@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 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;
@@ -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;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"}
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
  }
@@ -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
@@ -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;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"}
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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"}
@@ -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
- constructor(eventDefinitions: TEvents, stateDefinitions: TState, stateStore: StateStore<InferState<TState>>);
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;AAIpB,qBAAa,cAAc,CAC1B,OAAO,SAAS,gBAAgB,EAChC,MAAM,SAAS,gBAAgB,CAAC,OAAO,CAAC;IAMvC,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,UAAU;IANnB,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,cAAc,CAAgD;gBAG7D,gBAAgB,EAAE,OAAO,EACzB,gBAAgB,EAAE,MAAM,EACxB,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAGnD,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,IAAI,GAAG,MAAM,IAAI;IAMhE,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IAoBhD,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,EAAE;IAYvD,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;IAwC9C,YAAY,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,MAAM;IAYhD,KAAK,IAAI,IAAI;CAIb"}
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"}
@@ -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
- constructor(eventDefinitions, stateDefinitions, stateStore) {
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
@@ -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"}