@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 @@
|
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/session/connect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module session/connection
|
|
3
|
+
* An app's side of an account home, as one object any UI can draw — the twin
|
|
4
|
+
* of `createWeaveAuth`, for apps that never sign anyone in themselves.
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* const connection = createWeaveConnection({
|
|
8
|
+
* home: 'https://weave-home.example/connect', // a default; people can bring their own
|
|
9
|
+
* request: { name: 'Todo', access: 'write', scope: 'account' },
|
|
10
|
+
* network: { relays },
|
|
11
|
+
* });
|
|
12
|
+
* button.onclick = () => connection.connect(); // from a click: it opens a popup
|
|
13
|
+
* connection.subscribe(({ status, node }) => …);
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* It remembers the grant between visits and starts the node from it; when the
|
|
17
|
+
* grant runs out it says so (`expired`), and connecting again renews it. When
|
|
18
|
+
* the home disconnects the app, it forgets the grant and says so.
|
|
19
|
+
*
|
|
20
|
+
* The home is the person's, not the app's: `home` is only a default.
|
|
21
|
+
* `connect('weave.example.com')` uses theirs, and it is remembered — for
|
|
22
|
+
* reconnecting, and for linking to their account settings.
|
|
23
|
+
*/
|
|
24
|
+
import type { NodeNetworkConfig, P2PNode } from '../node/types.js';
|
|
25
|
+
import type { StoreFactory } from '../node/stores.js';
|
|
26
|
+
import { type ConnectRequest, type Grant } from './connect.js';
|
|
27
|
+
import type { KeyValueStore } from './stay-signed-in.js';
|
|
28
|
+
export interface WeaveConnectionConfig {
|
|
29
|
+
/** The account home to suggest — the person can use their own instead */
|
|
30
|
+
readonly home: string;
|
|
31
|
+
/** What to ask for */
|
|
32
|
+
readonly request: Omit<ConnectRequest, 'v' | 'audience'>;
|
|
33
|
+
/** Relays and always-on nodes the node connects to. Omit to stay offline. */
|
|
34
|
+
readonly network?: NodeNetworkConfig;
|
|
35
|
+
/** Where the grant is kept. Default `localStorage`. */
|
|
36
|
+
readonly storage?: KeyValueStore | null;
|
|
37
|
+
/** Where the node keeps its data. Default: this site's IndexedDB. */
|
|
38
|
+
readonly stores?: (grant: Grant) => StoreFactory;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* `starting` — looking for a grant from an earlier visit.
|
|
42
|
+
* `disconnected` — none; show a way to connect. `error` says why, when the home disconnected the app.
|
|
43
|
+
* `connecting` — the home is open, waiting on the person.
|
|
44
|
+
* `ready` — `node` acts for the account.
|
|
45
|
+
* `expired` — the grant ran out; connecting again renews it.
|
|
46
|
+
*/
|
|
47
|
+
export type ConnectionStatus = 'starting' | 'disconnected' | 'connecting' | 'ready' | 'expired';
|
|
48
|
+
export interface ConnectionState {
|
|
49
|
+
readonly status: ConnectionStatus;
|
|
50
|
+
/** The home this app connects to: the person's own, once they chose one, else the default */
|
|
51
|
+
readonly home: string;
|
|
52
|
+
readonly grant: Grant | null;
|
|
53
|
+
readonly node: P2PNode | null;
|
|
54
|
+
readonly error: string | null;
|
|
55
|
+
}
|
|
56
|
+
export interface WeaveConnection {
|
|
57
|
+
getState(): ConnectionState;
|
|
58
|
+
subscribe(listener: (state: ConnectionState) => void): () => void;
|
|
59
|
+
/** Picks up a grant from an earlier visit. Safe to call more than once. */
|
|
60
|
+
start(): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Opens the home and asks. Call it from a click.
|
|
63
|
+
* @param home The person's own home — `weave.example.com` is enough. Default: the one in `state.home`.
|
|
64
|
+
*/
|
|
65
|
+
connect(home?: string): Promise<void>;
|
|
66
|
+
/** Forgets the grant and this app's key, and stops the node. The account is untouched. */
|
|
67
|
+
disconnect(): Promise<void>;
|
|
68
|
+
}
|
|
69
|
+
export declare function createWeaveConnection(config: WeaveConnectionConfig): WeaveConnection;
|
|
70
|
+
//# sourceMappingURL=connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/session/connection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAOL,KAAK,cAAc,EACnB,KAAK,KAAK,EACX,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,WAAW,qBAAqB;IACpC,yEAAyE;IACzE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sBAAsB;IACtB,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,GAAG,GAAG,UAAU,CAAC,CAAC;IACzD,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC;IACrC,uDAAuD;IACvD,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACxC,qEAAqE;IACrE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,YAAY,CAAC;CAClD;AAED;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,cAAc,GAAG,YAAY,GAAG,OAAO,GAAG,SAAS,CAAC;AAEhG,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,6FAA6F;IAC7F,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,IAAI,eAAe,CAAC;IAC5B,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAClE,2EAA2E;IAC3E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB;;;OAGG;IACH,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,0FAA0F;IAC1F,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG,eAAe,CAyHpF"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { appKey, connectToHome, homeAddress, forgetAppKey, grantStore, startConnectedNode, } from './connect.js';
|
|
2
|
+
export function createWeaveConnection(config) {
|
|
3
|
+
const storage = config.storage !== undefined ? config.storage : (globalThis.localStorage ?? null);
|
|
4
|
+
const grants = grantStore(storage);
|
|
5
|
+
const HOME = 'weave.home';
|
|
6
|
+
const rememberedHome = (() => {
|
|
7
|
+
try {
|
|
8
|
+
return storage?.getItem(HOME) ?? null;
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
})();
|
|
14
|
+
let state = Object.freeze({
|
|
15
|
+
status: 'starting',
|
|
16
|
+
home: rememberedHome ?? homeAddress(config.home),
|
|
17
|
+
grant: null,
|
|
18
|
+
node: null,
|
|
19
|
+
error: null,
|
|
20
|
+
});
|
|
21
|
+
const listeners = new Set();
|
|
22
|
+
const update = (patch) => {
|
|
23
|
+
state = Object.freeze({ ...state, ...patch });
|
|
24
|
+
for (const listener of listeners)
|
|
25
|
+
listener(state);
|
|
26
|
+
};
|
|
27
|
+
let started = null;
|
|
28
|
+
let expiry = null;
|
|
29
|
+
let unwatch = null;
|
|
30
|
+
/** Forgets the grant and this app's key, and stops the node */
|
|
31
|
+
async function end(error) {
|
|
32
|
+
if (expiry)
|
|
33
|
+
globalThis.clearTimeout(expiry);
|
|
34
|
+
unwatch?.();
|
|
35
|
+
unwatch = null;
|
|
36
|
+
grants.forget();
|
|
37
|
+
const node = state.node;
|
|
38
|
+
update({ status: 'disconnected', grant: null, node: null, error });
|
|
39
|
+
await node?.close();
|
|
40
|
+
await forgetAppKey().catch(() => { });
|
|
41
|
+
}
|
|
42
|
+
async function open(grant) {
|
|
43
|
+
unwatch?.();
|
|
44
|
+
await state.node?.close();
|
|
45
|
+
const node = await startConnectedNode({
|
|
46
|
+
grant,
|
|
47
|
+
key: await appKey(),
|
|
48
|
+
...(config.network ? { network: config.network } : {}),
|
|
49
|
+
...(config.stores ? { stores: config.stores(grant) } : {}),
|
|
50
|
+
});
|
|
51
|
+
update({ status: 'ready', home: grant.home, grant, node, error: null });
|
|
52
|
+
// The home disconnected this app: nothing it writes counts any more, so stop.
|
|
53
|
+
unwatch = node.subscribe((event) => {
|
|
54
|
+
if (event.type === 'revoked' && state.node === node)
|
|
55
|
+
void end('Your account home disconnected this app.');
|
|
56
|
+
});
|
|
57
|
+
// Writes stop working when the note runs out; say so rather than fail quietly.
|
|
58
|
+
if (expiry)
|
|
59
|
+
globalThis.clearTimeout(expiry);
|
|
60
|
+
const left = grant.expiresAt * 1000 - Date.now();
|
|
61
|
+
expiry = globalThis.setTimeout(() => update({ status: 'expired' }), Math.min(left, 2 ** 31 - 1));
|
|
62
|
+
}
|
|
63
|
+
const connection = {
|
|
64
|
+
getState: () => state,
|
|
65
|
+
subscribe(listener) {
|
|
66
|
+
listeners.add(listener);
|
|
67
|
+
return () => listeners.delete(listener);
|
|
68
|
+
},
|
|
69
|
+
start() {
|
|
70
|
+
started ??= (async () => {
|
|
71
|
+
const grant = grants.load();
|
|
72
|
+
if (!grant) {
|
|
73
|
+
update({ status: 'disconnected' });
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
await open(grant);
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
update({ status: 'disconnected', error: error instanceof Error ? error.message : String(error) });
|
|
81
|
+
}
|
|
82
|
+
})();
|
|
83
|
+
return started;
|
|
84
|
+
},
|
|
85
|
+
async connect(home) {
|
|
86
|
+
const was = state.status;
|
|
87
|
+
let address;
|
|
88
|
+
try {
|
|
89
|
+
address = home === undefined ? state.home : homeAddress(home);
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
update({ error: error instanceof Error ? error.message : String(error) });
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
update({ status: 'connecting', error: null });
|
|
96
|
+
try {
|
|
97
|
+
// Nothing awaited before this: the popup must open inside the click.
|
|
98
|
+
const grant = await connectToHome({ home: address, request: config.request });
|
|
99
|
+
grants.save(grant);
|
|
100
|
+
try {
|
|
101
|
+
storage?.setItem(HOME, address);
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// Remembering is a convenience.
|
|
105
|
+
}
|
|
106
|
+
update({ home: address });
|
|
107
|
+
await open(grant);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
update({
|
|
111
|
+
status: was === 'expired' || was === 'ready' ? was : 'disconnected',
|
|
112
|
+
error: error instanceof Error ? error.message : String(error),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
disconnect: () => end(null),
|
|
117
|
+
};
|
|
118
|
+
return connection;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/session/connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module session/credentials
|
|
3
|
+
* Getting a password manager to actually keep something.
|
|
4
|
+
*
|
|
5
|
+
* Managers decide whether to offer saving by guessing, from the shape of a
|
|
6
|
+
* form and from a navigation that usually follows submitting one. A page that
|
|
7
|
+
* submits nothing and never navigates — which is every sign-in form here —
|
|
8
|
+
* often gets no prompt at all, and a field hidden with `display: none` is
|
|
9
|
+
* generally not counted as a username, so hiding one makes the guess worse
|
|
10
|
+
* rather than better.
|
|
11
|
+
*
|
|
12
|
+
* So the forms stay honest — a real username field, visible or at least laid
|
|
13
|
+
* out — and this asks outright as well, where the browser supports being asked.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Offers a credential to the browser's password manager.
|
|
17
|
+
*
|
|
18
|
+
* Best effort by design: Firefox and Safari have no such API, and a manager may
|
|
19
|
+
* decline. The password works either way — this only decides whether the user
|
|
20
|
+
* has to copy it somewhere themselves.
|
|
21
|
+
*
|
|
22
|
+
* @param id What to file it under, which is what the user will see in the vault
|
|
23
|
+
* @param password The secret
|
|
24
|
+
* @param name A longer label, where the manager shows one
|
|
25
|
+
* @returns Whether the browser was asked at all
|
|
26
|
+
*/
|
|
27
|
+
export declare function offerToSave(id: string, password: string, name?: string): Promise<boolean>;
|
|
28
|
+
/**
|
|
29
|
+
* What a password manager should file the account password under.
|
|
30
|
+
*
|
|
31
|
+
* The account's own name, so the vault entry says which account it opens —
|
|
32
|
+
* useful the moment there is more than one.
|
|
33
|
+
*/
|
|
34
|
+
export declare function accountCredentialName(name: string): string;
|
|
35
|
+
/**
|
|
36
|
+
* What a password manager should file a device password under.
|
|
37
|
+
*
|
|
38
|
+
* Deliberately different from {@link accountCredentialName}. They are two
|
|
39
|
+
* different secrets on the same origin: one opens the account anywhere, the
|
|
40
|
+
* other only here. Filed under the same name, a manager would offer whichever
|
|
41
|
+
* it saw last and quietly fill the wrong one.
|
|
42
|
+
*/
|
|
43
|
+
export declare function deviceCredentialName(name: string): string;
|
|
44
|
+
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/session/credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH;;;;;;;;;;;GAWG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAW/F;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module session/credentials
|
|
3
|
+
* Getting a password manager to actually keep something.
|
|
4
|
+
*
|
|
5
|
+
* Managers decide whether to offer saving by guessing, from the shape of a
|
|
6
|
+
* form and from a navigation that usually follows submitting one. A page that
|
|
7
|
+
* submits nothing and never navigates — which is every sign-in form here —
|
|
8
|
+
* often gets no prompt at all, and a field hidden with `display: none` is
|
|
9
|
+
* generally not counted as a username, so hiding one makes the guess worse
|
|
10
|
+
* rather than better.
|
|
11
|
+
*
|
|
12
|
+
* So the forms stay honest — a real username field, visible or at least laid
|
|
13
|
+
* out — and this asks outright as well, where the browser supports being asked.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Offers a credential to the browser's password manager.
|
|
17
|
+
*
|
|
18
|
+
* Best effort by design: Firefox and Safari have no such API, and a manager may
|
|
19
|
+
* decline. The password works either way — this only decides whether the user
|
|
20
|
+
* has to copy it somewhere themselves.
|
|
21
|
+
*
|
|
22
|
+
* @param id What to file it under, which is what the user will see in the vault
|
|
23
|
+
* @param password The secret
|
|
24
|
+
* @param name A longer label, where the manager shows one
|
|
25
|
+
* @returns Whether the browser was asked at all
|
|
26
|
+
*/
|
|
27
|
+
export async function offerToSave(id, password, name) {
|
|
28
|
+
const Ctor = globalThis.PasswordCredential;
|
|
29
|
+
if (!Ctor)
|
|
30
|
+
return false;
|
|
31
|
+
try {
|
|
32
|
+
await globalThis.navigator.credentials.store(new Ctor({ id, password, ...(name ? { name } : {}) }));
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// Declined, or blocked by policy. Not worth surfacing.
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* What a password manager should file the account password under.
|
|
42
|
+
*
|
|
43
|
+
* The account's own name, so the vault entry says which account it opens —
|
|
44
|
+
* useful the moment there is more than one.
|
|
45
|
+
*/
|
|
46
|
+
export function accountCredentialName(name) {
|
|
47
|
+
return name;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* What a password manager should file a device password under.
|
|
51
|
+
*
|
|
52
|
+
* Deliberately different from {@link accountCredentialName}. They are two
|
|
53
|
+
* different secrets on the same origin: one opens the account anywhere, the
|
|
54
|
+
* other only here. Filed under the same name, a manager would offer whichever
|
|
55
|
+
* it saw last and quietly fill the wrong one.
|
|
56
|
+
*/
|
|
57
|
+
export function deviceCredentialName(name) {
|
|
58
|
+
return `${name} (this device)`;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/session/credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAAU,EAAE,QAAgB,EAAE,IAAa;IAC3E,MAAM,IAAI,GAAI,UAAqE,CAAC,kBAAkB,CAAC;IACvG,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IAExB,IAAI,CAAC;QACH,MAAM,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACpG,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,uDAAuD;QACvD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,GAAG,IAAI,gBAAgB,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module session
|
|
3
|
+
* Signing in and staying signed in, with no framework: the flow as state and
|
|
4
|
+
* actions (`createWeaveAuth`), and the pieces it is made of.
|
|
5
|
+
*
|
|
6
|
+
* Browser-only — it reaches for IndexedDB, WebAuthn and the File System Access
|
|
7
|
+
* API when used — so it lives on its own entry point, away from the
|
|
8
|
+
* isomorphic core.
|
|
9
|
+
*/
|
|
10
|
+
export { createWeaveAuth } from './auth.js';
|
|
11
|
+
export type { WeaveAuth, WeaveAuthConfig, AuthState, AuthStage, AuthError, AccountEntry, WeaveSession, MovedToPod, Connection, GrantChoice, } from './auth.js';
|
|
12
|
+
export { createWeaveConnection } from './connection.js';
|
|
13
|
+
export type { WeaveConnection, WeaveConnectionConfig, ConnectionState, ConnectionStatus } from './connection.js';
|
|
14
|
+
export { connectToHome, connectCarrier, homeAddress, receiveConnectRequest, startConnectedNode, grantSigner, grantStore, grantCapabilities, appKey, forgetAppKey, MAX_GRANT_DAYS, } from './connect.js';
|
|
15
|
+
export type { ConnectRequest, ConnectOptions, Grant, CarryGrant, GrantedSpace, IncomingRequest, AppKey } from './connect.js';
|
|
16
|
+
export { browserPlace, folderPlace, pickPod, rememberPod, recallPod, forgetPod, listAccounts, inspectPod, storesFor, } from './places.js';
|
|
17
|
+
export type { Place, PodContents } from './places.js';
|
|
18
|
+
export { createStaySignedIn, STAY_SIGNED_IN_CHOICES, DEFAULT_STAY_SIGNED_IN } from './stay-signed-in.js';
|
|
19
|
+
export type { StaySignedIn, StaySignedInStore, KeyValueStore } from './stay-signed-in.js';
|
|
20
|
+
export { offerToPhone, collectFromDesktop, readPairingTicket, clearPairingTicket } from './pairing.js';
|
|
21
|
+
export type { PairingStage, PairingOffer } from './pairing.js';
|
|
22
|
+
export { offerAgentLink, acceptAgentLink, checkAgentGrant, newAgentCode, readAgentCode } from './agent-link.js';
|
|
23
|
+
export type { AgentLinkStage, AgentLinkOffer, AgentAsking } from './agent-link.js';
|
|
24
|
+
export { offerToSave, accountCredentialName, deviceCredentialName } from './credentials.js';
|
|
25
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,YAAY,EACV,SAAS,EACT,eAAe,EACf,SAAS,EACT,SAAS,EACT,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,UAAU,EACV,WAAW,GACZ,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,YAAY,EAAE,eAAe,EAAE,qBAAqB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACjH,OAAO,EACL,aAAa,EACb,cAAc,EACd,WAAW,EACX,qBAAqB,EACrB,kBAAkB,EAClB,WAAW,EACX,UAAU,EACV,iBAAiB,EACjB,MAAM,EACN,YAAY,EACZ,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC7H,OAAO,EACL,YAAY,EACZ,WAAW,EACX,OAAO,EACP,WAAW,EACX,SAAS,EACT,SAAS,EACT,YAAY,EACZ,UAAU,EACV,SAAS,GACV,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AACzG,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC1F,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvG,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChH,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module session
|
|
3
|
+
* Signing in and staying signed in, with no framework: the flow as state and
|
|
4
|
+
* actions (`createWeaveAuth`), and the pieces it is made of.
|
|
5
|
+
*
|
|
6
|
+
* Browser-only — it reaches for IndexedDB, WebAuthn and the File System Access
|
|
7
|
+
* API when used — so it lives on its own entry point, away from the
|
|
8
|
+
* isomorphic core.
|
|
9
|
+
*/
|
|
10
|
+
export { createWeaveAuth } from './auth.js';
|
|
11
|
+
export { createWeaveConnection } from './connection.js';
|
|
12
|
+
export { connectToHome, connectCarrier, homeAddress, receiveConnectRequest, startConnectedNode, grantSigner, grantStore, grantCapabilities, appKey, forgetAppKey, MAX_GRANT_DAYS, } from './connect.js';
|
|
13
|
+
export { browserPlace, folderPlace, pickPod, rememberPod, recallPod, forgetPod, listAccounts, inspectPod, storesFor, } from './places.js';
|
|
14
|
+
export { createStaySignedIn, STAY_SIGNED_IN_CHOICES, DEFAULT_STAY_SIGNED_IN } from './stay-signed-in.js';
|
|
15
|
+
export { offerToPhone, collectFromDesktop, readPairingTicket, clearPairingTicket } from './pairing.js';
|
|
16
|
+
export { offerAgentLink, acceptAgentLink, checkAgentGrant, newAgentCode, readAgentCode } from './agent-link.js';
|
|
17
|
+
export { offerToSave, accountCredentialName, deviceCredentialName } from './credentials.js';
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAa5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExD,OAAO,EACL,aAAa,EACb,cAAc,EACd,WAAW,EACX,qBAAqB,EACrB,kBAAkB,EAClB,WAAW,EACX,UAAU,EACV,iBAAiB,EACjB,MAAM,EACN,YAAY,EACZ,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,YAAY,EACZ,WAAW,EACX,OAAO,EACP,WAAW,EACX,SAAS,EACT,SAAS,EACT,YAAY,EACZ,UAAU,EACV,SAAS,GACV,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAEzG,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvG,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhH,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { type PairingTicket } from '../identity/pairing.js';
|
|
2
|
+
import type { P2PNode } from '../node/types.js';
|
|
3
|
+
export type PairingStage = {
|
|
4
|
+
readonly kind: 'waiting';
|
|
5
|
+
} | {
|
|
6
|
+
readonly kind: 'connected';
|
|
7
|
+
} | {
|
|
8
|
+
readonly kind: 'sent';
|
|
9
|
+
readonly spaces: number;
|
|
10
|
+
} | {
|
|
11
|
+
readonly kind: 'received';
|
|
12
|
+
readonly spaces: number;
|
|
13
|
+
} | {
|
|
14
|
+
readonly kind: 'failed';
|
|
15
|
+
readonly reason: string;
|
|
16
|
+
};
|
|
17
|
+
/** A pairing offer the desktop is currently making */
|
|
18
|
+
export interface PairingOffer {
|
|
19
|
+
/** The link the QR code encodes */
|
|
20
|
+
readonly url: string;
|
|
21
|
+
/** Stops listening. The link stops working for anyone still holding it. */
|
|
22
|
+
stop(): void;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Starts offering an account to a phone.
|
|
26
|
+
*
|
|
27
|
+
* @param params.node The signed-in node, whose spaces are handed over
|
|
28
|
+
* @param params.seed The account's seed
|
|
29
|
+
* @param params.relays Relays to meet on; the first goes in the link
|
|
30
|
+
* @param params.link The page the phone should open, without a fragment
|
|
31
|
+
* @param onStage Called as the handover progresses
|
|
32
|
+
* @returns The link to put in a QR code, and a way to stop
|
|
33
|
+
*/
|
|
34
|
+
export declare function offerToPhone(params: {
|
|
35
|
+
node: P2PNode;
|
|
36
|
+
seed: Uint8Array;
|
|
37
|
+
relays: ReadonlyArray<string>;
|
|
38
|
+
link: string;
|
|
39
|
+
}, onStage: (stage: PairingStage) => void): Promise<PairingOffer>;
|
|
40
|
+
/** The pairing link in this page's URL, if the phone arrived from a QR code. */
|
|
41
|
+
export declare function readPairingTicket(): PairingTicket | null;
|
|
42
|
+
/** Drops the pairing link from the address bar once it has been used. */
|
|
43
|
+
export declare function clearPairingTicket(): void;
|
|
44
|
+
/**
|
|
45
|
+
* Collects the spaces from the desktop, having already signed in with the code.
|
|
46
|
+
*
|
|
47
|
+
* Resolves once they have arrived, or after `timeoutMs` with nothing — the
|
|
48
|
+
* desktop may have closed the QR, or the two devices may not be able to reach
|
|
49
|
+
* each other. The identity is already correct either way, so a timeout costs
|
|
50
|
+
* the spaces, not the account.
|
|
51
|
+
*
|
|
52
|
+
* @param node The phone's node, signed in with the ticket's code
|
|
53
|
+
* @param ticket The ticket from the URL
|
|
54
|
+
* @param onStage Called as the handover progresses
|
|
55
|
+
* @param timeoutMs How long to wait for the desktop
|
|
56
|
+
* @returns How many spaces arrived
|
|
57
|
+
*/
|
|
58
|
+
export declare function collectFromDesktop(node: P2PNode, ticket: PairingTicket, onStage: (stage: PairingStage) => void, timeoutMs?: number): Promise<number>;
|
|
59
|
+
//# sourceMappingURL=pairing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pairing.d.ts","sourceRoot":"","sources":["../../src/session/pairing.ts"],"names":[],"mappings":"AAoBA,OAAO,EAOL,KAAK,aAAa,EACnB,MAAM,wBAAwB,CAAC;AAIhC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAUhD,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAC5B;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;CAAE,GAC9B;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD,sDAAsD;AACtD,MAAM,WAAW,YAAY;IAC3B,mCAAmC;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,IAAI,IAAI,IAAI,CAAC;CACd;AAED;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EACxF,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GACrC,OAAO,CAAC,YAAY,CAAC,CAqCvB;AAED,gFAAgF;AAChF,wBAAgB,iBAAiB,IAAI,aAAa,GAAG,IAAI,CAQxD;AAED,yEAAyE;AACzE,wBAAgB,kBAAkB,IAAI,IAAI,CAGzC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,EACtC,SAAS,GAAE,MAAe,GACzB,OAAO,CAAC,MAAM,CAAC,CAiDjB"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module session/pairing
|
|
3
|
+
* Handing an account to a phone.
|
|
4
|
+
*
|
|
5
|
+
* The desktop shows a QR code. The phone's camera reads it — no scanner in the
|
|
6
|
+
* app, because both iOS and Android recognise a URL in a QR natively — and opens
|
|
7
|
+
* a link whose fragment carries the recovery code and the address of the relay.
|
|
8
|
+
*
|
|
9
|
+
* That gets the phone the identity. It still does not know which spaces exist,
|
|
10
|
+
* and it never will from the code alone: a folder is unreadable to it, and the
|
|
11
|
+
* list of spaces plus their keys is far too big for a camera to read reliably.
|
|
12
|
+
* So both sides derive the same private room from the seed, meet there over the
|
|
13
|
+
* ordinary peer connection, and the desktop sends the spaces across encrypted.
|
|
14
|
+
*
|
|
15
|
+
* Afterwards the phone is a full peer. It holds its own replica, syncs with
|
|
16
|
+
* anyone in the space, and never refers to the desktop again — which is the
|
|
17
|
+
* difference between this and the phone-is-the-real-device pairing that
|
|
18
|
+
* messaging apps do.
|
|
19
|
+
*/
|
|
20
|
+
import { createMesh } from '../network/mesh.js';
|
|
21
|
+
import { pairingRoomId, derivePairingKey, encodePairingTicket, decodePairingTicket, sealPairingPayload, openPairingPayload, } from '../identity/pairing.js';
|
|
22
|
+
import { seedToRecoveryCode, recoveryCodeToSeed } from '../identity/recovery-code.js';
|
|
23
|
+
import { utf8Encode, utf8Decode } from '../utils/encoding.js';
|
|
24
|
+
/** The message the desktop sends once the phone turns up */
|
|
25
|
+
const PAIR_MESSAGE = 'pair';
|
|
26
|
+
/**
|
|
27
|
+
* Starts offering an account to a phone.
|
|
28
|
+
*
|
|
29
|
+
* @param params.node The signed-in node, whose spaces are handed over
|
|
30
|
+
* @param params.seed The account's seed
|
|
31
|
+
* @param params.relays Relays to meet on; the first goes in the link
|
|
32
|
+
* @param params.link The page the phone should open, without a fragment
|
|
33
|
+
* @param onStage Called as the handover progresses
|
|
34
|
+
* @returns The link to put in a QR code, and a way to stop
|
|
35
|
+
*/
|
|
36
|
+
export async function offerToPhone(params, onStage) {
|
|
37
|
+
const { node, seed, relays } = params;
|
|
38
|
+
const relay = relays[0];
|
|
39
|
+
if (!relay)
|
|
40
|
+
throw new Error('Pairing needs a relay, and none is configured.');
|
|
41
|
+
const url = `${params.link}#pair=${encodePairingTicket({ v: 1, code: seedToRecoveryCode(seed), relay })}`;
|
|
42
|
+
const key = await derivePairingKey(seed);
|
|
43
|
+
const network = createMesh({ relays, did: node.sessionDid }).join(await pairingRoomId(seed));
|
|
44
|
+
network.on('peer-connected', (peer) => {
|
|
45
|
+
onStage({ kind: 'connected' });
|
|
46
|
+
void (async () => {
|
|
47
|
+
try {
|
|
48
|
+
// Invites already carry everything a peer needs to open a space,
|
|
49
|
+
// including the key for a private one. Pairing is handing over a
|
|
50
|
+
// bundle of them at once.
|
|
51
|
+
const spaces = await node.spaces.list();
|
|
52
|
+
const invites = await Promise.all(spaces.map((space) => node.spaces.invite(space.id)));
|
|
53
|
+
const sealed = await sealPairingPayload(utf8Encode(JSON.stringify({ spaces: invites })), key);
|
|
54
|
+
network.send(peer.did, { type: PAIR_MESSAGE, from: node.sessionDid, payload: Array.from(sealed) });
|
|
55
|
+
onStage({ kind: 'sent', spaces: invites.length });
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
onStage({ kind: 'failed', reason: error instanceof Error ? error.message : 'Handover failed' });
|
|
59
|
+
}
|
|
60
|
+
})();
|
|
61
|
+
});
|
|
62
|
+
network.on('error', () => {
|
|
63
|
+
if (!network.isConnected())
|
|
64
|
+
onStage({ kind: 'failed', reason: 'Could not reach the relay from this page.' });
|
|
65
|
+
});
|
|
66
|
+
onStage({ kind: 'waiting' });
|
|
67
|
+
await network.connect();
|
|
68
|
+
return { url, stop: () => network.disconnect() };
|
|
69
|
+
}
|
|
70
|
+
/** The pairing link in this page's URL, if the phone arrived from a QR code. */
|
|
71
|
+
export function readPairingTicket() {
|
|
72
|
+
const match = /[#&]pair=([^&]+)/.exec(globalThis.location?.hash ?? '');
|
|
73
|
+
if (!match?.[1])
|
|
74
|
+
return null;
|
|
75
|
+
try {
|
|
76
|
+
return decodePairingTicket(match[1]);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/** Drops the pairing link from the address bar once it has been used. */
|
|
83
|
+
export function clearPairingTicket() {
|
|
84
|
+
if (!globalThis.location || !globalThis.history)
|
|
85
|
+
return;
|
|
86
|
+
globalThis.history.replaceState(null, '', globalThis.location.pathname + globalThis.location.search);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Collects the spaces from the desktop, having already signed in with the code.
|
|
90
|
+
*
|
|
91
|
+
* Resolves once they have arrived, or after `timeoutMs` with nothing — the
|
|
92
|
+
* desktop may have closed the QR, or the two devices may not be able to reach
|
|
93
|
+
* each other. The identity is already correct either way, so a timeout costs
|
|
94
|
+
* the spaces, not the account.
|
|
95
|
+
*
|
|
96
|
+
* @param node The phone's node, signed in with the ticket's code
|
|
97
|
+
* @param ticket The ticket from the URL
|
|
98
|
+
* @param onStage Called as the handover progresses
|
|
99
|
+
* @param timeoutMs How long to wait for the desktop
|
|
100
|
+
* @returns How many spaces arrived
|
|
101
|
+
*/
|
|
102
|
+
export async function collectFromDesktop(node, ticket, onStage, timeoutMs = 30_000) {
|
|
103
|
+
const seed = recoveryCodeToSeed(ticket.code);
|
|
104
|
+
const key = await derivePairingKey(seed);
|
|
105
|
+
// The phone uses the relay named in the ticket: it is the one the computer
|
|
106
|
+
// showing the code is definitely on, and the phone has no configuration.
|
|
107
|
+
const network = createMesh({ relays: [ticket.relay], did: node.sessionDid }).join(await pairingRoomId(seed));
|
|
108
|
+
return new Promise((resolve) => {
|
|
109
|
+
let settled = false;
|
|
110
|
+
const finish = (count, stage) => {
|
|
111
|
+
if (settled)
|
|
112
|
+
return;
|
|
113
|
+
settled = true;
|
|
114
|
+
globalThis.clearTimeout(timer);
|
|
115
|
+
network.disconnect();
|
|
116
|
+
onStage(stage);
|
|
117
|
+
resolve(count);
|
|
118
|
+
};
|
|
119
|
+
const timer = globalThis.setTimeout(() => finish(0, {
|
|
120
|
+
kind: 'failed',
|
|
121
|
+
reason: 'The computer did not answer. Check the code is still showing, and that both devices are on the same network.',
|
|
122
|
+
}), timeoutMs);
|
|
123
|
+
network.on('peer-connected', () => onStage({ kind: 'connected' }));
|
|
124
|
+
network.on('message', (message) => {
|
|
125
|
+
if (message.type !== PAIR_MESSAGE || !Array.isArray(message.payload))
|
|
126
|
+
return;
|
|
127
|
+
void (async () => {
|
|
128
|
+
try {
|
|
129
|
+
const opened = await openPairingPayload(new Uint8Array(message.payload), key);
|
|
130
|
+
const { spaces } = JSON.parse(utf8Decode(opened));
|
|
131
|
+
for (const invite of spaces)
|
|
132
|
+
await node.spaces.join(invite);
|
|
133
|
+
finish(spaces.length, { kind: 'received', spaces: spaces.length });
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
finish(0, { kind: 'failed', reason: error instanceof Error ? error.message : 'That handover could not be read.' });
|
|
137
|
+
}
|
|
138
|
+
})();
|
|
139
|
+
});
|
|
140
|
+
onStage({ kind: 'waiting' });
|
|
141
|
+
network.connect().catch(() => finish(0, { kind: 'failed', reason: 'Could not reach the relay from this phone.' }));
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=pairing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pairing.js","sourceRoot":"","sources":["../../src/session/pairing.ts"],"names":[],"mappings":"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"}
|