@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,427 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module elements/weave-auth
|
|
3
|
+
* `<weave-auth>`: the whole sign-in flow as one element.
|
|
4
|
+
*
|
|
5
|
+
* ```html
|
|
6
|
+
* <weave-auth app-name="Todo" relays="wss://relay.example"></weave-auth>
|
|
7
|
+
* <script type="module">
|
|
8
|
+
* import '@weaveprotocol/core/elements';
|
|
9
|
+
* document.querySelector('weave-auth').addEventListener('weave-session', (event) => {
|
|
10
|
+
* const session = event.detail.session; // null when signed out
|
|
11
|
+
* if (session) start(session.node);
|
|
12
|
+
* });
|
|
13
|
+
* </script>
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* Or hand it a flow you made yourself, to share it with the rest of the page:
|
|
17
|
+
* `element.auth = createWeaveAuth({ … })`.
|
|
18
|
+
*
|
|
19
|
+
* It draws into its own light DOM, not a shadow root, on purpose: password
|
|
20
|
+
* managers find and fill forms in the page far more reliably than forms inside
|
|
21
|
+
* a shadow root, and the account password living in a password manager is the
|
|
22
|
+
* point of the whole design. Its styles are scoped to the element instead.
|
|
23
|
+
*
|
|
24
|
+
* It fills whatever box it is put in — a page, a modal, a panel — and draws
|
|
25
|
+
* nothing once signed in; the host decides what happens then.
|
|
26
|
+
*/
|
|
27
|
+
import { createWeaveAuth } from '../session/auth.js';
|
|
28
|
+
import { accountCredentialName, deviceCredentialName, offerToSave } from '../session/credentials.js';
|
|
29
|
+
import { adoptStyles, h, svg } from './dom.js';
|
|
30
|
+
import { AUTH_CSS } from './auth-styles.js';
|
|
31
|
+
const Base = (globalThis.HTMLElement ?? class {
|
|
32
|
+
});
|
|
33
|
+
/** The mark and the name, above every step */
|
|
34
|
+
function wordmark() {
|
|
35
|
+
return h('div', { class: 'wa-wordmark' }, svg('<svg width="20" height="20" viewBox="0 0 20 20" aria-hidden="true"><path d="M2 5 L7 15 L10 8 L13 15 L18 5" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linejoin="round" stroke-linecap="round"/></svg>'), 'Weave');
|
|
36
|
+
}
|
|
37
|
+
/** A small deterministic hash, enough to seed a 5×5 pattern and a hue. */
|
|
38
|
+
function hash(text) {
|
|
39
|
+
let value = 2166136261;
|
|
40
|
+
for (let i = 0; i < text.length; i++) {
|
|
41
|
+
value ^= text.charCodeAt(i);
|
|
42
|
+
value = Math.imul(value, 16777619);
|
|
43
|
+
}
|
|
44
|
+
return value >>> 0;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* A visual fingerprint for an account, derived from its DID — the same
|
|
48
|
+
* everywhere it appears, so a wrong account is obvious before its name is read.
|
|
49
|
+
*/
|
|
50
|
+
function avatar(did, size = 32) {
|
|
51
|
+
const seed = hash(did);
|
|
52
|
+
const hue = seed % 360;
|
|
53
|
+
const cells = [];
|
|
54
|
+
for (let x = 0; x < 3; x++) {
|
|
55
|
+
for (let y = 0; y < 5; y++) {
|
|
56
|
+
if (((seed >> (x * 5 + y)) & 1) === 0)
|
|
57
|
+
continue;
|
|
58
|
+
cells.push(`<rect x="${x}" y="${y}" width="1" height="1"/>`);
|
|
59
|
+
if (x < 2)
|
|
60
|
+
cells.push(`<rect x="${4 - x}" y="${y}" width="1" height="1"/>`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return svg(`<svg class="wa-avatar" width="${size}" height="${size}" viewBox="0 0 5 5" role="img" aria-label="Account avatar" style="background:hsl(${hue} 46% 92%)"><g fill="hsl(${hue} 62% 48%)">${cells.join('')}</g></svg>`);
|
|
64
|
+
}
|
|
65
|
+
/** An explanation, folded away until asked for. */
|
|
66
|
+
function info(label, ...text) {
|
|
67
|
+
const popover = h('span', { class: 'wa-popover', role: 'note', hidden: true }, ...text);
|
|
68
|
+
const button = h('button', {
|
|
69
|
+
type: 'button',
|
|
70
|
+
class: 'wa-info-button',
|
|
71
|
+
'aria-label': label,
|
|
72
|
+
'aria-expanded': 'false',
|
|
73
|
+
onclick: () => {
|
|
74
|
+
popover.hidden = !popover.hidden;
|
|
75
|
+
button.setAttribute('aria-expanded', String(!popover.hidden));
|
|
76
|
+
},
|
|
77
|
+
onkeydown: (event) => {
|
|
78
|
+
if (event.key === 'Escape')
|
|
79
|
+
popover.hidden = true;
|
|
80
|
+
},
|
|
81
|
+
}, 'i');
|
|
82
|
+
return h('span', { class: 'wa-info' }, button, popover);
|
|
83
|
+
}
|
|
84
|
+
function errorBox(error) {
|
|
85
|
+
if (!error)
|
|
86
|
+
return null;
|
|
87
|
+
return h('div', { class: 'wa-error-box', role: 'alert' }, h('p', { class: 'wa-error' }, error.message), error.hint ? h('p', { class: 'wa-small' }, error.hint) : null);
|
|
88
|
+
}
|
|
89
|
+
function option(title, text, onclick, disabled, recommended = false) {
|
|
90
|
+
return h('button', { type: 'button', class: 'wa-option', onclick, disabled }, h('span', { class: 'wa-option-title' }, title, recommended ? h('span', { class: 'wa-badge' }, 'Recommended') : null), h('span', { class: 'wa-option-text' }, text));
|
|
91
|
+
}
|
|
92
|
+
function link(text, onclick, disabled = false) {
|
|
93
|
+
return h('button', { type: 'button', class: 'wa-link', onclick, disabled }, text);
|
|
94
|
+
}
|
|
95
|
+
function describePairing(stage) {
|
|
96
|
+
switch (stage.kind) {
|
|
97
|
+
case 'waiting':
|
|
98
|
+
return 'Looking for your computer…';
|
|
99
|
+
case 'connected':
|
|
100
|
+
return 'Found it. Collecting your spaces…';
|
|
101
|
+
case 'received':
|
|
102
|
+
return stage.spaces === 1 ? 'Got 1 space.' : `Got ${stage.spaces} spaces.`;
|
|
103
|
+
case 'sent':
|
|
104
|
+
return 'Done.';
|
|
105
|
+
case 'failed':
|
|
106
|
+
return stage.reason;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
export class WeaveAuthElement extends Base {
|
|
110
|
+
#auth = null;
|
|
111
|
+
#unsubscribe = null;
|
|
112
|
+
#announced = undefined;
|
|
113
|
+
// What only this element cares about: which fold is open, what is typed.
|
|
114
|
+
#drafts = new Map();
|
|
115
|
+
#showCode = false;
|
|
116
|
+
#filledAs = '';
|
|
117
|
+
#copied = false;
|
|
118
|
+
#lastSelected = null;
|
|
119
|
+
/** The flow this element draws. Set it to share one with the rest of the page; otherwise one is made from the attributes. */
|
|
120
|
+
get auth() {
|
|
121
|
+
this.#auth ??= createWeaveAuth({
|
|
122
|
+
...(this.getAttribute('app-name') ? { appName: this.getAttribute('app-name') } : {}),
|
|
123
|
+
network: {
|
|
124
|
+
relays: (this.getAttribute('relays') ?? '').split(',').map((url) => url.trim()).filter(Boolean),
|
|
125
|
+
nodes: (this.getAttribute('nodes') ?? '').split(',').map((url) => url.trim()).filter(Boolean),
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
return this.#auth;
|
|
129
|
+
}
|
|
130
|
+
set auth(auth) {
|
|
131
|
+
if (auth === this.#auth)
|
|
132
|
+
return;
|
|
133
|
+
this.#auth = auth;
|
|
134
|
+
if (this.isConnected)
|
|
135
|
+
this.#follow();
|
|
136
|
+
}
|
|
137
|
+
connectedCallback() {
|
|
138
|
+
adoptStyles('weave-auth', AUTH_CSS);
|
|
139
|
+
if (this.#auth) {
|
|
140
|
+
this.#follow();
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
// A framework may set `auth` just after inserting the element; wait a
|
|
144
|
+
// moment before making one from the attributes instead.
|
|
145
|
+
queueMicrotask(() => {
|
|
146
|
+
if (this.isConnected && !this.#unsubscribe)
|
|
147
|
+
this.#follow();
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
disconnectedCallback() {
|
|
151
|
+
this.#unsubscribe?.();
|
|
152
|
+
this.#unsubscribe = null;
|
|
153
|
+
}
|
|
154
|
+
#follow() {
|
|
155
|
+
this.#unsubscribe?.();
|
|
156
|
+
const auth = this.auth;
|
|
157
|
+
this.#unsubscribe = auth.subscribe((state) => this.#changed(state));
|
|
158
|
+
this.#changed(auth.getState());
|
|
159
|
+
void auth.start();
|
|
160
|
+
}
|
|
161
|
+
#changed(state) {
|
|
162
|
+
// A new account row, or a new screen, starts with empty fields.
|
|
163
|
+
if (state.selectedId !== this.#lastSelected) {
|
|
164
|
+
this.#lastSelected = state.selectedId;
|
|
165
|
+
this.#reset();
|
|
166
|
+
}
|
|
167
|
+
this.#render(state);
|
|
168
|
+
const session = state.stage === 'ready' ? state.session : null;
|
|
169
|
+
if (session !== this.#announced) {
|
|
170
|
+
this.#announced = session;
|
|
171
|
+
this.dispatchEvent(new CustomEvent('weave-session', { detail: { session }, bubbles: true, composed: true }));
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
#reset() {
|
|
175
|
+
this.#drafts.clear();
|
|
176
|
+
this.#showCode = false;
|
|
177
|
+
this.#filledAs = '';
|
|
178
|
+
}
|
|
179
|
+
/** Redraws, keeping focus and what was typed. */
|
|
180
|
+
#render(state) {
|
|
181
|
+
const focused = this.contains(globalThis.document.activeElement)
|
|
182
|
+
? globalThis.document.activeElement.dataset.key
|
|
183
|
+
: undefined;
|
|
184
|
+
this.replaceChildren(...this.#screen(state));
|
|
185
|
+
const again = focused
|
|
186
|
+
? this.querySelector(`[data-key="${focused}"]`)
|
|
187
|
+
: this.querySelector('[autofocus]');
|
|
188
|
+
again?.focus();
|
|
189
|
+
}
|
|
190
|
+
/** An input that survives a redraw */
|
|
191
|
+
#input(key, props) {
|
|
192
|
+
return h('input', {
|
|
193
|
+
...props,
|
|
194
|
+
'data-key': key,
|
|
195
|
+
value: this.#drafts.get(key) ?? props.value ?? '',
|
|
196
|
+
oninput: (event) => this.#drafts.set(key, event.target.value),
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
#screen(state) {
|
|
200
|
+
if (state.stage === 'ready')
|
|
201
|
+
return [];
|
|
202
|
+
if (state.stage === 'starting')
|
|
203
|
+
return [h('div', { class: 'wa-card' }, h('p', { class: 'wa-hint' }, 'Looking for your accounts…'))];
|
|
204
|
+
if (state.stage === 'pair')
|
|
205
|
+
return [this.#pair(state)];
|
|
206
|
+
if (state.stage === 'create')
|
|
207
|
+
return [state.freshCode ? this.#saveCode(state, state.freshCode) : this.#create(state)];
|
|
208
|
+
if (state.stage === 'where')
|
|
209
|
+
return [this.#where(state)];
|
|
210
|
+
if (state.stage === 'welcome')
|
|
211
|
+
return [this.#welcome(state)];
|
|
212
|
+
return [this.#signIn(state)];
|
|
213
|
+
}
|
|
214
|
+
// ─── Where should your data live ───────────────────────────────────
|
|
215
|
+
#where(state) {
|
|
216
|
+
const auth = this.auth;
|
|
217
|
+
return h('div', { class: 'wa-card' }, wordmark(), h('h1', { class: 'wa-title' }, 'Where should your data live?'), h('p', { class: 'wa-subtitle' }, 'You can change this later.'), h('div', { class: 'wa-options' }, option('Choose a pod', 'A folder on your computer that holds your Weave data. Every app you open it in sees the same account and the same spaces.', () => void auth.choosePod(), state.busy, true), option('Continue in this browser', "Nothing to set up. Your data syncs with your other devices, but other apps on other addresses can't open it.", () => void auth.useBrowser(), state.busy)), h('p', { class: 'wa-small', style: 'margin-top:16px' }, 'Your browser will ask to see the folder, then to save into it.', info('Why a pod', 'Your data becomes yours the way any other file is: copy it, back it up, or put the folder in iCloud or Dropbox and your devices stay in step with no server involved. It is also the only storage a second app on a different address can read.')), errorBox(state.error));
|
|
218
|
+
}
|
|
219
|
+
#placeLine(state) {
|
|
220
|
+
const place = state.place;
|
|
221
|
+
if (!place)
|
|
222
|
+
return null;
|
|
223
|
+
return h('p', { class: 'wa-small', style: 'margin-top:24px' }, place.kind === 'folder' ? `Pod: ${place.directory?.name ?? 'your folder'}` : 'Stored in this browser', state.folderAvailable ? [' · ', link('Change', () => this.auth.changeStorage(), state.busy)] : null);
|
|
224
|
+
}
|
|
225
|
+
// ─── New here, or not ──────────────────────────────────────────────
|
|
226
|
+
#welcome(state) {
|
|
227
|
+
const auth = this.auth;
|
|
228
|
+
return h('div', { class: 'wa-card' }, wordmark(), h('h1', { class: 'wa-title' }, 'Do you have a Weave account?'), h('p', { class: 'wa-subtitle' }, 'One account works in every Weave app.'), h('div', { class: 'wa-options' }, option('Create a new account', "We'll make you a strong password to save in your password manager.", () => auth.startCreating(), state.busy), option('I already have one', 'Sign in with the account password you saved when you made it.', () => auth.showSignIn(), state.busy)), errorBox(state.error), this.#placeLine(state));
|
|
229
|
+
}
|
|
230
|
+
// ─── Choosing an account, and getting in ───────────────────────────
|
|
231
|
+
/**
|
|
232
|
+
* The account-password form.
|
|
233
|
+
*
|
|
234
|
+
* The username field is off-screen, but deliberately not `display: none` —
|
|
235
|
+
* a field taken out of the layout is not counted as a username, while one
|
|
236
|
+
* merely moved out of view is filled normally. And writable: a manager fills
|
|
237
|
+
* the whole credential at once, so a read-only username keeps showing the
|
|
238
|
+
* account that was clicked while the password quietly belongs to another.
|
|
239
|
+
* Letting it be overwritten is what makes the mismatch detectable.
|
|
240
|
+
*/
|
|
241
|
+
#codeForm(state, selected) {
|
|
242
|
+
const username = h('input', {
|
|
243
|
+
type: 'text',
|
|
244
|
+
name: 'username',
|
|
245
|
+
autocomplete: 'username',
|
|
246
|
+
value: accountCredentialName(selected?.name ?? 'My account'),
|
|
247
|
+
class: 'wa-offscreen',
|
|
248
|
+
tabindex: '-1',
|
|
249
|
+
'aria-hidden': 'true',
|
|
250
|
+
});
|
|
251
|
+
const password = this.#input('code', {
|
|
252
|
+
type: 'password',
|
|
253
|
+
name: 'password',
|
|
254
|
+
placeholder: 'Your account password',
|
|
255
|
+
autocomplete: 'current-password',
|
|
256
|
+
spellcheck: 'false',
|
|
257
|
+
'aria-label': 'Account password',
|
|
258
|
+
disabled: state.busy,
|
|
259
|
+
});
|
|
260
|
+
// Autofill sets the DOM value directly; read what it filled as well.
|
|
261
|
+
password.addEventListener('input', () => {
|
|
262
|
+
const filled = username.value.trim();
|
|
263
|
+
if (filled !== this.#filledAs) {
|
|
264
|
+
this.#filledAs = filled;
|
|
265
|
+
this.#render(this.auth.getState());
|
|
266
|
+
}
|
|
267
|
+
});
|
|
268
|
+
return h('form', {
|
|
269
|
+
class: 'wa-form',
|
|
270
|
+
onsubmit: (event) => {
|
|
271
|
+
event.preventDefault();
|
|
272
|
+
const code = password.value.trim();
|
|
273
|
+
if (code)
|
|
274
|
+
void this.auth.signInWithCode(code);
|
|
275
|
+
},
|
|
276
|
+
}, username, password, h('button', { type: 'submit', class: 'wa-button', disabled: state.busy }, state.busy ? 'Signing in…' : 'Sign in'));
|
|
277
|
+
}
|
|
278
|
+
#signIn(state) {
|
|
279
|
+
const auth = this.auth;
|
|
280
|
+
const { accounts, entry, place } = state;
|
|
281
|
+
const selected = accounts.find((account) => account.id === state.selectedId) ?? null;
|
|
282
|
+
const rows = accounts.map((account) => {
|
|
283
|
+
const isSelected = account.id === state.selectedId;
|
|
284
|
+
const body = [];
|
|
285
|
+
if (isSelected && entry) {
|
|
286
|
+
const hasShortcut = entry.shortcuts.length > 0;
|
|
287
|
+
const needsCode = this.#showCode || (!hasShortcut && !entry.hasPassword);
|
|
288
|
+
// An account with wraps, none of them usable here, has been used on
|
|
289
|
+
// another site — a passkey works on one web address only.
|
|
290
|
+
const seenElsewhere = entry.vault.wraps.length > 0;
|
|
291
|
+
if (hasShortcut && !this.#showCode) {
|
|
292
|
+
body.push(h('button', { type: 'button', class: 'wa-button', 'data-key': 'passkey', disabled: state.busy, onclick: () => void auth.signInWithPasskey() }, state.busy ? 'Waiting…' : 'Unlock with passkey'));
|
|
293
|
+
}
|
|
294
|
+
if (entry.hasPassword && !this.#showCode) {
|
|
295
|
+
const devicePassword = this.#input('device-password', {
|
|
296
|
+
type: 'password',
|
|
297
|
+
name: 'password',
|
|
298
|
+
placeholder: 'Password on this device',
|
|
299
|
+
autocomplete: 'current-password',
|
|
300
|
+
'aria-label': 'Device password',
|
|
301
|
+
disabled: state.busy,
|
|
302
|
+
});
|
|
303
|
+
body.push(h('form', {
|
|
304
|
+
class: 'wa-form',
|
|
305
|
+
style: hasShortcut ? 'margin-top:10px' : '',
|
|
306
|
+
onsubmit: (event) => {
|
|
307
|
+
event.preventDefault();
|
|
308
|
+
if (devicePassword.value)
|
|
309
|
+
void auth.signInWithPassword(devicePassword.value);
|
|
310
|
+
},
|
|
311
|
+
}, h('input', {
|
|
312
|
+
type: 'text',
|
|
313
|
+
name: 'username',
|
|
314
|
+
autocomplete: 'username',
|
|
315
|
+
value: deviceCredentialName(account.name),
|
|
316
|
+
readonly: true,
|
|
317
|
+
class: 'wa-offscreen',
|
|
318
|
+
tabindex: '-1',
|
|
319
|
+
'aria-hidden': 'true',
|
|
320
|
+
}), devicePassword, h('button', { type: 'submit', class: 'wa-button', disabled: state.busy }, 'Unlock')));
|
|
321
|
+
}
|
|
322
|
+
if (needsCode) {
|
|
323
|
+
if (!hasShortcut && !entry.hasPassword) {
|
|
324
|
+
body.push(h('p', { class: 'wa-small', style: 'margin:0 0 10px' }, seenElsewhere ? 'New to this app.' : 'No passkey set up here yet.', info('Why it is asking for the password', seenElsewhere
|
|
325
|
+
? 'This account’s passkeys belong to the apps that made them — a passkey works on one web address only. Sign in once with your account password and this app can add its own.'
|
|
326
|
+
: 'Once you are in, you can add a passkey so this app stops asking.')));
|
|
327
|
+
}
|
|
328
|
+
body.push(this.#codeForm(state, selected));
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
body.push(h('div', { class: 'wa-links' }, link('Use my account password instead', () => {
|
|
332
|
+
this.#showCode = true;
|
|
333
|
+
this.#filledAs = '';
|
|
334
|
+
this.#render(auth.getState());
|
|
335
|
+
}, state.busy)));
|
|
336
|
+
}
|
|
337
|
+
if (this.#showCode && this.#filledAs !== '' && this.#filledAs !== accountCredentialName(account.name)) {
|
|
338
|
+
body.push(h('p', { class: 'wa-error', style: 'margin-top:10px' }, 'Your password manager filled ', h('strong', null, this.#filledAs), ', not ', h('strong', null, account.name), '. Pick the entry named ', h('strong', null, account.name), ', or open that account instead.'));
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return h('div', { class: 'wa-account' }, h('button', {
|
|
342
|
+
type: 'button',
|
|
343
|
+
class: 'wa-account-row',
|
|
344
|
+
'aria-expanded': String(isSelected),
|
|
345
|
+
disabled: state.busy,
|
|
346
|
+
// Clicking the open row must not wipe what a manager just filled.
|
|
347
|
+
onclick: () => (isSelected ? undefined : void auth.select(account.id)),
|
|
348
|
+
}, avatar(account.did), h('span', { style: 'flex:1;min-width:0' }, h('span', { class: 'wa-account-name' }, account.name), h('span', { class: 'wa-account-did' }, `${account.did.slice(0, 18)}…${account.did.slice(-4)}`))), body.length > 0 ? h('div', { class: 'wa-account-body' }, ...body) : null);
|
|
349
|
+
});
|
|
350
|
+
return h('div', { class: 'wa-card' }, wordmark(), h('h1', { class: 'wa-title' }, accounts.length > 0 ? 'Welcome back' : 'Sign in'), h('p', { class: 'wa-subtitle' }, accounts.length > 0 ? 'Choose your account.' : 'Paste the account password you saved when you made it.'), ...rows, accounts.length === 0
|
|
351
|
+
? [
|
|
352
|
+
h('p', { class: 'wa-hint' }, place?.kind === 'folder' ? 'This pod has no accounts yet.' : 'No accounts in this browser yet.', info('Why this works with nothing stored', 'The password is your key written out, not a hint to look something up with — so it opens the account in an app that has never seen you. If your account is in a pod, opening the pod below brings it back without the password.')),
|
|
353
|
+
this.#codeForm(state, null),
|
|
354
|
+
]
|
|
355
|
+
: null, errorBox(state.error), h('div', { class: 'wa-links' }, link('Create a new account', () => auth.startCreating(), state.busy)), place
|
|
356
|
+
? h('p', { class: 'wa-small', style: 'margin-top:16px' }, place.kind === 'folder' ? `Pod: ${place.directory?.name ?? 'your folder'}` : 'Accounts kept in this browser')
|
|
357
|
+
: null, state.folderAvailable
|
|
358
|
+
? h('div', { class: 'wa-links' }, link(place?.kind === 'folder' ? 'Open a different pod' : 'Open a pod', () => void auth.choosePod(), state.busy), place?.kind === 'folder' ? link('Use this browser instead', () => void auth.useBrowser(), state.busy) : null)
|
|
359
|
+
: null);
|
|
360
|
+
}
|
|
361
|
+
// ─── Making an account ─────────────────────────────────────────────
|
|
362
|
+
#create(state) {
|
|
363
|
+
const auth = this.auth;
|
|
364
|
+
const name = this.#input('name', {
|
|
365
|
+
type: 'text',
|
|
366
|
+
placeholder: 'Your name',
|
|
367
|
+
autocomplete: 'off',
|
|
368
|
+
autofocus: true,
|
|
369
|
+
disabled: state.busy,
|
|
370
|
+
});
|
|
371
|
+
return h('div', { class: 'wa-card' }, wordmark(), h('h1', { class: 'wa-title' }, 'Create your account'), h('p', { class: 'wa-subtitle' }, 'Your data stays with you, not on a server.'), h('form', {
|
|
372
|
+
class: 'wa-form',
|
|
373
|
+
onsubmit: (event) => {
|
|
374
|
+
event.preventDefault();
|
|
375
|
+
if (name.value.trim())
|
|
376
|
+
void auth.createAccount(name.value.trim());
|
|
377
|
+
},
|
|
378
|
+
}, name, h('button', { type: 'submit', class: 'wa-button', disabled: state.busy }, state.busy ? 'Creating…' : 'Create account')), h('div', { class: 'wa-links' }, link('I already have an account', () => auth.showSignIn(), state.busy)), h('p', { class: 'wa-small' }, "We'll generate a strong password and show it once.", info('What happens next', 'Save it in your password manager. It opens your account in any Weave app, even one that has never seen you — and nobody can reissue it.')), errorBox(state.error));
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* The new account's password, shown once.
|
|
382
|
+
*
|
|
383
|
+
* Framed as a password because that is what it is for: your password
|
|
384
|
+
* manager saves it here and fills it in on the next app. A real form with
|
|
385
|
+
* both fields is what makes a manager offer to save.
|
|
386
|
+
*/
|
|
387
|
+
#saveCode(state, code) {
|
|
388
|
+
const auth = this.auth;
|
|
389
|
+
const filedAs = accountCredentialName(state.session?.account.name ?? 'My account');
|
|
390
|
+
return h('div', { class: 'wa-card' }, wordmark(), h('h1', { class: 'wa-title' }, 'Save your password'), h('p', { class: 'wa-hint' }, 'Save this to your password manager now — it will fill itself in from then on.', info('About this password', 'It is generated rather than chosen, and it ', h('em', null, 'is'), ' your key rather than a backup of it. That is what lets it work on an app that has never seen you, with nothing stored anywhere. It is shown once and nobody can reissue it.')), h('form', {
|
|
391
|
+
class: 'wa-form',
|
|
392
|
+
onsubmit: (event) => {
|
|
393
|
+
event.preventDefault();
|
|
394
|
+
void offerToSave(filedAs, code, filedAs).then(() => auth.codeSaved());
|
|
395
|
+
},
|
|
396
|
+
}, h('input', { type: 'text', name: 'username', autocomplete: 'username', value: filedAs, readonly: true, 'aria-label': 'Account name' }), h('input', { type: 'password', name: 'password', autocomplete: 'new-password', value: code, readonly: true, 'aria-label': 'Account password' }), h('button', { type: 'submit', class: 'wa-button' }, "I've saved it — continue")), h('code', { class: 'wa-code' }, code), h('div', { class: 'wa-links' }, link(this.#copied ? 'Copied' : 'Copy', () => {
|
|
397
|
+
void globalThis.navigator.clipboard
|
|
398
|
+
?.writeText(code)
|
|
399
|
+
.then(() => {
|
|
400
|
+
this.#copied = true;
|
|
401
|
+
this.#render(auth.getState());
|
|
402
|
+
})
|
|
403
|
+
.catch(() => { });
|
|
404
|
+
})), h('p', { class: 'wa-small' }, 'It is the only way into this account from an app that has never seen it. Nobody can reissue it, and it is stored nowhere but where you put it. On this device you can add a passkey afterwards, so you will rarely need it again.'));
|
|
405
|
+
}
|
|
406
|
+
// ─── Arriving from a phone-pairing QR code ─────────────────────────
|
|
407
|
+
/**
|
|
408
|
+
* One button. Everything needed is already in the address bar, but signing
|
|
409
|
+
* in still takes a tap: the code in the link is a secret, and a page that
|
|
410
|
+
* used it the instant it loaded would sign someone in from a link they had
|
|
411
|
+
* merely opened by accident.
|
|
412
|
+
*/
|
|
413
|
+
#pair(state) {
|
|
414
|
+
const auth = this.auth;
|
|
415
|
+
return h('div', { class: 'wa-card' }, wordmark(), h('h1', { class: 'wa-title' }, 'Add this phone'), h('p', { class: 'wa-subtitle' }, 'You scanned a code from your computer.'), h('p', { class: 'wa-hint' }, 'This phone becomes the same account, with its own copy of your spaces.', info('What happens next', 'It syncs with your computer when both are around, and keeps working when they are not. Your spaces come over the network directly between the two devices — the relay only introduces them.')), h('button', { type: 'button', class: 'wa-button', disabled: state.busy, onclick: () => void auth.acceptPairing() }, state.busy ? 'Setting up…' : 'Set up this phone'), state.pairingStage
|
|
416
|
+
? h('p', { class: state.pairingStage.kind === 'failed' ? 'wa-error' : 'wa-hint', style: 'margin-top:12px' }, describePairing(state.pairingStage))
|
|
417
|
+
: null, errorBox(state.error), h('p', { class: 'wa-small' }, 'Keep the code showing until this finishes.'), h('div', { class: 'wa-links' }, link('Not now', () => auth.dismissPairing(), state.busy)));
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
/** Registers `<weave-auth>`, once. Importing this module does it for you. */
|
|
421
|
+
export function defineWeaveAuth(tag = 'weave-auth') {
|
|
422
|
+
const registry = globalThis.customElements;
|
|
423
|
+
if (registry && !registry.get(tag))
|
|
424
|
+
registry.define(tag, WeaveAuthElement);
|
|
425
|
+
}
|
|
426
|
+
defineWeaveAuth();
|
|
427
|
+
//# sourceMappingURL=weave-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weave-auth.js","sourceRoot":"","sources":["../../src/elements/weave-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module account-store
|
|
3
|
+
* The accounts that live somewhere — in a folder, or in this browser.
|
|
4
|
+
*
|
|
5
|
+
* A folder is a disk, not a person. Several people can keep accounts in one, and
|
|
6
|
+
* one person can keep several: work and personal, or a spare for testing. So the
|
|
7
|
+
* folder holds a list of who has an account in it, and a subtree per account.
|
|
8
|
+
*
|
|
9
|
+
* ```
|
|
10
|
+
* <folder>/
|
|
11
|
+
* accounts.json name, DID and id of each account
|
|
12
|
+
* accounts/<id>/account.json that account's keys, locked
|
|
13
|
+
* accounts/<id>/stores/... that account's spaces
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* **The list is readable without unlocking anything**, which it has to be — you
|
|
17
|
+
* cannot offer someone a choice of accounts without knowing their names. So
|
|
18
|
+
* whoever holds the folder can see how many accounts are in it and what they
|
|
19
|
+
* are called. What they cannot do is open one.
|
|
20
|
+
*
|
|
21
|
+
* A browser with no folder keeps the same shape in IndexedDB, so the app above
|
|
22
|
+
* has one model rather than two.
|
|
23
|
+
*/
|
|
24
|
+
import type { DirectoryHandleLike } from '../storage/folder-adapter.js';
|
|
25
|
+
import type { AccountVault } from './account-vault.js';
|
|
26
|
+
/** What can be known about an account without unlocking it */
|
|
27
|
+
export interface AccountSummary {
|
|
28
|
+
/** Stable, random, and the name of this account's subtree */
|
|
29
|
+
readonly id: string;
|
|
30
|
+
/** What the person called it. A label — never part of any key. */
|
|
31
|
+
readonly name: string;
|
|
32
|
+
readonly did: string;
|
|
33
|
+
readonly createdAt: string;
|
|
34
|
+
/**
|
|
35
|
+
* Where this account's spaces live, relative to the store root.
|
|
36
|
+
*
|
|
37
|
+
* Carried rather than computed so that an account written before folders
|
|
38
|
+
* held more than one keeps its data exactly where it already is, instead of
|
|
39
|
+
* needing every file moved.
|
|
40
|
+
*/
|
|
41
|
+
readonly dataPath: string;
|
|
42
|
+
readonly lastUsedAt?: string;
|
|
43
|
+
}
|
|
44
|
+
export interface AccountStore {
|
|
45
|
+
readonly kind: 'folder' | 'browser';
|
|
46
|
+
/**
|
|
47
|
+
* Every account here, most recently used first.
|
|
48
|
+
*
|
|
49
|
+
* At most one entry per identity. Two rows for one DID is always a mistake —
|
|
50
|
+
* they would appear as separate accounts in a picker while being the same
|
|
51
|
+
* person — so a duplicate is collapsed onto the most recently used.
|
|
52
|
+
*/
|
|
53
|
+
list(): Promise<ReadonlyArray<AccountSummary>>;
|
|
54
|
+
/** One account's locked keys */
|
|
55
|
+
read(id: string): Promise<AccountVault | null>;
|
|
56
|
+
/** Adds or replaces an account */
|
|
57
|
+
write(summary: AccountSummary, vault: AccountVault): Promise<void>;
|
|
58
|
+
/** Forgets an account, and everything it owns */
|
|
59
|
+
remove(id: string): Promise<void>;
|
|
60
|
+
}
|
|
61
|
+
/** Where a brand new account keeps its spaces. */
|
|
62
|
+
export declare function accountDataPath(id: string): string;
|
|
63
|
+
/** A short, stable, filename-safe id for a new account. */
|
|
64
|
+
export declare function newAccountId(): string;
|
|
65
|
+
/**
|
|
66
|
+
* Whether an id has the shape {@link newAccountId} gives one.
|
|
67
|
+
*
|
|
68
|
+
* An id names a directory, and `remove` deletes that directory with everything
|
|
69
|
+
* in it. The list it comes from is a plain file in a folder that may be synced
|
|
70
|
+
* or shared, so an id is checked before it is trusted with a path.
|
|
71
|
+
*/
|
|
72
|
+
export declare function isAccountId(id: unknown): id is string;
|
|
73
|
+
/**
|
|
74
|
+
* Opens the accounts kept in a folder.
|
|
75
|
+
*
|
|
76
|
+
* @param dir The data folder
|
|
77
|
+
* @returns A store over it
|
|
78
|
+
*/
|
|
79
|
+
export declare function createFolderAccountStore(dir: DirectoryHandleLike): AccountStore;
|
|
80
|
+
/**
|
|
81
|
+
* Opens the accounts kept in this browser, for when there is no folder.
|
|
82
|
+
*
|
|
83
|
+
* Same shape as a folder store, so nothing above has to know which it got —
|
|
84
|
+
* the difference is only that no other origin can read this one.
|
|
85
|
+
*
|
|
86
|
+
* @param dbName Overridable for tests
|
|
87
|
+
* @returns A store over this origin's database
|
|
88
|
+
*/
|
|
89
|
+
export declare function createBrowserAccountStore(dbName?: string): Promise<AccountStore>;
|
|
90
|
+
/**
|
|
91
|
+
* Finds the account in a folder that predates the list, so it can join it.
|
|
92
|
+
*
|
|
93
|
+
* Its data stays exactly where it is. Moving it would mean copying every file
|
|
94
|
+
* by hand — the File System Access API cannot rename across directories — for
|
|
95
|
+
* no benefit, so the summary records where the spaces already live instead.
|
|
96
|
+
*
|
|
97
|
+
* @param dir The data folder
|
|
98
|
+
* @param existing Accounts already listed, so one is not adopted twice
|
|
99
|
+
* @returns What to write into the list, or null when there is nothing to adopt
|
|
100
|
+
*/
|
|
101
|
+
export declare function adoptLegacyFolderAccount(dir: DirectoryHandleLike, existing: ReadonlyArray<AccountSummary>): Promise<{
|
|
102
|
+
summary: AccountSummary;
|
|
103
|
+
vault: AccountVault;
|
|
104
|
+
} | null>;
|
|
105
|
+
/**
|
|
106
|
+
* Lists a folder's accounts, adopting a pre-list one if it finds it.
|
|
107
|
+
*
|
|
108
|
+
* @param dir The data folder
|
|
109
|
+
* @param store The store over it
|
|
110
|
+
* @returns Every account, including one just adopted
|
|
111
|
+
*/
|
|
112
|
+
export declare function listFolderAccounts(dir: DirectoryHandleLike, store: AccountStore): Promise<ReadonlyArray<AccountSummary>>;
|
|
113
|
+
//# sourceMappingURL=account-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-store.d.ts","sourceRoot":"","sources":["../../src/identity/account-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKvD,8DAA8D;AAC9D,MAAM,WAAW,cAAc;IAC7B,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAC;IACpC;;;;;;OAMG;IACH,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC;IAC/C,gCAAgC;IAChC,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAC/C,kCAAkC;IAClC,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,iDAAiD;IACjD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnC;AAQD,kDAAkD;AAClD,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,2DAA2D;AAC3D,wBAAgB,YAAY,IAAI,MAAM,CAKrC;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,OAAO,GAAG,EAAE,IAAI,MAAM,CAErD;AAgED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,mBAAmB,GAAG,YAAY,CAiF/E;AA+CD;;;;;;;;GAQG;AACH,wBAAsB,yBAAyB,CAAC,MAAM,GAAE,MAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CA8B/F;AAID;;;;;;;;;;GAUG;AACH,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,mBAAmB,EACxB,QAAQ,EAAE,aAAa,CAAC,cAAc,CAAC,GACtC,OAAO,CAAC;IAAE,OAAO,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,GAAG,IAAI,CAAC,CAoBlE;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,mBAAmB,EACxB,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CAOxC"}
|