From 71865b37759b31d33e1eadb924154365dd6216a9 Mon Sep 17 00:00:00 2001 From: Celine Sarafa Date: Thu, 18 Jan 2024 10:47:55 +0100 Subject: [PATCH 1/4] chore: add seq to jwt --- packages/notify-client/src/types/client.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/notify-client/src/types/client.ts b/packages/notify-client/src/types/client.ts index 685f0b40..afac4cee 100644 --- a/packages/notify-client/src/types/client.ts +++ b/packages/notify-client/src/types/client.ts @@ -208,6 +208,7 @@ export declare namespace NotifyClientTypes { aud: string; // did:pkh blockchain account that notify subscription is associated with sub: string; // did:pkh of blockchain account that this notify subscription is associated with sbs: NotifyServerSubscription[]; // array of [Notify Server Subscriptions] + seq: number } interface CommonResponseJWTClaims extends BaseJwtClaims { @@ -220,16 +221,19 @@ export declare namespace NotifyClientTypes { interface SubscriptionResponseJWTClaims extends CommonResponseJWTClaims { act: "notify_subscription_response"; sbs: NotifyServerSubscription[]; // array of [Notify Server Subscriptions] + seq: number } interface UpdateResponseJWTClaims extends CommonResponseJWTClaims { act: "notify_update_response"; sbs: NotifyServerSubscription[]; // array of [Notify Server Subscriptions] + seq: number } interface DeleteResponseJWTClaims extends CommonResponseJWTClaims { act: "notify_delete_response"; sbs: NotifyServerSubscription[]; // array of [Notify Server Subscriptions] + seq: number } interface GetNotificationsResponseClaims extends BaseJwtClaims { @@ -247,6 +251,7 @@ export declare namespace NotifyClientTypes { aud: string; // did:key of client identity key sub: string; // did:key of the public key used for key agreement on the Notify topic sbs: NotifyServerSubscription[]; // array of [Notify Server Subscriptions] + seq: number } interface NotifySubscriptionsChangedResponseClaims extends BaseJwtClaims { From 951bb71bab06e27084193c8e073a9293b3d75eb4 Mon Sep 17 00:00:00 2001 From: Celine Sarafa Date: Thu, 18 Jan 2024 10:52:49 +0100 Subject: [PATCH 2/4] chore: add clientStateMaintenance --- packages/notify-client/src/client.ts | 11 +++++++++++ packages/notify-client/src/controllers/engine.ts | 14 ++++++++++++++ packages/notify-client/src/types/client.ts | 7 +++++++ 3 files changed, 32 insertions(+) diff --git a/packages/notify-client/src/client.ts b/packages/notify-client/src/client.ts index e7878aec..28e9fcf5 100644 --- a/packages/notify-client/src/client.ts +++ b/packages/notify-client/src/client.ts @@ -35,6 +35,7 @@ export class NotifyClient extends INotifyClient { public messages: INotifyClient["messages"]; public watchedAccounts: INotifyClient["watchedAccounts"]; public registrationData: INotifyClient["registrationData"]; + public clientStateMaintenance: INotifyClient["clientStateMaintenance"]; public identityKeys: INotifyClient["identityKeys"]; static async init(opts: NotifyClientTypes.ClientOptions) { @@ -95,6 +96,15 @@ export class NotifyClient extends INotifyClient { this.identityKeys = opts.identityKeys ?? new IdentityKeys(this.core, this.keyserverUrl); + + this.clientStateMaintenance = new Store( + this.core, + this.logger, + "clientStateMaintenance", + NOTIFY_CLIENT_STORAGE_PREFIX, + () => "stateMaintenance" + ); + this.engine = new NotifyEngine(this); } @@ -244,6 +254,7 @@ export class NotifyClient extends INotifyClient { await this.registrationData.init(); await this.identityKeys.init(); await this.watchedAccounts.init(); + await this.clientStateMaintenance.init(); await this.engine.init(); this.logger.info(`NotifyClient Initialization Success`); diff --git a/packages/notify-client/src/controllers/engine.ts b/packages/notify-client/src/controllers/engine.ts index 74b8cf6e..1038435c 100644 --- a/packages/notify-client/src/controllers/engine.ts +++ b/packages/notify-client/src/controllers/engine.ts @@ -1243,6 +1243,20 @@ export class NotifyEngine extends INotifyEngine { | NotifyClientTypes.UpdateResponseJWTClaims >(jwt, act); + // TODO: enable this when seq property is in notify server + // const latestSubscriptionSequence = + // this.client.clientStateMaintenance.get( + // "stateMaintenance" + // ).latestSubscriptionSequence; + + // if (latestSubscriptionSequence && latestSubscriptionSequence > claims.seq) { + // return this.client.subscriptions.getAll(); + // } + + // await this.client.clientStateMaintenance.update("stateMaintenance", { + // latestSubscriptionSequence: claims.seq, + // }); + this.client.logger.info("updateSubscriptionsUsingJwt > claims", claims); // Clean up any subscriptions that are no longer valid. diff --git a/packages/notify-client/src/types/client.ts b/packages/notify-client/src/types/client.ts index afac4cee..322e4f3e 100644 --- a/packages/notify-client/src/types/client.ts +++ b/packages/notify-client/src/types/client.ts @@ -336,6 +336,13 @@ export abstract class INotifyClient { } >; + public abstract clientStateMaintenance: IStore< + "stateMaintenance", + { + latestSubscriptionSequence: number; + } + >; + public abstract identityKeys: IdentityKeys; public abstract subscriptions: IStore< From 1e12ff350c86de3fa194eb61f7e0842f53b4dc8b Mon Sep 17 00:00:00 2001 From: Celine Sarafa Date: Thu, 18 Jan 2024 10:57:19 +0100 Subject: [PATCH 3/4] chore: add seq support in notify client --- .../notify-client/src/controllers/engine.ts | 26 +++++++++---------- packages/notify-client/src/types/client.ts | 10 +++---- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/packages/notify-client/src/controllers/engine.ts b/packages/notify-client/src/controllers/engine.ts index 1038435c..06d81adf 100644 --- a/packages/notify-client/src/controllers/engine.ts +++ b/packages/notify-client/src/controllers/engine.ts @@ -1243,19 +1243,19 @@ export class NotifyEngine extends INotifyEngine { | NotifyClientTypes.UpdateResponseJWTClaims >(jwt, act); - // TODO: enable this when seq property is in notify server - // const latestSubscriptionSequence = - // this.client.clientStateMaintenance.get( - // "stateMaintenance" - // ).latestSubscriptionSequence; - - // if (latestSubscriptionSequence && latestSubscriptionSequence > claims.seq) { - // return this.client.subscriptions.getAll(); - // } - - // await this.client.clientStateMaintenance.update("stateMaintenance", { - // latestSubscriptionSequence: claims.seq, - // }); + const latestSubscriptionSequence = this.client.clientStateMaintenance.length + ? this.client.clientStateMaintenance.get("stateMaintenance") + .latestSubscriptionSequence + : 0; + + const incomingMessageIsOld = latestSubscriptionSequence > claims.seq; + if (incomingMessageIsOld) { + return this.client.subscriptions.getAll(); + } + + await this.client.clientStateMaintenance.update("stateMaintenance", { + latestSubscriptionSequence: claims.seq, + }); this.client.logger.info("updateSubscriptionsUsingJwt > claims", claims); diff --git a/packages/notify-client/src/types/client.ts b/packages/notify-client/src/types/client.ts index 322e4f3e..2c96f61d 100644 --- a/packages/notify-client/src/types/client.ts +++ b/packages/notify-client/src/types/client.ts @@ -208,7 +208,7 @@ export declare namespace NotifyClientTypes { aud: string; // did:pkh blockchain account that notify subscription is associated with sub: string; // did:pkh of blockchain account that this notify subscription is associated with sbs: NotifyServerSubscription[]; // array of [Notify Server Subscriptions] - seq: number + seq: number; } interface CommonResponseJWTClaims extends BaseJwtClaims { @@ -221,19 +221,19 @@ export declare namespace NotifyClientTypes { interface SubscriptionResponseJWTClaims extends CommonResponseJWTClaims { act: "notify_subscription_response"; sbs: NotifyServerSubscription[]; // array of [Notify Server Subscriptions] - seq: number + seq: number; } interface UpdateResponseJWTClaims extends CommonResponseJWTClaims { act: "notify_update_response"; sbs: NotifyServerSubscription[]; // array of [Notify Server Subscriptions] - seq: number + seq: number; } interface DeleteResponseJWTClaims extends CommonResponseJWTClaims { act: "notify_delete_response"; sbs: NotifyServerSubscription[]; // array of [Notify Server Subscriptions] - seq: number + seq: number; } interface GetNotificationsResponseClaims extends BaseJwtClaims { @@ -251,7 +251,7 @@ export declare namespace NotifyClientTypes { aud: string; // did:key of client identity key sub: string; // did:key of the public key used for key agreement on the Notify topic sbs: NotifyServerSubscription[]; // array of [Notify Server Subscriptions] - seq: number + seq: number; } interface NotifySubscriptionsChangedResponseClaims extends BaseJwtClaims { From 96c6a78e9bb277508ed2148044e643f43a0740d7 Mon Sep 17 00:00:00 2001 From: Celine Sarafa Date: Thu, 18 Jan 2024 11:04:18 +0100 Subject: [PATCH 4/4] chore: use set instead of update to prevent no key bug --- packages/notify-client/src/controllers/engine.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/notify-client/src/controllers/engine.ts b/packages/notify-client/src/controllers/engine.ts index 06d81adf..94a5e705 100644 --- a/packages/notify-client/src/controllers/engine.ts +++ b/packages/notify-client/src/controllers/engine.ts @@ -1253,7 +1253,7 @@ export class NotifyEngine extends INotifyEngine { return this.client.subscriptions.getAll(); } - await this.client.clientStateMaintenance.update("stateMaintenance", { + await this.client.clientStateMaintenance.set("stateMaintenance", { latestSubscriptionSequence: claims.seq, });