@@ -108,6 +108,11 @@ const formCacheKeyPrefix = (streamId: StreamID): string => {
108108 return `${ streamId } |`
109109}
110110
111+ const invalidateCache = ( cache : CachingMap < string , any , any > , streamId : StreamID ) : void => {
112+ const matchTarget = ( s : string ) => s . startsWith ( formCacheKeyPrefix ( streamId ) )
113+ cache . invalidate ( matchTarget )
114+ }
115+
111116@scoped ( Lifecycle . ContainerScoped )
112117export class StreamRegistry {
113118
@@ -121,10 +126,10 @@ export class StreamRegistry {
121126 private readonly config : Pick < StrictStreamrClientConfig , 'contracts' | 'cache' | '_timeouts' >
122127 private readonly authentication : Authentication
123128 private readonly logger : Logger
124- private readonly getStreamMetadata_cached : CachingMap < string , StreamMetadata , [ StreamID ] >
125- private readonly isStreamPublisher_cached : CachingMap < string , boolean , [ StreamID , UserID ] >
126- private readonly isStreamSubscriber_cached : CachingMap < string , boolean , [ StreamID , UserID ] >
127- private readonly hasPublicSubscribePermission_cached : CachingMap < string , boolean , [ StreamID ] >
129+ private readonly metadataCache : CachingMap < string , StreamMetadata , [ StreamID ] >
130+ private readonly publisherCache : CachingMap < string , boolean , [ StreamID , UserID ] >
131+ private readonly subscriberCache : CachingMap < string , boolean , [ StreamID , UserID ] >
132+ private readonly publicSubscribePermissionCache : CachingMap < string , boolean , [ StreamID ] >
128133
129134 /** @internal */
130135 constructor (
@@ -165,25 +170,25 @@ export class StreamRegistry {
165170 } ) ,
166171 loggerFactory
167172 } )
168- this . getStreamMetadata_cached = new CachingMap ( ( streamId : StreamID ) => {
173+ this . metadataCache = new CachingMap ( ( streamId : StreamID ) => {
169174 return this . getStreamMetadata_nonCached ( streamId )
170175 } , {
171176 ...config . cache ,
172177 cacheKey : ( [ streamId ] ) => formCacheKeyPrefix ( streamId )
173178 } )
174- this . isStreamPublisher_cached = new CachingMap ( ( streamId : StreamID , userId : UserID ) => {
179+ this . publisherCache = new CachingMap ( ( streamId : StreamID , userId : UserID ) => {
175180 return this . isStreamPublisherOrSubscriber_nonCached ( streamId , userId , StreamPermission . PUBLISH )
176181 } , {
177182 ...config . cache ,
178183 cacheKey : ( [ streamId , userId ] ) => `${ formCacheKeyPrefix ( streamId ) } ${ userId } `
179184 } )
180- this . isStreamSubscriber_cached = new CachingMap ( ( streamId : StreamID , userId : UserID ) => {
185+ this . subscriberCache = new CachingMap ( ( streamId : StreamID , userId : UserID ) => {
181186 return this . isStreamPublisherOrSubscriber_nonCached ( streamId , userId , StreamPermission . SUBSCRIBE )
182187 } , {
183188 ...config . cache ,
184189 cacheKey : ( [ streamId , userId ] ) => `${ formCacheKeyPrefix ( streamId ) } ${ userId } `
185190 } )
186- this . hasPublicSubscribePermission_cached = new CachingMap ( ( streamId : StreamID ) => {
191+ this . publicSubscribePermissionCache = new CachingMap ( ( streamId : StreamID ) => {
187192 return this . hasPermission ( {
188193 streamId,
189194 public : true ,
@@ -241,6 +246,7 @@ export class StreamRegistry {
241246 await this . ensureStreamIdInNamespaceOfAuthenticatedUser ( domain , streamId )
242247 await waitForTx ( this . streamRegistryContract ! . createStream ( path , JSON . stringify ( metadata ) , ethersOverrides ) )
243248 }
249+ this . populateMetadataCache ( streamId , metadata )
244250 }
245251
246252 private async ensureStreamIdInNamespaceOfAuthenticatedUser ( address : EthereumAddress , streamId : StreamID ) : Promise < void > {
@@ -258,7 +264,7 @@ export class StreamRegistry {
258264 JSON . stringify ( metadata ) ,
259265 ethersOverrides
260266 ) )
261- this . invalidateMetadataCache ( streamId )
267+ this . populateMetadataCache ( streamId , metadata )
262268 }
263269
264270 async deleteStream ( streamIdOrPath : string ) : Promise < void > {
@@ -269,7 +275,7 @@ export class StreamRegistry {
269275 streamId ,
270276 ethersOverrides
271277 ) )
272- this . invalidateMetadataCache ( streamId )
278+ invalidateCache ( this . metadataCache , streamId )
273279 this . invalidatePermissionCaches ( streamId )
274280 }
275281
@@ -512,31 +518,29 @@ export class StreamRegistry {
512518 // --------------------------------------------------------------------------------------------
513519
514520 getStreamMetadata ( streamId : StreamID ) : Promise < StreamMetadata > {
515- return this . getStreamMetadata_cached . get ( streamId )
521+ return this . metadataCache . get ( streamId )
516522 }
517523
518524 isStreamPublisher ( streamId : StreamID , userId : UserID ) : Promise < boolean > {
519- return this . isStreamPublisher_cached . get ( streamId , userId )
525+ return this . publisherCache . get ( streamId , userId )
520526 }
521527
522528 isStreamSubscriber ( streamId : StreamID , userId : UserID ) : Promise < boolean > {
523- return this . isStreamSubscriber_cached . get ( streamId , userId )
529+ return this . subscriberCache . get ( streamId , userId )
524530 }
525531
526532 hasPublicSubscribePermission ( streamId : StreamID ) : Promise < boolean > {
527- return this . hasPublicSubscribePermission_cached . get ( streamId )
533+ return this . publicSubscribePermissionCache . get ( streamId )
528534 }
529535
530- invalidateMetadataCache ( streamId : StreamID ) : void {
531- this . logger . trace ( 'Clear metadata cache for stream' , { streamId } )
532- this . getStreamMetadata_cached . invalidate ( ( s ) => s . startsWith ( formCacheKeyPrefix ( streamId ) ) )
536+ private populateMetadataCache ( streamId : StreamID , metadata : StreamMetadata ) : void {
537+ this . metadataCache . set ( [ streamId ] , metadata )
533538 }
534539
535540 invalidatePermissionCaches ( streamId : StreamID ) : void {
536541 this . logger . trace ( 'Clear permission caches for stream' , { streamId } )
537- const matchTarget = ( s : string ) => s . startsWith ( formCacheKeyPrefix ( streamId ) )
538- this . isStreamPublisher_cached . invalidate ( matchTarget )
539- this . isStreamSubscriber_cached . invalidate ( matchTarget )
542+ invalidateCache ( this . publisherCache , streamId )
543+ invalidateCache ( this . subscriberCache , streamId )
540544 // TODO should also clear cache for hasPublicSubscribePermission?
541545 }
542546}
0 commit comments