Skip to content

Commit 1b661ed

Browse files
fix: implement singleton pattern for SharedValuesManager to manage multiple instances but unique per usage key.
1 parent ec0f431 commit 1b661ed

File tree

4 files changed

+19
-4
lines changed

4 files changed

+19
-4
lines changed

src/SharedValuesManager.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,16 @@ export const staticStores: SharedCreated[] = [];
77
export class SharedValuesManager<T> {
88
data = new Map<string, SharedValue<T>>();
99

10-
constructor(protected defaultValue: () => T = () => null as T) {
10+
static INSTANCES = new Map<string, SharedValuesManager<any>>();
11+
12+
private constructor(protected defaultValue: () => T = () => null as T) {
13+
}
14+
15+
static getInstance<T>(instanceKey: string): SharedValuesManager<T> {
16+
if (!SharedValuesManager.INSTANCES.has(instanceKey)) {
17+
SharedValuesManager.INSTANCES.set(instanceKey, new SharedValuesManager());
18+
}
19+
return SharedValuesManager.INSTANCES.get(instanceKey) as SharedValuesManager<T>;
1120
}
1221

1322
addListener(key: string, prefix: Prefix, listener: AFunction) {
@@ -198,10 +207,12 @@ export class SharedValuesApi<T> {
198207
}
199208
}
200209

210+
// noinspection JSUnusedGlobalSymbols
201211
clearAll() {
202212
this.sharedData.clearAll();
203213
}
204214

215+
// noinspection JSUnusedGlobalSymbols
205216
clearScope(scopeName?: Prefix) {
206217
const prefixToSearch: Prefix = scopeName || "_global";
207218
this.sharedData.data.forEach((_, key) => {
@@ -213,11 +224,13 @@ export class SharedValuesApi<T> {
213224
});
214225
}
215226

227+
// noinspection JSUnusedGlobalSymbols
216228
resolve(sharedCreated: SharedCreated): T | undefined {
217229
const {key, prefix} = sharedCreated;
218230
return this.get(key, prefix);
219231
}
220232

233+
// noinspection JSUnusedGlobalSymbols
221234
clear(key: string, scopeName: Prefix): void;
222235
clear(sharedCreated: SharedCreated): void;
223236
clear(key: string | SharedCreated, scopeName?: Prefix) {
@@ -233,11 +246,13 @@ export class SharedValuesApi<T> {
233246
this.sharedData.clear(keyStr, prefixStr);
234247
}
235248

249+
// noinspection JSUnusedGlobalSymbols
236250
has(key: string, scopeName: Prefix = "_global"): boolean {
237251
const prefix: Prefix = scopeName || "_global";
238252
return !!this.sharedData.has(key, prefix);
239253
}
240254

255+
// noinspection JSUnusedGlobalSymbols
241256
getAll(): Record<string, Record<string, T>> {
242257
const all: Record<string, Record<string, any>> = {};
243258
this.sharedData.data.forEach((value, key) => {

src/hooks/use-shared-function.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export type SharedFunctionValue<T> = {
1010
error?: unknown;
1111
}
1212

13-
const sharedFunctionsManager = new SharedValuesManager<SharedFunctionValue<any>>();
13+
const sharedFunctionsManager = SharedValuesManager.getInstance<SharedFunctionValue<any>>("SharedFunctionValue");
1414
export const sharedFunctionsApi = new SharedValuesApi<SharedFunctionValue<any>>(sharedFunctionsManager);
1515

1616
interface SharedFunctionCreated<T, Args extends unknown[]> extends SharedCreated {

src/hooks/use-shared-state.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import useShared from "./use-shared";
55
import {ensureNonEmptyString} from "../lib/utils";
66
import isEqual from "react-fast-compare";
77

8-
const sharedStatesManager = new SharedValuesManager<any>();
8+
const sharedStatesManager = SharedValuesManager.getInstance<any>("sharedStatesManager");
99
export const sharedStatesApi = new SharedValuesApi<any>(sharedStatesManager);
1010

1111
export interface SharedStateCreated<T> extends SharedCreated {

src/hooks/use-shared-subscription.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ interface SharedSubscription<T> extends SharedSubscriptionValue<T> {
2424
unsubscribe?: Unsubscribe | void;
2525
}
2626

27-
const sharedSubscriptionsManager = new SharedValuesManager<SharedSubscription<any>>();
27+
const sharedSubscriptionsManager = SharedValuesManager.getInstance<SharedSubscription<any>>("SharedSubscription");
2828
export const sharedSubscriptionsApi = new SharedValuesApi<SharedSubscription<any>>(sharedSubscriptionsManager);
2929

3030
interface SharedSubscriptionCreated<T> extends SharedCreated {

0 commit comments

Comments
 (0)