@anodb/core 0.8.0 → 0.10.1

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.
Files changed (54) hide show
  1. package/PROTOCOL.md +30 -7
  2. package/README.md +57 -42
  3. package/dist/anodb.d.ts +1 -27
  4. package/dist/anodb.js +2 -151
  5. package/dist/anodb.js.map +1 -1
  6. package/dist/cli/init.js +5 -3
  7. package/dist/cli/init.js.map +1 -1
  8. package/dist/crypto.d.ts +2 -2
  9. package/dist/crypto.js +2 -2
  10. package/dist/crypto.js.map +1 -1
  11. package/dist/db.d.ts +9 -10
  12. package/dist/db.js +22 -31
  13. package/dist/db.js.map +1 -1
  14. package/dist/defaults.d.ts +3 -2
  15. package/dist/defaults.js +7 -5
  16. package/dist/defaults.js.map +1 -1
  17. package/dist/drivers/browser.d.ts +2 -1
  18. package/dist/drivers/browser.js +4 -1
  19. package/dist/drivers/browser.js.map +1 -1
  20. package/dist/index.d.ts +4 -7
  21. package/dist/index.js +2 -3
  22. package/dist/index.js.map +1 -1
  23. package/dist/kysely.d.ts +4 -0
  24. package/dist/kysely.js.map +1 -1
  25. package/dist/links.d.ts +8 -0
  26. package/dist/links.js +16 -0
  27. package/dist/links.js.map +1 -0
  28. package/dist/policy.d.ts +16 -0
  29. package/dist/policy.js +29 -0
  30. package/dist/policy.js.map +1 -0
  31. package/dist/react.d.ts +2 -2
  32. package/dist/react.js +1 -1
  33. package/dist/react.js.map +1 -1
  34. package/dist/schema.d.ts +12 -1
  35. package/dist/schema.js +28 -5
  36. package/dist/schema.js.map +1 -1
  37. package/dist/sharing.d.ts +18 -23
  38. package/dist/sharing.js +56 -99
  39. package/dist/sharing.js.map +1 -1
  40. package/dist/store.d.ts +8 -30
  41. package/dist/store.js +35 -86
  42. package/dist/store.js.map +1 -1
  43. package/dist/ui.d.ts +14 -44
  44. package/dist/ui.js +45 -86
  45. package/dist/ui.js.map +1 -1
  46. package/docs/DECISIONS.md +4 -0
  47. package/docs/DESIGN.md +4 -18
  48. package/package.json +3 -3
  49. package/dist/public-tables.d.ts +0 -31
  50. package/dist/public-tables.js +0 -186
  51. package/dist/public-tables.js.map +0 -1
  52. package/dist/public.d.ts +0 -75
  53. package/dist/public.js +0 -164
  54. package/dist/public.js.map +0 -1
package/dist/index.d.ts CHANGED
@@ -1,13 +1,11 @@
1
1
  export { AnoDB, createAnoDB } from './anodb.js';
2
- export type { PublicSyncFilter, SyncGap } from './anodb.js';
2
+ export type { SyncGap } from './anodb.js';
3
3
  export type { P2PMode, P2POptions, PeerInfo } from './p2p.js';
4
- export { publicTable, presets } from './public-tables.js';
5
- export type { PresetName } from './public-tables.js';
6
4
  export { AnoDBCore, AnoDBError } from './db.js';
7
- export type { Device, Invitation, JoinRequest, Member, PairingOffer } from './sharing.js';
5
+ export type { Device, Invitation, Member, PairingOffer } from './sharing.js';
8
6
  export type { Role } from './membership.js';
9
7
  export type { AnoDBErrorCode, AnoDBOptions, ChangeListener, ErrorListener, SpaceInfo, StatusListener } from './db.js';
10
- export { defineSchema, json } from './schema.js';
8
+ export { defineSchema, json, owned, ownerOfRow } from './schema.js';
11
9
  export { BLOSSOM_AUTH_KIND, BlobError, BlobStore, DEFAULT_BLOB_SERVERS, isBlobRef } from './blob.js';
12
10
  export type { BlobPutOptions, BlobRef, BlobUploadReport } from './blob.js';
13
11
  export type { KyselyDatabase, KyselyTable } from './kysely.js';
@@ -18,13 +16,12 @@ export type { BrowserDriverOptions } from './drivers/browser.js';
18
16
  export { expoSqliteDriver } from './drivers/expo.js';
19
17
  export type { ExpoSQLiteDatabase } from './drivers/expo.js';
