diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml deleted file mode 100644 index 7ea0e5f..0000000 --- a/.github/workflows/node.js.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: CI - -on: - push: - branches: [master] - pull_request: - branches: [master] - -jobs: - test: - strategy: - matrix: - node-version: [16.x, 18.x, 20.x] - os: [ubuntu-latest] - - runs-on: ${{ matrix.os }} - timeout-minutes: 2 - - steps: - - name: Checkout the repo - uses: actions/checkout@v2 - - name: Set up Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node-version }} - - run: npm install - - run: npm test diff --git a/.woodpecker.yaml b/.woodpecker.yaml new file mode 100644 index 0000000..d254f8d --- /dev/null +++ b/.woodpecker.yaml @@ -0,0 +1,13 @@ +matrix: + NODE_VERSION: + - 18 + - 20 + +steps: + test: + when: + event: [push] + image: node:${NODE_VERSION} + commands: + - npm install + - npm test \ No newline at end of file diff --git a/README.md b/README.md index ceba577..0890eb4 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,9 @@ -# ppppp-invite +# pzp-invite -**Work in progress** +PZP invite code generator and parser + +## Installation + +``` +npm install pzp-invite +``` diff --git a/lib/index.js b/lib/index.js index 1c3c40c..52a086e 100644 --- a/lib/index.js +++ b/lib/index.js @@ -4,10 +4,10 @@ const p = require('promisify-tuple') /** * @typedef {{ pubkey: string }} SHSE - * @typedef {ReturnType} PPPPPPromise - * @typedef {ReturnType} PPPPPNet - * @typedef {ReturnType} PPPPPHubClient - * @typedef {import('ppppp-hub-client/plugin').HubMultiaddr} HubMultiaddr + * @typedef {ReturnType} PZPPromise + * @typedef {ReturnType} PZPNet + * @typedef {ReturnType} PZPHubClient + * @typedef {import('pzp-hub-client/plugin').HubMultiaddr} HubMultiaddr * @typedef {{ * type: 'join', * multiaddr: string, @@ -43,9 +43,9 @@ const p = require('promisify-tuple') * } Command * @typedef {{ * shse: SHSE; - * promise: PPPPPPromise; - * hubClient: PPPPPHubClient; - * net: PPPPPNet; + * promise: PZPPromise; + * hubClient: PZPHubClient; + * net: PZPNet; * }} Peer */ @@ -206,14 +206,14 @@ function parsePromiseAccountAddCommand(pieces, uri) { } /** - * @param {`ppppp://invite/${string}`} uri + * @param {`pzp://invite/${string}`} uri * @returns {Array} */ function parse(uri) { const url = new URL(uri) - if (url.protocol !== 'ppppp:') { + if (url.protocol !== 'pzp:') { // prettier-ignore - throw new Error(`Invalid protocol in URI "${uri}" for invite.parse, expected "ppppp:"`) + throw new Error(`Invalid protocol in URI "${uri}" for invite.parse, expected "pzp:"`) } if (url.host !== 'invite') { // prettier-ignore @@ -386,7 +386,7 @@ function initInvite(peer, config) { const followCommand = `follow/${opts.id}` // prettier-ignore - const uri = `ppppp://invite/${joinCommands.join('/')}/${followCommand}/${promiseCommand}` + const uri = `pzp://invite/${joinCommands.join('/')}/${followCommand}/${promiseCommand}` const url = `${protocol}://${hostname}/invite#${encodeURIComponent(uri)}` cb(null, { uri, url }) } @@ -435,7 +435,7 @@ function initInvite(peer, config) { const tunnelCommand = `tunnel-connect/${pubkey}/${peer.shse.pubkey}` // prettier-ignore - const uri = `ppppp://invite/${joinCommands.join('/')}/${tunnelCommand}/${promiseCommand}` + const uri = `pzp://invite/${joinCommands.join('/')}/${tunnelCommand}/${promiseCommand}` const url = `${protocol}://${hostname}/invite#${encodeURIComponent(uri)}` cb(null, { uri, url }) } diff --git a/package.json b/package.json index 737a14a..e75d9e9 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,11 @@ { - "name": "ppppp-invite", + "name": "pzp-invite", "version": "0.0.1", - "description": "PPPPP invite code generator and parser", - "homepage": "https://github.com/staltz/ppppp-invite", + "description": "PZP invite code generator and parser", + "homepage": "https://codeberg.org/pzp/pzp-invite", "repository": { "type": "git", - "url": "git://github.com/staltz/ppppp-invite.git" + "url": "git@codeberg.org:pzp/pzp-invite.git" }, "author": "Andre 'Staltz' Medeiros ", "license": "MIT", @@ -30,11 +30,11 @@ "@types/node": "^20.2.5", "c8": "^7.11.0", "husky": "^4.3.0", - "ppppp-caps": "github:staltz/ppppp-caps", - "ppppp-hub-client": "github:staltz/ppppp-hub-client", - "ppppp-keypair": "github:staltz/ppppp-keypair", - "ppppp-net": "github:staltz/ppppp-net", - "ppppp-promise": "github:staltz/ppppp-promise", + "pzp-caps": "^1.0.0", + "pzp-hub-client": "^1.0.0", + "pzp-keypair": "^1.0.0", + "pzp-net": "^1.0.0", + "pzp-promise": "^1.0.0", "prettier": "^2.6.2", "pretty-quick": "^3.1.3", "rimraf": "^5.0.1", diff --git a/protospec.md b/protospec.md index a0c6d24..ec8532a 100644 --- a/protospec.md +++ b/protospec.md @@ -1,11 +1,11 @@ -`ppppp://invite` URIs are followed by any number of "commands", where each command has a name plus a fixed-length list of arguments. +`pzp://invite` URIs are followed by any number of "commands", where each command has a name plus a fixed-length list of arguments. ## Inviting a new user to the network **Invite URL:** ``` -ppppp://invite/join/HOSTFORMAT/HOST/TRANSPORT/PORT/TRANSFORM/CREDENTIALS/follow/ALICE_ID/promise.follow/account.ALICE_ID/ALICE_TOKEN +pzp://invite/join/HOSTFORMAT/HOST/TRANSPORT/PORT/TRANSFORM/CREDENTIALS/follow/ALICE_ID/promise.follow/account.ALICE_ID/ALICE_TOKEN ``` made of 3 "commands": @@ -40,9 +40,9 @@ deactivate H A->>B: Externally: send invite URL B->>H: HTTP: open URL activate H -H-->>B: HTML with PPPPP invite URI +H-->>B: HTML with PZP invite URI deactivate H -B->>B: open PPPPP app +B->>B: open PZP app note over B: parse URI and detect 3 commands note over B: execute command "join" B->>H: connect with hubToken in SHSe @@ -70,7 +70,7 @@ end **Invite URL:** ``` -ppppp://invite/join/HOSTFORMAT/HOST/TRANSPORT/PORT/TRANSFORM/CREDENTIALS/tunnel-connect/HUB_PUBKEY/OLD_PUBKEY/promise.account-add/peer.PUBKEY/OLD_TOKEN/promise.account-internal-encryption-key/peer.PUBKEY/OLD_TOKEN +pzp://invite/join/HOSTFORMAT/HOST/TRANSPORT/PORT/TRANSFORM/CREDENTIALS/tunnel-connect/HUB_PUBKEY/OLD_PUBKEY/promise.account-add/peer.PUBKEY/OLD_TOKEN/promise.account-internal-encryption-key/peer.PUBKEY/OLD_TOKEN ``` made of 3 "commands": diff --git a/test/createForFriend.test.js b/test/createForFriend.test.js index 8ceb439..54be5bf 100644 --- a/test/createForFriend.test.js +++ b/test/createForFriend.test.js @@ -4,11 +4,11 @@ const Path = require('node:path') const os = require('node:os') const p = require('node:util').promisify const rimraf = require('rimraf') -const Keypair = require('ppppp-keypair') -const caps = require('ppppp-caps') +const Keypair = require('pzp-keypair') +const caps = require('pzp-caps') test('createForFriend()', async (t) => { - const path = Path.join(os.tmpdir(), 'ppppp-promise-createForFriend-0') + const path = Path.join(os.tmpdir(), 'pzp-promise-createForFriend-0') rimraf.sync(path) const keypair = Keypair.generate('ed25519', 'alice') @@ -89,11 +89,11 @@ test('createForFriend()', async (t) => { }) assert.equal( uri, - `ppppp://invite/join/dns/example.com/tcp/8008/shse/HUB_PUBKEY.MOCK_TOKEN/follow/MOCK_ID/promise.follow/pubkey.${keypair.public}/MOCK_PROMISE` + `pzp://invite/join/dns/example.com/tcp/8008/shse/HUB_PUBKEY.MOCK_TOKEN/follow/MOCK_ID/promise.follow/pubkey.${keypair.public}/MOCK_PROMISE` ) assert.equal( url, - `https://example.com/invite#ppppp%3A%2F%2Finvite%2Fjoin%2Fdns%2Fexample.com%2Ftcp%2F8008%2Fshse%2FHUB_PUBKEY.MOCK_TOKEN%2Ffollow%2FMOCK_ID%2Fpromise.follow%2Fpubkey.${keypair.public}%2FMOCK_PROMISE` + `https://example.com/invite#pzp%3A%2F%2Finvite%2Fjoin%2Fdns%2Fexample.com%2Ftcp%2F8008%2Fshse%2FHUB_PUBKEY.MOCK_TOKEN%2Ffollow%2FMOCK_ID%2Fpromise.follow%2Fpubkey.${keypair.public}%2FMOCK_PROMISE` ) assert.ok(connectCalled) diff --git a/test/createForMyself.test.js b/test/createForMyself.test.js index 56e7692..b6de4e1 100644 --- a/test/createForMyself.test.js +++ b/test/createForMyself.test.js @@ -4,11 +4,11 @@ const Path = require('node:path') const os = require('node:os') const p = require('node:util').promisify const rimraf = require('rimraf') -const Keypair = require('ppppp-keypair') -const caps = require('ppppp-caps') +const Keypair = require('pzp-keypair') +const caps = require('pzp-caps') test('createForMyself()', async (t) => { - const path = Path.join(os.tmpdir(), 'ppppp-promise-createForMyself-0') + const path = Path.join(os.tmpdir(), 'pzp-promise-createForMyself-0') rimraf.sync(path) const keypair = Keypair.generate('ed25519', 'alice') @@ -87,11 +87,11 @@ test('createForMyself()', async (t) => { }) assert.equal( uri, - `ppppp://invite/join/dns/example.com/tcp/8008/shse/HUB_PUBKEY.MOCK_TOKEN/tunnel-connect/HUB_PUBKEY/${local.shse.pubkey}/promise.account-add/pubkey.${keypair.public}/MOCK_PROMISE` + `pzp://invite/join/dns/example.com/tcp/8008/shse/HUB_PUBKEY.MOCK_TOKEN/tunnel-connect/HUB_PUBKEY/${local.shse.pubkey}/promise.account-add/pubkey.${keypair.public}/MOCK_PROMISE` ) assert.equal( url, - `https://example.com/invite#ppppp%3A%2F%2Finvite%2Fjoin%2Fdns%2Fexample.com%2Ftcp%2F8008%2Fshse%2FHUB_PUBKEY.MOCK_TOKEN%2Ftunnel-connect%2FHUB_PUBKEY%2F${local.shse.pubkey}%2Fpromise.account-add%2Fpubkey.${keypair.public}%2FMOCK_PROMISE` + `https://example.com/invite#pzp%3A%2F%2Finvite%2Fjoin%2Fdns%2Fexample.com%2Ftcp%2F8008%2Fshse%2FHUB_PUBKEY.MOCK_TOKEN%2Ftunnel-connect%2FHUB_PUBKEY%2F${local.shse.pubkey}%2Fpromise.account-add%2Fpubkey.${keypair.public}%2FMOCK_PROMISE` ) assert.ok(connectCalled) diff --git a/test/parse.test.js b/test/parse.test.js index d09f63a..0c30ffb 100644 --- a/test/parse.test.js +++ b/test/parse.test.js @@ -7,16 +7,16 @@ test('parse() error cases', (t) => { plugin.parse('ssb://invite/join/ip4/127.0.0.1/tcp/HUB_PUBKEY/HUB_TOKEN') }) assert.throws(() => { - plugin.parse('ppppp:invite') + plugin.parse('pzp:invite') }) assert.throws(() => { - plugin.parse('ppppp:invite/join/ip4/127.0.0.1') + plugin.parse('pzp:invite/join/ip4/127.0.0.1') }) }) test('parse() good friend invite', (t) => { const commands = plugin.parse( - 'ppppp://invite/join/dns/example.com/tcp/8080/shse/PUBKEY.TOKEN/follow/ALICE/promise.follow/pubkey.ALICE/ALICE_TOKEN' + 'pzp://invite/join/dns/example.com/tcp/8080/shse/PUBKEY.TOKEN/follow/ALICE/promise.follow/pubkey.ALICE/ALICE_TOKEN' ) assert.deepEqual(commands, [ { @@ -37,7 +37,7 @@ test('parse() good friend invite', (t) => { test('parse() good myself invite', (t) => { const commands = plugin.parse( - 'ppppp://invite/join/dns/example.com/tcp/8080/shse/PUBKEY.TOKEN/tunnel-connect/HUB_PUBKEY/OLD_PUBKEY/promise.account-add/pubkey.PUBKEY/OLD_TOKEN' + 'pzp://invite/join/dns/example.com/tcp/8080/shse/PUBKEY.TOKEN/tunnel-connect/HUB_PUBKEY/OLD_PUBKEY/promise.account-add/pubkey.PUBKEY/OLD_TOKEN' ) assert.deepEqual(commands, [ { @@ -58,7 +58,7 @@ test('parse() good myself invite', (t) => { test('parse() good tokenless join invite', (t) => { const commands = plugin.parse( - 'ppppp://invite/join/dns/example.com/tcp/8080/shse/PUBKEY' + 'pzp://invite/join/dns/example.com/tcp/8080/shse/PUBKEY' ) assert.deepEqual(commands, [ {