From 42d58955c25d88d34ba72951b100a73dabba31d8 Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 3 Jun 2020 19:49:59 +0200 Subject: [PATCH] feat(core-api/Storage): Encode the key names to avoid clashes --- .../implementations/StorageApi/WebStorage.test.ts | 13 +++++++++++++ .../apis/implementations/StorageApi/WebStorage.ts | 6 +++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/packages/core-api/src/apis/implementations/StorageApi/WebStorage.test.ts b/packages/core-api/src/apis/implementations/StorageApi/WebStorage.test.ts index f28cb9e41b..de6d55c7a4 100644 --- a/packages/core-api/src/apis/implementations/StorageApi/WebStorage.test.ts +++ b/packages/core-api/src/apis/implementations/StorageApi/WebStorage.test.ts @@ -117,4 +117,17 @@ describe('WebStorage Storage API', () => { expect(firstStorage.get(keyName)).toBe('boop'); expect(secondStorage.get(keyName)).toBe('deerp'); }); + + it('should not clash with other namesapces when creating buckets', async () => { + const rootStorage = new WebStorage(); + + // when getting key test2 it will translate to /profile/something/deep/test2 + const firstStorage = rootStorage.forBucket('profile/something/deep'); + // when getting key deep/test2 it will translate to /profile/something/deep/test2 + const secondStorage = rootStorage.forBucket('profile/something'); + + await firstStorage.set('test2', { error: true }); + + expect(secondStorage.get('deep/test2')).toBe(undefined); + }); }); diff --git a/packages/core-api/src/apis/implementations/StorageApi/WebStorage.ts b/packages/core-api/src/apis/implementations/StorageApi/WebStorage.ts index c9665253de..bd7c144421 100644 --- a/packages/core-api/src/apis/implementations/StorageApi/WebStorage.ts +++ b/packages/core-api/src/apis/implementations/StorageApi/WebStorage.ts @@ -53,7 +53,7 @@ export class WebStorage implements StorageApi { } private getKeyName(key: string) { - return `${this.namespace}/${key}`; + return `${this.namespace}/${encodeURIComponent(key)}`; } private notifyChanges(message: ObservableMessage) { @@ -62,9 +62,9 @@ export class WebStorage implements StorageApi { } } - private subscribers: Set< + private subscribers = new Set< ZenObservable.SubscriptionObserver - > = new Set(); + >(); private readonly observable = new ObservableImpl( subscriber => {