@decentrl/sdk 0.0.6 → 0.0.8
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/dist/client.d.ts +15 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +74 -14
- package/dist/define-app.d.ts +5 -5
- package/dist/define-app.d.ts.map +1 -1
- package/dist/direct-transport.d.ts +32 -0
- package/dist/direct-transport.d.ts.map +1 -1
- package/dist/direct-transport.js +26 -0
- package/dist/event-processor.d.ts +12 -2
- package/dist/event-processor.d.ts.map +1 -1
- package/dist/event-processor.js +100 -3
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/public-channel-reader.d.ts +21 -0
- package/dist/public-channel-reader.d.ts.map +1 -0
- package/dist/public-channel-reader.js +169 -0
- package/dist/transport.d.ts +32 -0
- package/dist/transport.d.ts.map +1 -1
- package/dist/types.d.ts +84 -7
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/client.ts +132 -19
- package/src/define-app.ts +19 -5
- package/src/direct-transport-public.test.ts +139 -0
- package/src/direct-transport.ts +55 -0
- package/src/event-processor-public.test.ts +343 -0
- package/src/event-processor.ts +144 -5
- package/src/index.ts +11 -0
- package/src/public-channel-reader.ts +239 -0
- package/src/sdk.e2e.test.ts +165 -0
- package/src/transport.ts +32 -0
- package/src/types.ts +138 -13
package/dist/client.d.ts
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
import { ContractManager } from './contract-manager.js';
|
|
2
2
|
import { IdentityManager } from './identity-manager.js';
|
|
3
|
-
import type { DecentrlAppConfig, DecentrlClientConfig, EventDefinitions, EventEnvelope, InferState, PaginatedResult, PublishOptions, QueryOptions, StateDefinitions, StateListener, SyncOptions } from './types.js';
|
|
3
|
+
import type { ChannelDefinitions, ChannelSubscriptionConfig, DecentrlAppConfig, DecentrlClientConfig, EventDefinitions, EventEnvelope, InferState, PaginatedResult, PublicEventDefinitions, PublicEventEnvelope, PublicEventResult, PublicQueryOptions, PublishOptions, QueryOptions, StateDefinitions, StateListener, SyncOptions } from './types.js';
|
|
4
4
|
import type { ConnectionStatus } from './websocket-transport.js';
|
|
5
|
-
export declare class DecentrlClient<TEvents extends EventDefinitions, TState extends StateDefinitions<TEvents>> {
|
|
5
|
+
export declare class DecentrlClient<TEvents extends EventDefinitions, TPublicEvents extends PublicEventDefinitions = PublicEventDefinitions, TChannels extends ChannelDefinitions = ChannelDefinitions, TState extends StateDefinitions<TEvents, TPublicEvents, TChannels> = StateDefinitions<TEvents, TPublicEvents, TChannels>> {
|
|
6
6
|
private appConfig;
|
|
7
7
|
private clientConfig;
|
|
8
8
|
private stateStore;
|
|
9
9
|
private eventProcessor;
|
|
10
10
|
private syncManager;
|
|
11
11
|
private transport;
|
|
12
|
+
private publicChannelReader;
|
|
12
13
|
private unsubscribePersistState;
|
|
13
14
|
private unsubscribePersistIdentity;
|
|
14
15
|
readonly identity: IdentityManager;
|
|
15
16
|
readonly contracts: ContractManager;
|
|
16
|
-
constructor(appConfig: DecentrlAppConfig<TEvents, TState>, clientConfig: DecentrlClientConfig);
|
|
17
|
+
constructor(appConfig: DecentrlAppConfig<TEvents, TPublicEvents, TChannels, TState>, clientConfig: DecentrlClientConfig);
|
|
17
18
|
private setupPersistence;
|
|
18
19
|
publish<K extends string & keyof TEvents>(eventType: K, data: TEvents[K] extends {
|
|
19
20
|
schema: infer S extends import('zod').ZodType;
|
|
@@ -24,6 +25,17 @@ export declare class DecentrlClient<TEvents extends EventDefinitions, TState ext
|
|
|
24
25
|
processed: number;
|
|
25
26
|
total: number;
|
|
26
27
|
}>;
|
|
28
|
+
publishPublic<K extends string & keyof TPublicEvents>(eventType: K, data: TPublicEvents[K] extends {
|
|
29
|
+
schema: infer S extends import('zod').ZodType;
|
|
30
|
+
} ? import('zod').infer<S> : never): Promise<{
|
|
31
|
+
publicEventId: string;
|
|
32
|
+
}>;
|
|
33
|
+
deletePublicEvent(publicEventId: string, eventType?: string): Promise<void>;
|
|
34
|
+
queryPublicEvents(options: PublicQueryOptions): Promise<PaginatedResult<PublicEventResult>>;
|
|
35
|
+
subscribeToChannel(config: ChannelSubscriptionConfig): {
|
|
36
|
+
unsubscribe: () => void;
|
|
37
|
+
};
|
|
38
|
+
onPublicEvent(listener: (envelope: PublicEventEnvelope) => void): () => void;
|
|
27
39
|
getState: () => InferState<TState>;
|
|
28
40
|
subscribe: (listener: StateListener<InferState<TState>>) => (() => void);
|
|
29
41
|
startSync(options?: SyncOptions): void;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
CHANGED
|
@@ -4,6 +4,7 @@ import { DecentrlSDKError } from './errors.js';
|
|
|
4
4
|
import { EventProcessor } from './event-processor.js';
|
|
5
5
|
import { IdentityManager } from './identity-manager.js';
|
|
6
6
|
import { clearPersisted, loadPersistedIdentity, loadPersistedState, persistIdentity, persistState, } from './persistence.js';
|
|
7
|
+
import { PublicChannelReader } from './public-channel-reader.js';
|
|
7
8
|
import { StateStore } from './state-store.js';
|
|
8
9
|
import { SyncManager } from './sync-manager.js';
|
|
9
10
|
export class DecentrlClient {
|
|
@@ -13,6 +14,7 @@ export class DecentrlClient {
|
|
|
13
14
|
eventProcessor;
|
|
14
15
|
syncManager;
|
|
15
16
|
transport;
|
|
17
|
+
publicChannelReader;
|
|
16
18
|
unsubscribePersistState = null;
|
|
17
19
|
unsubscribePersistIdentity = null;
|
|
18
20
|
identity;
|
|
@@ -23,7 +25,6 @@ export class DecentrlClient {
|
|
|
23
25
|
// Build initial state from slice definitions
|
|
24
26
|
const initialState = {};
|
|
25
27
|
for (const key of Object.keys(appConfig.state)) {
|
|
26
|
-
// TS can't statically index InferState<TState> during construction
|
|
27
28
|
initialState[key] = appConfig.state[key].initial;
|
|
28
29
|
}
|
|
29
30
|
// Restore persisted state if available
|
|
@@ -32,7 +33,6 @@ export class DecentrlClient {
|
|
|
32
33
|
if (persistOpts) {
|
|
33
34
|
const saved = loadPersistedState(persistOpts);
|
|
34
35
|
if (saved) {
|
|
35
|
-
// Merge: use saved values for slices that exist, fall back to initial for new slices
|
|
36
36
|
restoredState = { ...initialState, ...saved };
|
|
37
37
|
}
|
|
38
38
|
}
|
|
@@ -53,7 +53,8 @@ export class DecentrlClient {
|
|
|
53
53
|
console.debug('[Decentrl] Failed to seed identity from transport:', err);
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
|
-
this.eventProcessor = new EventProcessor(appConfig.events, appConfig.state, this.stateStore);
|
|
56
|
+
this.eventProcessor = new EventProcessor(appConfig.events, appConfig.state, this.stateStore, appConfig.publicEvents, appConfig.channels);
|
|
57
|
+
this.publicChannelReader = new PublicChannelReader(this.transport, this.eventProcessor, appConfig.channels);
|
|
57
58
|
this.syncManager = new SyncManager(this.eventProcessor, this.contracts, this.identity, this.transport);
|
|
58
59
|
// Restore persisted identity
|
|
59
60
|
if (persistOpts) {
|
|
@@ -63,7 +64,6 @@ export class DecentrlClient {
|
|
|
63
64
|
this.identity.load(savedIdentity);
|
|
64
65
|
}
|
|
65
66
|
catch {
|
|
66
|
-
// Corrupted identity data — clear it
|
|
67
67
|
persistIdentity(persistOpts, null);
|
|
68
68
|
}
|
|
69
69
|
}
|
|
@@ -75,7 +75,6 @@ export class DecentrlClient {
|
|
|
75
75
|
if (!persistOpts) {
|
|
76
76
|
return;
|
|
77
77
|
}
|
|
78
|
-
// Auto-persist identity on changes
|
|
79
78
|
this.unsubscribePersistIdentity = this.identity.onChange((identity) => {
|
|
80
79
|
if (identity) {
|
|
81
80
|
persistIdentity(persistOpts, this.identity.serialize());
|
|
@@ -84,7 +83,6 @@ export class DecentrlClient {
|
|
|
84
83
|
persistIdentity(persistOpts, null);
|
|
85
84
|
}
|
|
86
85
|
});
|
|
87
|
-
// Auto-persist state on changes (debounced)
|
|
88
86
|
let persistTimeout = null;
|
|
89
87
|
this.unsubscribePersistState = this.stateStore.subscribe((state) => {
|
|
90
88
|
if (persistTimeout) {
|
|
@@ -93,10 +91,9 @@ export class DecentrlClient {
|
|
|
93
91
|
persistTimeout = setTimeout(() => persistState(persistOpts, state), 100);
|
|
94
92
|
});
|
|
95
93
|
}
|
|
94
|
+
// --- Private Events ---
|
|
96
95
|
async publish(eventType, data, options) {
|
|
97
|
-
// 1. Validate data against schema
|
|
98
96
|
this.eventProcessor.validate(eventType, data);
|
|
99
|
-
// 2. Build envelope
|
|
100
97
|
const meta = {
|
|
101
98
|
senderDid: this.identity.requireIdentity().did,
|
|
102
99
|
timestamp: Date.now(),
|
|
@@ -104,16 +101,13 @@ export class DecentrlClient {
|
|
|
104
101
|
...(options?.ephemeral ? { ephemeral: true } : {}),
|
|
105
102
|
};
|
|
106
103
|
const envelope = this.eventProcessor.buildEnvelope(eventType, data, meta);
|
|
107
|
-
// 3. Compute tags
|
|
108
104
|
const tags = this.eventProcessor.computeTags(eventType, data);
|
|
109
105
|
try {
|
|
110
|
-
// 4. Publish via transport
|
|
111
106
|
await this.transport.publishEvent(envelope, {
|
|
112
107
|
tags,
|
|
113
108
|
recipient: options?.recipient,
|
|
114
109
|
ephemeral: options?.ephemeral,
|
|
115
110
|
});
|
|
116
|
-
// 5. Optimistic local state update
|
|
117
111
|
this.eventProcessor.processEvent(envelope);
|
|
118
112
|
}
|
|
119
113
|
catch (error) {
|
|
@@ -142,12 +136,79 @@ export class DecentrlClient {
|
|
|
142
136
|
const processed = this.eventProcessor.processBatch(result.data);
|
|
143
137
|
return { processed, total: result.pagination.total };
|
|
144
138
|
}
|
|
139
|
+
// --- Public Events (publishing) ---
|
|
140
|
+
async publishPublic(eventType, data) {
|
|
141
|
+
this.eventProcessor.validatePublicEvent(eventType, data);
|
|
142
|
+
const identity = this.identity.requireIdentity();
|
|
143
|
+
const tags = this.eventProcessor.computePublicTags(eventType, data);
|
|
144
|
+
const channelId = this.eventProcessor.getPublicChannelId(eventType);
|
|
145
|
+
const eventPayload = JSON.stringify({ type: eventType, data });
|
|
146
|
+
if (!this.transport.publishPublicEvent) {
|
|
147
|
+
throw new DecentrlSDKError('Transport does not support publishPublicEvent', 'PUBLISH_FAILED');
|
|
148
|
+
}
|
|
149
|
+
try {
|
|
150
|
+
const result = await this.transport.publishPublicEvent({
|
|
151
|
+
channelId,
|
|
152
|
+
event: eventPayload,
|
|
153
|
+
tags,
|
|
154
|
+
});
|
|
155
|
+
this.eventProcessor.processPublicEvent({
|
|
156
|
+
type: eventType,
|
|
157
|
+
data,
|
|
158
|
+
meta: {
|
|
159
|
+
publisherDid: identity.did,
|
|
160
|
+
timestamp: Math.floor(Date.now() / 1000),
|
|
161
|
+
eventId: result.publicEventId,
|
|
162
|
+
channelId,
|
|
163
|
+
},
|
|
164
|
+
tags,
|
|
165
|
+
});
|
|
166
|
+
return result;
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
throw new DecentrlSDKError(`Failed to publish public event "${eventType}": ${error instanceof Error ? error.message : String(error)}`, 'PUBLISH_FAILED', { eventType, data, error });
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
async deletePublicEvent(publicEventId, eventType) {
|
|
173
|
+
if (!this.transport.deletePublicEvent) {
|
|
174
|
+
throw new DecentrlSDKError('Transport does not support deletePublicEvent', 'PUBLISH_FAILED');
|
|
175
|
+
}
|
|
176
|
+
await this.transport.deletePublicEvent(publicEventId, eventType);
|
|
177
|
+
}
|
|
178
|
+
// --- Public Events (reading) ---
|
|
179
|
+
async queryPublicEvents(options) {
|
|
180
|
+
// Auto-resolve mediator endpoint when querying own events
|
|
181
|
+
let mediatorEndpoint = options.mediatorEndpoint;
|
|
182
|
+
if (!mediatorEndpoint) {
|
|
183
|
+
const ownIdentity = this.identity.getIdentity();
|
|
184
|
+
if (ownIdentity && options.publisherDid === ownIdentity.did) {
|
|
185
|
+
mediatorEndpoint = ownIdentity.mediatorEndpoint;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return this.publicChannelReader.fetch({
|
|
189
|
+
did: options.publisherDid,
|
|
190
|
+
mediatorEndpoint,
|
|
191
|
+
channelId: options.channelId,
|
|
192
|
+
tags: options.tags,
|
|
193
|
+
afterTimestamp: options.afterTimestamp,
|
|
194
|
+
beforeTimestamp: options.beforeTimestamp,
|
|
195
|
+
pagination: options.pagination,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
subscribeToChannel(config) {
|
|
199
|
+
return this.publicChannelReader.subscribe(config);
|
|
200
|
+
}
|
|
201
|
+
onPublicEvent(listener) {
|
|
202
|
+
return this.eventProcessor.onPublicEvent(listener);
|
|
203
|
+
}
|
|
204
|
+
// --- State ---
|
|
145
205
|
getState = () => {
|
|
146
206
|
return this.stateStore.getState();
|
|
147
207
|
};
|
|
148
208
|
subscribe = (listener) => {
|
|
149
209
|
return this.stateStore.subscribe(listener);
|
|
150
210
|
};
|
|
211
|
+
// --- Sync ---
|
|
151
212
|
startSync(options) {
|
|
152
213
|
this.syncManager.start(options);
|
|
153
214
|
}
|
|
@@ -163,8 +224,10 @@ export class DecentrlClient {
|
|
|
163
224
|
onConnectionStatusChange = (listener) => {
|
|
164
225
|
return this.syncManager.onConnectionStatusChange(listener);
|
|
165
226
|
};
|
|
227
|
+
// --- Reset ---
|
|
166
228
|
reset() {
|
|
167
229
|
this.syncManager.stop();
|
|
230
|
+
this.publicChannelReader.dispose();
|
|
168
231
|
this.identity.reset();
|
|
169
232
|
this.contracts.reset();
|
|
170
233
|
this.eventProcessor.reset();
|
|
@@ -176,17 +239,14 @@ export class DecentrlClient {
|
|
|
176
239
|
this.unsubscribePersistIdentity();
|
|
177
240
|
this.unsubscribePersistIdentity = null;
|
|
178
241
|
}
|
|
179
|
-
// Rebuild initial state
|
|
180
242
|
const initialState = {};
|
|
181
243
|
for (const key of Object.keys(this.appConfig.state)) {
|
|
182
244
|
initialState[key] = this.appConfig.state[key].initial;
|
|
183
245
|
}
|
|
184
246
|
this.stateStore.reset(initialState);
|
|
185
|
-
// Clear persisted data
|
|
186
247
|
if (this.clientConfig.persist) {
|
|
187
248
|
clearPersisted(this.clientConfig.persist);
|
|
188
249
|
}
|
|
189
|
-
// Re-subscribe persistence listeners
|
|
190
250
|
this.setupPersistence();
|
|
191
251
|
}
|
|
192
252
|
}
|
package/dist/define-app.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
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>;
|
|
2
|
+
import type { ChannelDefinitions, DecentrlAppConfig, DecentrlClientConfig, EventDefinitions, PublicEventDefinitions, StateDefinitions } from './types.js';
|
|
3
|
+
export interface DecentrlApp<TEvents extends EventDefinitions, TPublicEvents extends PublicEventDefinitions, TChannels extends ChannelDefinitions, TState extends StateDefinitions<TEvents, TPublicEvents, TChannels>> {
|
|
4
|
+
config: DecentrlAppConfig<TEvents, TPublicEvents, TChannels, TState>;
|
|
5
|
+
createClient(clientConfig: DecentrlClientConfig): DecentrlClient<TEvents, TPublicEvents, TChannels, TState>;
|
|
6
6
|
}
|
|
7
|
-
export declare function defineDecentrlApp<TEvents extends EventDefinitions, TState extends StateDefinitions<TEvents>>(config: DecentrlAppConfig<TEvents, TState>): DecentrlApp<TEvents, TState>;
|
|
7
|
+
export declare function defineDecentrlApp<TEvents extends EventDefinitions, TPublicEvents extends PublicEventDefinitions = PublicEventDefinitions, TChannels extends ChannelDefinitions = ChannelDefinitions, TState extends StateDefinitions<TEvents, TPublicEvents, TChannels> = StateDefinitions<TEvents, TPublicEvents, TChannels>>(config: DecentrlAppConfig<TEvents, TPublicEvents, TChannels, TState>): DecentrlApp<TEvents, TPublicEvents, TChannels, TState>;
|
|
8
8
|
//# sourceMappingURL=define-app.d.ts.map
|
package/dist/define-app.d.ts.map
CHANGED
|
@@ -1 +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;
|
|
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,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,EAChB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,WAAW,CAC3B,OAAO,SAAS,gBAAgB,EAChC,aAAa,SAAS,sBAAsB,EAC5C,SAAS,SAAS,kBAAkB,EACpC,MAAM,SAAS,gBAAgB,CAAC,OAAO,EAAE,aAAa,EAAE,SAAS,CAAC;IAElE,MAAM,EAAE,iBAAiB,CAAC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACrE,YAAY,CACX,YAAY,EAAE,oBAAoB,GAChC,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;CAC7D;AAED,wBAAgB,iBAAiB,CAChC,OAAO,SAAS,gBAAgB,EAChC,aAAa,SAAS,sBAAsB,GAAG,sBAAsB,EACrE,SAAS,SAAS,kBAAkB,GAAG,kBAAkB,EACzD,MAAM,SAAS,gBAAgB,CAAC,OAAO,EAAE,aAAa,EAAE,SAAS,CAAC,GAAG,gBAAgB,CACpF,OAAO,EACP,aAAa,EACb,SAAS,CACT,EAED,MAAM,EAAE,iBAAiB,CAAC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,CAAC,GAClE,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,CAAC,CAKxD"}
|
|
@@ -61,6 +61,38 @@ export declare class DirectTransport implements DecentrlTransport {
|
|
|
61
61
|
private autoAcceptRenewals;
|
|
62
62
|
processContractCleanup(): Promise<void>;
|
|
63
63
|
getContractHistory(): Promise<ArchivedContract[]>;
|
|
64
|
+
publishPublicEvent(options: {
|
|
65
|
+
channelId: string;
|
|
66
|
+
event: string;
|
|
67
|
+
tags: string[];
|
|
68
|
+
}): Promise<{
|
|
69
|
+
publicEventId: string;
|
|
70
|
+
}>;
|
|
71
|
+
deletePublicEvent(publicEventId: string): Promise<void>;
|
|
72
|
+
fetchPublicEvents(options: {
|
|
73
|
+
mediatorEndpoint: string;
|
|
74
|
+
publisherDid: string;
|
|
75
|
+
channelId?: string;
|
|
76
|
+
tags?: string[];
|
|
77
|
+
afterTimestamp?: number;
|
|
78
|
+
beforeTimestamp?: number;
|
|
79
|
+
page?: number;
|
|
80
|
+
pageSize?: number;
|
|
81
|
+
}): Promise<{
|
|
82
|
+
events: Array<{
|
|
83
|
+
id: string;
|
|
84
|
+
channelId: string;
|
|
85
|
+
event: string;
|
|
86
|
+
tags: string[];
|
|
87
|
+
timestamp: number;
|
|
88
|
+
eventSignature: string;
|
|
89
|
+
}>;
|
|
90
|
+
pagination: {
|
|
91
|
+
page: number;
|
|
92
|
+
pageSize: number;
|
|
93
|
+
total: number;
|
|
94
|
+
};
|
|
95
|
+
}>;
|
|
64
96
|
dispose(): void;
|
|
65
97
|
private notifyEphemeralKeysChanged;
|
|
66
98
|
private requireIdentity;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"direct-transport.d.ts","sourceRoot":"","sources":["../src/direct-transport.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"direct-transport.d.ts","sourceRoot":"","sources":["../src/direct-transport.ts"],"names":[],"mappings":"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"}
|
package/dist/direct-transport.js
CHANGED
|
@@ -416,6 +416,32 @@ export class DirectTransport {
|
|
|
416
416
|
})
|
|
417
417
|
.map((e) => e.data);
|
|
418
418
|
}
|
|
419
|
+
async publishPublicEvent(options) {
|
|
420
|
+
const eventStore = this.requireEventStore();
|
|
421
|
+
return eventStore.publishPublicEvent(options.event, {
|
|
422
|
+
channelId: options.channelId,
|
|
423
|
+
tags: options.tags,
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
async deletePublicEvent(publicEventId) {
|
|
427
|
+
const eventStore = this.requireEventStore();
|
|
428
|
+
await eventStore.deletePublicEvent(publicEventId);
|
|
429
|
+
}
|
|
430
|
+
async fetchPublicEvents(options) {
|
|
431
|
+
const result = await DecentrlEventStore.fetchPublicEvents({
|
|
432
|
+
mediatorEndpoint: options.mediatorEndpoint,
|
|
433
|
+
publisherDid: options.publisherDid,
|
|
434
|
+
channelId: options.channelId,
|
|
435
|
+
tags: options.tags,
|
|
436
|
+
afterTimestamp: options.afterTimestamp,
|
|
437
|
+
beforeTimestamp: options.beforeTimestamp,
|
|
438
|
+
pagination: options.page != null ? { page: options.page, pageSize: options.pageSize ?? 20 } : undefined,
|
|
439
|
+
});
|
|
440
|
+
return {
|
|
441
|
+
events: result.data,
|
|
442
|
+
pagination: result.pagination,
|
|
443
|
+
};
|
|
444
|
+
}
|
|
419
445
|
dispose() {
|
|
420
446
|
this.eventStore = null;
|
|
421
447
|
}
|
|
@@ -1,18 +1,28 @@
|
|
|
1
1
|
import type { StateStore } from './state-store.js';
|
|
2
|
-
import type { EventDefinitions, EventEnvelope, EventMeta, InferState, StateDefinitions } from './types.js';
|
|
2
|
+
import type { ChannelDefinitions, EventDefinitions, EventEnvelope, EventMeta, InferState, PublicEventDefinitions, PublicEventEnvelope, StateDefinitions } from './types.js';
|
|
3
3
|
export declare class EventProcessor<TEvents extends EventDefinitions, TState extends StateDefinitions<TEvents>> {
|
|
4
4
|
private eventDefinitions;
|
|
5
5
|
private stateDefinitions;
|
|
6
6
|
private stateStore;
|
|
7
|
+
private publicEventDefinitions?;
|
|
8
|
+
private channelDefinitions?;
|
|
7
9
|
private processedEventIds;
|
|
8
10
|
private eventListeners;
|
|
9
|
-
|
|
11
|
+
private publicEventListeners;
|
|
12
|
+
constructor(eventDefinitions: TEvents, stateDefinitions: TState, stateStore: StateStore<InferState<TState>>, publicEventDefinitions?: PublicEventDefinitions | undefined, channelDefinitions?: ChannelDefinitions | undefined);
|
|
10
13
|
onEvent(listener: (envelope: EventEnvelope) => void): () => void;
|
|
14
|
+
onPublicEvent(listener: (envelope: PublicEventEnvelope) => void): () => void;
|
|
11
15
|
validate(eventType: string, data: unknown): void;
|
|
16
|
+
validatePublicEvent(eventType: string, data: unknown): void;
|
|
12
17
|
computeTags(eventType: string, data: unknown): string[];
|
|
18
|
+
computePublicTags(eventType: string, data: unknown): string[];
|
|
19
|
+
getPublicChannelId(eventType: string): string;
|
|
13
20
|
computeTagsSafe(eventType: string, data: unknown): string[];
|
|
14
21
|
buildEnvelope(eventType: string, data: unknown, meta: EventMeta): EventEnvelope;
|
|
15
22
|
processEvent(envelope: EventEnvelope): boolean;
|
|
23
|
+
processPublicEvent(envelope: PublicEventEnvelope): boolean;
|
|
24
|
+
processChannelEvent(envelope: PublicEventEnvelope): boolean;
|
|
25
|
+
validateChannelEvent(eventType: string, data: unknown): boolean;
|
|
16
26
|
processBatch(envelopes: EventEnvelope[]): number;
|
|
17
27
|
reset(): void;
|
|
18
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-processor.d.ts","sourceRoot":"","sources":["../src/event-processor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EACX,gBAAgB,EAChB,aAAa,EACb,SAAS,EACT,UAAU,EACV,gBAAgB,EAChB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"event-processor.d.ts","sourceRoot":"","sources":["../src/event-processor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EACX,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,SAAS,EACT,UAAU,EACV,sBAAsB,EACtB,mBAAmB,EAEnB,gBAAgB,EAChB,MAAM,YAAY,CAAC;AASpB,qBAAa,cAAc,CAC1B,OAAO,SAAS,gBAAgB,EAChC,MAAM,SAAS,gBAAgB,CAAC,OAAO,CAAC;IAOvC,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,sBAAsB,CAAC;IAC/B,OAAO,CAAC,kBAAkB,CAAC;IAT5B,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,cAAc,CAAgD;IACtE,OAAO,CAAC,oBAAoB,CAAsD;gBAGzE,gBAAgB,EAAE,OAAO,EACzB,gBAAgB,EAAE,MAAM,EACxB,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAC1C,sBAAsB,CAAC,EAAE,sBAAsB,YAAA,EAC/C,kBAAkB,CAAC,EAAE,kBAAkB,YAAA;IAGhD,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,IAAI,GAAG,MAAM,IAAI;IAMhE,aAAa,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK,IAAI,GAAG,MAAM,IAAI;IAM5E,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IAoBhD,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IAoB3D,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,EAAE;IAYvD,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,EAAE;IAY7D,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAY7C,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,EAAE;IAQ3D,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,GAAG,aAAa;IAI/E,YAAY,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO;IAoC9C,kBAAkB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,OAAO;IAmC1D,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,OAAO;IAmC3D,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO;IAU/D,YAAY,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,MAAM;IAYhD,KAAK,IAAI,IAAI;CAKb"}
|
package/dist/event-processor.js
CHANGED
|
@@ -5,17 +5,26 @@ export class EventProcessor {
|
|
|
5
5
|
eventDefinitions;
|
|
6
6
|
stateDefinitions;
|
|
7
7
|
stateStore;
|
|
8
|
+
publicEventDefinitions;
|
|
9
|
+
channelDefinitions;
|
|
8
10
|
processedEventIds = new Set();
|
|
9
11
|
eventListeners = new Set();
|
|
10
|
-
|
|
12
|
+
publicEventListeners = new Set();
|
|
13
|
+
constructor(eventDefinitions, stateDefinitions, stateStore, publicEventDefinitions, channelDefinitions) {
|
|
11
14
|
this.eventDefinitions = eventDefinitions;
|
|
12
15
|
this.stateDefinitions = stateDefinitions;
|
|
13
16
|
this.stateStore = stateStore;
|
|
17
|
+
this.publicEventDefinitions = publicEventDefinitions;
|
|
18
|
+
this.channelDefinitions = channelDefinitions;
|
|
14
19
|
}
|
|
15
20
|
onEvent(listener) {
|
|
16
21
|
this.eventListeners.add(listener);
|
|
17
22
|
return () => this.eventListeners.delete(listener);
|
|
18
23
|
}
|
|
24
|
+
onPublicEvent(listener) {
|
|
25
|
+
this.publicEventListeners.add(listener);
|
|
26
|
+
return () => this.publicEventListeners.delete(listener);
|
|
27
|
+
}
|
|
19
28
|
validate(eventType, data) {
|
|
20
29
|
const definition = this.eventDefinitions[eventType];
|
|
21
30
|
if (!definition) {
|
|
@@ -28,6 +37,18 @@ export class EventProcessor {
|
|
|
28
37
|
throw new DecentrlSDKError(`Schema validation failed for event type "${eventType}": ${result.error.message}`, 'SCHEMA_VALIDATION_FAILED', { eventType, errors: result.error.issues });
|
|
29
38
|
}
|
|
30
39
|
}
|
|
40
|
+
validatePublicEvent(eventType, data) {
|
|
41
|
+
const definition = this.publicEventDefinitions?.[eventType];
|
|
42
|
+
if (!definition) {
|
|
43
|
+
throw new DecentrlSDKError(`Unknown public event type: ${eventType}`, 'UNKNOWN_EVENT_TYPE', {
|
|
44
|
+
eventType,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
const result = definition.schema.safeParse(data);
|
|
48
|
+
if (!result.success) {
|
|
49
|
+
throw new DecentrlSDKError(`Schema validation failed for public event type "${eventType}": ${result.error.message}`, 'SCHEMA_VALIDATION_FAILED', { eventType, errors: result.error.issues });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
31
52
|
computeTags(eventType, data) {
|
|
32
53
|
const definition = this.eventDefinitions[eventType];
|
|
33
54
|
if (!definition) {
|
|
@@ -37,6 +58,24 @@ export class EventProcessor {
|
|
|
37
58
|
}
|
|
38
59
|
return evaluateTagTemplates(definition.tags, data);
|
|
39
60
|
}
|
|
61
|
+
computePublicTags(eventType, data) {
|
|
62
|
+
const definition = this.publicEventDefinitions?.[eventType];
|
|
63
|
+
if (!definition) {
|
|
64
|
+
throw new DecentrlSDKError(`Unknown public event type: ${eventType}`, 'UNKNOWN_EVENT_TYPE', {
|
|
65
|
+
eventType,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
return evaluateTagTemplates(definition.tags, data);
|
|
69
|
+
}
|
|
70
|
+
getPublicChannelId(eventType) {
|
|
71
|
+
const definition = this.publicEventDefinitions?.[eventType];
|
|
72
|
+
if (!definition) {
|
|
73
|
+
throw new DecentrlSDKError(`Unknown public event type: ${eventType}`, 'UNKNOWN_EVENT_TYPE', {
|
|
74
|
+
eventType,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
return definition.channelId;
|
|
78
|
+
}
|
|
40
79
|
computeTagsSafe(eventType, data) {
|
|
41
80
|
try {
|
|
42
81
|
return this.computeTags(eventType, data);
|
|
@@ -55,7 +94,6 @@ export class EventProcessor {
|
|
|
55
94
|
return false;
|
|
56
95
|
}
|
|
57
96
|
if (this.processedEventIds.size >= MAX_DEDUP_SIZE) {
|
|
58
|
-
// Set iterates in insertion order — first value is the oldest
|
|
59
97
|
const oldest = this.processedEventIds.values().next().value;
|
|
60
98
|
this.processedEventIds.delete(oldest);
|
|
61
99
|
}
|
|
@@ -64,7 +102,6 @@ export class EventProcessor {
|
|
|
64
102
|
const currentState = this.stateStore.getState();
|
|
65
103
|
for (const sliceKey of Object.keys(this.stateDefinitions)) {
|
|
66
104
|
const sliceDef = this.stateDefinitions[sliceKey];
|
|
67
|
-
// Dynamic reducer lookup — TS can't prove type safety for runtime event type dispatch
|
|
68
105
|
const reducer = sliceDef.reduce[envelope.type];
|
|
69
106
|
if (reducer) {
|
|
70
107
|
const currentSlice = currentState[sliceKey];
|
|
@@ -77,6 +114,65 @@ export class EventProcessor {
|
|
|
77
114
|
}
|
|
78
115
|
return true;
|
|
79
116
|
}
|
|
117
|
+
processPublicEvent(envelope) {
|
|
118
|
+
const dedupKey = `public:${envelope.meta.eventId}`;
|
|
119
|
+
if (this.processedEventIds.has(dedupKey)) {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
if (this.processedEventIds.size >= MAX_DEDUP_SIZE) {
|
|
123
|
+
const oldest = this.processedEventIds.values().next().value;
|
|
124
|
+
this.processedEventIds.delete(oldest);
|
|
125
|
+
}
|
|
126
|
+
this.processedEventIds.add(dedupKey);
|
|
127
|
+
const reducerKey = `public:${envelope.type}`;
|
|
128
|
+
const currentState = this.stateStore.getState();
|
|
129
|
+
for (const sliceKey of Object.keys(this.stateDefinitions)) {
|
|
130
|
+
const sliceDef = this.stateDefinitions[sliceKey];
|
|
131
|
+
const reducer = sliceDef.reduce[reducerKey];
|
|
132
|
+
if (reducer) {
|
|
133
|
+
const currentSlice = currentState[sliceKey];
|
|
134
|
+
const newSlice = reducer(currentSlice, envelope.data, envelope.meta);
|
|
135
|
+
this.stateStore.setSlice(sliceKey, newSlice);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
for (const listener of this.publicEventListeners) {
|
|
139
|
+
listener(envelope);
|
|
140
|
+
}
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
processChannelEvent(envelope) {
|
|
144
|
+
const dedupKey = `channel:${envelope.meta.eventId}`;
|
|
145
|
+
if (this.processedEventIds.has(dedupKey)) {
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
if (this.processedEventIds.size >= MAX_DEDUP_SIZE) {
|
|
149
|
+
const oldest = this.processedEventIds.values().next().value;
|
|
150
|
+
this.processedEventIds.delete(oldest);
|
|
151
|
+
}
|
|
152
|
+
this.processedEventIds.add(dedupKey);
|
|
153
|
+
const reducerKey = `channel:${envelope.type}`;
|
|
154
|
+
const currentState = this.stateStore.getState();
|
|
155
|
+
for (const sliceKey of Object.keys(this.stateDefinitions)) {
|
|
156
|
+
const sliceDef = this.stateDefinitions[sliceKey];
|
|
157
|
+
const reducer = sliceDef.reduce[reducerKey];
|
|
158
|
+
if (reducer) {
|
|
159
|
+
const currentSlice = currentState[sliceKey];
|
|
160
|
+
const newSlice = reducer(currentSlice, envelope.data, envelope.meta);
|
|
161
|
+
this.stateStore.setSlice(sliceKey, newSlice);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
for (const listener of this.publicEventListeners) {
|
|
165
|
+
listener(envelope);
|
|
166
|
+
}
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
validateChannelEvent(eventType, data) {
|
|
170
|
+
const definition = this.channelDefinitions?.[eventType];
|
|
171
|
+
if (!definition) {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
return definition.schema.safeParse(data).success;
|
|
175
|
+
}
|
|
80
176
|
processBatch(envelopes) {
|
|
81
177
|
let newCount = 0;
|
|
82
178
|
for (const envelope of envelopes) {
|
|
@@ -89,5 +185,6 @@ export class EventProcessor {
|
|
|
89
185
|
reset() {
|
|
90
186
|
this.processedEventIds.clear();
|
|
91
187
|
this.eventListeners.clear();
|
|
188
|
+
this.publicEventListeners.clear();
|
|
92
189
|
}
|
|
93
190
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -9,10 +9,11 @@ export { DecentrlSDKError } from './errors.js';
|
|
|
9
9
|
export { EventProcessor } from './event-processor.js';
|
|
10
10
|
export { IdentityManager } from './identity-manager.js';
|
|
11
11
|
export type { PersistOptions } from './persistence.js';
|
|
12
|
+
export { PublicChannelReader } from './public-channel-reader.js';
|
|
12
13
|
export { StateStore } from './state-store.js';
|
|
13
14
|
export { SyncManager } from './sync-manager.js';
|
|
14
15
|
export type { DecentrlTransport } from './transport.js';
|
|
15
|
-
export type { ArchivedContract, DecentrlAppConfig, DecentrlClientConfig, EventDefinition, EventDefinitions, EventEnvelope, EventMeta, IdentityState, InferState, PaginatedResult, PaginationMeta, PendingContractRequest, PublishOptions, QueryOptions, SerializedIdentity, SerializedKeyPair, StateDefinitions, StateListener, StateSliceDefinition, StoredSignedContract, SyncOptions, } from './types.js';
|
|
16
|
+
export type { ArchivedContract, ChannelDefinition, ChannelDefinitions, ChannelFetchOptions, ChannelSubscriptionConfig, DecentrlAppConfig, DecentrlClientConfig, EventDefinition, EventDefinitions, EventEnvelope, EventMeta, IdentityState, InferState, PaginatedResult, PaginationMeta, PendingContractRequest, PublicEventDefinition, PublicEventDefinitions, PublicEventEnvelope, PublicEventMeta, PublicEventResult, PublicQueryOptions, PublishOptions, QueryOptions, SerializedIdentity, SerializedKeyPair, StateDefinitions, StateListener, StateSliceDefinition, StoredSignedContract, SyncOptions, } from './types.js';
|
|
16
17
|
export type { ConnectionStatus, WebSocketTransportCallbacks, WebSocketTransportIdentity, } from './websocket-transport.js';
|
|
17
18
|
export { deriveWsUrl, WebSocketTransport } from './websocket-transport.js';
|
|
18
19
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,YAAY,EACX,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,SAAS,EACT,aAAa,EACb,UAAU,EACV,eAAe,EACf,cAAc,EACd,sBAAsB,EACtB,cAAc,EACd,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,WAAW,GACX,MAAM,YAAY,CAAC;AACpB,YAAY,EACX,gBAAgB,EAChB,2BAA2B,EAC3B,0BAA0B,GAC1B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,YAAY,EACX,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,yBAAyB,EACzB,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,SAAS,EACT,aAAa,EACb,UAAU,EACV,eAAe,EACf,cAAc,EACd,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,WAAW,GACX,MAAM,YAAY,CAAC;AACpB,YAAY,EACX,gBAAgB,EAChB,2BAA2B,EAC3B,0BAA0B,GAC1B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -5,6 +5,7 @@ export { DirectTransport } from './direct-transport.js';
|
|
|
5
5
|
export { DecentrlSDKError } from './errors.js';
|
|
6
6
|
export { EventProcessor } from './event-processor.js';
|
|
7
7
|
export { IdentityManager } from './identity-manager.js';
|
|
8
|
+
export { PublicChannelReader } from './public-channel-reader.js';
|
|
8
9
|
export { StateStore } from './state-store.js';
|
|
9
10
|
export { SyncManager } from './sync-manager.js';
|
|
10
11
|
export { deriveWsUrl, WebSocketTransport } from './websocket-transport.js';
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { EventProcessor } from './event-processor.js';
|
|
2
|
+
import type { DecentrlTransport } from './transport.js';
|
|
3
|
+
import type { ChannelDefinitions, ChannelFetchOptions, ChannelSubscriptionConfig, EventDefinitions, PaginatedResult, PublicEventResult, StateDefinitions } from './types.js';
|
|
4
|
+
export declare class PublicChannelReader<TEvents extends EventDefinitions, TState extends StateDefinitions<TEvents>> {
|
|
5
|
+
private transport;
|
|
6
|
+
private eventProcessor;
|
|
7
|
+
private channelDefinitions?;
|
|
8
|
+
private subscriptions;
|
|
9
|
+
private mediatorEndpointCache;
|
|
10
|
+
private signingKeyCache;
|
|
11
|
+
constructor(transport: DecentrlTransport, eventProcessor: EventProcessor<TEvents, TState>, channelDefinitions?: ChannelDefinitions | undefined);
|
|
12
|
+
subscribe(config: ChannelSubscriptionConfig): {
|
|
13
|
+
unsubscribe: () => void;
|
|
14
|
+
};
|
|
15
|
+
fetch(options: ChannelFetchOptions): Promise<PaginatedResult<PublicEventResult>>;
|
|
16
|
+
dispose(): void;
|
|
17
|
+
private parseAndVerifyPublicEvent;
|
|
18
|
+
private resolveSigningKeyFromDid;
|
|
19
|
+
private resolveMediatorEndpoint;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=public-channel-reader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-channel-reader.d.ts","sourceRoot":"","sources":["../src/public-channel-reader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EACX,kBAAkB,EAClB,mBAAmB,EACnB,yBAAyB,EACzB,gBAAgB,EAChB,eAAe,EAEf,iBAAiB,EACjB,gBAAgB,EAChB,MAAM,YAAY,CAAC;AAMpB,qBAAa,mBAAmB,CAC/B,OAAO,SAAS,gBAAgB,EAChC,MAAM,SAAS,gBAAgB,CAAC,OAAO,CAAC;IAOvC,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,kBAAkB,CAAC;IAP5B,OAAO,CAAC,aAAa,CAAyC;IAC9D,OAAO,CAAC,qBAAqB,CAA6B;IAC1D,OAAO,CAAC,eAAe,CAAiC;gBAG/C,SAAS,EAAE,iBAAiB,EAC5B,cAAc,EAAE,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,EAC/C,kBAAkB,CAAC,EAAE,kBAAkB,YAAA;IAGhD,SAAS,CAAC,MAAM,EAAE,yBAAyB,GAAG;QAAE,WAAW,EAAE,MAAM,IAAI,CAAA;KAAE;IAwDnE,KAAK,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC;IAyBtF,OAAO,IAAI,IAAI;YAQD,yBAAyB;IA8DvC,OAAO,CAAC,wBAAwB;YA4BlB,uBAAuB;CA0BrC"}
|