20
18
  export type { SqlJsDatabase } from './drivers/sqljs.js';
21
- export { PublicData, KIND_NOTE, KIND_PROFILE, KIND_RELAY_LIST } from './public.js';
22
- export type { Fetched, FetchOptions, Profile, RelayList } from './public.js';
23
19
  export { RelayPool } from './relay-pool.js';
24
20
  export type { Filter, PublishResult, RelayPoolOptions } from './relay-pool.js';
25
21
  export { MESSAGE_KIND, PROTOCOL_VERSION, TAG, WRAP_KIND } from './protocol.js';
26
22
  export { DELEGATION_KIND, KEY_PACKAGE_KIND } from './identity.js';
27
23
  export { DEFAULT_DISCOVERY_RELAYS, DEFAULT_RELAYS } from './defaults.js';
24
+ export { LINK_CHANNEL } from './links.js';
28
25
  export type { SecretKeyInput } from './crypto.js';
29
26
  export { localSigner, nip07Signer, nip46Signer, nip55Signer } from './signer.js';
30
27
  export type { Nip55Bridge, Signer } from './signer.js';
package/dist/index.js CHANGED
@@ -1,17 +1,16 @@
1
1
  export { AnoDB, createAnoDB } from './anodb.js';
2
- export { publicTable, presets } from './public-tables.js';
3
2
  export { AnoDBCore, AnoDBError } from './db.js';
4
- export { defineSchema, json } from './schema.js';
3
+ export { defineSchema, json, owned, ownerOfRow } from './schema.js';
5
4
  export { BLOSSOM_AUTH_KIND, BlobError, BlobStore, DEFAULT_BLOB_SERVERS, isBlobRef } from './blob.js';
6
5
  export { sqlJsDriver } from './drivers/sqljs.js';
7
6
  export { sqlJsIndexedDB } from './drivers/sqljs-idb.js';
8
7
  export { browserDriver, loadSqlJs } from './drivers/browser.js';
9
8
  export { expoSqliteDriver } from './drivers/expo.js';
10
- export { PublicData, KIND_NOTE, KIND_PROFILE, KIND_RELAY_LIST } from './public.js';
11
9
  export { RelayPool } from './relay-pool.js';
12
10
  export { MESSAGE_KIND, PROTOCOL_VERSION, TAG, WRAP_KIND } from './protocol.js';
13
11
  export { DELEGATION_KIND, KEY_PACKAGE_KIND } from './identity.js';
14
12
  export { DEFAULT_DISCOVERY_RELAYS, DEFAULT_RELAYS } from './defaults.js';
13
+ export { LINK_CHANNEL } from './links.js';
15
14
  export { localSigner, nip07Signer, nip46Signer, nip55Signer } from './signer.js';
16
15
  export { memoryKeyStore } from './keystore/memory.js';
17
16
  export { browserKeyStore } from './keystore/browser.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAG/C,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAEzD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAI/C,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,SAAS,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAGpG,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAE/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAGpD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAElF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAC9E,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AACjE,OAAO,EAAE,wBAAwB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAExE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAGhF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAEhF,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAG/C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAI/C,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACnE,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,SAAS,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAGpG,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAE/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAGpD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAC9E,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AACjE,OAAO,EAAE,wBAAwB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEzC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAGhF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAEhF,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAA"}
package/dist/kysely.d.ts CHANGED
@@ -9,6 +9,10 @@ export type KyselyTable<D extends TableDefinition> = {
9
9
  id: ColumnType<string, string | undefined, never>;
10
10
  createdAt: ColumnType<number | null, never, never>;
11
11
  updatedAt: ColumnType<number, never, never>;
12
+ /** Identity (pubkey) that created the row, from the row id — cannot be forged. Null for rows with custom ids. */
13
+ createdBy: ColumnType<string | null, never, never>;
14
+ /** Identity whose signed change last touched the row. */
15
+ updatedBy: ColumnType<string | null, never, never>;
12
16
  } & {
13
17
  [K in Exclude<keyof D, symbol>]: ColumnType<SelectTs<D[K]> | null, WriteTs<D[K]> | null | undefined, WriteTs<D[K]> | null>;
14
18
  };
