@kubun/store-p2p 0.10.0 → 0.11.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/lib/index.d.ts CHANGED
@@ -3,7 +3,6 @@ import type { P2PStoreAPI } from './api.js';
3
3
  export type { P2PStoreAPI } from './api.js';
4
4
  export { createP2PStore } from './api.js';
5
5
  export { p2pStoreDefinition } from './definition.js';
6
- export { createP2PRevocationBackend } from './revocation-backend.js';
7
6
  export declare const P2P_STORE: "p2p";
8
7
  export declare function getP2PStore(provider: StoreProvider): Promise<P2PStoreAPI>;
9
- export type { Circle, CircleMember, CircleMemberTable, CircleTable, DelegationToken, DelegationTokenTable, Group, GroupHub, GroupHubTable, GroupMember, GroupMemberTable, GroupMLSState, GroupMLSStateTable, GroupTable, HeldRevocation, Hub, HubTable, InsertCircle, InsertCircleMember, InsertDelegationToken, InsertGroup, InsertGroupHub, InsertGroupMember, InsertGroupMLSState, InsertHub, InsertSyncCheckpoint, InsertSyncPeer, P2PStoreTables, PaginatedResult, PaginationParams, SyncCheckpoint, SyncCheckpointTable, SyncPeer, SyncPeerTable, UpdateGroupMLSState, } from './tables.js';
8
+ export type { Circle, CircleMember, CircleMemberTable, CircleTable, ControlLedgerEntry, ControlLedgerTable, Group, GroupDelegation, GroupDelegationTable, GroupHub, GroupHubTable, GroupMember, GroupMemberTable, GroupMLSState, GroupMLSStateTable, GroupTable, Hub, HubTable, InsertCircle, InsertCircleMember, InsertControlLedgerEntry, InsertGroup, InsertGroupDelegation, InsertGroupHub, InsertGroupMember, InsertGroupMLSState, InsertHub, InsertProjectionState, InsertSyncCheckpoint, InsertSyncPeer, P2PStoreTables, PaginatedResult, PaginationParams, ProjectionState, ProjectionStateTable, SyncCheckpoint, SyncCheckpointTable, SyncPeer, SyncPeerTable, UpdateGroupMLSState, } from './tables.js';
package/lib/index.js CHANGED
@@ -1 +1,6 @@
1
- export{createP2PStore}from"./api.js";export{p2pStoreDefinition}from"./definition.js";export{createP2PRevocationBackend}from"./revocation-backend.js";export const P2P_STORE="p2p";export function getP2PStore(e){return e.getStore("p2p")}
1
+ export { createP2PStore } from './api.js';
2
+ export { p2pStoreDefinition } from './definition.js';
3
+ export const P2P_STORE = 'p2p';
4
+ export function getP2PStore(provider) {
5
+ return provider.getStore(P2P_STORE);
6
+ }
package/lib/migrations.js CHANGED
@@ -1 +1,105 @@
1
- export function getP2PMigrations(e){let t=e.types,a=e.functions.now;return{"0-init":{async up(e){await e.schema.createTable("kubun_p2p_groups").ifNotExists().addColumn("id",t.text,e=>e.notNull().primaryKey()).addColumn("name",t.text,e=>e.notNull()).addColumn("description",t.text,e=>e.notNull().defaultTo("")).addColumn("created_by",t.text,e=>e.notNull()).addColumn("hlc",t.text,e=>e.notNull()).addColumn("created_at",t.timestamp,e=>e.defaultTo(a).notNull()).addColumn("updated_at",t.timestamp).execute(),await e.schema.createTable("kubun_p2p_group_members").ifNotExists().addColumn("group_id",t.text,e=>e.notNull()).addColumn("member_did",t.text,e=>e.notNull()).addColumn("role",t.text,e=>e.notNull().defaultTo("member")).addColumn("hlc",t.text,e=>e.notNull()).addColumn("removed_at_hlc",t.text).addColumn("created_at",t.timestamp,e=>e.defaultTo(a).notNull()).addColumn("updated_at",t.timestamp).addPrimaryKeyConstraint("pk_p2p_group_members",["group_id","member_did"]).execute(),await e.schema.createIndex("idx_p2p_group_members_did").ifNotExists().on("kubun_p2p_group_members").column("member_did").execute(),await e.schema.createTable("kubun_p2p_circles").ifNotExists().addColumn("id",t.text,e=>e.notNull().primaryKey()).addColumn("group_id",t.text,e=>e.notNull()).addColumn("name",t.text,e=>e.notNull()).addColumn("description",t.text,e=>e.notNull().defaultTo("")).addColumn("catalog_ids",t.json,e=>e.notNull().defaultTo("[]")).addColumn("hlc",t.text,e=>e.notNull()).addColumn("created_at",t.timestamp,e=>e.defaultTo(a).notNull()).addColumn("updated_at",t.timestamp).execute(),await e.schema.createIndex("idx_p2p_circles_group").ifNotExists().on("kubun_p2p_circles").column("group_id").execute(),await e.schema.createTable("kubun_p2p_circle_members").ifNotExists().addColumn("circle_id",t.text,e=>e.notNull()).addColumn("member_did",t.text,e=>e.notNull()).addColumn("role",t.text,e=>e.notNull().defaultTo("member")).addColumn("hlc",t.text,e=>e.notNull()).addColumn("created_at",t.timestamp,e=>e.defaultTo(a).notNull()).addColumn("updated_at",t.timestamp).addPrimaryKeyConstraint("pk_p2p_circle_members",["circle_id","member_did"]).execute(),await e.schema.createIndex("idx_p2p_circle_members_did").ifNotExists().on("kubun_p2p_circle_members").column("member_did").execute(),await e.schema.createTable("kubun_p2p_delegation_tokens").ifNotExists().addColumn("jti",t.text,e=>e.notNull()).addColumn("grantor",t.text,e=>e.notNull()).addColumn("audience",t.text,e=>e.notNull()).addColumn("token",t.text,e=>e.notNull()).addColumn("resource",t.text,e=>e.notNull()).addColumn("act",t.text,e=>e.notNull()).addColumn("exp","integer",e=>e.notNull()).addColumn("group_id",t.text,e=>e.notNull()).addColumn("hlc",t.text,e=>e.notNull()).addColumn("created_at",t.timestamp,e=>e.defaultTo(a).notNull()).addColumn("updated_at",t.timestamp).addPrimaryKeyConstraint("pk_p2p_delegation_tokens",["grantor","audience","resource"]).execute(),await e.schema.createIndex("idx_p2p_delegation_tokens_grantor_audience").ifNotExists().on("kubun_p2p_delegation_tokens").columns(["grantor","audience"]).execute(),await e.schema.createIndex("idx_p2p_delegation_tokens_audience_exp").ifNotExists().on("kubun_p2p_delegation_tokens").columns(["audience","exp"]).execute(),await e.schema.createIndex("idx_p2p_delegation_tokens_jti").ifNotExists().on("kubun_p2p_delegation_tokens").column("jti").execute(),await e.schema.createTable("kubun_p2p_revoked_capabilities").ifNotExists().addColumn("jti",t.text,e=>e.notNull().primaryKey()).addColumn("revoker_did",t.text,e=>e.notNull()).addColumn("revoked_iat","integer",e=>e.notNull()).addColumn("revocation_token",t.text,e=>e.notNull()).addColumn("verified_at","integer").addColumn("cap_exp","integer").addColumn("group_id",t.text,e=>e.notNull()).addColumn("hlc",t.text,e=>e.notNull()).addColumn("created_at",t.timestamp,e=>e.defaultTo(a).notNull()).addColumn("updated_at",t.timestamp).execute(),await e.schema.createIndex("idx_p2p_revoked_capabilities_verified_cap_exp").ifNotExists().on("kubun_p2p_revoked_capabilities").columns(["verified_at","cap_exp"]).execute(),await e.schema.createTable("kubun_p2p_group_mls_state").ifNotExists().addColumn("group_id",t.text,e=>e.notNull()).addColumn("device_id",t.text,e=>e.notNull()).addColumn("mls_state",t.binary,e=>e.notNull()).addColumn("credential",t.text,e=>e.notNull()).addColumn("epoch","integer",e=>e.notNull()).addColumn("root_capability",t.text,e=>e.notNull().defaultTo("")).addColumn("updated_at",t.timestamp,e=>e.defaultTo(a).notNull()).addPrimaryKeyConstraint("pk_p2p_group_mls_state",["group_id","device_id"]).execute(),await e.schema.createTable("kubun_p2p_sync_peers").ifNotExists().addColumn("id",t.text,e=>e.notNull().primaryKey()).addColumn("peer_did",t.text,e=>e.notNull().unique()).addColumn("endpoint",t.text,e=>e.notNull()).addColumn("mode",t.text,e=>e.notNull()).addColumn("allowed_users",t.json,e=>e.notNull()).addColumn("priority",t.text,e=>e.notNull().defaultTo("0")).addColumn("trust_level",t.text,e=>e.notNull()).addColumn("config",t.json,e=>e.notNull()).addColumn("created_at",t.timestamp,e=>e.defaultTo(a).notNull()).addColumn("updated_at",t.timestamp,e=>e.defaultTo(a).notNull()).execute(),await e.schema.createTable("kubun_p2p_sync_checkpoints").ifNotExists().addColumn("id",t.text,e=>e.notNull().primaryKey()).addColumn("peer_did",t.text,e=>e.notNull()).addColumn("scope",t.text,e=>e.notNull()).addColumn("checkpoint_hlc",t.text,e=>e.notNull()).addColumn("updated_at",t.timestamp,e=>e.defaultTo(a).notNull()).execute(),await e.schema.createTable("kubun_p2p_broadcast_log").ifNotExists().addColumn("doc_id",t.text,e=>e.notNull()).addColumn("version",t.text,e=>e.notNull()).addColumn("mls_group_id",t.text,e=>e.notNull()).addColumn("broadcast_at",t.timestamp,e=>e.defaultTo(a).notNull()).addPrimaryKeyConstraint("pk_p2p_broadcast_log",["doc_id","version","mls_group_id"]).execute(),await e.schema.createIndex("idx_p2p_broadcast_log_doc").ifNotExists().on("kubun_p2p_broadcast_log").column("doc_id").execute(),await e.schema.createTable("kubun_p2p_hubs").ifNotExists().addColumn("id",t.text,e=>e.notNull().primaryKey()).addColumn("label",t.text).addColumn("url",t.text,e=>e.notNull().unique()).addColumn("server_did",t.text).addColumn("created_at",t.timestamp,e=>e.defaultTo(a).notNull()).addColumn("updated_at",t.timestamp).execute(),await e.schema.createTable("kubun_p2p_group_hubs").ifNotExists().addColumn("group_id",t.text,e=>e.notNull()).addColumn("hub_id",t.text,e=>e.notNull()).addColumn("created_at",t.timestamp,e=>e.defaultTo(a).notNull()).addPrimaryKeyConstraint("pk_p2p_group_hubs",["group_id","hub_id"]).execute(),await e.schema.createIndex("idx_p2p_group_hubs_hub").ifNotExists().on("kubun_p2p_group_hubs").column("hub_id").execute()},async down(e){await e.schema.dropTable("kubun_p2p_group_hubs").ifExists().execute(),await e.schema.dropTable("kubun_p2p_hubs").ifExists().execute(),await e.schema.dropTable("kubun_p2p_broadcast_log").ifExists().execute(),await e.schema.dropTable("kubun_p2p_sync_checkpoints").ifExists().execute(),await e.schema.dropTable("kubun_p2p_sync_peers").ifExists().execute(),await e.schema.dropTable("kubun_p2p_group_mls_state").ifExists().execute(),await e.schema.dropTable("kubun_p2p_revoked_capabilities").ifExists().execute(),await e.schema.dropTable("kubun_p2p_delegation_tokens").ifExists().execute(),await e.schema.dropTable("kubun_p2p_circle_members").ifExists().execute(),await e.schema.dropTable("kubun_p2p_circles").ifExists().execute(),await e.schema.dropTable("kubun_p2p_group_members").ifExists().execute(),await e.schema.dropTable("kubun_p2p_groups").ifExists().execute()}}}}
1
+ export function getP2PMigrations(ctx) {
2
+ const t = ctx.types;
3
+ const now = ctx.functions.now;
4
+ const init = {
5
+ async up (db) {
6
+ // Groups
7
+ await db.schema.createTable('kubun_p2p_groups').ifNotExists().addColumn('id', t.text, (col)=>col.notNull().primaryKey()).addColumn('name', t.text, (col)=>col.notNull()).addColumn('description', t.text, (col)=>col.notNull().defaultTo('')).addColumn('created_by', t.text, (col)=>col.notNull()).addColumn('hlc', t.text, (col)=>col.notNull()).addColumn('created_at', t.timestamp, (col)=>col.defaultTo(now).notNull()).addColumn('updated_at', t.timestamp).execute();
8
+ // Group members
9
+ await db.schema.createTable('kubun_p2p_group_members').ifNotExists().addColumn('group_id', t.text, (col)=>col.notNull()).addColumn('member_did', t.text, (col)=>col.notNull()).addColumn('role', t.text, (col)=>col.notNull().defaultTo('member'))// LWW version key for the row, set on insert and refreshed on re-add.
10
+ .addColumn('hlc', t.text, (col)=>col.notNull())// HLC at which this peer learned the member was removed from the MLS
11
+ // group. NULL means the member is active; a non-null value tombstones
12
+ // the row so read-ACL / sync-scope queries exclude it while the
13
+ // apply-time check can still compare against the removal HLC.
14
+ .addColumn('removed_at_hlc', t.text).addColumn('created_at', t.timestamp, (col)=>col.defaultTo(now).notNull()).addColumn('updated_at', t.timestamp).addPrimaryKeyConstraint('pk_p2p_group_members', [
15
+ 'group_id',
16
+ 'member_did'
17
+ ]).execute();
18
+ await db.schema.createIndex('idx_p2p_group_members_did').ifNotExists().on('kubun_p2p_group_members').column('member_did').execute();
19
+ // Circles
20
+ await db.schema.createTable('kubun_p2p_circles').ifNotExists().addColumn('id', t.text, (col)=>col.notNull().primaryKey()).addColumn('group_id', t.text, (col)=>col.notNull()).addColumn('name', t.text, (col)=>col.notNull()).addColumn('description', t.text, (col)=>col.notNull().defaultTo('')).addColumn('catalog_ids', t.json, (col)=>col.notNull().defaultTo('[]')).addColumn('hlc', t.text, (col)=>col.notNull())// NULL means the circle is active; a non-null value tombstones the row
21
+ // so reads exclude it while the removal HLC stays comparable.
22
+ .addColumn('removed_at_hlc', t.text).addColumn('created_at', t.timestamp, (col)=>col.defaultTo(now).notNull()).addColumn('updated_at', t.timestamp).execute();
23
+ await db.schema.createIndex('idx_p2p_circles_group').ifNotExists().on('kubun_p2p_circles').column('group_id').execute();
24
+ // Circle members
25
+ await db.schema.createTable('kubun_p2p_circle_members').ifNotExists().addColumn('circle_id', t.text, (col)=>col.notNull()).addColumn('member_did', t.text, (col)=>col.notNull()).addColumn('role', t.text, (col)=>col.notNull().defaultTo('member')).addColumn('hlc', t.text, (col)=>col.notNull())// NULL means the circle member is active; a non-null value tombstones
26
+ // the row so reads exclude it while the removal HLC stays comparable.
27
+ .addColumn('removed_at_hlc', t.text).addColumn('created_at', t.timestamp, (col)=>col.defaultTo(now).notNull()).addColumn('updated_at', t.timestamp).addPrimaryKeyConstraint('pk_p2p_circle_members', [
28
+ 'circle_id',
29
+ 'member_did'
30
+ ]).execute();
31
+ await db.schema.createIndex('idx_p2p_circle_members_did').ifNotExists().on('kubun_p2p_circle_members').column('member_did').execute();
32
+ // Group-delegation edge. The delegation token and revocation rows live in
33
+ // the core delegation store (group-agnostic); this thin edge records the
34
+ // one group a delegation `jti` was granted in, so the p2p layer can still
35
+ // resolve a cap's group for revoke-broadcast targeting and listing
36
+ // enrichment. One group per `jti`, so `jti` is the primary key.
37
+ await db.schema.createTable('kubun_p2p_group_delegation').ifNotExists().addColumn('group_id', t.text, (col)=>col.notNull()).addColumn('jti', t.text, (col)=>col.notNull().primaryKey()).execute();
38
+ // Group MLS state
39
+ await db.schema.createTable('kubun_p2p_group_mls_state').ifNotExists().addColumn('group_id', t.text, (col)=>col.notNull()).addColumn('device_id', t.text, (col)=>col.notNull()).addColumn('mls_state', t.binary, (col)=>col.notNull()).addColumn('credential', t.text, (col)=>col.notNull()).addColumn('epoch', 'integer', (col)=>col.notNull()).addColumn('root_capability', t.text, (col)=>col.notNull().defaultTo('')).addColumn('updated_at', t.timestamp, (col)=>col.defaultTo(now).notNull()).addPrimaryKeyConstraint('pk_p2p_group_mls_state', [
40
+ 'group_id',
41
+ 'device_id'
42
+ ]).execute();
43
+ // Sync peers
44
+ await db.schema.createTable('kubun_p2p_sync_peers').ifNotExists().addColumn('id', t.text, (col)=>col.notNull().primaryKey()).addColumn('peer_did', t.text, (col)=>col.notNull().unique()).addColumn('endpoint', t.text, (col)=>col.notNull()).addColumn('mode', t.text, (col)=>col.notNull()).addColumn('allowed_users', t.json, (col)=>col.notNull()).addColumn('priority', t.text, (col)=>col.notNull().defaultTo('0')).addColumn('trust_level', t.text, (col)=>col.notNull()).addColumn('config', t.json, (col)=>col.notNull()).addColumn('created_at', t.timestamp, (col)=>col.defaultTo(now).notNull()).addColumn('updated_at', t.timestamp, (col)=>col.defaultTo(now).notNull()).execute();
45
+ // Sync checkpoints
46
+ await db.schema.createTable('kubun_p2p_sync_checkpoints').ifNotExists().addColumn('id', t.text, (col)=>col.notNull().primaryKey()).addColumn('peer_did', t.text, (col)=>col.notNull()).addColumn('scope', t.text, (col)=>col.notNull()).addColumn('checkpoint_hlc', t.text, (col)=>col.notNull()).addColumn('updated_at', t.timestamp, (col)=>col.defaultTo(now).notNull()).execute();
47
+ // Broadcast log
48
+ await db.schema.createTable('kubun_p2p_broadcast_log').ifNotExists().addColumn('doc_id', t.text, (col)=>col.notNull()).addColumn('version', t.text, (col)=>col.notNull()).addColumn('mls_group_id', t.text, (col)=>col.notNull()).addColumn('broadcast_at', t.timestamp, (col)=>col.defaultTo(now).notNull()).addPrimaryKeyConstraint('pk_p2p_broadcast_log', [
49
+ 'doc_id',
50
+ 'version',
51
+ 'mls_group_id'
52
+ ]).execute();
53
+ await db.schema.createIndex('idx_p2p_broadcast_log_doc').ifNotExists().on('kubun_p2p_broadcast_log').column('doc_id').execute();
54
+ // Hubs (device-local, never synced — no hlc column)
55
+ await db.schema.createTable('kubun_p2p_hubs').ifNotExists().addColumn('id', t.text, (col)=>col.notNull().primaryKey()).addColumn('label', t.text).addColumn('url', t.text, (col)=>col.notNull().unique()).addColumn('server_did', t.text).addColumn('created_at', t.timestamp, (col)=>col.defaultTo(now).notNull()).addColumn('updated_at', t.timestamp).execute();
56
+ // Group hubs (join table, device-local — no hlc column)
57
+ await db.schema.createTable('kubun_p2p_group_hubs').ifNotExists().addColumn('group_id', t.text, (col)=>col.notNull()).addColumn('hub_id', t.text, (col)=>col.notNull()).addColumn('created_at', t.timestamp, (col)=>col.defaultTo(now).notNull()).addPrimaryKeyConstraint('pk_p2p_group_hubs', [
58
+ 'group_id',
59
+ 'hub_id'
60
+ ]).execute();
61
+ await db.schema.createIndex('idx_p2p_group_hubs_hub').ifNotExists().on('kubun_p2p_group_hubs').column('hub_id').execute();
62
+ // Control ledger: append-only signed-claim log. `entry_id` (content
63
+ // digest of `signed_token`) is the primary key, so a re-delivered entry
64
+ // is a no-op insert. Rows are read ordered by `(hlc, entry_id)` for a
65
+ // deterministic reducer fold; index that pair scoped to the group.
66
+ await db.schema.createTable('kubun_p2p_control_ledger').ifNotExists().addColumn('group_id', t.text, (col)=>col.notNull()).addColumn('entry_id', t.text, (col)=>col.notNull().primaryKey()).addColumn('type', t.text, (col)=>col.notNull()).addColumn('subject', t.text, (col)=>col.notNull()).addColumn('value', t.json, (col)=>col.notNull()).addColumn('hlc', t.text, (col)=>col.notNull()).addColumn('issuer_did', t.text, (col)=>col.notNull()).addColumn('signed_token', t.text, (col)=>col.notNull()).addColumn('received_at', t.timestamp, (col)=>col.defaultTo(now).notNull()).execute();
67
+ await db.schema.createIndex('idx_p2p_control_ledger_group_order').ifNotExists().on('kubun_p2p_control_ledger').columns([
68
+ 'group_id',
69
+ 'hlc',
70
+ 'entry_id'
71
+ ]).execute();
72
+ await db.schema.createIndex('idx_p2p_control_ledger_group_type').ifNotExists().on('kubun_p2p_control_ledger').columns([
73
+ 'group_id',
74
+ 'type'
75
+ ]).execute();
76
+ // Projection watermark: how far a given `(group, projection)` fold has
77
+ // been materialized. An in-order entry (hlc > watermark) applies
78
+ // incrementally and advances this; an out-of-order or absent watermark
79
+ // triggers a full reproject. The projection is disposable — this row only
80
+ // optimizes away re-folding the whole ledger per receive.
81
+ await db.schema.createTable('kubun_p2p_projection_state').ifNotExists().addColumn('group_id', t.text, (col)=>col.notNull()).addColumn('projection', t.text, (col)=>col.notNull()).addColumn('projected_through_hlc', t.text, (col)=>col.notNull()).addColumn('updated_at', t.timestamp).addPrimaryKeyConstraint('pk_p2p_projection_state', [
82
+ 'group_id',
83
+ 'projection'
84
+ ]).execute();
85
+ },
86
+ async down (db) {
87
+ await db.schema.dropTable('kubun_p2p_projection_state').ifExists().execute();
88
+ await db.schema.dropTable('kubun_p2p_control_ledger').ifExists().execute();
89
+ await db.schema.dropTable('kubun_p2p_group_hubs').ifExists().execute();
90
+ await db.schema.dropTable('kubun_p2p_hubs').ifExists().execute();
91
+ await db.schema.dropTable('kubun_p2p_broadcast_log').ifExists().execute();
92
+ await db.schema.dropTable('kubun_p2p_sync_checkpoints').ifExists().execute();
93
+ await db.schema.dropTable('kubun_p2p_sync_peers').ifExists().execute();
94
+ await db.schema.dropTable('kubun_p2p_group_mls_state').ifExists().execute();
95
+ await db.schema.dropTable('kubun_p2p_group_delegation').ifExists().execute();
96
+ await db.schema.dropTable('kubun_p2p_circle_members').ifExists().execute();
97
+ await db.schema.dropTable('kubun_p2p_circles').ifExists().execute();
98
+ await db.schema.dropTable('kubun_p2p_group_members').ifExists().execute();
99
+ await db.schema.dropTable('kubun_p2p_groups').ifExists().execute();
100
+ }
101
+ };
102
+ return {
103
+ '0-init': init
104
+ };
105
+ }
package/lib/tables.d.ts CHANGED
@@ -33,6 +33,7 @@ export type CircleTable = {
33
33
  description: DefaultedStringColumn;
34
34
  catalog_ids: JSONArrayColumn<string>;
35
35
  hlc: string;
36
+ removed_at_hlc: NullableStringColumn;
36
37
  created_at: CreatedAtColumn;
37
38
  updated_at: UpdatedAtColumn;
38
39
  };
