@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":"key-distribution.js","sourceRoot":"","sources":["../../src/privacy/key-distribution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAoBxE;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAmB,EACnB,kBAA6B,EAC7B,YAAoB;IAEpB,MAAM,aAAa,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAC9D,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,EACrC,IAAI,EACJ,CAAC,YAAY,CAAC,CACf,CAAC;IAEF,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAC5D,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAC5C,aAAa,CAAC,UAAU,EACxB,GAAG,CACJ,CAAC;IAEF,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAClD,KAAK,EACL,YAAY,EACZ,EAAE,IAAI,EAAE,QAAQ,EAAE,EAClB,KAAK,EACL,CAAC,SAAS,CAAC,CACZ,CAAC;IAEF,MAAM,gBAAgB,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAC7D,KAAK,EACL,QAAQ,EACR,GAAG,EACH,EAAE,IAAI,EAAE,QAAQ,EAAE,CACnB,CAAC;IAEF,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IAE9F,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,YAAY;QACZ,kBAAkB,EAAE,eAAe,CAAC,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC;QACjE,cAAc,EAAE,eAAe,CAAC,IAAI,UAAU,CAAC,gBAAgB,CAAC,CAAC;QACjE,SAAS,EAAE,aAAa;KACzB,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAmB,EACnB,mBAA8B;IAE9B,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACjE,MAAM,kBAAkB,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CACjE,KAAK,EACL,YAA4B,EAC5B,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,EACrC,IAAI,EACJ,EAAE,CACH,CAAC;IAEF,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAC5D,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAC5C,mBAAmB,EACnB,GAAG,CACJ,CAAC;IAEF,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAClD,KAAK,EACL,YAAY,EACZ,EAAE,IAAI,EAAE,QAAQ,EAAE,EAClB,KAAK,EACL,CAAC,WAAW,CAAC,CACd,CAAC;IAEF,MAAM,cAAc,GAAG,eAAe,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAE/D,OAAO,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CACvC,KAAK,EACL,cAA8B,EAC9B,GAAG,EACH,EAAE,IAAI,EAAE,QAAQ,EAAE,EAClB,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,EAChC,IAAI,EACJ,CAAC,SAAS,EAAE,SAAS,CAAC,CACvB,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAAmB,EACnB,gBAAgD;IAEhD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAC7C,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,CACrD,CAAC;IACF,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAChD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Expression, Space } from '../types.js';
|
|
2
|
+
import { type SpaceKey, type EncryptedExpression } from './space-encryption.js';
|
|
3
|
+
import { type WrappedKey } from './key-distribution.js';
|
|
4
|
+
/**
|
|
5
|
+
* Orchestrator for transparent encryption and decryption of expressions within spaces.
|
|
6
|
+
*/
|
|
7
|
+
export interface PrivacyGuard {
|
|
8
|
+
addSpace(space: Space, spaceKey?: SpaceKey): void;
|
|
9
|
+
isPrivateSpace(spaceId: string): boolean;
|
|
10
|
+
encryptForSpace(spaceId: string, expression: Expression): Promise<EncryptedExpression | Expression>;
|
|
11
|
+
decryptFromSpace(spaceId: string, encrypted: EncryptedExpression | Expression): Promise<Expression>;
|
|
12
|
+
setSpaceKey(spaceId: string, key: SpaceKey): void;
|
|
13
|
+
rotateSpaceKey(spaceId: string): Promise<SpaceKey>;
|
|
14
|
+
getSpaceKey(spaceId: string): SpaceKey | undefined;
|
|
15
|
+
wrapKeyForMember(spaceId: string, memberPublicKey: CryptoKey, memberDid: string): Promise<WrappedKey>;
|
|
16
|
+
unwrapKeyFromMember(wrapped: WrappedKey, privateKey: CryptoKey): Promise<SpaceKey>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Creates a new PrivacyGuard orchestrator.
|
|
20
|
+
*
|
|
21
|
+
* @returns {PrivacyGuard} A new PrivacyGuard instance.
|
|
22
|
+
*/
|
|
23
|
+
export declare function createPrivacyGuard(): PrivacyGuard;
|
|
24
|
+
//# sourceMappingURL=privacy-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"privacy-guard.d.ts","sourceRoot":"","sources":["../../src/privacy/privacy-guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,mBAAmB,EAIzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,KAAK,UAAU,EAGhB,MAAM,uBAAuB,CAAC;AAI/B;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAClD,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IACzC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,mBAAmB,GAAG,UAAU,CAAC,CAAC;IACpG,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,mBAAmB,GAAG,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACpG,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAC;IAClD,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IACnD,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACtG,mBAAmB,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CACpF;AAOD;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CA0FjD"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { generateSpaceKey, encryptExpression, decryptExpression } from './space-encryption.js';
|
|
2
|
+
import { wrapSpaceKey, unwrapSpaceKey } from './key-distribution.js';
|
|
3
|
+
import { base64UrlEncode } from '../utils/encoding.js';
|
|
4
|
+
import { sha256 } from '../utils/hash.js';
|
|
5
|
+
/**
|
|
6
|
+
* Creates a new PrivacyGuard orchestrator.
|
|
7
|
+
*
|
|
8
|
+
* @returns {PrivacyGuard} A new PrivacyGuard instance.
|
|
9
|
+
*/
|
|
10
|
+
export function createPrivacyGuard() {
|
|
11
|
+
const spaces = new Map();
|
|
12
|
+
return {
|
|
13
|
+
addSpace(space, spaceKey) {
|
|
14
|
+
spaces.set(space.id, { space, spaceKey });
|
|
15
|
+
},
|
|
16
|
+
isPrivateSpace(spaceId) {
|
|
17
|
+
const entry = spaces.get(spaceId);
|
|
18
|
+
return entry !== undefined && entry.space.encryptionKeyId !== undefined;
|
|
19
|
+
},
|
|
20
|
+
async encryptForSpace(spaceId, expression) {
|
|
21
|
+
const entry = spaces.get(spaceId);
|
|
22
|
+
if (!entry)
|
|
23
|
+
throw new Error(`Space ${spaceId} not found`);
|
|
24
|
+
if (!this.isPrivateSpace(spaceId)) {
|
|
25
|
+
return expression;
|
|
26
|
+
}
|
|
27
|
+
if (!entry.spaceKey) {
|
|
28
|
+
throw new Error(`Space key not available for space ${spaceId}`);
|
|
29
|
+
}
|
|
30
|
+
return encryptExpression(expression, entry.spaceKey);
|
|
31
|
+
},
|
|
32
|
+
async decryptFromSpace(spaceId, encrypted) {
|
|
33
|
+
const entry = spaces.get(spaceId);
|
|
34
|
+
if (!entry)
|
|
35
|
+
throw new Error(`Space ${spaceId} not found`);
|
|
36
|
+
if (!this.isPrivateSpace(spaceId) || !('ciphertext' in encrypted.body)) {
|
|
37
|
+
return encrypted;
|
|
38
|
+
}
|
|
39
|
+
if (!entry.spaceKey) {
|
|
40
|
+
throw new Error(`Space key not available for space ${spaceId}`);
|
|
41
|
+
}
|
|
42
|
+
return decryptExpression(encrypted, entry.spaceKey);
|
|
43
|
+
},
|
|
44
|
+
setSpaceKey(spaceId, key) {
|
|
45
|
+
const entry = spaces.get(spaceId);
|
|
46
|
+
if (!entry)
|
|
47
|
+
throw new Error(`Space ${spaceId} not found`);
|
|
48
|
+
entry.spaceKey = key;
|
|
49
|
+
},
|
|
50
|
+
async rotateSpaceKey(spaceId) {
|
|
51
|
+
const entry = spaces.get(spaceId);
|
|
52
|
+
if (!entry)
|
|
53
|
+
throw new Error(`Space ${spaceId} not found`);
|
|
54
|
+
const newKey = await generateSpaceKey();
|
|
55
|
+
const version = (entry.spaceKey?.version ?? 0) + 1;
|
|
56
|
+
const rotatedKey = Object.freeze({
|
|
57
|
+
...newKey,
|
|
58
|
+
version
|
|
59
|
+
});
|
|
60
|
+
entry.spaceKey = rotatedKey;
|
|
61
|
+
return rotatedKey;
|
|
62
|
+
},
|
|
63
|
+
getSpaceKey(spaceId) {
|
|
64
|
+
return spaces.get(spaceId)?.spaceKey;
|
|
65
|
+
},
|
|
66
|
+
async wrapKeyForMember(spaceId, memberPublicKey, memberDid) {
|
|
67
|
+
const spaceKey = this.getSpaceKey(spaceId);
|
|
68
|
+
if (!spaceKey) {
|
|
69
|
+
throw new Error(`Space key not found for space ${spaceId}`);
|
|
70
|
+
}
|
|
71
|
+
return wrapSpaceKey(spaceKey.key, memberPublicKey, memberDid);
|
|
72
|
+
},
|
|
73
|
+
async unwrapKeyFromMember(wrapped, privateKey) {
|
|
74
|
+
const unwrappedCryptoKey = await unwrapSpaceKey(wrapped, privateKey);
|
|
75
|
+
// Derive a consistent ID based on the raw key data
|
|
76
|
+
const raw = await globalThis.crypto.subtle.exportKey('raw', unwrappedCryptoKey);
|
|
77
|
+
const id = base64UrlEncode(new Uint8Array(await sha256(new Uint8Array(raw))));
|
|
78
|
+
return Object.freeze({
|
|
79
|
+
id,
|
|
80
|
+
key: unwrappedCryptoKey,
|
|
81
|
+
createdAt: new Date().toISOString(),
|
|
82
|
+
version: 1 // Defaulting to 1 as versioning would normally be distributed alongside the wrapped key
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=privacy-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"privacy-guard.js","sourceRoot":"","sources":["../../src/privacy/privacy-guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { Expression } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Represents a key used to encrypt a Space.
|
|
4
|
+
*/
|
|
5
|
+
export interface SpaceKey {
|
|
6
|
+
readonly id: string;
|
|
7
|
+
readonly key: CryptoKey;
|
|
8
|
+
readonly createdAt: string;
|
|
9
|
+
readonly version: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* The body of an expression after it has been encrypted.
|
|
13
|
+
*/
|
|
14
|
+
export interface EncryptedExpressionBody {
|
|
15
|
+
readonly ciphertext: string;
|
|
16
|
+
readonly iv: string;
|
|
17
|
+
readonly keyId: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* An expression whose body has been encrypted.
|
|
21
|
+
*/
|
|
22
|
+
export type EncryptedExpression = Omit<Expression, 'body'> & {
|
|
23
|
+
readonly body: EncryptedExpressionBody;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Generates a new random AES-GCM-256 key for a Space.
|
|
27
|
+
*
|
|
28
|
+
* @returns {Promise<SpaceKey>} A promise resolving to a new SpaceKey.
|
|
29
|
+
*/
|
|
30
|
+
export declare function generateSpaceKey(): Promise<SpaceKey>;
|
|
31
|
+
/**
|
|
32
|
+
* Encrypts an expression's body using AES-GCM.
|
|
33
|
+
*
|
|
34
|
+
* @param {Expression} expression - The expression to encrypt.
|
|
35
|
+
* @param {SpaceKey} spaceKey - The key to use for encryption.
|
|
36
|
+
* @returns {Promise<EncryptedExpression>} A promise resolving to the encrypted expression.
|
|
37
|
+
*/
|
|
38
|
+
export declare function encryptExpression(expression: Expression, spaceKey: SpaceKey): Promise<EncryptedExpression>;
|
|
39
|
+
/**
|
|
40
|
+
* Decrypts an encrypted expression's body using AES-GCM.
|
|
41
|
+
*
|
|
42
|
+
* @param {EncryptedExpression} encrypted - The encrypted expression.
|
|
43
|
+
* @param {SpaceKey} spaceKey - The key to use for decryption.
|
|
44
|
+
* @returns {Promise<Expression>} A promise resolving to the decrypted expression.
|
|
45
|
+
* @throws {Error} If the key ID doesn't match the space key's ID.
|
|
46
|
+
*/
|
|
47
|
+
export declare function decryptExpression(encrypted: EncryptedExpression, spaceKey: SpaceKey): Promise<Expression>;
|
|
48
|
+
//# sourceMappingURL=space-encryption.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"space-encryption.d.ts","sourceRoot":"","sources":["../../src/privacy/space-encryption.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI9C;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG;IAC3D,QAAQ,CAAC,IAAI,EAAE,uBAAuB,CAAC;CACxC,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,QAAQ,CAAC,CAe1D;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAoBhH;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,mBAAmB,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAoB/G"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { base64UrlEncode, base64UrlDecode, utf8Encode, utf8Decode } from '../utils/encoding.js';
|
|
2
|
+
import { sha256 } from '../utils/hash.js';
|
|
3
|
+
/**
|
|
4
|
+
* Generates a new random AES-GCM-256 key for a Space.
|
|
5
|
+
*
|
|
6
|
+
* @returns {Promise<SpaceKey>} A promise resolving to a new SpaceKey.
|
|
7
|
+
*/
|
|
8
|
+
export async function generateSpaceKey() {
|
|
9
|
+
const key = await globalThis.crypto.subtle.generateKey({ name: 'AES-GCM', length: 256 }, true, ['encrypt', 'decrypt']);
|
|
10
|
+
const raw = await globalThis.crypto.subtle.exportKey('raw', key);
|
|
11
|
+
const id = base64UrlEncode(new Uint8Array(await sha256(new Uint8Array(raw))));
|
|
12
|
+
return Object.freeze({
|
|
13
|
+
id,
|
|
14
|
+
key,
|
|
15
|
+
createdAt: new Date().toISOString(),
|
|
16
|
+
version: 1
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Encrypts an expression's body using AES-GCM.
|
|
21
|
+
*
|
|
22
|
+
* @param {Expression} expression - The expression to encrypt.
|
|
23
|
+
* @param {SpaceKey} spaceKey - The key to use for encryption.
|
|
24
|
+
* @returns {Promise<EncryptedExpression>} A promise resolving to the encrypted expression.
|
|
25
|
+
*/
|
|
26
|
+
export async function encryptExpression(expression, spaceKey) {
|
|
27
|
+
const iv = globalThis.crypto.getRandomValues(new Uint8Array(12));
|
|
28
|
+
const encodedBody = utf8Encode(JSON.stringify(expression.body));
|
|
29
|
+
const ciphertextBuffer = await globalThis.crypto.subtle.encrypt({ name: 'AES-GCM', iv }, spaceKey.key, encodedBody);
|
|
30
|
+
const ciphertext = base64UrlEncode(new Uint8Array(ciphertextBuffer));
|
|
31
|
+
return Object.freeze({
|
|
32
|
+
...expression,
|
|
33
|
+
body: Object.freeze({
|
|
34
|
+
ciphertext,
|
|
35
|
+
iv: base64UrlEncode(iv),
|
|
36
|
+
keyId: spaceKey.id
|
|
37
|
+
})
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Decrypts an encrypted expression's body using AES-GCM.
|
|
42
|
+
*
|
|
43
|
+
* @param {EncryptedExpression} encrypted - The encrypted expression.
|
|
44
|
+
* @param {SpaceKey} spaceKey - The key to use for decryption.
|
|
45
|
+
* @returns {Promise<Expression>} A promise resolving to the decrypted expression.
|
|
46
|
+
* @throws {Error} If the key ID doesn't match the space key's ID.
|
|
47
|
+
*/
|
|
48
|
+
export async function decryptExpression(encrypted, spaceKey) {
|
|
49
|
+
if (encrypted.body.keyId !== spaceKey.id) {
|
|
50
|
+
throw new Error('Key ID mismatch');
|
|
51
|
+
}
|
|
52
|
+
const iv = base64UrlDecode(encrypted.body.iv);
|
|
53
|
+
const ciphertext = base64UrlDecode(encrypted.body.ciphertext);
|
|
54
|
+
const decryptedBuffer = await globalThis.crypto.subtle.decrypt({ name: 'AES-GCM', iv: iv.buffer }, spaceKey.key, ciphertext);
|
|
55
|
+
const body = JSON.parse(utf8Decode(new Uint8Array(decryptedBuffer)));
|
|
56
|
+
return Object.freeze({
|
|
57
|
+
...encrypted,
|
|
58
|
+
body
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=space-encryption.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"space-encryption.js","sourceRoot":"","sources":["../../src/privacy/space-encryption.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAChG,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AA4B1C;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CACpD,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,EAChC,IAAI,EACJ,CAAC,SAAS,EAAE,SAAS,CAAC,CACvB,CAAC;IACF,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACjE,MAAM,EAAE,GAAG,eAAe,CAAC,IAAI,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9E,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,EAAE;QACF,GAAG;QACH,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,OAAO,EAAE,CAAC;KACX,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,UAAsB,EAAE,QAAkB;IAChF,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;IACjE,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IAEhE,MAAM,gBAAgB,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAC7D,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,EACvB,QAAQ,CAAC,GAAG,EACZ,WAA2B,CAC5B,CAAC;IAEF,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAErE,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,GAAG,UAAU;QACb,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;YAClB,UAAU;YACV,EAAE,EAAE,eAAe,CAAC,EAAE,CAAC;YACvB,KAAK,EAAE,QAAQ,CAAC,EAAE;SACnB,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,SAA8B,EAAE,QAAkB;IACxF,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,EAAE,GAAG,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAE9D,MAAM,eAAe,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAC5D,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC,MAAqB,EAAE,EACjD,QAAQ,CAAC,GAAG,EACZ,UAA0B,CAC3B,CAAC;IAEF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAErE,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,GAAG,SAAS;QACZ,IAAI;KACL,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module query/engine
|
|
3
|
+
* Runs a query: narrow by collection, filter, sort, page, then follow links.
|
|
4
|
+
*
|
|
5
|
+
* Deliberately no planner. A browser holds a replica, not a warehouse; at that
|
|
6
|
+
* scale an optimiser would be more code than it saves. Filtering happens after
|
|
7
|
+
* records are opened, so in a private space it sees decrypted bodies — and a
|
|
8
|
+
* record this device cannot open is left out, here and in every `include`.
|
|
9
|
+
*/
|
|
10
|
+
import type { NodeRecord } from '../node/types.js';
|
|
11
|
+
import { type Query, type QueryResult } from './types.js';
|
|
12
|
+
/** What the engine needs from a space: its current records, one by key, and what links where. */
|
|
13
|
+
export interface QuerySource {
|
|
14
|
+
/** Current, not deleted */
|
|
15
|
+
list(collection: string): Promise<ReadonlyArray<NodeRecord>>;
|
|
16
|
+
get(key: string): Promise<NodeRecord | null>;
|
|
17
|
+
linked(key: string, options: {
|
|
18
|
+
rel?: string;
|
|
19
|
+
collection?: string;
|
|
20
|
+
}): Promise<ReadonlyArray<NodeRecord>>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Runs a query against a space.
|
|
24
|
+
* @throws When the query is malformed — with a message saying what to fix
|
|
25
|
+
*/
|
|
26
|
+
export declare function runQuery<T = unknown>(source: QuerySource, given: Query): Promise<QueryResult<T>>;
|
|
27
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/query/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAA4B,KAAK,KAAK,EAAoB,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAEtG,iGAAiG;AACjG,MAAM,WAAW,WAAW;IAC1B,2BAA2B;IAC3B,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;IAC7D,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;CACzG;AAsDD;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAoBtG"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { checkQuery, fieldValue, matches } from './filter.js';
|
|
2
|
+
import { plainQuery } from './types.js';
|
|
3
|
+
/** Orders two values of a field: missing sorts first, then numbers and strings by value. */
|
|
4
|
+
function compareValues(a, b) {
|
|
5
|
+
if (a === b)
|
|
6
|
+
return 0;
|
|
7
|
+
if (a === undefined || a === null)
|
|
8
|
+
return -1;
|
|
9
|
+
if (b === undefined || b === null)
|
|
10
|
+
return 1;
|
|
11
|
+
if (typeof a === 'number' && typeof b === 'number')
|
|
12
|
+
return a - b;
|
|
13
|
+
if (typeof a === 'boolean' && typeof b === 'boolean')
|
|
14
|
+
return Number(a) - Number(b);
|
|
15
|
+
return String(a) < String(b) ? -1 : String(a) > String(b) ? 1 : 0;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* A total order. Ties always break on the key — stable on every node,
|
|
19
|
+
* so paging neither skips nor repeats between peers holding the same data.
|
|
20
|
+
*/
|
|
21
|
+
function sortRecords(records, sort) {
|
|
22
|
+
const fields = Object.entries(sort ?? { '@createdAt': 'asc' });
|
|
23
|
+
return records.sort((a, b) => {
|
|
24
|
+
for (const [field, direction] of fields) {
|
|
25
|
+
const order = compareValues(fieldValue(a, field), fieldValue(b, field));
|
|
26
|
+
if (order !== 0)
|
|
27
|
+
return direction === 'desc' ? -order : order;
|
|
28
|
+
}
|
|
29
|
+
return a.key < b.key ? -1 : a.key > b.key ? 1 : 0;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/** Only records whose body this device could open */
|
|
33
|
+
const readable = (r) => r !== null && r.body !== null;
|
|
34
|
+
async function expand(source, record, includes) {
|
|
35
|
+
if (!includes)
|
|
36
|
+
return { ...record, included: {} };
|
|
37
|
+
const included = {};
|
|
38
|
+
for (const [name, include] of Object.entries(includes)) {
|
|
39
|
+
let related;
|
|
40
|
+
if (include.direction === 'out') {
|
|
41
|
+
const targets = await Promise.all(record.links.filter((l) => l.rel === include.rel).map((l) => source.get(l.to)));
|
|
42
|
+
// A link to a record not held here is normal; it simply finds nothing.
|
|
43
|
+
related = targets.filter((r) => readable(r) && (!include.from || r.collection === include.from));
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
const from = include.from; // names only, after plainQuery
|
|
47
|
+
related = (await source.linked(record.key, { rel: include.rel, ...(from ? { collection: from } : {}) })).filter(readable);
|
|
48
|
+
}
|
|
49
|
+
if (include.where)
|
|
50
|
+
related = related.filter((r) => matches(r, include.where));
|
|
51
|
+
if (include.count) {
|
|
52
|
+
included[name] = related.length;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
const page = include.limit === undefined ? related : related.slice(0, include.limit);
|
|
56
|
+
included[name] = await Promise.all(page.map((r) => expand(source, r, include.include)));
|
|
57
|
+
}
|
|
58
|
+
return { ...record, included };
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Runs a query against a space.
|
|
62
|
+
* @throws When the query is malformed — with a message saying what to fix
|
|
63
|
+
*/
|
|
64
|
+
export async function runQuery(source, given) {
|
|
65
|
+
const query = plainQuery(given);
|
|
66
|
+
const problem = checkQuery(query);
|
|
67
|
+
if (problem)
|
|
68
|
+
throw new Error(`Invalid query: ${problem}`);
|
|
69
|
+
const candidates = (await source.list(query.collection)).filter(readable);
|
|
70
|
+
const filtered = query.where ? candidates.filter((r) => matches(r, query.where)) : candidates;
|
|
71
|
+
const sorted = sortRecords(filtered, query.sort);
|
|
72
|
+
// The cursor is the key of the last record of the previous page. If that
|
|
73
|
+
// record has since gone, start from where it would have been.
|
|
74
|
+
let start = 0;
|
|
75
|
+
if (query.cursor) {
|
|
76
|
+
const at = sorted.findIndex((r) => r.key === query.cursor);
|
|
77
|
+
start = at >= 0 ? at + 1 : 0;
|
|
78
|
+
}
|
|
79
|
+
const page = query.limit === undefined ? sorted.slice(start) : sorted.slice(start, start + query.limit);
|
|
80
|
+
const records = await Promise.all(page.map((r) => expand(source, r, query.include)));
|
|
81
|
+
const more = start + page.length < sorted.length && page.length > 0;
|
|
82
|
+
return { records: records, cursor: more ? page[page.length - 1].key : null };
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/query/engine.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAgE,MAAM,YAAY,CAAC;AAUtG,4FAA4F;AAC5F,SAAS,aAAa,CAAC,CAAU,EAAE,CAAU;IAC3C,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,CAAC,CAAC,CAAC;IAC7C,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,CAAC,CAAC;IAC5C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACjE,IAAI,OAAO,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACnF,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAuB,OAAY,EAAE,IAAmB;IAC1E,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/D,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC3B,KAAK,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,MAAM,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;YACxE,IAAI,KAAK,KAAK,CAAC;gBAAE,OAAO,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QAChE,CAAC;QACD,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,qDAAqD;AACrD,MAAM,QAAQ,GAAG,CAAC,CAAoB,EAAmB,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;AAE1F,KAAK,UAAU,MAAM,CAAC,MAAmB,EAAE,MAAkB,EAAE,QAA0B;IACvF,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAClD,MAAM,QAAQ,GAAwD,EAAE,CAAC;IACzE,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAA6B,EAAE,CAAC;QACnF,IAAI,OAAqB,CAAC;QAC1B,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAClH,uEAAuE;YACvE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAmB,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACpH,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,OAAO,CAAC,IAA0B,CAAC,CAAC,+BAA+B;YAChF,OAAO,GAAG,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5H,CAAC;QACD,IAAI,OAAO,CAAC,KAAK;YAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,KAAM,CAAC,CAAC,CAAC;QAC/E,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;YAChC,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACrF,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAc,MAAmB,EAAE,KAAY;IAC3E,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,OAAO,EAAE,CAAC,CAAC;IAE1D,MAAM,UAAU,GAAG,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAoB,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpF,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,KAAM,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAC/F,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAEjD,yEAAyE;IACzE,8DAA8D;IAC9D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3D,KAAK,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IACxG,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACrF,MAAM,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACpE,OAAO,EAAE,OAAO,EAAE,OAAwC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACjH,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module query/filter
|
|
3
|
+
* The filter operators, as pure functions over opened records.
|
|
4
|
+
*/
|
|
5
|
+
import type { NodeRecord } from '../node/types.js';
|
|
6
|
+
import type { Filter } from './types.js';
|
|
7
|
+
/** Nested `include` beyond this is refused rather than quietly slow. */
|
|
8
|
+
export declare const MAX_INCLUDE_DEPTH = 3;
|
|
9
|
+
/** A field of a record: `@…` for the record itself, a dotted path into its body otherwise. */
|
|
10
|
+
export declare function fieldValue(record: NodeRecord, path: string): unknown;
|
|
11
|
+
/** Whether a record matches a filter. */
|
|
12
|
+
export declare function matches(record: NodeRecord, filter: Filter): boolean;
|
|
13
|
+
/** Why a query cannot run, or null when it can. Queries are data; functions and unknown operators are refused. */
|
|
14
|
+
export declare function checkQuery(query: unknown): string | null;
|
|
15
|
+
//# sourceMappingURL=filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../src/query/filter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,MAAM,EAAkB,MAAM,YAAY,CAAC;AAEzD,wEAAwE;AACxE,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAenC,8FAA8F;AAC9F,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAYpE;AAmED,yCAAyC;AACzC,wBAAgB,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAOnE;AAsDD,kHAAkH;AAClH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAsBxD"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/** Nested `include` beyond this is refused rather than quietly slow. */
|
|
2
|
+
export const MAX_INCLUDE_DEPTH = 3;
|
|
3
|
+
const META = {
|
|
4
|
+
'@key': (r) => r.key,
|
|
5
|
+
'@author': (r) => r.author,
|
|
6
|
+
'@root': (r) => r.root,
|
|
7
|
+
'@createdBy': (r) => r.createdBy,
|
|
8
|
+
'@createdAt': (r) => r.createdAt,
|
|
9
|
+
'@updatedAt': (r) => r.updatedAt,
|
|
10
|
+
'@seq': (r) => r.seq,
|
|
11
|
+
'@collection': (r) => r.collection,
|
|
12
|
+
};
|
|
13
|
+
const OPERATORS = new Set(['$eq', '$ne', '$gt', '$gte', '$lt', '$lte', '$in', '$nin', '$exists', '$contains']);
|
|
14
|
+
/** A field of a record: `@…` for the record itself, a dotted path into its body otherwise. */
|
|
15
|
+
export function fieldValue(record, path) {
|
|
16
|
+
if (path.startsWith('@')) {
|
|
17
|
+
const read = META[path];
|
|
18
|
+
if (!read)
|
|
19
|
+
throw new Error(`Unknown record field "${path}" — use one of ${Object.keys(META).join(', ')}`);
|
|
20
|
+
return read(record);
|
|
21
|
+
}
|
|
22
|
+
let value = record.body;
|
|
23
|
+
for (const part of path.split('.')) {
|
|
24
|
+
if (value === null || typeof value !== 'object')
|
|
25
|
+
return undefined;
|
|
26
|
+
value = value[part];
|
|
27
|
+
}
|
|
28
|
+
return value;
|
|
29
|
+
}
|
|
30
|
+
function isPlainObject(value) {
|
|
31
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
32
|
+
}
|
|
33
|
+
function equal(a, b) {
|
|
34
|
+
if (a === b)
|
|
35
|
+
return true;
|
|
36
|
+
if (typeof a !== typeof b || a === null || b === null || typeof a !== 'object')
|
|
37
|
+
return false;
|
|
38
|
+
if (Array.isArray(a) !== Array.isArray(b))
|
|
39
|
+
return false;
|
|
40
|
+
const ak = Object.keys(a);
|
|
41
|
+
const bk = Object.keys(b);
|
|
42
|
+
return ak.length === bk.length && ak.every((k) => equal(a[k], b[k]));
|
|
43
|
+
}
|
|
44
|
+
/** Ordered comparison, only between two numbers or two strings. */
|
|
45
|
+
function compare(a, b) {
|
|
46
|
+
if (typeof a === 'number' && typeof b === 'number')
|
|
47
|
+
return a - b;
|
|
48
|
+
if (typeof a === 'string' && typeof b === 'string')
|
|
49
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
function operatorHolds(op, value, operand) {
|
|
53
|
+
switch (op) {
|
|
54
|
+
case '$eq':
|
|
55
|
+
return equal(value, operand);
|
|
56
|
+
case '$ne':
|
|
57
|
+
return !equal(value, operand);
|
|
58
|
+
case '$gt': {
|
|
59
|
+
const c = compare(value, operand);
|
|
60
|
+
return c !== null && c > 0;
|
|
61
|
+
}
|
|
62
|
+
case '$gte': {
|
|
63
|
+
const c = compare(value, operand);
|
|
64
|
+
return c !== null && c >= 0;
|
|
65
|
+
}
|
|
66
|
+
case '$lt': {
|
|
67
|
+
const c = compare(value, operand);
|
|
68
|
+
return c !== null && c < 0;
|
|
69
|
+
}
|
|
70
|
+
case '$lte': {
|
|
71
|
+
const c = compare(value, operand);
|
|
72
|
+
return c !== null && c <= 0;
|
|
73
|
+
}
|
|
74
|
+
case '$in':
|
|
75
|
+
return Array.isArray(operand) && operand.some((o) => equal(value, o));
|
|
76
|
+
case '$nin':
|
|
77
|
+
return Array.isArray(operand) && !operand.some((o) => equal(value, o));
|
|
78
|
+
case '$exists':
|
|
79
|
+
return (value !== undefined) === operand;
|
|
80
|
+
case '$contains':
|
|
81
|
+
if (typeof value === 'string' && typeof operand === 'string')
|
|
82
|
+
return value.toLowerCase().includes(operand.toLowerCase());
|
|
83
|
+
if (Array.isArray(value))
|
|
84
|
+
return value.some((item) => equal(item, operand));
|
|
85
|
+
return false;
|
|
86
|
+
default:
|
|
87
|
+
throw new Error(`Unknown operator ${op}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/** Whether one field satisfies a condition: an operator object, or a value to equal. */
|
|
91
|
+
function conditionHolds(value, condition) {
|
|
92
|
+
if (isPlainObject(condition) && Object.keys(condition).length > 0 && Object.keys(condition).every((k) => k.startsWith('$'))) {
|
|
93
|
+
return Object.entries(condition).every(([op, operand]) => operatorHolds(op, value, operand));
|
|
94
|
+
}
|
|
95
|
+
return equal(value, condition);
|
|
96
|
+
}
|
|
97
|
+
/** Whether a record matches a filter. */
|
|
98
|
+
export function matches(record, filter) {
|
|
99
|
+
return Object.entries(filter).every(([field, condition]) => {
|
|
100
|
+
if (field === '$and')
|
|
101
|
+
return condition.every((f) => matches(record, f));
|
|
102
|
+
if (field === '$or')
|
|
103
|
+
return condition.some((f) => matches(record, f));
|
|
104
|
+
if (field === '$not')
|
|
105
|
+
return !matches(record, condition);
|
|
106
|
+
return conditionHolds(fieldValue(record, field), condition);
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
// ─── Checking a query before running it ─────────────────────────────
|
|
110
|
+
function checkFilter(filter, at) {
|
|
111
|
+
if (!isPlainObject(filter))
|
|
112
|
+
return `${at} must be an object`;
|
|
113
|
+
for (const [field, condition] of Object.entries(filter)) {
|
|
114
|
+
if (field === '$and' || field === '$or') {
|
|
115
|
+
if (!Array.isArray(condition))
|
|
116
|
+
return `${at}.${field} must be a list of filters`;
|
|
117
|
+
for (const [i, sub] of condition.entries()) {
|
|
118
|
+
const problem = checkFilter(sub, `${at}.${field}[${i}]`);
|
|
119
|
+
if (problem)
|
|
120
|
+
return problem;
|
|
121
|
+
}
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
if (field === '$not') {
|
|
125
|
+
const problem = checkFilter(condition, `${at}.$not`);
|
|
126
|
+
if (problem)
|
|
127
|
+
return problem;
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (field.startsWith('$'))
|
|
131
|
+
return `${at}: "${field}" is not a field or a logical operator ($and, $or, $not)`;
|
|
132
|
+
if (field.startsWith('@') && !META[field])
|
|
133
|
+
return `${at}: unknown record field "${field}" — use one of ${Object.keys(META).join(', ')}`;
|
|
134
|
+
if (isPlainObject(condition) && Object.keys(condition).some((k) => k.startsWith('$'))) {
|
|
135
|
+
for (const op of Object.keys(condition)) {
|
|
136
|
+
if (!OPERATORS.has(op))
|
|
137
|
+
return `${at}.${field}: unknown operator "${op}" — use one of ${[...OPERATORS].join(', ')}`;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
function checkIncludes(includes, at, depth) {
|
|
144
|
+
if (!isPlainObject(includes))
|
|
145
|
+
return `${at} must be an object of named includes`;
|
|
146
|
+
if (depth > MAX_INCLUDE_DEPTH)
|
|
147
|
+
return `${at}: includes nest at most ${MAX_INCLUDE_DEPTH} deep`;
|
|
148
|
+
for (const [name, spec] of Object.entries(includes)) {
|
|
149
|
+
const inc = spec;
|
|
150
|
+
const here = `${at}.${name}`;
|
|
151
|
+
if (!isPlainObject(inc))
|
|
152
|
+
return `${here} must be an object`;
|
|
153
|
+
if (typeof inc.rel !== 'string')
|
|
154
|
+
return `${here}.rel is required: the link role to follow, e.g. "about"`;
|
|
155
|
+
if (inc.from !== undefined && typeof inc.from !== 'string')
|
|
156
|
+
return `${here}.from must be a collection name`;
|
|
157
|
+
if (inc.direction !== undefined && inc.direction !== 'in' && inc.direction !== 'out')
|
|
158
|
+
return `${here}.direction must be "in" or "out"`;
|
|
159
|
+
if (inc.limit !== undefined && (!Number.isInteger(inc.limit) || inc.limit < 0))
|
|
160
|
+
return `${here}.limit must be a whole number`;
|
|
161
|
+
if (inc.where !== undefined) {
|
|
162
|
+
const problem = checkFilter(inc.where, `${here}.where`);
|
|
163
|
+
if (problem)
|
|
164
|
+
return problem;
|
|
165
|
+
}
|
|
166
|
+
if (inc.include !== undefined) {
|
|
167
|
+
const problem = checkIncludes(inc.include, `${here}.include`, depth + 1);
|
|
168
|
+
if (problem)
|
|
169
|
+
return problem;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
/** Why a query cannot run, or null when it can. Queries are data; functions and unknown operators are refused. */
|
|
175
|
+
export function checkQuery(query) {
|
|
176
|
+
const q = query;
|
|
177
|
+
if (!isPlainObject(q))
|
|
178
|
+
return 'A query must be an object';
|
|
179
|
+
if (typeof q.collection !== 'string' || !q.collection)
|
|
180
|
+
return 'A query needs a "collection"';
|
|
181
|
+
if (q.where !== undefined) {
|
|
182
|
+
const problem = checkFilter(q.where, 'where');
|
|
183
|
+
if (problem)
|
|
184
|
+
return problem;
|
|
185
|
+
}
|
|
186
|
+
if (q.include !== undefined) {
|
|
187
|
+
const problem = checkIncludes(q.include, 'include', 1);
|
|
188
|
+
if (problem)
|
|
189
|
+
return problem;
|
|
190
|
+
}
|
|
191
|
+
if (q.sort !== undefined) {
|
|
192
|
+
if (!isPlainObject(q.sort))
|
|
193
|
+
return 'sort must be an object: { field: "asc" | "desc" }';
|
|
194
|
+
for (const [field, direction] of Object.entries(q.sort)) {
|
|
195
|
+
if (direction !== 'asc' && direction !== 'desc')
|
|
196
|
+
return `sort.${field} must be "asc" or "desc"`;
|
|
197
|
+
if (field.startsWith('@') && !META[field])
|
|
198
|
+
return `sort: unknown record field "${field}"`;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
if (q.limit !== undefined && (!Number.isInteger(q.limit) || q.limit < 0))
|
|
202
|
+
return 'limit must be a whole number';
|
|
203
|
+
if (q.cursor !== undefined && typeof q.cursor !== 'string')
|
|
204
|
+
return 'cursor must be the string a previous page returned';
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../../src/query/filter.ts"],"names":[],"mappings":"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"}
|