@weaveprotocol/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1106 -0
- package/dist/elements/auth-styles.d.ts +18 -0
- package/dist/elements/auth-styles.d.ts.map +1 -0
- package/dist/elements/auth-styles.js +150 -0
- package/dist/elements/auth-styles.js.map +1 -0
- package/dist/elements/dom.d.ts +28 -0
- package/dist/elements/dom.d.ts.map +1 -0
- package/dist/elements/dom.js +74 -0
- package/dist/elements/dom.js.map +1 -0
- package/dist/elements/index.d.ts +13 -0
- package/dist/elements/index.d.ts.map +1 -0
- package/dist/elements/index.js +11 -0
- package/dist/elements/index.js.map +1 -0
- package/dist/elements/weave-auth.d.ts +52 -0
- package/dist/elements/weave-auth.d.ts.map +1 -0
- package/dist/elements/weave-auth.js +427 -0
- package/dist/elements/weave-auth.js.map +1 -0
- package/dist/identity/account-store.d.ts +113 -0
- package/dist/identity/account-store.d.ts.map +1 -0
- package/dist/identity/account-store.js +305 -0
- package/dist/identity/account-store.js.map +1 -0
- package/dist/identity/account-vault.d.ts +199 -0
- package/dist/identity/account-vault.d.ts.map +1 -0
- package/dist/identity/account-vault.js +251 -0
- package/dist/identity/account-vault.js.map +1 -0
- package/dist/identity/agent-note.d.ts +19 -0
- package/dist/identity/agent-note.d.ts.map +1 -0
- package/dist/identity/agent-note.js +29 -0
- package/dist/identity/agent-note.js.map +1 -0
- package/dist/identity/crypto-p256.d.ts +7 -0
- package/dist/identity/crypto-p256.d.ts.map +1 -0
- package/dist/identity/crypto-p256.js +84 -0
- package/dist/identity/crypto-p256.js.map +1 -0
- package/dist/identity/device-key.d.ts +60 -0
- package/dist/identity/device-key.d.ts.map +1 -0
- package/dist/identity/device-key.js +103 -0
- package/dist/identity/device-key.js.map +1 -0
- package/dist/identity/did.d.ts +22 -0
- package/dist/identity/did.d.ts.map +1 -0
- package/dist/identity/did.js +37 -0
- package/dist/identity/did.js.map +1 -0
- package/dist/identity/folder-account.d.ts +65 -0
- package/dist/identity/folder-account.d.ts.map +1 -0
- package/dist/identity/folder-account.js +115 -0
- package/dist/identity/folder-account.js.map +1 -0
- package/dist/identity/identity-manager.d.ts +36 -0
- package/dist/identity/identity-manager.d.ts.map +1 -0
- package/dist/identity/identity-manager.js +115 -0
- package/dist/identity/identity-manager.js.map +1 -0
- package/dist/identity/index.d.ts +10 -0
- package/dist/identity/index.d.ts.map +1 -0
- package/dist/identity/index.js +10 -0
- package/dist/identity/index.js.map +1 -0
- package/dist/identity/keys.d.ts +24 -0
- package/dist/identity/keys.d.ts.map +1 -0
- package/dist/identity/keys.js +38 -0
- package/dist/identity/keys.js.map +1 -0
- package/dist/identity/pairing.d.ts +83 -0
- package/dist/identity/pairing.d.ts.map +1 -0
- package/dist/identity/pairing.js +120 -0
- package/dist/identity/pairing.js.map +1 -0
- package/dist/identity/passkey-diagnostics.d.ts +54 -0
- package/dist/identity/passkey-diagnostics.d.ts.map +1 -0
- package/dist/identity/passkey-diagnostics.js +178 -0
- package/dist/identity/passkey-diagnostics.js.map +1 -0
- package/dist/identity/recovery-code.d.ts +50 -0
- package/dist/identity/recovery-code.d.ts.map +1 -0
- package/dist/identity/recovery-code.js +116 -0
- package/dist/identity/recovery-code.js.map +1 -0
- package/dist/identity/root-signer.d.ts +59 -0
- package/dist/identity/root-signer.d.ts.map +1 -0
- package/dist/identity/root-signer.js +44 -0
- package/dist/identity/root-signer.js.map +1 -0
- package/dist/identity/ucan.d.ts +164 -0
- package/dist/identity/ucan.d.ts.map +1 -0
- package/dist/identity/ucan.js +273 -0
- package/dist/identity/ucan.js.map +1 -0
- package/dist/identity/webauthn.d.ts +87 -0
- package/dist/identity/webauthn.d.ts.map +1 -0
- package/dist/identity/webauthn.js +155 -0
- package/dist/identity/webauthn.js.map +1 -0
- package/dist/index.d.ts +116 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +85 -0
- package/dist/index.js.map +1 -0
- package/dist/network/index.d.ts +17 -0
- package/dist/network/index.d.ts.map +1 -0
- package/dist/network/index.js +10 -0
- package/dist/network/index.js.map +1 -0
- package/dist/network/introductions.d.ts +85 -0
- package/dist/network/introductions.d.ts.map +1 -0
- package/dist/network/introductions.js +94 -0
- package/dist/network/introductions.js.map +1 -0
- package/dist/network/local-transport.d.ts +22 -0
- package/dist/network/local-transport.d.ts.map +1 -0
- package/dist/network/local-transport.js +55 -0
- package/dist/network/local-transport.js.map +1 -0
- package/dist/network/mesh.d.ts +31 -0
- package/dist/network/mesh.d.ts.map +1 -0
- package/dist/network/mesh.js +332 -0
- package/dist/network/mesh.js.map +1 -0
- package/dist/network/multi-signaling.d.ts +29 -0
- package/dist/network/multi-signaling.d.ts.map +1 -0
- package/dist/network/multi-signaling.js +125 -0
- package/dist/network/multi-signaling.js.map +1 -0
- package/dist/network/network-manager.d.ts +37 -0
- package/dist/network/network-manager.d.ts.map +1 -0
- package/dist/network/network-manager.js +64 -0
- package/dist/network/network-manager.js.map +1 -0
- package/dist/network/peer-auth.d.ts +98 -0
- package/dist/network/peer-auth.d.ts.map +1 -0
- package/dist/network/peer-auth.js +86 -0
- package/dist/network/peer-auth.js.map +1 -0
- package/dist/network/rtc-transport.d.ts +18 -0
- package/dist/network/rtc-transport.d.ts.map +1 -0
- package/dist/network/rtc-transport.js +149 -0
- package/dist/network/rtc-transport.js.map +1 -0
- package/dist/network/signaling.d.ts +40 -0
- package/dist/network/signaling.d.ts.map +1 -0
- package/dist/network/signaling.js +124 -0
- package/dist/network/signaling.js.map +1 -0
- package/dist/network/transport.d.ts +50 -0
- package/dist/network/transport.d.ts.map +1 -0
- package/dist/network/transport.js +13 -0
- package/dist/network/transport.js.map +1 -0
- package/dist/network/ws-transport.d.ts +42 -0
- package/dist/network/ws-transport.d.ts.map +1 -0
- package/dist/network/ws-transport.js +194 -0
- package/dist/network/ws-transport.js.map +1 -0
- package/dist/node/actions.d.ts +62 -0
- package/dist/node/actions.d.ts.map +1 -0
- package/dist/node/actions.js +500 -0
- package/dist/node/actions.js.map +1 -0
- package/dist/node/carrier.d.ts +85 -0
- package/dist/node/carrier.d.ts.map +1 -0
- package/dist/node/carrier.js +192 -0
- package/dist/node/carrier.js.map +1 -0
- package/dist/node/copy.d.ts +38 -0
- package/dist/node/copy.d.ts.map +1 -0
- package/dist/node/copy.js +53 -0
- package/dist/node/copy.js.map +1 -0
- package/dist/node/index.d.ts +16 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +11 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/node.d.ts +12 -0
- package/dist/node/node.d.ts.map +1 -0
- package/dist/node/node.js +872 -0
- package/dist/node/node.js.map +1 -0
- package/dist/node/space-runtime.d.ts +144 -0
- package/dist/node/space-runtime.d.ts.map +1 -0
- package/dist/node/space-runtime.js +1221 -0
- package/dist/node/space-runtime.js.map +1 -0
- package/dist/node/stores.d.ts +45 -0
- package/dist/node/stores.d.ts.map +1 -0
- package/dist/node/stores.js +31 -0
- package/dist/node/stores.js.map +1 -0
- package/dist/node/types.d.ts +508 -0
- package/dist/node/types.d.ts.map +1 -0
- package/dist/node/types.js +2 -0
- package/dist/node/types.js.map +1 -0
- package/dist/privacy/index.d.ts +4 -0
- package/dist/privacy/index.d.ts.map +1 -0
- package/dist/privacy/index.js +4 -0
- package/dist/privacy/index.js.map +1 -0
- package/dist/privacy/key-distribution.d.ts +42 -0
- package/dist/privacy/key-distribution.d.ts.map +1 -0
- package/dist/privacy/key-distribution.js +50 -0
- package/dist/privacy/key-distribution.js.map +1 -0
- package/dist/privacy/privacy-guard.d.ts +24 -0
- package/dist/privacy/privacy-guard.d.ts.map +1 -0
- package/dist/privacy/privacy-guard.js +87 -0
- package/dist/privacy/privacy-guard.js.map +1 -0
- package/dist/privacy/space-encryption.d.ts +48 -0
- package/dist/privacy/space-encryption.d.ts.map +1 -0
- package/dist/privacy/space-encryption.js +61 -0
- package/dist/privacy/space-encryption.js.map +1 -0
- package/dist/query/engine.d.ts +27 -0
- package/dist/query/engine.d.ts.map +1 -0
- package/dist/query/engine.js +84 -0
- package/dist/query/engine.js.map +1 -0
- package/dist/query/filter.d.ts +15 -0
- package/dist/query/filter.d.ts.map +1 -0
- package/dist/query/filter.js +207 -0
- package/dist/query/filter.js.map +1 -0
- package/dist/query/types.d.ts +144 -0
- package/dist/query/types.d.ts.map +1 -0
- package/dist/query/types.js +22 -0
- package/dist/query/types.js.map +1 -0
- package/dist/react/context.d.ts +81 -0
- package/dist/react/context.d.ts.map +1 -0
- package/dist/react/context.js +95 -0
- package/dist/react/context.js.map +1 -0
- package/dist/react/index.d.ts +40 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +36 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/use-live.d.ts +16 -0
- package/dist/react/use-live.d.ts.map +1 -0
- package/dist/react/use-live.js +55 -0
- package/dist/react/use-live.js.map +1 -0
- package/dist/react/use-query.d.ts +17 -0
- package/dist/react/use-query.d.ts.map +1 -0
- package/dist/react/use-query.js +23 -0
- package/dist/react/use-query.js.map +1 -0
- package/dist/react/use-space.d.ts +29 -0
- package/dist/react/use-space.d.ts.map +1 -0
- package/dist/react/use-space.js +48 -0
- package/dist/react/use-space.js.map +1 -0
- package/dist/react/use-spaces.d.ts +19 -0
- package/dist/react/use-spaces.d.ts.map +1 -0
- package/dist/react/use-spaces.js +55 -0
- package/dist/react/use-spaces.js.map +1 -0
- package/dist/react/use-weave-auth.d.ts +10 -0
- package/dist/react/use-weave-auth.d.ts.map +1 -0
- package/dist/react/use-weave-auth.js +15 -0
- package/dist/react/use-weave-auth.js.map +1 -0
- package/dist/react/weave-auth.d.ts +17 -0
- package/dist/react/weave-auth.d.ts.map +1 -0
- package/dist/react/weave-auth.js +38 -0
- package/dist/react/weave-auth.js.map +1 -0
- package/dist/records/describe.d.ts +38 -0
- package/dist/records/describe.d.ts.map +1 -0
- package/dist/records/describe.js +101 -0
- package/dist/records/describe.js.map +1 -0
- package/dist/records/links.d.ts +14 -0
- package/dist/records/links.d.ts.map +1 -0
- package/dist/records/links.js +25 -0
- package/dist/records/links.js.map +1 -0
- package/dist/records/rules.d.ts +59 -0
- package/dist/records/rules.d.ts.map +1 -0
- package/dist/records/rules.js +118 -0
- package/dist/records/rules.js.map +1 -0
- package/dist/records/version.d.ts +54 -0
- package/dist/records/version.d.ts.map +1 -0
- package/dist/records/version.js +70 -0
- package/dist/records/version.js.map +1 -0
- package/dist/schema/collection-def.d.ts +96 -0
- package/dist/schema/collection-def.d.ts.map +1 -0
- package/dist/schema/collection-def.js +272 -0
- package/dist/schema/collection-def.js.map +1 -0
- package/dist/schema/expression.d.ts +69 -0
- package/dist/schema/expression.d.ts.map +1 -0
- package/dist/schema/expression.js +92 -0
- package/dist/schema/expression.js.map +1 -0
- package/dist/schema/index.d.ts +4 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +4 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/schema-engine.d.ts +42 -0
- package/dist/schema/schema-engine.d.ts.map +1 -0
- package/dist/schema/schema-engine.js +36 -0
- package/dist/schema/schema-engine.js.map +1 -0
- package/dist/schema/signer.d.ts +27 -0
- package/dist/schema/signer.d.ts.map +1 -0
- package/dist/schema/signer.js +36 -0
- package/dist/schema/signer.js.map +1 -0
- package/dist/schemas/apps.d.ts +88 -0
- package/dist/schemas/apps.d.ts.map +1 -0
- package/dist/schemas/apps.js +168 -0
- package/dist/schemas/apps.js.map +1 -0
- package/dist/schemas/index.d.ts +410 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +208 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/screens.d.ts +67 -0
- package/dist/schemas/screens.d.ts.map +1 -0
- package/dist/schemas/screens.js +242 -0
- package/dist/schemas/screens.js.map +1 -0
- package/dist/session/agent-link.d.ts +79 -0
- package/dist/session/agent-link.d.ts.map +1 -0
- package/dist/session/agent-link.js +251 -0
- package/dist/session/agent-link.js.map +1 -0
- package/dist/session/auth.d.ts +233 -0
- package/dist/session/auth.d.ts.map +1 -0
- package/dist/session/auth.js +783 -0
- package/dist/session/auth.js.map +1 -0
- package/dist/session/connect.d.ts +211 -0
- package/dist/session/connect.d.ts.map +1 -0
- package/dist/session/connect.js +355 -0
- package/dist/session/connect.js.map +1 -0
- package/dist/session/connection.d.ts +70 -0
- package/dist/session/connection.d.ts.map +1 -0
- package/dist/session/connection.js +120 -0
- package/dist/session/connection.js.map +1 -0
- package/dist/session/credentials.d.ts +44 -0
- package/dist/session/credentials.d.ts.map +1 -0
- package/dist/session/credentials.js +60 -0
- package/dist/session/credentials.js.map +1 -0
- package/dist/session/index.d.ts +25 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +18 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/pairing.d.ts +59 -0
- package/dist/session/pairing.d.ts.map +1 -0
- package/dist/session/pairing.js +144 -0
- package/dist/session/pairing.js.map +1 -0
- package/dist/session/places.d.ts +62 -0
- package/dist/session/places.d.ts.map +1 -0
- package/dist/session/places.js +101 -0
- package/dist/session/places.js.map +1 -0
- package/dist/session/stay-signed-in.d.ts +37 -0
- package/dist/session/stay-signed-in.d.ts.map +1 -0
- package/dist/session/stay-signed-in.js +124 -0
- package/dist/session/stay-signed-in.js.map +1 -0
- package/dist/space/account-registry.d.ts +64 -0
- package/dist/space/account-registry.d.ts.map +1 -0
- package/dist/space/account-registry.js +66 -0
- package/dist/space/account-registry.js.map +1 -0
- package/dist/space/index.d.ts +3 -0
- package/dist/space/index.d.ts.map +1 -0
- package/dist/space/index.js +3 -0
- package/dist/space/index.js.map +1 -0
- package/dist/space/pass.d.ts +63 -0
- package/dist/space/pass.d.ts.map +1 -0
- package/dist/space/pass.js +54 -0
- package/dist/space/pass.js.map +1 -0
- package/dist/space/presets.d.ts +31 -0
- package/dist/space/presets.d.ts.map +1 -0
- package/dist/space/presets.js +24 -0
- package/dist/space/presets.js.map +1 -0
- package/dist/space/roles.d.ts +186 -0
- package/dist/space/roles.d.ts.map +1 -0
- package/dist/space/roles.js +500 -0
- package/dist/space/roles.js.map +1 -0
- package/dist/space/space-access.d.ts +80 -0
- package/dist/space/space-access.d.ts.map +1 -0
- package/dist/space/space-access.js +135 -0
- package/dist/space/space-access.js.map +1 -0
- package/dist/space/space-manager.d.ts +87 -0
- package/dist/space/space-manager.d.ts.map +1 -0
- package/dist/space/space-manager.js +187 -0
- package/dist/space/space-manager.js.map +1 -0
- package/dist/storage/directory-access.d.ts +78 -0
- package/dist/storage/directory-access.d.ts.map +1 -0
- package/dist/storage/directory-access.js +164 -0
- package/dist/storage/directory-access.js.map +1 -0
- package/dist/storage/encrypted-adapter.d.ts +49 -0
- package/dist/storage/encrypted-adapter.d.ts.map +1 -0
- package/dist/storage/encrypted-adapter.js +106 -0
- package/dist/storage/encrypted-adapter.js.map +1 -0
- package/dist/storage/folder-adapter.d.ts +105 -0
- package/dist/storage/folder-adapter.d.ts.map +1 -0
- package/dist/storage/folder-adapter.js +280 -0
- package/dist/storage/folder-adapter.js.map +1 -0
- package/dist/storage/folder-reconcile.d.ts +53 -0
- package/dist/storage/folder-reconcile.d.ts.map +1 -0
- package/dist/storage/folder-reconcile.js +65 -0
- package/dist/storage/folder-reconcile.js.map +1 -0
- package/dist/storage/index.d.ts +10 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +9 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/indexeddb-adapter.d.ts +12 -0
- package/dist/storage/indexeddb-adapter.d.ts.map +1 -0
- package/dist/storage/indexeddb-adapter.js +190 -0
- package/dist/storage/indexeddb-adapter.js.map +1 -0
- package/dist/storage/mst.d.ts +121 -0
- package/dist/storage/mst.d.ts.map +1 -0
- package/dist/storage/mst.js +402 -0
- package/dist/storage/mst.js.map +1 -0
- package/dist/storage/storage-provider.d.ts +85 -0
- package/dist/storage/storage-provider.d.ts.map +1 -0
- package/dist/storage/storage-provider.js +220 -0
- package/dist/storage/storage-provider.js.map +1 -0
- package/dist/sync/anti-entropy.d.ts +49 -0
- package/dist/sync/anti-entropy.d.ts.map +1 -0
- package/dist/sync/anti-entropy.js +62 -0
- package/dist/sync/anti-entropy.js.map +1 -0
- package/dist/sync/index.d.ts +4 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +4 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/sync-engine.d.ts +71 -0
- package/dist/sync/sync-engine.d.ts.map +1 -0
- package/dist/sync/sync-engine.js +309 -0
- package/dist/sync/sync-engine.js.map +1 -0
- package/dist/sync/sync-messages.d.ts +75 -0
- package/dist/sync/sync-messages.d.ts.map +1 -0
- package/dist/sync/sync-messages.js +12 -0
- package/dist/sync/sync-messages.js.map +1 -0
- package/dist/types.d.ts +243 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/encoding.d.ts +63 -0
- package/dist/utils/encoding.d.ts.map +1 -0
- package/dist/utils/encoding.js +130 -0
- package/dist/utils/encoding.js.map +1 -0
- package/dist/utils/errors.d.ts +43 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +28 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/events.d.ts +19 -0
- package/dist/utils/events.d.ts.map +1 -0
- package/dist/utils/events.js +27 -0
- package/dist/utils/events.js.map +1 -0
- package/dist/utils/hash.d.ts +23 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +49 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/validation/capability-gate.d.ts +50 -0
- package/dist/validation/capability-gate.d.ts.map +1 -0
- package/dist/validation/capability-gate.js +71 -0
- package/dist/validation/capability-gate.js.map +1 -0
- package/dist/validation/crypto-gate.d.ts +16 -0
- package/dist/validation/crypto-gate.d.ts.map +1 -0
- package/dist/validation/crypto-gate.js +37 -0
- package/dist/validation/crypto-gate.js.map +1 -0
- package/dist/validation/index.d.ts +6 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +6 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/stateful-gate.d.ts +15 -0
- package/dist/validation/stateful-gate.d.ts.map +1 -0
- package/dist/validation/stateful-gate.js +50 -0
- package/dist/validation/stateful-gate.js.map +1 -0
- package/dist/validation/structural-gate.d.ts +18 -0
- package/dist/validation/structural-gate.d.ts.map +1 -0
- package/dist/validation/structural-gate.js +54 -0
- package/dist/validation/structural-gate.js.map +1 -0
- package/dist/validation/validation-engine.d.ts +28 -0
- package/dist/validation/validation-engine.d.ts.map +1 -0
- package/dist/validation/validation-engine.js +38 -0
- package/dist/validation/validation-engine.js.map +1 -0
- package/package.json +107 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Peers over a transport that dials on its own — a socket to an
|
|
3
|
+
* always-on node, a local link, an in-memory fake in tests. Such a transport
|
|
4
|
+
* authenticates, or is trusted, by itself; relays and WebRTC are the mesh's
|
|
5
|
+
* (`mesh.ts`), which hands each space the same {@link NetworkManager}.
|
|
6
|
+
*/
|
|
7
|
+
import type { PeerInfo, NetworkMessage } from '../types.js';
|
|
8
|
+
import type { PeerTransport } from './transport.js';
|
|
9
|
+
export interface NetworkManagerConfig {
|
|
10
|
+
readonly did: string;
|
|
11
|
+
readonly createTransport: () => PeerTransport;
|
|
12
|
+
}
|
|
13
|
+
export type NetworkEvents = {
|
|
14
|
+
message: (message: NetworkMessage) => void;
|
|
15
|
+
'peer-connected': (info: PeerInfo) => void;
|
|
16
|
+
'peer-disconnected': (info: PeerInfo) => void;
|
|
17
|
+
error: (error: Error) => void;
|
|
18
|
+
};
|
|
19
|
+
/** One space's peers, whatever carries them */
|
|
20
|
+
export interface NetworkManager {
|
|
21
|
+
readonly connect: () => Promise<void>;
|
|
22
|
+
readonly disconnect: () => void;
|
|
23
|
+
readonly send: (peerId: string, message: NetworkMessage) => void;
|
|
24
|
+
readonly broadcast: (message: NetworkMessage) => void;
|
|
25
|
+
readonly getPeers: () => ReadonlyArray<PeerInfo>;
|
|
26
|
+
readonly on: <K extends keyof NetworkEvents>(event: K, callback: NetworkEvents[K]) => void;
|
|
27
|
+
readonly off: <K extends keyof NetworkEvents>(event: K, callback: NetworkEvents[K]) => void;
|
|
28
|
+
readonly isConnected: () => boolean;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Creates a network manager over a transport that dials on its own.
|
|
32
|
+
*
|
|
33
|
+
* @param config - Who this is, and the transport to use.
|
|
34
|
+
* @returns The network manager instance.
|
|
35
|
+
*/
|
|
36
|
+
export declare function createNetworkManager(config: NetworkManagerConfig): NetworkManager;
|
|
37
|
+
//# sourceMappingURL=network-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network-manager.d.ts","sourceRoot":"","sources":["../../src/network/network-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,eAAe,EAAE,MAAM,aAAa,CAAC;CAC/C;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IAC3C,gBAAgB,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IAC3C,mBAAmB,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IAC9C,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC/B,CAAC;AAEF,+CAA+C;AAC/C,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IACjE,QAAQ,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IACtD,QAAQ,CAAC,QAAQ,EAAE,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;IACjD,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,MAAM,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAC3F,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,SAAS,MAAM,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAC5F,QAAQ,CAAC,WAAW,EAAE,MAAM,OAAO,CAAC;CACrC;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,GAAG,cAAc,CAkDjF"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Peers over a transport that dials on its own — a socket to an
|
|
3
|
+
* always-on node, a local link, an in-memory fake in tests. Such a transport
|
|
4
|
+
* authenticates, or is trusted, by itself; relays and WebRTC are the mesh's
|
|
5
|
+
* (`mesh.ts`), which hands each space the same {@link NetworkManager}.
|
|
6
|
+
*/
|
|
7
|
+
import { utf8Encode, utf8Decode } from '../utils/encoding.js';
|
|
8
|
+
import { createEmitter } from '../utils/events.js';
|
|
9
|
+
/**
|
|
10
|
+
* Creates a network manager over a transport that dials on its own.
|
|
11
|
+
*
|
|
12
|
+
* @param config - Who this is, and the transport to use.
|
|
13
|
+
* @returns The network manager instance.
|
|
14
|
+
*/
|
|
15
|
+
export function createNetworkManager(config) {
|
|
16
|
+
const transport = config.createTransport();
|
|
17
|
+
const peers = new Map();
|
|
18
|
+
const { on, off, emit } = createEmitter();
|
|
19
|
+
transport.on('connected', (peerId) => {
|
|
20
|
+
const info = { did: peerId, connectionId: peerId, connectedAt: new Date().toISOString() };
|
|
21
|
+
peers.set(peerId, info);
|
|
22
|
+
emit('peer-connected', info);
|
|
23
|
+
});
|
|
24
|
+
transport.on('disconnected', (peerId) => {
|
|
25
|
+
const info = peers.get(peerId);
|
|
26
|
+
if (info && peers.delete(peerId))
|
|
27
|
+
emit('peer-disconnected', info);
|
|
28
|
+
});
|
|
29
|
+
transport.on('data', (peerId, data) => {
|
|
30
|
+
try {
|
|
31
|
+
const message = JSON.parse(utf8Decode(data));
|
|
32
|
+
// The sender is the connection it arrived on, not whatever the message claims.
|
|
33
|
+
emit('message', { ...message, from: peerId });
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
emit('error', new Error('Failed to parse incoming message'));
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
transport.on('error', (peerId, error) => emit('error', new Error(`Transport error with peer ${peerId}: ${error.message}`)));
|
|
40
|
+
const send = (peerId, message) => {
|
|
41
|
+
try {
|
|
42
|
+
transport.send(peerId, utf8Encode(JSON.stringify(message)));
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
emit('error', err instanceof Error ? err : new Error('Failed to send message'));
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
return Object.freeze({
|
|
49
|
+
connect: async () => {
|
|
50
|
+
await transport.connect?.();
|
|
51
|
+
},
|
|
52
|
+
disconnect: () => transport.closeAll(),
|
|
53
|
+
send,
|
|
54
|
+
broadcast: (message) => {
|
|
55
|
+
for (const peerId of peers.keys())
|
|
56
|
+
send(peerId, message);
|
|
57
|
+
},
|
|
58
|
+
getPeers: () => [...peers.values()],
|
|
59
|
+
on,
|
|
60
|
+
off,
|
|
61
|
+
isConnected: () => peers.size > 0,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=network-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network-manager.js","sourceRoot":"","sources":["../../src/network/network-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module peer-auth
|
|
3
|
+
* Proving, over a connection, who you are — and that you may read a space.
|
|
4
|
+
*
|
|
5
|
+
* An always-on node serves a space to whoever connects. For a public space that
|
|
6
|
+
* is fine — anyone may read it anyway. For a private one, serving the
|
|
7
|
+
* ciphertext to anyone who knows the id hands out the space's whole shape and
|
|
8
|
+
* history. And in either, a peer that could claim any name could knock the
|
|
9
|
+
* real owner of that name off the node and take its place. So before a byte
|
|
10
|
+
* of the space moves:
|
|
11
|
+
*
|
|
12
|
+
* ```
|
|
13
|
+
* node → client challenge { nonce: Nₛ, did: node }
|
|
14
|
+
* client → node hello { did: client, nonce: N꜀, sig: client key signs H, read?: read key signs H }
|
|
15
|
+
* node → client welcome { did: node, sig: node key signs (server | space | node did | N꜀) }
|
|
16
|
+
*
|
|
17
|
+
* H = client | space | client did | node did | Nₛ
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* The client signs with **the key its DID names**, proving the name, and in a
|
|
21
|
+
* private space with the space's **read key** too, derived from the space key
|
|
22
|
+
* (`space/space-access.ts`). The node checks the read signature against the
|
|
23
|
+
* public half, which is part of the space — so a node needs no secret to do
|
|
24
|
+
* it, and a host that cannot read the space checks readers exactly as a
|
|
25
|
+
* member's own node does.
|
|
26
|
+
*
|
|
27
|
+
* The node signs with **its own key**, the one its DID names. That proves the
|
|
28
|
+
* welcome comes from the node that sent the challenge; which node to trust is
|
|
29
|
+
* the client's choice of URL. Naming the node in the client's signature keeps
|
|
30
|
+
* a hello from being replayed to a different node.
|
|
31
|
+
*/
|
|
32
|
+
import type { CryptoProvider } from '../types.js';
|
|
33
|
+
/** What a client sends to prove itself: its own signature, and in a private space the read key's */
|
|
34
|
+
export interface HelloProof {
|
|
35
|
+
readonly sig: string;
|
|
36
|
+
readonly read?: string;
|
|
37
|
+
}
|
|
38
|
+
/** The connecting side: proves who it is and that it may read, and checks the node's welcome. */
|
|
39
|
+
export interface ClientAuth {
|
|
40
|
+
hello(clientDid: string, nodeDid: string, nodeNonce: string): Promise<HelloProof>;
|
|
41
|
+
checkWelcome(nodeDid: string, clientNonce: string, sig: unknown): Promise<boolean>;
|
|
42
|
+
}
|
|
43
|
+
/** The serving side: checks a peer's hello, and signs its welcome. */
|
|
44
|
+
export interface ServerAuth {
|
|
45
|
+
checkHello(clientDid: string, nodeDid: string, nodeNonce: string, proof: unknown): Promise<boolean>;
|
|
46
|
+
welcome(nodeDid: string, clientNonce: string): Promise<string>;
|
|
47
|
+
}
|
|
48
|
+
/** A fresh random nonce, as a string. */
|
|
49
|
+
export declare function peerNonce(): string;
|
|
50
|
+
/**
|
|
51
|
+
* The client side.
|
|
52
|
+
* @param spaceId The space — bound into every signature, so a proof for one space is useless in another
|
|
53
|
+
* @param session This side's DID and the key it names
|
|
54
|
+
* @param readKey In a private space, the space's read key (`deriveReadKey`); null in a public one
|
|
55
|
+
*/
|
|
56
|
+
export declare function createClientAuth(spaceId: string, session: {
|
|
57
|
+
readonly did: string;
|
|
58
|
+
readonly key: CryptoKey;
|
|
59
|
+
}, readKey: {
|
|
60
|
+
readonly privateKey: CryptoKey;
|
|
61
|
+
} | null, provider: CryptoProvider): ClientAuth;
|
|
62
|
+
/**
|
|
63
|
+
* The node side. Holds no secret of the space's.
|
|
64
|
+
* @param readKey In a private space, its public read key, from the space itself; null in a public one
|
|
65
|
+
* @param nodeKey The private key of the DID the node introduces itself as
|
|
66
|
+
*/
|
|
67
|
+
export declare function createServerAuth(spaceId: string, readKey: string | null, nodeKey: CryptoKey, provider: CryptoProvider): ServerAuth;
|
|
68
|
+
/** The fingerprints of one connection's two ends, as this side sees them */
|
|
69
|
+
export interface ChannelBinding {
|
|
70
|
+
readonly local: string;
|
|
71
|
+
readonly remote: string;
|
|
72
|
+
}
|
|
73
|
+
/** What one side sends to prove itself */
|
|
74
|
+
export interface MeshProof {
|
|
75
|
+
readonly sig: string;
|
|
76
|
+
readonly read?: string;
|
|
77
|
+
}
|
|
78
|
+
/** Proving who you are to a peer — and, in a private space, that you may read it. */
|
|
79
|
+
export interface MeshAuth {
|
|
80
|
+
prove(peerDid: string, peerNonce: string, binding: ChannelBinding | null): Promise<MeshProof>;
|
|
81
|
+
check(peerDid: string, ourNonce: string, binding: ChannelBinding | null, proof: unknown): Promise<boolean>;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* One side of the handshake between peers.
|
|
85
|
+
* @param spaceId The space — bound into every proof
|
|
86
|
+
* @param session This side's DID and the key it names
|
|
87
|
+
* @param read In a private space: the read key to prove with, and the public half the space names to check others against
|
|
88
|
+
*/
|
|
89
|
+
export declare function createMeshAuth(spaceId: string, session: {
|
|
90
|
+
readonly did: string;
|
|
91
|
+
readonly key: CryptoKey;
|
|
92
|
+
}, read: {
|
|
93
|
+
readonly key: {
|
|
94
|
+
readonly privateKey: CryptoKey;
|
|
95
|
+
} | null;
|
|
96
|
+
readonly publicDid: string;
|
|
97
|
+
} | null, provider: CryptoProvider): MeshAuth;
|
|
98
|
+
//# sourceMappingURL=peer-auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peer-auth.d.ts","sourceRoot":"","sources":["../../src/network/peer-auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIlD,oGAAoG;AACpG,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,iGAAiG;AACjG,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAClF,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACpF;AAED,sEAAsE;AACtE,MAAM,WAAW,UAAU;IACzB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpG,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAChE;AAED,yCAAyC;AACzC,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAiBD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAA;CAAE,EAC1D,OAAO,EAAE;IAAE,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAA;CAAE,GAAG,IAAI,EAClD,QAAQ,EAAE,cAAc,GACvB,UAAU,CAWZ;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,GAAG,UAAU,CAYlI;AA0BD,4EAA4E;AAC5E,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,0CAA0C;AAC1C,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qFAAqF;AACrF,MAAM,WAAW,QAAQ;IACvB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC9F,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5G;AAKD;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAA;CAAE,EAC1D,IAAI,EAAE;IAAE,QAAQ,CAAC,GAAG,EAAE;QAAE,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAA;KAAE,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,EACpG,QAAQ,EAAE,cAAc,GACvB,QAAQ,CAkBV"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { base64UrlDecode, base64UrlEncode, utf8Encode } from '../utils/encoding.js';
|
|
2
|
+
import { didToPublicKey } from '../identity/did.js';
|
|
3
|
+
/** A fresh random nonce, as a string. */
|
|
4
|
+
export function peerNonce() {
|
|
5
|
+
return base64UrlEncode(globalThis.crypto.getRandomValues(new Uint8Array(16)));
|
|
6
|
+
}
|
|
7
|
+
const helloLabel = (spaceId, clientDid, nodeDid, nonce) => utf8Encode(`weave-peer/v3|client|${spaceId}|${clientDid}|${nodeDid}|${nonce}`);
|
|
8
|
+
const welcomeLabel = (spaceId, nodeDid, nonce) => utf8Encode(`weave-peer/v3|server|${spaceId}|${nodeDid}|${nonce}`);
|
|
9
|
+
async function verifyBy(provider, did, sig, data) {
|
|
10
|
+
if (typeof sig !== 'string')
|
|
11
|
+
return false;
|
|
12
|
+
try {
|
|
13
|
+
const publicKey = await provider.importPublicKey(didToPublicKey(did).publicKeyBytes);
|
|
14
|
+
return await provider.verify(publicKey, base64UrlDecode(sig), data);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The client side.
|
|
22
|
+
* @param spaceId The space — bound into every signature, so a proof for one space is useless in another
|
|
23
|
+
* @param session This side's DID and the key it names
|
|
24
|
+
* @param readKey In a private space, the space's read key (`deriveReadKey`); null in a public one
|
|
25
|
+
*/
|
|
26
|
+
export function createClientAuth(spaceId, session, readKey, provider) {
|
|
27
|
+
return Object.freeze({
|
|
28
|
+
async hello(clientDid, nodeDid, nodeNonce) {
|
|
29
|
+
const label = helloLabel(spaceId, clientDid, nodeDid, nodeNonce);
|
|
30
|
+
const sig = base64UrlEncode(await provider.sign(session.key, label));
|
|
31
|
+
return readKey ? { sig, read: base64UrlEncode(await provider.sign(readKey.privateKey, label)) } : { sig };
|
|
32
|
+
},
|
|
33
|
+
checkWelcome(nodeDid, clientNonce, sig) {
|
|
34
|
+
return verifyBy(provider, nodeDid, sig, welcomeLabel(spaceId, nodeDid, clientNonce));
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* The node side. Holds no secret of the space's.
|
|
40
|
+
* @param readKey In a private space, its public read key, from the space itself; null in a public one
|
|
41
|
+
* @param nodeKey The private key of the DID the node introduces itself as
|
|
42
|
+
*/
|
|
43
|
+
export function createServerAuth(spaceId, readKey, nodeKey, provider) {
|
|
44
|
+
return Object.freeze({
|
|
45
|
+
async checkHello(clientDid, nodeDid, nodeNonce, proof) {
|
|
46
|
+
const { sig, read } = (proof ?? {});
|
|
47
|
+
const label = helloLabel(spaceId, clientDid, nodeDid, nodeNonce);
|
|
48
|
+
if (!clientDid.startsWith('did:key:') || !(await verifyBy(provider, clientDid, sig, label)))
|
|
49
|
+
return false;
|
|
50
|
+
return readKey ? verifyBy(provider, readKey, read, label) : true;
|
|
51
|
+
},
|
|
52
|
+
async welcome(nodeDid, clientNonce) {
|
|
53
|
+
return base64UrlEncode(await provider.sign(nodeKey, welcomeLabel(spaceId, nodeDid, clientNonce)));
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
const meshLabel = (spaceId, prover, verifier, nonce, proverCert, verifierCert) => utf8Encode(`weave-mesh/v1|${spaceId}|${prover}|${verifier}|${nonce}|${proverCert}|${verifierCert}`);
|
|
58
|
+
/**
|
|
59
|
+
* One side of the handshake between peers.
|
|
60
|
+
* @param spaceId The space — bound into every proof
|
|
61
|
+
* @param session This side's DID and the key it names
|
|
62
|
+
* @param read In a private space: the read key to prove with, and the public half the space names to check others against
|
|
63
|
+
*/
|
|
64
|
+
export function createMeshAuth(spaceId, session, read, provider) {
|
|
65
|
+
return Object.freeze({
|
|
66
|
+
async prove(peerDid, peerNonce, binding) {
|
|
67
|
+
const label = meshLabel(spaceId, session.did, peerDid, peerNonce, binding?.local ?? '', binding?.remote ?? '');
|
|
68
|
+
const sig = base64UrlEncode(await provider.sign(session.key, label));
|
|
69
|
+
if (!read)
|
|
70
|
+
return { sig };
|
|
71
|
+
// A node without the space's key cannot prove it may read — and should not be served.
|
|
72
|
+
if (!read.key)
|
|
73
|
+
throw new Error('This node cannot read the space, so it cannot join its peers');
|
|
74
|
+
return { sig, read: base64UrlEncode(await provider.sign(read.key.privateKey, label)) };
|
|
75
|
+
},
|
|
76
|
+
async check(peerDid, ourNonce, binding, proof) {
|
|
77
|
+
const { sig, read: readSig } = (proof ?? {});
|
|
78
|
+
// What they signed, seen from this end: their certificate is our remote one.
|
|
79
|
+
const label = meshLabel(spaceId, peerDid, session.did, ourNonce, binding?.remote ?? '', binding?.local ?? '');
|
|
80
|
+
if (!peerDid.startsWith('did:key:') || !(await verifyBy(provider, peerDid, sig, label)))
|
|
81
|
+
return false;
|
|
82
|
+
return read ? verifyBy(provider, read.publicDid, readSig, label) : true;
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=peer-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peer-auth.js","sourceRoot":"","sources":["../../src/network/peer-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview WebRTC data channel transport management.
|
|
3
|
+
*/
|
|
4
|
+
import type { PeerTransportEvents, SignalledTransport } from './transport.js';
|
|
5
|
+
export interface RTCTransportConfig {
|
|
6
|
+
readonly iceServers?: ReadonlyArray<RTCIceServer>;
|
|
7
|
+
}
|
|
8
|
+
export type RTCTransportEvents = PeerTransportEvents;
|
|
9
|
+
/** WebRTC data channels: a transport whose connections start with an offer. */
|
|
10
|
+
export type RTCTransport = SignalledTransport;
|
|
11
|
+
/**
|
|
12
|
+
* Creates a new WebRTC transport manager.
|
|
13
|
+
*
|
|
14
|
+
* @param config - Optional configuration for ICE servers.
|
|
15
|
+
* @returns The RTC transport instance.
|
|
16
|
+
*/
|
|
17
|
+
export declare function createRTCTransport(config?: RTCTransportConfig): RTCTransport;
|
|
18
|
+
//# sourceMappingURL=rtc-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rtc-transport.d.ts","sourceRoot":"","sources":["../../src/network/rtc-transport.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAiB,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAG7F,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;CACnD;AAED,MAAM,MAAM,kBAAkB,GAAG,mBAAmB,CAAC;AAErD,+EAA+E;AAC/E,MAAM,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAkB9C;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,YAAY,CAuJ5E"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview WebRTC data channel transport management.
|
|
3
|
+
*/
|
|
4
|
+
import { createEmitter } from '../utils/events.js';
|
|
5
|
+
/** The DTLS certificate fingerprint a session description commits to */
|
|
6
|
+
function fingerprintOf(description) {
|
|
7
|
+
const match = description?.sdp?.match(/^a=fingerprint:\s*(\S+)\s+(\S+)/im);
|
|
8
|
+
return match ? `${match[1].toLowerCase()} ${match[2].toUpperCase()}` : null;
|
|
9
|
+
}
|
|
10
|
+
const DEFAULT_ICE_SERVERS = [
|
|
11
|
+
{ urls: 'stun:stun.l.google.com:19302' },
|
|
12
|
+
{ urls: 'stun:stun1.l.google.com:19302' }
|
|
13
|
+
];
|
|
14
|
+
/**
|
|
15
|
+
* Creates a new WebRTC transport manager.
|
|
16
|
+
*
|
|
17
|
+
* @param config - Optional configuration for ICE servers.
|
|
18
|
+
* @returns The RTC transport instance.
|
|
19
|
+
*/
|
|
20
|
+
export function createRTCTransport(config) {
|
|
21
|
+
const iceServers = config?.iceServers ?? DEFAULT_ICE_SERVERS;
|
|
22
|
+
const connections = new Map();
|
|
23
|
+
const { on, off, emit } = createEmitter();
|
|
24
|
+
const setupDataChannel = (peerId, channel) => {
|
|
25
|
+
channel.binaryType = 'arraybuffer';
|
|
26
|
+
channel.onopen = () => {
|
|
27
|
+
emit('connected', peerId);
|
|
28
|
+
};
|
|
29
|
+
channel.onclose = () => {
|
|
30
|
+
emit('disconnected', peerId);
|
|
31
|
+
close(peerId);
|
|
32
|
+
};
|
|
33
|
+
channel.onerror = (ev) => {
|
|
34
|
+
const errEvent = ev;
|
|
35
|
+
emit('error', peerId, errEvent.error || new Error('Data channel error'));
|
|
36
|
+
};
|
|
37
|
+
channel.onmessage = (event) => {
|
|
38
|
+
if (event.data instanceof ArrayBuffer) {
|
|
39
|
+
emit('data', peerId, new Uint8Array(event.data));
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
// Handle other types if necessary, though we strictly use arraybuffer
|
|
43
|
+
console.warn('Received non-ArrayBuffer data on RTC channel');
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
const createConnection = (peerId, onCandidate) => {
|
|
48
|
+
if (connections.has(peerId)) {
|
|
49
|
+
close(peerId);
|
|
50
|
+
}
|
|
51
|
+
const connection = new RTCPeerConnection({ iceServers: [...iceServers] });
|
|
52
|
+
connections.set(peerId, { connection, channel: null });
|
|
53
|
+
// Attached before any description is set, so no candidate can be missed.
|
|
54
|
+
connection.onicecandidate = (event) => {
|
|
55
|
+
if (event.candidate)
|
|
56
|
+
onCandidate(event.candidate.toJSON());
|
|
57
|
+
};
|
|
58
|
+
connection.onconnectionstatechange = () => {
|
|
59
|
+
if (connection.connectionState === 'failed' || connection.connectionState === 'closed') {
|
|
60
|
+
emit('disconnected', peerId);
|
|
61
|
+
close(peerId);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
return connection;
|
|
65
|
+
};
|
|
66
|
+
const createOffer = async (peerId, onCandidate) => {
|
|
67
|
+
const connection = createConnection(peerId, onCandidate);
|
|
68
|
+
const channel = connection.createDataChannel('data', { ordered: true });
|
|
69
|
+
setupDataChannel(peerId, channel);
|
|
70
|
+
const peerData = connections.get(peerId);
|
|
71
|
+
if (peerData) {
|
|
72
|
+
peerData.channel = channel;
|
|
73
|
+
}
|
|
74
|
+
const offer = await connection.createOffer();
|
|
75
|
+
await connection.setLocalDescription(offer);
|
|
76
|
+
return offer;
|
|
77
|
+
};
|
|
78
|
+
const handleOffer = async (peerId, offer, onCandidate) => {
|
|
79
|
+
const connection = createConnection(peerId, onCandidate);
|
|
80
|
+
connection.ondatachannel = (event) => {
|
|
81
|
+
const channel = event.channel;
|
|
82
|
+
setupDataChannel(peerId, channel);
|
|
83
|
+
const peerData = connections.get(peerId);
|
|
84
|
+
if (peerData) {
|
|
85
|
+
peerData.channel = channel;
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
await connection.setRemoteDescription(offer);
|
|
89
|
+
const answer = await connection.createAnswer();
|
|
90
|
+
await connection.setLocalDescription(answer);
|
|
91
|
+
return answer;
|
|
92
|
+
};
|
|
93
|
+
const handleAnswer = async (peerId, answer) => {
|
|
94
|
+
const peerData = connections.get(peerId);
|
|
95
|
+
if (!peerData) {
|
|
96
|
+
throw new Error(`No connection found for peer ${peerId}`);
|
|
97
|
+
}
|
|
98
|
+
await peerData.connection.setRemoteDescription(answer);
|
|
99
|
+
};
|
|
100
|
+
const addIceCandidate = async (peerId, candidate) => {
|
|
101
|
+
const peerData = connections.get(peerId);
|
|
102
|
+
if (!peerData) {
|
|
103
|
+
throw new Error(`No connection found for peer ${peerId}`);
|
|
104
|
+
}
|
|
105
|
+
await peerData.connection.addIceCandidate(candidate);
|
|
106
|
+
};
|
|
107
|
+
const send = (peerId, data) => {
|
|
108
|
+
const peerData = connections.get(peerId);
|
|
109
|
+
if (!peerData || !peerData.channel || peerData.channel.readyState !== 'open') {
|
|
110
|
+
throw new Error(`Data channel not open for peer ${peerId}`);
|
|
111
|
+
}
|
|
112
|
+
peerData.channel.send(data.buffer);
|
|
113
|
+
};
|
|
114
|
+
const close = (peerId) => {
|
|
115
|
+
const peerData = connections.get(peerId);
|
|
116
|
+
if (peerData) {
|
|
117
|
+
if (peerData.channel) {
|
|
118
|
+
peerData.channel.close();
|
|
119
|
+
}
|
|
120
|
+
peerData.connection.close();
|
|
121
|
+
connections.delete(peerId);
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
const closeAll = () => {
|
|
125
|
+
const allPeers = Array.from(connections.keys());
|
|
126
|
+
for (const peerId of allPeers) {
|
|
127
|
+
close(peerId);
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
const binding = (peerId) => {
|
|
131
|
+
const connection = connections.get(peerId)?.connection;
|
|
132
|
+
const local = fingerprintOf(connection?.localDescription ?? null);
|
|
133
|
+
const remote = fingerprintOf(connection?.remoteDescription ?? null);
|
|
134
|
+
return local && remote ? { local, remote } : null;
|
|
135
|
+
};
|
|
136
|
+
return Object.freeze({
|
|
137
|
+
createOffer,
|
|
138
|
+
handleOffer,
|
|
139
|
+
handleAnswer,
|
|
140
|
+
addIceCandidate,
|
|
141
|
+
send,
|
|
142
|
+
close,
|
|
143
|
+
closeAll,
|
|
144
|
+
binding,
|
|
145
|
+
on,
|
|
146
|
+
off
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=rtc-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rtc-transport.js","sourceRoot":"","sources":["../../src/network/rtc-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/** What a peer's connection offer, answer or candidate is */
|
|
2
|
+
export type SignalKind = 'offer' | 'answer' | 'candidate';
|
|
3
|
+
export interface SignalingMessage {
|
|
4
|
+
readonly type: SignalKind | 'join' | 'leave';
|
|
5
|
+
readonly from: string;
|
|
6
|
+
readonly to?: string;
|
|
7
|
+
readonly room?: string;
|
|
8
|
+
readonly payload?: unknown;
|
|
9
|
+
}
|
|
10
|
+
export type SignalingEvents = {
|
|
11
|
+
/** An offer, answer or candidate from a peer */
|
|
12
|
+
signal: (message: SignalingMessage & {
|
|
13
|
+
readonly type: SignalKind;
|
|
14
|
+
}) => void;
|
|
15
|
+
'peer-joined': (did: string, room: string) => void;
|
|
16
|
+
'peer-left': (did: string, room: string) => void;
|
|
17
|
+
connected: () => void;
|
|
18
|
+
disconnected: () => void;
|
|
19
|
+
error: (error: Error) => void;
|
|
20
|
+
};
|
|
21
|
+
export interface SignalingClient {
|
|
22
|
+
readonly connect: () => Promise<void>;
|
|
23
|
+
readonly disconnect: () => void;
|
|
24
|
+
/** Enters a room, now and after every reconnect, and hears who else is there. */
|
|
25
|
+
readonly join: (room: string) => void;
|
|
26
|
+
readonly leave: (room: string) => void;
|
|
27
|
+
readonly signal: (kind: SignalKind, targetDid: string, payload: unknown) => void;
|
|
28
|
+
readonly on: <K extends keyof SignalingEvents>(event: K, callback: SignalingEvents[K]) => void;
|
|
29
|
+
readonly off: <K extends keyof SignalingEvents>(event: K, callback: SignalingEvents[K]) => void;
|
|
30
|
+
readonly isConnected: () => boolean;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Creates a new signaling client.
|
|
34
|
+
*
|
|
35
|
+
* @param url - The relay's WebSocket URL.
|
|
36
|
+
* @param did - The decentralized identifier of this peer.
|
|
37
|
+
* @returns The signaling client instance.
|
|
38
|
+
*/
|
|
39
|
+
export declare function createSignalingClient(url: string, did: string): SignalingClient;
|
|
40
|
+
//# sourceMappingURL=signaling.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signaling.d.ts","sourceRoot":"","sources":["../../src/network/signaling.ts"],"names":[],"mappings":"AAQA,6DAA6D;AAC7D,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE1D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,gDAAgD;IAChD,MAAM,EAAE,CAAC,OAAO,EAAE,gBAAgB,GAAG;QAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;KAAE,KAAK,IAAI,CAAC;IAC5E,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC/B,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC;IAChC,iFAAiF;IACjF,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACjF,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,MAAM,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAC/F,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,SAAS,MAAM,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAChG,QAAQ,CAAC,WAAW,EAAE,MAAM,OAAO,CAAC;CACrC;AAID;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,CA2G/E"}
|