From d4a8e5829a535bf325833cf8fc44e41e930c490a Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Tue, 29 Nov 2022 18:40:39 -0500 Subject: [PATCH] Do not use object constructors for names (#4149) * Do not use object constructors for names Minification was selecting different class names for different instances of services, which was causing them not to sync properly. This was happening _only_ in production mode for some reason, perhaps due to minifying post chunking? * Add tests for additional synced properties --- .../session-sync.decorator.spec.ts | 36 +++++++++++++++++-- .../session-sync.decorator.ts | 5 ++- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/apps/browser/src/decorators/session-sync-observable/session-sync.decorator.spec.ts b/apps/browser/src/decorators/session-sync-observable/session-sync.decorator.spec.ts index 38ec7aac9a1..c6d46b28fd1 100644 --- a/apps/browser/src/decorators/session-sync-observable/session-sync.decorator.spec.ts +++ b/apps/browser/src/decorators/session-sync-observable/session-sync.decorator.spec.ts @@ -8,9 +8,12 @@ describe("sessionSync decorator", () => { class TestClass { @sessionSync({ ctor: ctor, initializer: initializer }) private testProperty = new BehaviorSubject(""); + @sessionSync({ ctor: ctor, initializer: initializer, initializeAs: "array" }) + private secondTestProperty = new BehaviorSubject(""); complete() { this.testProperty.complete(); + this.secondTestProperty.complete(); } } @@ -19,11 +22,40 @@ describe("sessionSync decorator", () => { expect((testClass as any).__syncedItemMetadata).toEqual([ expect.objectContaining({ propertyKey: "testProperty", - sessionKey: "TestClass_testProperty", + sessionKey: "testProperty_0", ctor: ctor, initializer: initializer, }), - testClass.complete(), + expect.objectContaining({ + propertyKey: "secondTestProperty", + sessionKey: "secondTestProperty_1", + ctor: ctor, + initializer: initializer, + initializeAs: "array", + }), ]); + testClass.complete(); + }); + + class TestClass2 { + @sessionSync({ ctor: ctor, initializer: initializer }) + private testProperty = new BehaviorSubject(""); + + complete() { + this.testProperty.complete(); + } + } + + it("should maintain sessionKey index count for other test classes", () => { + const testClass = new TestClass2(); + expect((testClass as any).__syncedItemMetadata).toEqual([ + expect.objectContaining({ + propertyKey: "testProperty", + sessionKey: "testProperty_2", + ctor: ctor, + initializer: initializer, + }), + ]); + testClass.complete(); }); }); diff --git a/apps/browser/src/decorators/session-sync-observable/session-sync.decorator.ts b/apps/browser/src/decorators/session-sync-observable/session-sync.decorator.ts index 071322900e1..6a6b3d33fa1 100644 --- a/apps/browser/src/decorators/session-sync-observable/session-sync.decorator.ts +++ b/apps/browser/src/decorators/session-sync-observable/session-sync.decorator.ts @@ -9,6 +9,9 @@ class BuildOptions> { initializeAs?: InitializeOptions; } +// Used to ensure uniqueness for each synced observable +let index = 0; + /** * A decorator used to indicate the BehaviorSubject should be synced for this browser session across all contexts. * @@ -44,7 +47,7 @@ export function sessionSync(buildOptions: BuildOptions) { p.__syncedItemMetadata.push({ propertyKey, - sessionKey: `${prototype.constructor.name}_${propertyKey}`, + sessionKey: `${propertyKey}_${index++}`, ctor: buildOptions.ctor, initializer: buildOptions.initializer, initializeAs: buildOptions.initializeAs ?? "object",