@@ -43,50 +44,18 @@ export type CircleMemberTable = {
43
44
  member_did: string;
44
45
  role: DefaultedStringColumn;
45
46
  hlc: string;
47
+ removed_at_hlc: NullableStringColumn;
46
48
  created_at: CreatedAtColumn;
47
49
  updated_at: UpdatedAtColumn;
48
50
  };
49
51
  export type CircleMember = Selectable<CircleMemberTable>;
50
52
  export type InsertCircleMember = Insertable<CircleMemberTable>;
51
- export type DelegationTokenTable = {
52
- jti: string;
53
- grantor: string;
54
- audience: string;
55
- token: string;
56
- resource: string;
57
- act: string;
58
- exp: number;
59
- group_id: string;
60
- hlc: string;
61
- created_at: CreatedAtColumn;
62
- updated_at: UpdatedAtColumn;
63
- };
64
- export type DelegationToken = Selectable<DelegationTokenTable>;
65
- export type InsertDelegationToken = Insertable<DelegationTokenTable>;
66
- export type RevokedCapabilityTable = {
67
- jti: string;
68
- revoker_did: string;
69
- revoked_iat: number;
70
- revocation_token: string;
71
- verified_at: number | null;
72
- cap_exp: number | null;
53
+ export type GroupDelegationTable = {
73
54
  group_id: string;
74
- hlc: string;
75
- created_at: CreatedAtColumn;
76
- updated_at: UpdatedAtColumn;
77
- };
78
- export type RevokedCapability = Selectable<RevokedCapabilityTable>;
79
- export type InsertRevokedCapability = Insertable<RevokedCapabilityTable>;
80
- export type HeldRevocation = {
81
55
  jti: string;
82
- grantor: string;
83
- audience: string;
84
- revoker_did: string;
85
- revoked_iat: number;
86
- verified_at: number;
87
- cap_exp: number | null;
88
- group_id: string;
89
56
  };
57
+ export type GroupDelegation = Selectable<GroupDelegationTable>;
58
+ export type InsertGroupDelegation = Insertable<GroupDelegationTable>;
90
59
  export type GroupMLSStateTable = {
91
60
  group_id: string;
92
61
  device_id: string;
@@ -132,6 +101,27 @@ export type BroadcastLogTable = {
132
101
  };
133
102
  export type BroadcastLogEntry = Selectable<BroadcastLogTable>;
134
103
  export type InsertBroadcastLogEntry = Insertable<BroadcastLogTable>;
104
+ export type ControlLedgerTable = {
105
+ group_id: string;
106
+ entry_id: string;
107
+ type: string;
108
+ subject: string;
109
+ value: JSONValueColumn<unknown>;
110
+ hlc: string;
111
+ issuer_did: string;
112
+ signed_token: string;
113
+ received_at: CreatedAtColumn;
114
+ };
115
+ export type ControlLedgerEntry = Selectable<ControlLedgerTable>;
116
+ export type InsertControlLedgerEntry = Insertable<ControlLedgerTable>;
117
+ export type ProjectionStateTable = {
118
+ group_id: string;
119
+ projection: string;
120
+ projected_through_hlc: string;
121
+ updated_at: UpdatedAtColumn;
122
+ };
123
+ export type ProjectionState = Selectable<ProjectionStateTable>;
124
+ export type InsertProjectionState = Insertable<ProjectionStateTable>;
135
125
  export type HubTable = {
136
126
  id: string;
137
127
  label: string | null;
@@ -162,12 +152,13 @@ export type P2PStoreTables = {
162
152
  kubun_p2p_group_members: GroupMemberTable;
163
153
  kubun_p2p_circles: CircleTable;
164
154
  kubun_p2p_circle_members: CircleMemberTable;
165
- kubun_p2p_delegation_tokens: DelegationTokenTable;
166
- kubun_p2p_revoked_capabilities: RevokedCapabilityTable;
155
+ kubun_p2p_group_delegation: GroupDelegationTable;
167
156
  kubun_p2p_group_mls_state: GroupMLSStateTable;
168
157
  kubun_p2p_sync_peers: SyncPeerTable;
169
158
  kubun_p2p_sync_checkpoints: SyncCheckpointTable;
170
159
  kubun_p2p_broadcast_log: BroadcastLogTable;
160
+ kubun_p2p_control_ledger: ControlLedgerTable;
161
+ kubun_p2p_projection_state: ProjectionStateTable;
171
162
  kubun_p2p_hubs: HubTable;
172
163
  kubun_p2p_group_hubs: GroupHubTable;
173
164
  };
package/lib/tables.js CHANGED
@@ -1 +1,2 @@
1
- export{};
1
+ // --- Aggregate P2PStoreTables type ---
2
+ export { };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kubun/store-p2p",
3
- "version": "0.10.0",
3
+ "version": "0.11.0",
4
4
  "license": "see LICENSE.md",
5
5
  "keywords": [],
6
6
  "type": "module",
@@ -15,21 +15,22 @@
15
15
  ],
16
16
  "sideEffects": false,
17
17
  "dependencies": {
18
- "@enkaku/capability": "^0.16.0",
18
+ "@kokuin/capability": "^0.1.0",
19
+ "@kokuin/token": "^0.1.1",
19
20
  "kysely": "^0.29.2",
20
- "@kubun/db": "^0.10.0",
21
- "@kubun/db-adapter": "^0.10.0",
22
- "@kubun/logger": "^0.10.0"
21
+ "@kubun/db": "^0.11.0",
22
+ "@kubun/logger": "^0.11.0",
23
+ "@kubun/db-adapter": "^0.11.0"
23
24
  },
24
25
  "devDependencies": {
25
- "@testcontainers/postgresql": "^12.0.1",
26
- "@kubun/db-better-sqlite": "^0.10.0",
27
- "@kubun/db-postgres": "^0.10.0",
28
- "@kubun/hlc": "^0.10.0"
26
+ "@testcontainers/postgresql": "^12.0.4",
27
+ "@kubun/db-better-sqlite": "^0.11.0",
28
+ "@kubun/db-postgres": "^0.11.0",
29
+ "@kubun/hlc": "^0.11.0"
29
30
  },
30
31
  "scripts": {
31
32
  "build:clean": "del lib",
32
- "build:js": "swc src -d ./lib --config-file ../../swc.json --strip-leading-paths",
33
+ "build:js": "swc src -d ./lib --config-file ../../node_modules/@kigu/dev/swc.json --strip-leading-paths",
33
34
  "build:types": "tsc --emitDeclarationOnly --skipLibCheck",
34
35
  "build:types:ci": "tsc --emitDeclarationOnly --declarationMap false",
35
36
  "build": "pnpm run build:clean && pnpm run build:js && pnpm run build:types",
@@ -1,3 +0,0 @@
1
- import type { RevocationBackend } from '@enkaku/capability';
2
- import type { P2PStoreAPI } from './api.js';
3
- export declare function createP2PRevocationBackend(api: P2PStoreAPI): RevocationBackend;
@@ -1 +0,0 @@
1
- export function createP2PRevocationBackend(e){return{async add(e){},isRevoked:async a=>await e.isRevoked(a)}}