11import type { DataStore } from './types/data-store.js' ;
22import type { EventLog } from './types/event-log.js' ;
3+ import type { EventStream } from './types/subscriptions.js' ;
34import type { MessageStore } from './types/message-store.js' ;
45import type { MethodHandler } from './types/method-handler.js' ;
56import type { TenantGate } from './core/tenant-gate.js' ;
67import type { UnionMessageReply } from './core/message-reply.js' ;
7- import type { EventsGetMessage , EventsGetReply , EventsQueryMessage , EventsQueryReply } from './types/event -types.js' ;
8+ import type { EventsGetMessage , EventsGetReply , EventsQueryMessage , EventsQueryReply , EventsSubscribeMessage , EventsSubscribeMessageOptions , EventsSubscribeReply } from './types/events -types.js' ;
89import type { GenericMessage , GenericMessageReply , MessageOptions } from './types/message-types.js' ;
910import type { MessagesGetMessage , MessagesGetReply } from './types/messages-types.js' ;
1011import type { PermissionsGrantMessage , PermissionsRequestMessage , PermissionsRevokeMessage } from './types/permissions-types.js' ;
@@ -15,6 +16,7 @@ import { AllowAllTenantGate } from './core/tenant-gate.js';
1516import { DidResolver } from './did/did-resolver.js' ;
1617import { EventsGetHandler } from './handlers/events-get.js' ;
1718import { EventsQueryHandler } from './handlers/events-query.js' ;
19+ import { EventsSubscribeHandler } from './handlers/events-subscribe.js' ;
1820import { Message } from './core/message.js' ;
1921import { messageReplyFromError } from './core/message-reply.js' ;
2022import { MessagesGetHandler } from './handlers/messages-get.js' ;
@@ -36,32 +38,87 @@ export class Dwn {
3638 private dataStore : DataStore ;
3739 private eventLog : EventLog ;
3840 private tenantGate : TenantGate ;
41+ private eventStream ?: EventStream ;
3942
4043 private constructor ( config : DwnConfig ) {
4144 this . didResolver = config . didResolver ! ;
4245 this . tenantGate = config . tenantGate ! ;
4346 this . messageStore = config . messageStore ;
4447 this . dataStore = config . dataStore ;
4548 this . eventLog = config . eventLog ;
49+ this . eventStream = config . eventStream ;
4650
4751 this . methodHandlers = {
48- [ DwnInterfaceName . Events + DwnMethodName . Get ] : new EventsGetHandler ( this . didResolver , this . eventLog ) ,
49- [ DwnInterfaceName . Events + DwnMethodName . Query ] : new EventsQueryHandler ( this . didResolver , this . eventLog ) ,
50- [ DwnInterfaceName . Messages + DwnMethodName . Get ] : new MessagesGetHandler ( this . didResolver , this . messageStore , this . dataStore ) ,
51- [ DwnInterfaceName . Permissions + DwnMethodName . Grant ] : new PermissionsGrantHandler (
52- this . didResolver , this . messageStore , this . eventLog ) ,
52+ [ DwnInterfaceName . Events + DwnMethodName . Get ] : new EventsGetHandler (
53+ this . didResolver ,
54+ this . eventLog ,
55+ ) ,
56+ [ DwnInterfaceName . Events + DwnMethodName . Query ] : new EventsQueryHandler (
57+ this . didResolver ,
58+ this . eventLog ,
59+ ) ,
60+ [ DwnInterfaceName . Events + DwnMethodName . Subscribe ] : new EventsSubscribeHandler (
61+ this . didResolver ,
62+ this . eventStream ,
63+ ) ,
64+ [ DwnInterfaceName . Messages + DwnMethodName . Get ] : new MessagesGetHandler (
65+ this . didResolver ,
66+ this . messageStore ,
67+ this . dataStore ,
68+ ) ,
69+ [ DwnInterfaceName . Permissions + DwnMethodName . Grant ] : new PermissionsGrantHandler (
70+ this . didResolver ,
71+ this . messageStore ,
72+ this . eventLog ,
73+ this . eventStream
74+ ) ,
5375 [ DwnInterfaceName . Permissions + DwnMethodName . Request ] : new PermissionsRequestHandler (
54- this . didResolver , this . messageStore , this . eventLog ) ,
76+ this . didResolver ,
77+ this . messageStore ,
78+ this . eventLog ,
79+ this . eventStream
80+ ) ,
5581 [ DwnInterfaceName . Permissions + DwnMethodName . Revoke ] : new PermissionsRevokeHandler (
56- this . didResolver , this . messageStore , this . eventLog ) ,
82+ this . didResolver ,
83+ this . messageStore ,
84+ this . eventLog ,
85+ this . eventStream
86+ ) ,
5787 [ DwnInterfaceName . Protocols + DwnMethodName . Configure ] : new ProtocolsConfigureHandler (
58- this . didResolver , this . messageStore , this . dataStore , this . eventLog ) ,
59- [ DwnInterfaceName . Protocols + DwnMethodName . Query ] : new ProtocolsQueryHandler ( this . didResolver , this . messageStore , this . dataStore ) ,
60- [ DwnInterfaceName . Records + DwnMethodName . Delete ] : new RecordsDeleteHandler (
61- this . didResolver , this . messageStore , this . dataStore , this . eventLog ) ,
62- [ DwnInterfaceName . Records + DwnMethodName . Query ] : new RecordsQueryHandler ( this . didResolver , this . messageStore , this . dataStore ) ,
63- [ DwnInterfaceName . Records + DwnMethodName . Read ] : new RecordsReadHandler ( this . didResolver , this . messageStore , this . dataStore ) ,
64- [ DwnInterfaceName . Records + DwnMethodName . Write ] : new RecordsWriteHandler ( this . didResolver , this . messageStore , this . dataStore , this . eventLog ) ,
88+ this . didResolver ,
89+ this . messageStore ,
90+ this . eventLog ,
91+ this . eventStream
92+ ) ,
93+ [ DwnInterfaceName . Protocols + DwnMethodName . Query ] : new ProtocolsQueryHandler (
94+ this . didResolver ,
95+ this . messageStore ,
96+ this . dataStore
97+ ) ,
98+ [ DwnInterfaceName . Records + DwnMethodName . Delete ] : new RecordsDeleteHandler (
99+ this . didResolver ,
100+ this . messageStore ,
101+ this . dataStore ,
102+ this . eventLog ,
103+ this . eventStream
104+ ) ,
105+ [ DwnInterfaceName . Records + DwnMethodName . Query ] : new RecordsQueryHandler (
106+ this . didResolver ,
107+ this . messageStore ,
108+ this . dataStore
109+ ) ,
110+ [ DwnInterfaceName . Records + DwnMethodName . Read ] : new RecordsReadHandler (
111+ this . didResolver ,
112+ this . messageStore ,
113+ this . dataStore
114+ ) ,
115+ [ DwnInterfaceName . Records + DwnMethodName . Write ] : new RecordsWriteHandler (
116+ this . didResolver ,
117+ this . messageStore ,
118+ this . dataStore ,
119+ this . eventLog ,
120+ this . eventStream
121+ )
65122 } ;
66123 }
67124
@@ -82,12 +139,14 @@ export class Dwn {
82139 await this . messageStore . open ( ) ;
83140 await this . dataStore . open ( ) ;
84141 await this . eventLog . open ( ) ;
142+ await this . eventStream ?. open ( ) ;
85143 }
86144
87145 public async close ( ) : Promise < void > {
88- this . messageStore . close ( ) ;
89- this . dataStore . close ( ) ;
90- this . eventLog . close ( ) ;
146+ await this . eventStream ?. close ( ) ;
147+ await this . messageStore . close ( ) ;
148+ await this . dataStore . close ( ) ;
149+ await this . eventLog . close ( ) ;
91150 }
92151
93152 /**
@@ -96,6 +155,8 @@ export class Dwn {
96155 */
97156 public async processMessage ( tenant : string , rawMessage : EventsGetMessage ) : Promise < EventsGetReply > ;
98157 public async processMessage ( tenant : string , rawMessage : EventsQueryMessage ) : Promise < EventsQueryReply > ;
158+ public async processMessage (
159+ tenant : string , rawMessage : EventsSubscribeMessage , options ?: EventsSubscribeMessageOptions ) : Promise < EventsSubscribeReply > ;
99160 public async processMessage ( tenant : string , rawMessage : MessagesGetMessage ) : Promise < MessagesGetReply > ;
100161 public async processMessage ( tenant : string , rawMessage : ProtocolsConfigureMessage ) : Promise < GenericMessageReply > ;
101162 public async processMessage ( tenant : string , rawMessage : ProtocolsQueryMessage ) : Promise < ProtocolsQueryReply > ;
@@ -113,13 +174,14 @@ export class Dwn {
113174 return errorMessageReply ;
114175 }
115176
116- const { dataStream } = options ;
177+ const { dataStream, subscriptionHandler } = options ;
117178
118179 const handlerKey = rawMessage . descriptor . interface + rawMessage . descriptor . method ;
119180 const methodHandlerReply = await this . methodHandlers [ handlerKey ] . handle ( {
120181 tenant,
121182 message : rawMessage as GenericMessage ,
122- dataStream
183+ dataStream,
184+ subscriptionHandler
123185 } ) ;
124186
125187 return methodHandlerReply ;
@@ -154,6 +216,7 @@ export class Dwn {
154216 // Verify interface and method
155217 const dwnInterface = rawMessage ?. descriptor ?. interface ;
156218 const dwnMethod = rawMessage ?. descriptor ?. method ;
219+
157220 if ( dwnInterface === undefined || dwnMethod === undefined ) {
158221 return {
159222 status : { code : 400 , detail : `Both interface and method must be present, interface: ${ dwnInterface } , method: ${ dwnMethod } ` }
@@ -174,10 +237,13 @@ export class Dwn {
174237 * DWN configuration.
175238 */
176239export type DwnConfig = {
177- didResolver ?: DidResolver ,
240+ didResolver ?: DidResolver ;
178241 tenantGate ?: TenantGate ;
179242
243+ // event stream is optional if a DWN does not wish to provide subscription services.
244+ eventStream ?: EventStream ;
245+
180246 messageStore : MessageStore ;
181247 dataStore : DataStore ;
182- eventLog : EventLog
248+ eventLog : EventLog ;
183249} ;
0 commit comments