@decentrl/sdk 0.0.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 (74) hide show
  1. package/dist/client.d.ts +36 -0
  2. package/dist/client.d.ts.map +1 -0
  3. package/dist/client.js +192 -0
  4. package/dist/contract-manager.d.ts +23 -0
  5. package/dist/contract-manager.d.ts.map +1 -0
  6. package/dist/contract-manager.js +91 -0
  7. package/dist/define-app.d.ts +8 -0
  8. package/dist/define-app.d.ts.map +1 -0
  9. package/dist/define-app.js +7 -0
  10. package/dist/direct-transport.d.ts +69 -0
  11. package/dist/direct-transport.d.ts.map +1 -0
  12. package/dist/direct-transport.js +450 -0
  13. package/dist/errors.d.ts +7 -0
  14. package/dist/errors.d.ts.map +1 -0
  15. package/dist/errors.js +10 -0
  16. package/dist/event-processor.d.ts +19 -0
  17. package/dist/event-processor.d.ts.map +1 -0
  18. package/dist/event-processor.js +93 -0
  19. package/dist/identity-manager.d.ts +22 -0
  20. package/dist/identity-manager.d.ts.map +1 -0
  21. package/dist/identity-manager.js +62 -0
  22. package/dist/identity-serialization.d.ts +5 -0
  23. package/dist/identity-serialization.d.ts.map +1 -0
  24. package/dist/identity-serialization.js +30 -0
  25. package/dist/index.d.ts +18 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +10 -0
  28. package/dist/persistence.d.ts +11 -0
  29. package/dist/persistence.d.ts.map +1 -0
  30. package/dist/persistence.js +82 -0
  31. package/dist/state-store.d.ts +12 -0
  32. package/dist/state-store.d.ts.map +1 -0
  33. package/dist/state-store.js +32 -0
  34. package/dist/sync-manager.d.ts +33 -0
  35. package/dist/sync-manager.d.ts.map +1 -0
  36. package/dist/sync-manager.js +244 -0
  37. package/dist/tag-templates.d.ts +2 -0
  38. package/dist/tag-templates.d.ts.map +1 -0
  39. package/dist/tag-templates.js +23 -0
  40. package/dist/test-helpers.d.ts +15 -0
  41. package/dist/test-helpers.d.ts.map +1 -0
  42. package/dist/test-helpers.js +65 -0
  43. package/dist/transport.d.ts +41 -0
  44. package/dist/transport.d.ts.map +1 -0
  45. package/dist/transport.js +1 -0
  46. package/dist/types.d.ts +131 -0
  47. package/dist/types.d.ts.map +1 -0
  48. package/dist/types.js +1 -0
  49. package/dist/websocket-transport.d.ts +36 -0
  50. package/dist/websocket-transport.d.ts.map +1 -0
  51. package/dist/websocket-transport.js +160 -0
  52. package/package.json +35 -0
  53. package/src/client.ts +277 -0
  54. package/src/contract-manager.test.ts +207 -0
  55. package/src/contract-manager.ts +130 -0
  56. package/src/define-app.ts +25 -0
  57. package/src/direct-transport.test.ts +460 -0
  58. package/src/direct-transport.ts +729 -0
  59. package/src/errors.ts +23 -0
  60. package/src/event-processor.ts +133 -0
  61. package/src/identity-manager.ts +91 -0
  62. package/src/identity-serialization.ts +33 -0
  63. package/src/index.ts +43 -0
  64. package/src/persistence.ts +103 -0
  65. package/src/sdk.e2e.test.ts +367 -0
  66. package/src/state-store.ts +42 -0
  67. package/src/sync-manager.test.ts +414 -0
  68. package/src/sync-manager.ts +308 -0
  69. package/src/tag-templates.test.ts +111 -0
  70. package/src/tag-templates.ts +30 -0
  71. package/src/test-helpers.ts +88 -0
  72. package/src/transport.ts +65 -0
  73. package/src/types.ts +191 -0
  74. package/src/websocket-transport.ts +233 -0