@@ -1 +1 @@
1
- {"version":3,"file":"kysely.js","sourceRoot":"","sources":["../src/kysely.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"kysely.js","sourceRoot":"","sources":["../src/kysely.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Same-origin channel that carries an opened link (`#anodb=…`, or any other `#key=value` link such
3
+ * as anoAuth's `#anoauth=…`) to the tab that already runs the app (a second tab cannot open the
4
+ * database, see browserDriver's tab lock). Listeners ignore links they do not understand.
5
+ */
6
+ export declare const LINK_CHANNEL = "anodb:links";
7
+ /** Sends this page's `#…=…` link to the other tab. Returns true if there was one to send. */
8
+ export declare function forwardLinkToOtherTab(): boolean;
package/dist/links.js ADDED
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Same-origin channel that carries an opened link (`#anodb=…`, or any other `#key=value` link such
3
+ * as anoAuth's `#anoauth=…`) to the tab that already runs the app (a second tab cannot open the
4
+ * database, see browserDriver's tab lock). Listeners ignore links they do not understand.
5
+ */
6
+ export const LINK_CHANNEL = 'anodb:links';
7
+ /** Sends this page's `#…=…` link to the other tab. Returns true if there was one to send. */
8
+ export function forwardLinkToOtherTab() {
9
+ if (typeof location === 'undefined' || typeof BroadcastChannel === 'undefined' || !/^#[A-Za-z]+=/.test(location.hash))
10
+ return false;
11
+ const ch = new BroadcastChannel(LINK_CHANNEL);
12
+ ch.postMessage({ href: location.href });
13
+ ch.close();
14
+ return true;
15
+ }
16
+ //# sourceMappingURL=links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"links.js","sourceRoot":"","sources":["../src/links.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAA;AAEzC,6FAA6F;AAC7F,MAAM,UAAU,qBAAqB;IACnC,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,OAAO,gBAAgB,KAAK,WAAW,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAA;IACnI,MAAM,EAAE,GAAG,IAAI,gBAAgB,CAAC,YAAY,CAAC,CAAA;IAC7C,EAAE,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;IACvC,EAAE,CAAC,KAAK,EAAE,CAAA;IACV,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { Role } from './membership.js';
2
+ import type { Change } from './protocol.js';
3
+ import type { SchemaDefinition } from './types.js';
4
+ /**
5
+ * Row-level write rule, evaluated identically by every device when it applies a change (local or
6
+ * remote). A change that fails it is ignored everywhere, so the shared state cannot contain it.
7
+ *
8
+ * - Always: a row id that names an identity can only be *created* by that identity (so
9
+ * `createdBy` cannot be forged).
10
+ * - Plain tables (default): any writer may change or delete any row, like a database without RLS.
11
+ * - `owned(...)` tables: only the creator may change a row; deleting is also allowed for admins /
12
+ * the owner of the space (moderation). Admins cannot edit other people's rows.
13
+ */
14
+ export declare function changeAllowed(schema: SchemaDefinition, c: Change, writer: string, role: Role | undefined): boolean;
15
+ /** Message for a local write that the rule refuses. */
16
+ export declare const policyMessage: (c: Change) => string;
package/dist/policy.js ADDED
@@ -0,0 +1,29 @@
1
+ import { SYS_CREATED, SYS_DELETED, isOwned, ownerOfRow } from './schema.js';
2
+ /**
3
+ * Row-level write rule, evaluated identically by every device when it applies a change (local or
4
+ * remote). A change that fails it is ignored everywhere, so the shared state cannot contain it.
5
+ *
6
+ * - Always: a row id that names an identity can only be *created* by that identity (so
7
+ * `createdBy` cannot be forged).
8
+ * - Plain tables (default): any writer may change or delete any row, like a database without RLS.
9
+ * - `owned(...)` tables: only the creator may change a row; deleting is also allowed for admins /
10
+ * the owner of the space (moderation). Admins cannot edit other people's rows.
11
+ */
12
+ export function changeAllowed(schema, c, writer, role) {
13
+ const [table, rowId, column] = c;
14
+ const owner = ownerOfRow(rowId);
15
+ if (owner === null || owner === writer)
16
+ return true;
17
+ if (column === SYS_CREATED)
18
+ return false;
19
+ if (!isOwned(schema[table]))
20
+ return true;
21
+ if (column === SYS_DELETED)
22
+ return role === 'owner' || role === 'admin';
23
+ return false;
24
+ }
25
+ /** Message for a local write that the rule refuses. */
26
+ export const policyMessage = (c) => c[2] === SYS_DELETED
27
+ ? `anoDB: ${c[0]} is owned(): only the member who created this row (or an admin) can delete it`
28
+ : `anoDB: ${c[0]} is owned(): only the member who created this row can change it`;
29
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAG3E;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAAC,MAAwB,EAAE,CAAS,EAAE,MAAc,EAAE,IAAsB;IACvG,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAA;IAChC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;IAC/B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,IAAI,CAAA;IACnD,IAAI,MAAM,KAAK,WAAW;QAAE,OAAO,KAAK,CAAA;IACxC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAA;IACxC,IAAI,MAAM,KAAK,WAAW;QAAE,OAAO,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,CAAA;IACvE,OAAO,KAAK,CAAA;AACd,CAAC;AAED,uDAAuD;AACvD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAS,EAAE,EAAE,CACzC,CAAC,CAAC,CAAC,CAAC,KAAK,WAAW;IAClB,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,+EAA+E;IAC/F,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,iEAAiE,CAAA"}
package/dist/react.d.ts CHANGED
@@ -37,5 +37,5 @@ export declare function useAnoDB<D extends ReactiveDB = ReactiveDB>(): D;
37
37
  */
38
38
  export declare function useQuery<D extends ReactiveDB, R>(build: (db: D) => Query<R>, deps: readonly unknown[]): R[] | undefined;
39
39
  export declare function useSyncStatus(): SyncStatus;
40
- export { DeviceList, InviteLink, Invitations, JoinRequests, JoinSpace, Members, PairDevice, QRCode, parseAppLink, toAppLink, useIncomingLink, useLive, } from './ui.js';
41
- export type { InviteLinkProps, JoinSpaceProps, Labels, Lang, MembersProps, PairDeviceProps, SharingDB } from './ui.js';
40
+ export { AddMember, DeviceList, Invitations, Members, PairDevice, QRCode, parseAppLink, toAppLink, useIncomingLink, useLive, } from './ui.js';
41
+ export type { AddMemberProps, Labels, Lang, MembersProps, PairDeviceProps, SharingDB } from './ui.js';
package/dist/react.js CHANGED
@@ -74,5 +74,5 @@ export function useSyncStatus() {
74
74
  useEffect(() => void (ref.current = db.status), [db]);
75
75
  return useSyncExternalStore(subscribe, () => ref.current, () => ref.current);
76
76
  }
77
- export { DeviceList, InviteLink, Invitations, JoinRequests, JoinSpace, Members, PairDevice, QRCode, parseAppLink, toAppLink, useIncomingLink, useLive, } from './ui.js';
77
+ export { AddMember, DeviceList, Invitations, Members, PairDevice, QRCode, parseAppLink, toAppLink, useIncomingLink, useLive, } from './ui.js';
78
78
  //# sourceMappingURL=react.js.map
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"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"}
package/dist/schema.d.ts CHANGED
@@ -3,6 +3,17 @@ export declare const RESERVED_COLUMNS: Set<string>;
3
3
  /** System cells. They travel in the change log like user cells. */
4
4
  export declare const SYS_DELETED = "$deleted";
5
5
  export declare const SYS_CREATED = "$createdAt";
6
+ export declare const ownerOfRow: (rowId: string) => string | null;
7
+ /**
8
+ * Opt-in row-level rule. By default every writer may change or delete any row (like a table
9
+ * without row-level security). In an `owned(...)` table only the row's creator may change it;
10
+ * deleting is also allowed for admins / the owner of a shared space (moderation). Every device
11
+ * enforces it when it applies a change, so a modified client cannot get around it.
12
+ *
13
+ * defineSchema({ messages: owned({ text: 'text' }) })
14
+ */
15
+ export declare function owned<const T extends TableDefinition>(def: T): T;
16
+ export declare const isOwned: (def: TableDefinition | undefined) => boolean;
6
17
  /**
7
18
  * A `json` column with a TypeScript type for its value (reads return the parsed value):
8
19
  *
@@ -13,7 +24,7 @@ export declare function json<T = unknown>(): JsonColumn<T>;
13
24
  export declare function defineSchema<const S extends SchemaDefinition>(schema: S): S;
14
25
  export declare function validateSchema(schema: SchemaDefinition): void;
15
26
  export declare function quoteIdent(name: string): string;
16
- export declare function createTableSql(table: string, def: TableDefinition, defaultSpace: string): string;
27
+ export declare function createTableSql(table: string, def: TableDefinition, defaultSpace: string, owner?: string): string;
17
28
  /** Stable fingerprint of a table definition; projection is rebuilt when it changes. */
18
29
  export declare function tableFingerprint(def: TableDefinition): string;
19
30
  /** Validate a user value against the column type. Returns the JSON-safe wire value. */
package/dist/schema.js CHANGED
@@ -1,9 +1,31 @@
1
1
  const IDENT = /^[A-Za-z][A-Za-z0-9_]*$/;
2
- export const RESERVED_COLUMNS = new Set(['id', 'space', 'createdAt', 'updatedAt', 'isDeleted']);
2
+ export const RESERVED_COLUMNS = new Set(['id', 'space', 'createdAt', 'updatedAt', 'createdBy', 'updatedBy', 'isDeleted']);
3
3
  const COLUMN_TYPES = new Set(['text', 'integer', 'real', 'boolean', 'json']);
4
4
  /** System cells. They travel in the change log like user cells. */
5
5
  export const SYS_DELETED = '$deleted';
6
6
  export const SYS_CREATED = '$createdAt';
7
+ /**
8
+ * Row ids that name their creator. Default ids are `<64 hex pubkey>-<random>`, so `createdBy` can be
9
+ * read from the id. Nobody can create a row whose id names someone else (checked on every device),
10
+ * so `createdBy` cannot be forged. Ids without that prefix (older data, custom ids) have no creator.
11
+ */
12
+ const OWNED_ID = /^([0-9a-f]{64})(?:-[A-Za-z0-9_]{1,63})?$/;
13
+ export const ownerOfRow = (rowId) => OWNED_ID.exec(rowId)?.[1] ?? null;
14
+ const OWNED = Symbol.for('anodb.owned');
15
+ /**
16
+ * Opt-in row-level rule. By default every writer may change or delete any row (like a table
17
+ * without row-level security). In an `owned(...)` table only the row's creator may change it;
18
+ * deleting is also allowed for admins / the owner of a shared space (moderation). Every device
19
+ * enforces it when it applies a change, so a modified client cannot get around it.
20
+ *
21
+ * defineSchema({ messages: owned({ text: 'text' }) })
22
+ */
23
+ export function owned(def) {
24
+ return Object.assign({ ...def }, { [OWNED]: true });
25
+ }
26
+ export const isOwned = (def) => !!def && def[OWNED] === true;
27
+ /** Bump to rebuild every projection (new system columns). */
28
+ const PROJECTION_VERSION = 3;
7
29
  /**
8
30
  * A `json` column with a TypeScript type for its value (reads return the parsed value):
9
31
  *
@@ -43,15 +65,16 @@ const SQL_TYPE = {
43
65
  boolean: 'INTEGER',
44
66
  json: 'TEXT',
45
67
  };
46
- export function createTableSql(table, def, defaultSpace) {
68
+ export function createTableSql(table, def, defaultSpace, owner) {
47
69
  const cols = Object.entries(def).map(([c, t]) => `${quoteIdent(c)} ${SQL_TYPE[t]}`);
48
70
  const space = `space TEXT NOT NULL DEFAULT '${defaultSpace.replaceAll("'", "''")}'`;
49
- const id = 'id TEXT NOT NULL DEFAULT (lower(hex(randomblob(16))))';
50
- return `CREATE TABLE ${quoteIdent(table)} (${[space, id, ...cols, '"createdAt" INTEGER', '"updatedAt" INTEGER NOT NULL DEFAULT 0', 'PRIMARY KEY (space, id)'].join(', ')})`;
71
+ // New rows are owned by the writer: <pubkey>-<random>.
72
+ const id = owner && /^[0-9a-f]{64}$/.test(owner) ? `id TEXT NOT NULL DEFAULT ('${owner}-' || lower(hex(randomblob(8))))` : 'id TEXT NOT NULL DEFAULT (lower(hex(randomblob(16))))';
73
+ return `CREATE TABLE ${quoteIdent(table)} (${[space, id, ...cols, '"createdAt" INTEGER', '"updatedAt" INTEGER NOT NULL DEFAULT 0', '"createdBy" TEXT', '"updatedBy" TEXT', 'PRIMARY KEY (space, id)'].join(', ')})`;
51
74
  }
52
75
  /** Stable fingerprint of a table definition; projection is rebuilt when it changes. */
53
76
  export function tableFingerprint(def) {
54
- return JSON.stringify(Object.entries(def).sort(([a], [b]) => (a < b ? -1 : 1)));
77
+ return `v${PROJECTION_VERSION}|${isOwned(def) ? 'owned' : 'open'}|${JSON.stringify(Object.entries(def).sort(([a], [b]) => (a < b ? -1 : 1)))}`;
55
78
  }
56
79
  /** Validate a user value against the column type. Returns the JSON-safe wire value. */
57
80
  export function checkValue(table, column, type, value) {
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
package/dist/sharing.d.ts CHANGED
@@ -18,14 +18,6 @@ export interface Invitation {
18
18
  role: Role;
19
19
  from: string;
20
20
  }
21
- export interface JoinRequest {
22
- id: string;
23
- space: string;
24
- role: Role;
25
- identity: string;
26
- npub: string;
27
- name: string;
28
- }
29
21
  export interface PairingOffer {
30
22
  uri: string;
31
23
  /** Show this; the approving device shows the same code. */
@@ -50,13 +42,22 @@ export declare class AnoDBSharing<S extends SchemaDefinition> extends AnoDBCore<
50
42
  protected membership(space: string): Membership;
51
43
  protected invalidateMembership(space: string): void;
52
44
  protected isAuthorizedWriter(space: string, identity: string, device: string, seq: number): boolean;
45
+ protected roleOf(space: string, identity: string): Role | undefined;
53
46
  protected rebuildSpace(space: string): Set<string>;
54
47
  /** Create a shared space owned by this identity. */
55
48
  createSpace(name: string): Promise<string>;
56
49
  members(space: string): Member[];
57
50
  roleIn(space: string): Role | undefined;
58
- /** Invite by npub / pubkey. The invitee must have published a key package. */
59
- invite(space: string, who: string, role: Exclude<Role, 'owner'>): Promise<void>;
51
+ /**
52
+ * Add a member by npub / pubkey and deliver the space key to their devices (owners / admins).
53
+ * Who may join is decided outside anoDB (e.g. anoAuth): this is the primitive it calls.
54
+ * `devices`: the member's device delegations; when omitted, the devices this database already
55
+ * knows for that identity (e.g. a member of another shared space) or their published key package
56
+ * (`db.publishKeyPackage()`) are used. The new member sees an invitation and must accept it.
57
+ */
58
+ addMember(space: string, who: string, role: Exclude<Role, 'owner'>, opts?: {
59
+ devices?: NostrEvent[];
60
+ }): Promise<void>;
60
61
  setRole(space: string, who: string, role: Exclude<Role, 'owner'>): Promise<void>;
61
62
  removeMember(space: string, who: string): Promise<void>;
62
63
  transferOwnership(space: string, who: string): Promise<void>;
@@ -65,7 +66,7 @@ export declare class AnoDBSharing<S extends SchemaDefinition> extends AnoDBCore<
65
66
  * New epoch key: delivered to every active device of every member (new members get an
66
67
  * invitation instead), then a snapshot of the current state is posted in the new epoch.
67
68
  */
68
- rotateKey(space: string, invitees?: Map<string, string | undefined>): Promise<void>;
69
+ rotateKey(space: string, invitees?: ReadonlySet<string>): Promise<void>;
69
70
  /** Post the current state of a space as a (multi-part) snapshot message. */
70
71
  protected snapshot(space: string): void;
71
72
  /** Hook (v0.4: prune superseded envelopes). */
@@ -82,18 +83,12 @@ export declare class AnoDBSharing<S extends SchemaDefinition> extends AnoDBCore<
82
83
  /** Join a space you were invited to. Nothing is synced for a space until you accept. */
83
84
  acceptInvitation(space: string): Promise<void>;
84
85
  declineInvitation(space: string): void;
85
- /** One-time, expiring link. Whoever opens it can only *ask* to join; an admin must approve. */
86
- createInviteLink(space: string, opts?: {
87
- role?: Exclude<Role, 'owner'>;
88
- expiresInMs?: number;
89
- }): Promise<string>;
90
- /** Invitee: ask to join via a link. The invitation that follows is accepted automatically. */
91
- requestJoin(link: string, name?: string): Promise<void>;
92
- joinRequests(): JoinRequest[];
93
- onJoinRequest(fn: (r: JoinRequest) => void): () => void;
94
- approveJoinRequest(id: string): Promise<void>;
95
- rejectJoinRequest(id: string): void;
96
- /** Publish the list of this identity's devices so others can invite it by npub (needs the identity key). */
86
+ /**
87
+ * This identity's current device delegations (signed by the identity). Hand them to whoever adds
88
+ * you (`addMember(space, npub, role, { devices })`) when you have not published a key package.
89
+ */
90
+ deviceDelegations(): NostrEvent[];
91
+ /** Publish the list of this identity's devices so others can add it by npub (needs the identity key). */
97
92
  publishKeyPackage(): Promise<NostrEvent>;
98
93
  devices(): Device[];
99
94
  /**