@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/api.d.ts +148 -119
- package/lib/api.js +593 -1
- package/lib/definition.js +7 -1
- package/lib/index.d.ts +1 -2
- package/lib/index.js +6 -1
- package/lib/migrations.js +105 -1
- package/lib/tables.d.ts +29 -38
- package/lib/tables.js +2 -1
- package/package.json +11 -10
- package/lib/revocation-backend.d.ts +0 -3
- package/lib/revocation-backend.js +0 -1
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,
|
|
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
|
|
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(
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
"@
|
|
18
|
+
"@kokuin/capability": "^0.1.0",
|
|
19
|
+
"@kokuin/token": "^0.1.1",
|
|
19
20
|
"kysely": "^0.29.2",
|
|
20
|
-
"@kubun/db": "^0.
|
|
21
|
-
"@kubun/
|
|
22
|
-
"@kubun/
|
|
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.
|
|
26
|
-
"@kubun/db-better-sqlite": "^0.
|
|
27
|
-
"@kubun/db-postgres": "^0.
|
|
28
|
-
"@kubun/hlc": "^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 +0,0 @@
|
|
|
1
|
-
export function createP2PRevocationBackend(e){return{async add(e){},isRevoked:async a=>await e.isRevoked(a)}}
|