@@ -0,0 +1,36 @@
1
+ import { ContractManager } from './contract-manager.js';
2
+ import { IdentityManager } from './identity-manager.js';
3
+ import type { DecentrlAppConfig, DecentrlClientConfig, EventDefinitions, EventEnvelope, InferState, PaginatedResult, PublishOptions, QueryOptions, StateDefinitions, StateListener, SyncOptions } from './types.js';
4
+ import type { ConnectionStatus } from './websocket-transport.js';
5
+ export declare class DecentrlClient<TEvents extends EventDefinitions, TState extends StateDefinitions<TEvents>> {
6
+ private appConfig;
7
+ private clientConfig;
8
+ private stateStore;
9
+ private eventProcessor;
10
+ private syncManager;
11
+ private transport;
12
+ private unsubscribePersistState;
13
+ private unsubscribePersistIdentity;
14
+ readonly identity: IdentityManager;
15
+ readonly contracts: ContractManager;
16
+ constructor(appConfig: DecentrlAppConfig<TEvents, TState>, clientConfig: DecentrlClientConfig);
17
+ private setupPersistence;
18
+ publish<K extends string & keyof TEvents>(eventType: K, data: TEvents[K] extends {
19
+ schema: infer S extends import('zod').ZodType;
20
+ } ? import('zod').infer<S> : never, options?: PublishOptions): Promise<void>;
21
+ query(options?: QueryOptions): Promise<PaginatedResult<EventEnvelope>>;
22
+ onEvent(listener: (envelope: EventEnvelope) => void): () => void;
23
+ queryAndProcess(options?: QueryOptions): Promise<{
24
+ processed: number;
25
+ total: number;
26
+ }>;
27
+ getState: () => InferState<TState>;
28
+ subscribe: (listener: StateListener<InferState<TState>>) => (() => void);
29
+ startSync(options?: SyncOptions): void;
30
+ stopSync(): void;
31
+ sync(): Promise<void>;
32
+ getConnectionStatus: () => ConnectionStatus;
33
+ onConnectionStatusChange: (listener: (status: ConnectionStatus) => void) => (() => void);
34
+ reset(): void;
35
+ }
36
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAIxD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAWxD,OAAO,KAAK,EACX,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,aAAa,EAEb,UAAU,EACV,eAAe,EACf,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,qBAAa,cAAc,CAC1B,OAAO,SAAS,gBAAgB,EAChC,MAAM,SAAS,gBAAgB,CAAC,OAAO,CAAC;IAavC,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,YAAY;IAZrB,OAAO,CAAC,UAAU,CAAiC;IACnD,OAAO,CAAC,cAAc,CAAkC;IACxD,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,uBAAuB,CAA6B;IAC5D,OAAO,CAAC,0BAA0B,CAA6B;IAE/D,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;gBAG3B,SAAS,EAAE,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,EAC7C,YAAY,EAAE,oBAAoB;IAqE3C,OAAO,CAAC,gBAAgB;IA2BlB,OAAO,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,OAAO,EAC7C,SAAS,EAAE,CAAC,EACZ,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS;QAAE,MAAM,EAAE,MAAM,CAAC,SAAS,OAAO,KAAK,EAAE,OAAO,CAAA;KAAE,GACvE,OAAO,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GACtB,KAAK,EACR,OAAO,CAAC,EAAE,cAAc,GACtB,OAAO,CAAC,IAAI,CAAC;IAmCV,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;IAoB5E,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,IAAI,GAAG,MAAM,IAAI;IAI1D,eAAe,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAO5F,QAAQ,QAAO,UAAU,CAAC,MAAM,CAAC,CAE/B;IAEF,SAAS,GAAI,UAAU,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAG,CAAC,MAAM,IAAI,CAAC,CAErE;IAEF,SAAS,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI;IAItC,QAAQ,IAAI,IAAI;IAIV,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,mBAAmB,QAAO,gBAAgB,CAExC;IAEF,wBAAwB,GAAI,UAAU,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,KAAG,CAAC,MAAM,IAAI,CAAC,CAErF;IAEF,KAAK,IAAI,IAAI;CAiCb"}
package/dist/client.js ADDED
@@ -0,0 +1,192 @@
1
+ import { ContractManager } from './contract-manager.js';
2
+ import { DirectTransport } from './direct-transport.js';
3
+ import { DecentrlSDKError } from './errors.js';
4
+ import { EventProcessor } from './event-processor.js';
5
+ import { IdentityManager } from './identity-manager.js';
6
+ import { clearPersisted, loadPersistedIdentity, loadPersistedState, persistIdentity, persistState, } from './persistence.js';
7
+ import { StateStore } from './state-store.js';
8
+ import { SyncManager } from './sync-manager.js';
9
+ export class DecentrlClient {
10
+ appConfig;
11
+ clientConfig;
12
+ stateStore;
13
+ eventProcessor;
14
+ syncManager;
15
+ transport;
16
+ unsubscribePersistState = null;
17
+ unsubscribePersistIdentity = null;
18
+ identity;
19
+ contracts;
20
+ constructor(appConfig, clientConfig) {
21
+ this.appConfig = appConfig;
22
+ this.clientConfig = clientConfig;
23
+ // Build initial state from slice definitions
24
+ const initialState = {};
25
+ for (const key of Object.keys(appConfig.state)) {
26
+ // TS can't statically index InferState<TState> during construction
27
+ initialState[key] = appConfig.state[key].initial;
28
+ }
29
+ // Restore persisted state if available
30
+ const persistOpts = clientConfig.persist;
31
+ let restoredState = initialState;
32
+ if (persistOpts) {
33
+ const saved = loadPersistedState(persistOpts);
34
+ if (saved) {
35
+ // Merge: use saved values for slices that exist, fall back to initial for new slices
36
+ restoredState = { ...initialState, ...saved };
37
+ }
38
+ }
39
+ this.stateStore = new StateStore(restoredState);
40
+ this.identity = new IdentityManager();
41
+ this.contracts = new ContractManager();
42
+ // Set up transport (auto-create DirectTransport if none provided)
43
+ this.transport = clientConfig.transport ?? new DirectTransport();
44
+ this.identity.setTransport(this.transport);
45
+ this.contracts.setTransport(this.transport);
46
+ // Seed identity from transport (e.g. extension already has it after connect)
47
+ const transportIdentity = this.transport.getIdentity();
48
+ if (transportIdentity) {
49
+ try {
50
+ this.identity.load(transportIdentity);
51
+ }
52
+ catch (err) {
53
+ console.debug('[Decentrl] Failed to seed identity from transport:', err);
54
+ }
55
+ }
56
+ this.eventProcessor = new EventProcessor(appConfig.events, appConfig.state, this.stateStore);
57
+ this.syncManager = new SyncManager(this.eventProcessor, this.contracts, this.identity, this.transport);
58
+ // Restore persisted identity
59
+ if (persistOpts) {
60
+ const savedIdentity = loadPersistedIdentity(persistOpts);
61
+ if (savedIdentity) {
62
+ try {
63
+ this.identity.load(savedIdentity);
64
+ }
65
+ catch {
66
+ // Corrupted identity data — clear it
67
+ persistIdentity(persistOpts, null);
68
+ }
69
+ }
70
+ this.setupPersistence();
71
+ }
72
+ }
73
+ setupPersistence() {
74
+ const persistOpts = this.clientConfig.persist;
75
+ if (!persistOpts) {
76
+ return;
77
+ }
78
+ // Auto-persist identity on changes
79
+ this.unsubscribePersistIdentity = this.identity.onChange((identity) => {
80
+ if (identity) {
81
+ persistIdentity(persistOpts, this.identity.serialize());
82
+ }
83
+ else {
84
+ persistIdentity(persistOpts, null);
85
+ }
86
+ });
87
+ // Auto-persist state on changes (debounced)
88
+ let persistTimeout = null;
89
+ this.unsubscribePersistState = this.stateStore.subscribe((state) => {
90
+ if (persistTimeout) {
91
+ clearTimeout(persistTimeout);
92
+ }
93
+ persistTimeout = setTimeout(() => persistState(persistOpts, state), 100);
94
+ });
95
+ }
96
+ async publish(eventType, data, options) {
97
+ // 1. Validate data against schema
98
+ this.eventProcessor.validate(eventType, data);
99
+ // 2. Build envelope
100
+ const meta = {
101
+ senderDid: this.identity.requireIdentity().did,
102
+ timestamp: Date.now(),
103
+ eventId: crypto.randomUUID(),
104
+ ...(options?.ephemeral ? { ephemeral: true } : {}),
105
+ };
106
+ const envelope = this.eventProcessor.buildEnvelope(eventType, data, meta);
107
+ // 3. Compute tags
108
+ const tags = this.eventProcessor.computeTags(eventType, data);
109
+ try {
110
+ // 4. Publish via transport
111
+ await this.transport.publishEvent(envelope, {
112
+ tags,
113
+ recipient: options?.recipient,
114
+ ephemeral: options?.ephemeral,
115
+ });
116
+ // 5. Optimistic local state update
117
+ this.eventProcessor.processEvent(envelope);
118
+ }
119
+ catch (error) {
120
+ throw new DecentrlSDKError(`Failed to publish event "${eventType}": ${error instanceof Error ? error.message : String(error)}`, 'PUBLISH_FAILED', { eventType, data, error });
121
+ }
122
+ }
123
+ async query(options) {
124
+ if (!this.transport.queryEvents) {
125
+ throw new DecentrlSDKError('Transport does not support queryEvents', 'QUERY_NOT_SUPPORTED');
126
+ }
127
+ try {
128
+ return await this.transport.queryEvents(options);
129
+ }
130
+ catch (error) {
131
+ if (error instanceof DecentrlSDKError) {
132
+ throw error;
133
+ }
134
+ throw new DecentrlSDKError(`Failed to query events: ${error instanceof Error ? error.message : String(error)}`, 'QUERY_FAILED', { options, error });
135
+ }
136
+ }
137
+ onEvent(listener) {
138
+ return this.eventProcessor.onEvent(listener);
139
+ }
140
+ async queryAndProcess(options) {
141
+ const result = await this.query(options);
142
+ const processed = this.eventProcessor.processBatch(result.data);
143
+ return { processed, total: result.pagination.total };
144
+ }
145
+ getState = () => {
146
+ return this.stateStore.getState();
147
+ };
148
+ subscribe = (listener) => {
149
+ return this.stateStore.subscribe(listener);
150
+ };
151
+ startSync(options) {
152
+ this.syncManager.start(options);
153
+ }
154
+ stopSync() {
155
+ this.syncManager.stop();
156
+ }
157
+ async sync() {
158
+ await this.syncManager.tick();
159
+ }
160
+ getConnectionStatus = () => {
161
+ return this.syncManager.getConnectionStatus();
162
+ };
163
+ onConnectionStatusChange = (listener) => {
164
+ return this.syncManager.onConnectionStatusChange(listener);
165
+ };
166
+ reset() {
167
+ this.syncManager.stop();
168
+ this.identity.reset();
169
+ this.contracts.reset();
170
+ this.eventProcessor.reset();
171
+ if (this.unsubscribePersistState) {
172
+ this.unsubscribePersistState();
173
+ this.unsubscribePersistState = null;
174
+ }
175
+ if (this.unsubscribePersistIdentity) {
176
+ this.unsubscribePersistIdentity();
177
+ this.unsubscribePersistIdentity = null;
178
+ }
179
+ // Rebuild initial state
180
+ const initialState = {};
181
+ for (const key of Object.keys(this.appConfig.state)) {
182
+ initialState[key] = this.appConfig.state[key].initial;
183
+ }
184
+ this.stateStore.reset(initialState);
185
+ // Clear persisted data
186
+ if (this.clientConfig.persist) {
187
+ clearPersisted(this.clientConfig.persist);
188
+ }
189
+ // Re-subscribe persistence listeners
190
+ this.setupPersistence();
191
+ }
192
+ }
@@ -0,0 +1,23 @@
1
+ import type { DecentrlTransport } from './transport.js';
2
+ import type { PendingContractRequest, StoredSignedContract } from './types.js';
3
+ type ContractChangeListener = () => void;
4
+ export declare class ContractManager {
5
+ private contracts;
6
+ private listeners;
7
+ private cachedActiveContracts;
8
+ private transport;
9
+ setTransport(transport: DecentrlTransport): void;
10
+ onChange(listener: ContractChangeListener): () => void;
11
+ private notify;
12
+ request(recipientDid: string, expiresIn?: number): Promise<void>;
13
+ getPending(): Promise<PendingContractRequest[]>;
14
+ accept(pendingId: string, encryptedPayload: string, requestorEphemeralPublicKey: string): Promise<void>;
15
+ refresh(): Promise<void>;
16
+ getActiveContracts(): StoredSignedContract[];
17
+ getContractByDid(did: string): StoredSignedContract | undefined;
18
+ processAutoRenewals(threshold?: number): Promise<void>;
19
+ processContractCleanup(): Promise<void>;
20
+ reset(): void;
21
+ }
22
+ export {};
23
+ //# sourceMappingURL=contract-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-manager.d.ts","sourceRoot":"","sources":["../src/contract-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAE/E,KAAK,sBAAsB,GAAG,MAAM,IAAI,CAAC;AAEzC,qBAAa,eAAe;IAC3B,OAAO,CAAC,SAAS,CAA2C;IAC5D,OAAO,CAAC,SAAS,CAAqC;IACtD,OAAO,CAAC,qBAAqB,CAA8B;IAC3D,OAAO,CAAC,SAAS,CAAkC;IAEnD,YAAY,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI;IAIhD,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,GAAG,MAAM,IAAI;IAQtD,OAAO,CAAC,MAAM;IAUR,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,SAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAQnE,UAAU,IAAI,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAQ/C,MAAM,CACX,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,MAAM,EACxB,2BAA2B,EAAE,MAAM,GACjC,OAAO,CAAC,IAAI,CAAC;IASV,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAe9B,kBAAkB,IAAI,oBAAoB,EAAE;IAI5C,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS;IAyBzD,mBAAmB,CAAC,SAAS,SAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASnD,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAS7C,KAAK,IAAI,IAAI;CAIb"}
@@ -0,0 +1,91 @@
1
+ import { DecentrlSDKError } from './errors.js';
2
+ export class ContractManager {
3
+ contracts = new Map();
4
+ listeners = new Set();
5
+ cachedActiveContracts = [];
6
+ transport = null;
7
+ setTransport(transport) {
8
+ this.transport = transport;
9
+ }
10
+ onChange(listener) {
11
+ this.listeners.add(listener);
12
+ return () => {
13
+ this.listeners.delete(listener);
14
+ };
15
+ }
16
+ notify() {
17
+ this.cachedActiveContracts = Array.from(this.contracts.values()).filter((c) => c.status === 'active');
18
+ for (const listener of this.listeners) {
19
+ listener();
20
+ }
21
+ }
22
+ async request(recipientDid, expiresIn = 3600 * 24) {
23
+ if (!this.transport) {
24
+ throw new DecentrlSDKError('Transport not set', 'NO_TRANSPORT');
25
+ }
26
+ await this.transport.requestContract(recipientDid, expiresIn);
27
+ }
28
+ async getPending() {
29
+ if (!this.transport) {
30
+ throw new DecentrlSDKError('Transport not set', 'NO_TRANSPORT');
31
+ }
32
+ return this.transport.getPendingContracts();
33
+ }
34
+ async accept(pendingId, encryptedPayload, requestorEphemeralPublicKey) {
35
+ if (!this.transport) {
36
+ throw new DecentrlSDKError('Transport not set', 'NO_TRANSPORT');
37
+ }
38
+ await this.transport.acceptContract(pendingId, encryptedPayload, requestorEphemeralPublicKey);
39
+ await this.refresh();
40
+ }
41
+ async refresh() {
42
+ if (!this.transport) {
43
+ throw new DecentrlSDKError('Transport not set', 'NO_TRANSPORT');
44
+ }
45
+ const contracts = await this.transport.refreshContracts();
46
+ this.contracts.clear();
47
+ for (const contract of contracts) {
48
+ this.contracts.set(contract.id, contract);
49
+ }
50
+ this.notify();
51
+ }
52
+ getActiveContracts() {
53
+ return this.cachedActiveContracts;
54
+ }
55
+ getContractByDid(did) {
56
+ let best;
57
+ for (const contract of this.contracts.values()) {
58
+ if (contract.participantDid !== did) {
59
+ continue;
60
+ }
61
+ if (!best) {
62
+ best = contract;
63
+ continue;
64
+ }
65
+ const bestExpiry = best.signedCommunicationContract?.communication_contract?.expires_at ?? 0;
66
+ const currExpiry = contract.signedCommunicationContract?.communication_contract?.expires_at ?? 0;
67
+ if (currExpiry > bestExpiry) {
68
+ best = contract;
69
+ }
70
+ }
71
+ return best;
72
+ }
73
+ async processAutoRenewals(threshold = 0.2) {
74
+ if (!this.transport?.processAutoRenewals) {
75
+ return;
76
+ }
77
+ await this.transport.processAutoRenewals(threshold);
78
+ await this.refresh();
79
+ }
80
+ async processContractCleanup() {
81
+ if (!this.transport?.processContractCleanup) {
82
+ return;
83
+ }
84
+ await this.transport.processContractCleanup();
85
+ await this.refresh();
86
+ }
87
+ reset() {
88
+ this.contracts.clear();
89
+ this.notify();
90
+ }
91
+ }
@@ -0,0 +1,8 @@
1
+ import { DecentrlClient } from './client.js';
2
+ import type { DecentrlAppConfig, DecentrlClientConfig, EventDefinitions, StateDefinitions } from './types.js';
3
+ export interface DecentrlApp<TEvents extends EventDefinitions, TState extends StateDefinitions<TEvents>> {
4
+ config: DecentrlAppConfig<TEvents, TState>;
5
+ createClient(clientConfig: DecentrlClientConfig): DecentrlClient<TEvents, TState>;
6
+ }
7
+ export declare function defineDecentrlApp<TEvents extends EventDefinitions, TState extends StateDefinitions<TEvents>>(config: DecentrlAppConfig<TEvents, TState>): DecentrlApp<TEvents, TState>;
8
+ //# sourceMappingURL=define-app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-app.d.ts","sourceRoot":"","sources":["../src/define-app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EACX,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,WAAW,CAC3B,OAAO,SAAS,gBAAgB,EAChC,MAAM,SAAS,gBAAgB,CAAC,OAAO,CAAC;IAExC,MAAM,EAAE,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC3C,YAAY,CAAC,YAAY,EAAE,oBAAoB,GAAG,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;CAClF;AAED,wBAAgB,iBAAiB,CAChC,OAAO,SAAS,gBAAgB,EAChC,MAAM,SAAS,gBAAgB,CAAC,OAAO,CAAC,EACvC,MAAM,EAAE,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAK1E"}
@@ -0,0 +1,7 @@
1
+ import { DecentrlClient } from './client.js';
2
+ export function defineDecentrlApp(config) {
3
+ return {
4
+ config,
5
+ createClient: (clientConfig) => new DecentrlClient(config, clientConfig),
6
+ };
7
+ }
@@ -0,0 +1,69 @@
1
+ import type { DecentrlTransport } from './transport.js';
2
+ import type { ArchivedContract, EventEnvelope, PaginatedResult, PendingContractRequest, QueryOptions, SerializedIdentity, StoredSignedContract } from './types.js';
3
+ export type HttpPost = <T = unknown>(url: string, data: unknown, options?: {
4
+ timeout?: number;
5
+ }) => Promise<{
6
+ data: T;
7
+ }>;
8
+ export interface DirectTransportOptions {
9
+ httpPost?: HttpPost;
10
+ onEphemeralKeysChanged?: (keys: Record<string, string>) => void | Promise<void>;
11
+ }
12
+ export declare class DirectTransport implements DecentrlTransport {
13
+ private identity;
14
+ private eventStore;
15
+ private activeContracts;
16
+ private httpPost;
17
+ private onEphemeralKeysChanged?;
18
+ private pendingEphemeralKeys;
19
+ private knownRootSecrets;
20
+ private renewalInFlight;
21
+ private supersededContracts;
22
+ private confirmedNewContracts;
23
+ private purgedContractIds;
24
+ constructor(options?: DirectTransportOptions);
25
+ createIdentity(options: {
26
+ alias: string;
27
+ mediatorDid: string;
28
+ }): Promise<SerializedIdentity>;
29
+ getIdentity(): SerializedIdentity | null;
30
+ loadIdentity(serialized: SerializedIdentity): void;
31
+ loadContracts(contracts: StoredSignedContract[]): void;
32
+ loadEphemeralKeys(keys: Record<string, string>): void;
33
+ getEphemeralKeys(): Record<string, string>;
34
+ publishEvent(envelope: EventEnvelope, options: {
35
+ tags: string[];
36
+ recipient?: string;
37
+ ephemeral?: boolean;
38
+ }): Promise<void>;
39
+ processPendingEvents(): Promise<EventEnvelope[]>;
40
+ processPreFetchedPendingEvents(rawEvents: Array<{
41
+ id: string;
42
+ sender_did: string;
43
+ payload: string;
44
+ }>): Promise<EventEnvelope[]>;
45
+ queryEvents(options?: QueryOptions): Promise<PaginatedResult<EventEnvelope>>;
46
+ updateEventTags(events: Array<{
47
+ eventId: string;
48
+ tags: string[];
49
+ }>): Promise<void>;
50
+ queryUnprocessedEvents(pagination?: {
51
+ page: number;
52
+ pageSize: number;
53
+ }): Promise<PaginatedResult<EventEnvelope>>;
54
+ requestContract(recipientDid: string, expiresIn?: number): Promise<void>;
55
+ getPendingContracts(): Promise<PendingContractRequest[]>;
56
+ acceptContract(pendingId: string, encryptedPayload: string, requestorEphemeralPublicKey: string): Promise<void>;
57
+ refreshContracts(): Promise<StoredSignedContract[]>;
58
+ getActiveContracts(): StoredSignedContract[];
59
+ processAutoRenewals(threshold?: number): Promise<void>;
60
+ private initiateRenewals;
61
+ private autoAcceptRenewals;
62
+ processContractCleanup(): Promise<void>;
63
+ getContractHistory(): Promise<ArchivedContract[]>;
64
+ dispose(): void;
65
+ private notifyEphemeralKeysChanged;
66
+ private requireIdentity;
67
+ private requireEventStore;
68
+ }
69
+ //# sourceMappingURL=direct-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"direct-transport.d.ts","sourceRoot":"","sources":["../src/direct-transport.ts"],"names":[],"mappings":"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"}