@wix/services-manager 0.2.18 → 0.2.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/build/core-services/signals/definition.d.ts +1 -3
  2. package/build/core-services/signals/definition.js +1 -1
  3. package/build/core-services/signals/service.d.ts +7 -12
  4. package/build/core-services/signals/service.js +15 -6
  5. package/build/helpers.d.ts +0 -3
  6. package/build/helpers.js +0 -8
  7. package/build/services-manager.d.ts +2 -7
  8. package/build/services-manager.js +9 -37
  9. package/build/types.d.ts +6 -10
  10. package/cjs/build/core-services/signals/definition.d.ts +1 -3
  11. package/cjs/build/core-services/signals/service.d.ts +7 -12
  12. package/cjs/build/core-services/signals/service.js +14 -5
  13. package/cjs/build/helpers.d.ts +0 -3
  14. package/cjs/build/helpers.js +1 -11
  15. package/cjs/build/services-manager.d.ts +2 -7
  16. package/cjs/build/services-manager.js +9 -39
  17. package/cjs/build/types.d.ts +6 -10
  18. package/package.json +6 -16
  19. package/build/core-services/signals/registry.d.ts +0 -27
  20. package/build/core-services/signals/registry.js +0 -115
  21. package/build/core-services/signals/transfer-helpers.d.ts +0 -2
  22. package/build/core-services/signals/transfer-helpers.js +0 -64
  23. package/build/remote-helpers.d.ts +0 -54
  24. package/build/remote-helpers.js +0 -243
  25. package/build/transfer-handlers/init-handlers.d.ts +0 -2
  26. package/build/transfer-handlers/init-handlers.js +0 -79
  27. package/cjs/build/core-services/signals/registry.d.ts +0 -27
  28. package/cjs/build/core-services/signals/registry.js +0 -121
  29. package/cjs/build/core-services/signals/transfer-helpers.d.ts +0 -2
  30. package/cjs/build/core-services/signals/transfer-helpers.js +0 -101
  31. package/cjs/build/remote-helpers.d.ts +0 -54
  32. package/cjs/build/remote-helpers.js +0 -283
  33. package/cjs/build/transfer-handlers/init-handlers.d.ts +0 -2
  34. package/cjs/build/transfer-handlers/init-handlers.js +0 -115
  35. package/remote-helpers/package.json +0 -3
@@ -1,64 +0,0 @@
1
- import * as Comlink from 'comlink';
2
- function hasSignals(obj) {
3
- if ((obj && typeof obj !== 'object') || typeof obj === 'function') {
4
- return false;
5
- }
6
- if (obj?.isSignal) {
7
- return true;
8
- }
9
- for (const key in obj) {
10
- if (hasSignals(obj[key])) {
11
- return true;
12
- }
13
- }
14
- return false;
15
- }
16
- function deserializeSignals(obj, signalsRegistry) {
17
- if (obj?.isSignal) {
18
- return signalsRegistry.setOrCreateSignal(obj.id, obj.value, obj.readonly);
19
- }
20
- if (Array.isArray(obj)) {
21
- return obj.map((item) => deserializeSignals(item, signalsRegistry));
22
- }
23
- if (typeof obj === 'object') {
24
- const res = {};
25
- for (const key in obj) {
26
- res[key] = deserializeSignals(obj[key], signalsRegistry);
27
- }
28
- return res;
29
- }
30
- return obj;
31
- }
32
- function serializeSignals(obj) {
33
- if (obj?.isSignal) {
34
- const signal = obj;
35
- return {
36
- id: signal.id,
37
- value: signal.peek(),
38
- isSignal: true,
39
- readonly: !obj.set,
40
- };
41
- }
42
- if (Array.isArray(obj)) {
43
- return obj.map((item) => serializeSignals(item));
44
- }
45
- if (typeof obj === 'object') {
46
- const res = {};
47
- for (const key in obj) {
48
- res[key] = serializeSignals(obj[key]);
49
- }
50
- return res;
51
- }
52
- return obj;
53
- }
54
- export const createSignalsTransferHandler = (signalsRegistry) => {
55
- Comlink.transferHandlers.set('Signals', {
56
- // @ts-expect-error
57
- canHandle: hasSignals,
58
- serialize: (obj) => {
59
- const serialized = serializeSignals(obj);
60
- return [serialized, []];
61
- },
62
- deserialize: (obj) => deserializeSignals(obj, signalsRegistry),
63
- });
64
- };
@@ -1,54 +0,0 @@
1
- import type { ServicesManager, PromisifiedServiceAPI, ServiceDefinition, ThreadMode } from './types.js';
2
- import { GetService, NamedSignals } from '@wix/services-definitions';
3
- import * as Comlink from 'comlink';
4
- export type RemoteServicesManager = ServicesManager<ThreadMode.REMOTE> & {
5
- getServiceProxy: GetService<ThreadMode.REMOTE>;
6
- syncSignal: (signalId: string, value: any, revision: string) => void;
7
- exchangeServicesAndSignals: (serviceSignalsArr: {
8
- serviceId: string;
9
- signals: NamedSignals;
10
- }[]) => {
11
- serviceId: string;
12
- signals: any;
13
- }[];
14
- awaitConnectionFromMain: () => Promise<boolean>;
15
- enableContext: (context: 'global' | 'module') => RemoteServicesManager;
16
- };
17
- export type ProxyServiceManager = Comlink.Remote<RemoteServicesManager>;
18
- export declare function createServiceProxy<T extends ServiceDefinition<any, any>>(definition: T, remoteServiceManager: ProxyServiceManager | Promise<ProxyServiceManager>, localServicesManager: ServicesManager): PromisifiedServiceAPI<T>;
19
- export declare enum SERVICE_MANAGER_MESSAGES {
20
- INIT_PORT = "WIX_MESSAGE.SERVICE_MANAGER.INIT_PORT",
21
- SIGNAL = "WIX_MESSAGE.SERVICE_MANAGER.SIGNAL",
22
- REMOTE_READY = "WIX_MESSAGE.SERVICE_MANAGER.REMOTE_READY",
23
- READY_FOR_CONNECTION = "WIX_MESSAGE.SERVICE_MANAGER.READY_FOR_CONNECTION"
24
- }
25
- export declare function connectRemoteIframe(manager: ServicesManager<any>, target: Window, options?: {
26
- retryOptions?: ConnectRemoteParams['retryOptions'];
27
- remoteServices?: ConnectRemoteParams['remoteServices'];
28
- awaitInitialConnection?: ConnectRemoteParams['awaitInitialConnection'];
29
- }): Promise<ProxyServiceManager>;
30
- export declare function connectRemoteWorker(manager: ServicesManager<any>, target: Worker, options?: {
31
- retryOptions?: ConnectRemoteParams['retryOptions'];
32
- remoteServices?: ConnectRemoteParams['remoteServices'];
33
- awaitInitialConnection?: ConnectRemoteParams['awaitInitialConnection'];
34
- }): Promise<ProxyServiceManager>;
35
- type ConnectRemoteParams = {
36
- awaitInitialConnection?: boolean;
37
- manager: ServicesManager<any>;
38
- retryOptions?: {
39
- timeout?: number;
40
- interval?: number;
41
- };
42
- remoteServices?: ServiceDefinition<any, any>[];
43
- } & ({
44
- target: Window;
45
- type: 'iframe';
46
- } | {
47
- target: Worker;
48
- type: 'worker';
49
- });
50
- export declare function createRemoteServicesManager({ servicesManager, messageFrame, }: {
51
- servicesManager: ServicesManager<any>;
52
- messageFrame?: Window | Worker;
53
- }): RemoteServicesManager;
54
- export {};
@@ -1,243 +0,0 @@
1
- import { defineService, } from '@wix/services-definitions';
2
- import * as Comlink from 'comlink';
3
- import { initializeTransferHandlers } from './transfer-handlers/init-handlers.js';
4
- export function createServiceProxy(definition, remoteServiceManager, localServicesManager) {
5
- return new Proxy({}, {
6
- get(_, prop) {
7
- if (prop === 'signals') {
8
- return localServicesManager.getServiceSignals(definition);
9
- }
10
- return async (...args) => {
11
- const remoteManager = remoteServiceManager instanceof Promise
12
- ? await remoteServiceManager
13
- : remoteServiceManager;
14
- let service = remoteManager.getServiceProxy(definition);
15
- if (!service[prop]) {
16
- service = await service;
17
- }
18
- return service[prop](...args);
19
- };
20
- },
21
- });
22
- }
23
- export var SERVICE_MANAGER_MESSAGES;
24
- (function (SERVICE_MANAGER_MESSAGES) {
25
- SERVICE_MANAGER_MESSAGES["INIT_PORT"] = "WIX_MESSAGE.SERVICE_MANAGER.INIT_PORT";
26
- SERVICE_MANAGER_MESSAGES["SIGNAL"] = "WIX_MESSAGE.SERVICE_MANAGER.SIGNAL";
27
- SERVICE_MANAGER_MESSAGES["REMOTE_READY"] = "WIX_MESSAGE.SERVICE_MANAGER.REMOTE_READY";
28
- SERVICE_MANAGER_MESSAGES["READY_FOR_CONNECTION"] = "WIX_MESSAGE.SERVICE_MANAGER.READY_FOR_CONNECTION";
29
- })(SERVICE_MANAGER_MESSAGES || (SERVICE_MANAGER_MESSAGES = {}));
30
- // the main thread always connects to workers and iframes and not the other way around
31
- export async function connectRemoteIframe(manager, target, options) {
32
- return connectRemote({
33
- manager,
34
- target,
35
- type: 'iframe',
36
- retryOptions: options?.retryOptions,
37
- remoteServices: options?.remoteServices,
38
- awaitInitialConnection: options?.awaitInitialConnection,
39
- });
40
- }
41
- export async function connectRemoteWorker(manager, target, options) {
42
- return connectRemote({
43
- manager,
44
- target,
45
- type: 'worker',
46
- retryOptions: options?.retryOptions,
47
- remoteServices: options?.remoteServices,
48
- awaitInitialConnection: options?.awaitInitialConnection,
49
- });
50
- }
51
- async function connectRemote({ manager, target, type,
52
- // by default the connection attempt is only once
53
- retryOptions: { timeout = 10000, interval = 11000 } = {}, remoteServices = [], awaitInitialConnection = false, }) {
54
- if (interval < 5) {
55
- console.warn('setting a low interval might cause a race condition on the response message');
56
- }
57
- const signalsRegistry = manager.getSignalsRegistry();
58
- const onReadyFromRemote = (callback) => {
59
- if (type === 'iframe') {
60
- window.addEventListener('message', (event) => {
61
- if (event.data?.type === SERVICE_MANAGER_MESSAGES.READY_FOR_CONNECTION &&
62
- event.source === target) {
63
- callback();
64
- }
65
- });
66
- }
67
- else {
68
- target.onmessage = (event) => {
69
- if (event.data?.type === SERVICE_MANAGER_MESSAGES.READY_FOR_CONNECTION) {
70
- callback();
71
- }
72
- };
73
- }
74
- };
75
- if (awaitInitialConnection && typeof window !== 'undefined') {
76
- await new Promise((resolve) => {
77
- onReadyFromRemote(resolve);
78
- });
79
- }
80
- return new Promise((resolve, reject) => {
81
- const triggerConnection = () => {
82
- const remoteConnectionId = Math.random().toString(36).substring(7);
83
- const { port1: remotePort, port2: localPort } = new MessageChannel();
84
- const servicesToSignals = remoteServices.map((definition) => {
85
- let signals = {};
86
- try {
87
- signals = manager.getService(definition)?.signals;
88
- }
89
- catch (e) {
90
- // do nothing, service probably not present here
91
- }
92
- return {
93
- serviceId: definition.toString(),
94
- signals,
95
- };
96
- });
97
- const message = {
98
- type: SERVICE_MANAGER_MESSAGES.INIT_PORT,
99
- remoteConnectionId,
100
- port: remotePort,
101
- };
102
- if (type === 'iframe') {
103
- target.postMessage(message, '*', [remotePort]);
104
- }
105
- else {
106
- target.postMessage(message, [remotePort]);
107
- }
108
- localPort.onmessage = async (event) => {
109
- if (event.data.type === SERVICE_MANAGER_MESSAGES.REMOTE_READY &&
110
- event.data.remoteConnectionId === remoteConnectionId) {
111
- clearTimeout(timeoutId);
112
- clearInterval(intervalId);
113
- const wrappedManager = Comlink.wrap(localPort);
114
- const remoteServicesManager = createRemoteServicesManager({
115
- servicesManager: manager,
116
- });
117
- Comlink.expose(remoteServicesManager, localPort);
118
- // sync from main to remote manager when set is from main
119
- signalsRegistry.addReplicator((id, value, revision) => {
120
- wrappedManager.syncSignal(id, value, revision);
121
- });
122
- const remoteSignals = await wrappedManager.exchangeServicesAndSignals(servicesToSignals);
123
- remoteSignals
124
- .filter(({ signals }) => !!signals)
125
- .forEach(({ serviceId, signals }) => {
126
- signalsRegistry.setServiceSignals(serviceId, signals);
127
- });
128
- resolve(wrappedManager);
129
- }
130
- };
131
- };
132
- // first connection
133
- triggerConnection();
134
- // re-establish connection if remote frame is reloaded
135
- onReadyFromRemote(() => triggerConnection());
136
- // retries if defined in options
137
- const intervalId = setInterval(triggerConnection, interval);
138
- const timeoutId = setTimeout(() => {
139
- clearInterval(intervalId);
140
- reject(new Error('Connection timeout'));
141
- }, timeout);
142
- });
143
- }
144
- export function createRemoteServicesManager({ servicesManager, messageFrame, }) {
145
- let connectedResolver = (result) => { };
146
- const connectedPromise = new Promise((resolve) => {
147
- connectedResolver = resolve;
148
- });
149
- initializeTransferHandlers(servicesManager.getSignalsRegistry());
150
- let remoteServiceManager = null;
151
- const signalsRegistry = servicesManager.getSignalsRegistry();
152
- const remoteManager = {
153
- ...servicesManager,
154
- async awaitConnectionFromMain() {
155
- const result = await connectedPromise;
156
- return result === 'connected';
157
- },
158
- getService(definition, getService = remoteManager.getService, signals = {}) {
159
- let result = null;
160
- if (servicesManager.hasService(definition)) {
161
- result = servicesManager.getService(definition, getService, signals || servicesManager.getServiceSignals(definition));
162
- }
163
- else {
164
- result = createServiceProxy(definition,
165
- // remoteServiceManager!,
166
- (async () => {
167
- await connectedPromise;
168
- return remoteServiceManager;
169
- })(), servicesManager);
170
- servicesManager.addService(definition, () => result);
171
- }
172
- if (result) {
173
- if (result.signals) {
174
- signalsRegistry.setServiceSignals(definition.toString(), result.signals);
175
- }
176
- return result;
177
- }
178
- else {
179
- throw new Error(`Service ${definition} is not provided`);
180
- }
181
- },
182
- getServiceProxy(definition, getService = remoteManager.getService) {
183
- const service = remoteManager.getService(definition, getService);
184
- return service ? Comlink.proxy(service) : service;
185
- },
186
- syncSignal(signalId, value, revision) {
187
- const signal = signalsRegistry.getSignalById(signalId);
188
- if (signal) {
189
- signal.syncSignal(value, revision);
190
- }
191
- else {
192
- const newSignal = signalsRegistry.createSignal(value, signalId);
193
- newSignal.set(value);
194
- }
195
- },
196
- exchangeServicesAndSignals(serviceSignalArr) {
197
- serviceSignalArr
198
- .map(({ serviceId, signals }) => ({
199
- serviceId,
200
- signals,
201
- }))
202
- .filter(({ signals }) => !!signals)
203
- .forEach(({ serviceId, signals }) => {
204
- signalsRegistry.setServiceSignals(serviceId, signals);
205
- });
206
- connectedResolver('connected');
207
- return serviceSignalArr
208
- .map(({ serviceId }) => defineService(serviceId))
209
- .map((definition) => ({
210
- serviceId: definition.toString(),
211
- signals: remoteManager.getService(definition).signals,
212
- }));
213
- },
214
- enableContext(context) {
215
- servicesManager.enableContext.bind(this)(context);
216
- return this;
217
- },
218
- };
219
- if (messageFrame) {
220
- messageFrame.onmessage = (event) => {
221
- if (event.data.type === SERVICE_MANAGER_MESSAGES.INIT_PORT) {
222
- remoteServiceManager = Comlink.wrap(event.data.port);
223
- Comlink.expose(remoteManager, event.data.port);
224
- event.data.port.postMessage({
225
- type: SERVICE_MANAGER_MESSAGES.REMOTE_READY,
226
- remoteConnectionId: event.data.remoteConnectionId,
227
- }, {});
228
- // sync from remote to main when set is from remote
229
- signalsRegistry.addReplicator((id, value, revision) => {
230
- void remoteServiceManager.syncSignal(id, value, revision);
231
- });
232
- }
233
- };
234
- const message = { type: SERVICE_MANAGER_MESSAGES.READY_FOR_CONNECTION };
235
- if (messageFrame.parent) {
236
- messageFrame.parent.postMessage(message, '*');
237
- }
238
- else {
239
- messageFrame.postMessage(message);
240
- }
241
- }
242
- return remoteManager;
243
- }
@@ -1,2 +0,0 @@
1
- import { SignalsRegistry } from '../core-services/signals/registry.js';
2
- export declare function initializeTransferHandlers(signalsRegistry: SignalsRegistry): void;
@@ -1,79 +0,0 @@
1
- import * as Comlink from 'comlink';
2
- // import type { ServiceDefinition } from '../types.js';
3
- // import { defineService } from '@wix/services-definitions';
4
- import { createSignalsTransferHandler } from '../core-services/signals/transfer-helpers.js';
5
- function isObjectOrFunction(obj) {
6
- return (typeof obj === 'object' && obj !== null) || typeof obj === 'function';
7
- }
8
- function needsProxy(obj) {
9
- if (!isObjectOrFunction(obj)) {
10
- return false;
11
- }
12
- if (typeof obj === 'function') {
13
- return true;
14
- }
15
- // Check if any property of the object needs a proxy
16
- for (const key in obj) {
17
- if (needsProxy(obj[key])) {
18
- return true;
19
- }
20
- }
21
- return false;
22
- }
23
- const methodIdentifier = '3#p7C$:remote-helpers-method-identifier';
24
- const stripMethods = (obj) => {
25
- if (typeof obj === 'function') {
26
- return methodIdentifier;
27
- }
28
- if (Array.isArray(obj)) {
29
- const strippedArr = obj.map(stripMethods).filter(Boolean);
30
- return strippedArr.length ? strippedArr : undefined;
31
- }
32
- if (isObjectOrFunction(obj)) {
33
- return Object.entries(obj).reduce((entries, [key, value]) => {
34
- entries[key] = stripMethods(value);
35
- return entries;
36
- }, {});
37
- }
38
- return obj;
39
- };
40
- const deepMerge = (target, source) => {
41
- if (typeof target === 'undefined' || target === methodIdentifier) {
42
- return source;
43
- }
44
- for (const key in target) {
45
- target[key] = deepMerge(target[key] || {}, source[key]);
46
- }
47
- return target;
48
- };
49
- let isInitialized = false;
50
- export function initializeTransferHandlers(signalsRegistry) {
51
- if (isInitialized) {
52
- return;
53
- }
54
- isInitialized = true;
55
- createSignalsTransferHandler(signalsRegistry);
56
- Comlink.transferHandlers.set('FUNC', {
57
- // @ts-expect-error
58
- canHandle: needsProxy,
59
- serialize: (obj) => {
60
- const { port1, port2 } = new MessageChannel();
61
- Comlink.expose(obj, port1);
62
- return [{ stripped: stripMethods(obj), port: port2 }, [port2]];
63
- },
64
- deserialize: ({ stripped, port }) => deepMerge(stripped, Comlink.wrap(port)),
65
- });
66
- //
67
- // Comlink.transferHandlers.set('ServiceDefinition', {
68
- // // @ts-expect-error
69
- // canHandle: (obj?: ServiceDefinition<any, any>) => {
70
- // return !!obj?.isServiceDefinition;
71
- // },
72
- // serialize: (p: any) => {
73
- // return [p.toString(), []];
74
- // },
75
- // deserialize: (definition: string) => {
76
- // return defineService(definition);
77
- // },
78
- // });
79
- }
@@ -1,27 +0,0 @@
1
- import { ReadOnlySignal, Signal } from './definition.js';
2
- import { Jsonifiable } from 'type-fest';
3
- import { SignalsWrapper, SignalValue } from '@wix/services-definitions';
4
- export declare function generateSignalId(): string;
5
- export type SignalReplicator = (id: string, value: any, revision: string) => void;
6
- export type InnerSignal<T extends SignalValue> = Signal<T> & {
7
- syncSignal: (value: T, revision: string) => void;
8
- getRevision(): string;
9
- readonly: boolean;
10
- };
11
- export declare class SignalsRegistry {
12
- private signalsStore;
13
- private serviceSignalsRegistry;
14
- private replicators;
15
- private createInnerSignal;
16
- getSignals(): ReadOnlySignal<any>[];
17
- clearSignalsRegistry(): void;
18
- private _createSignal;
19
- setOrCreateSignal<T extends Jsonifiable>(id: string, initialValue: T, readonly?: boolean): ReadOnlySignal<T>;
20
- createSignal<T extends Jsonifiable>(initialValue: T, id?: string): Signal<T>;
21
- createComputedSignal<T extends Jsonifiable>(fn: () => T, id?: string): ReadOnlySignal<T>;
22
- getSignalById(id: string): InnerSignal<any> | undefined;
23
- addReplicator(replicator: SignalReplicator): void;
24
- getServiceSignals(serviceId: string): SignalsWrapper | undefined;
25
- setServiceSignals(serviceId: string, signals: SignalsWrapper): void;
26
- }
27
- export declare const createSignalsRegistry: () => SignalsRegistry;
@@ -1,121 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createSignalsRegistry = exports.SignalsRegistry = void 0;
4
- exports.generateSignalId = generateSignalId;
5
- const signals_core_1 = require("@preact/signals-core");
6
- function generateSignalId() {
7
- return 'signal:xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
8
- const r = (Math.random() * 16) | 0, v = c === 'x' ? r : (r & 0x3) | 0x8;
9
- return v.toString(16);
10
- });
11
- }
12
- function generateRevisionId() {
13
- return Math.random().toString(36).slice(2);
14
- }
15
- function toPublicSignal(signal) {
16
- return {
17
- ...(signal.readonly ? {} : { set: signal.set }),
18
- get: signal.get,
19
- peek: signal.peek,
20
- subscribe: signal.subscribe,
21
- id: signal.id,
22
- isSignal: true,
23
- };
24
- }
25
- class SignalsRegistry {
26
- signalsStore = new Map();
27
- serviceSignalsRegistry = new Map();
28
- replicators = [];
29
- createInnerSignal(value, id, readonly = false) {
30
- let revisionId = generateRevisionId();
31
- const sig = (0, signals_core_1.signal)(value);
32
- const signal = {
33
- get: () => sig.value,
34
- peek: () => sig.peek(),
35
- syncSignal: (newValue, revision) => {
36
- if (sig.peek() !== newValue && revision !== revisionId) {
37
- revisionId = revision;
38
- sig.value = newValue;
39
- }
40
- },
41
- set: (newValue) => {
42
- if (sig.peek() !== newValue) {
43
- revisionId = generateRevisionId();
44
- sig.value = newValue;
45
- }
46
- },
47
- subscribe: (sfn) => sig.subscribe(sfn),
48
- id,
49
- isSignal: true,
50
- getRevision: () => revisionId,
51
- readonly,
52
- };
53
- return signal;
54
- }
55
- getSignals() {
56
- return Array.from(this.signalsStore.values());
57
- }
58
- clearSignalsRegistry() {
59
- this.signalsStore.clear();
60
- this.serviceSignalsRegistry.clear();
61
- this.replicators = [];
62
- }
63
- _createSignal(initialValue, id = generateSignalId(), readonly = false) {
64
- const innerSignal = this.createInnerSignal(initialValue, id, readonly);
65
- this.signalsStore.set(innerSignal.id, innerSignal);
66
- innerSignal.subscribe((newValue) => {
67
- this.replicators.forEach((replicator) => replicator(innerSignal.id, newValue, innerSignal.getRevision()));
68
- });
69
- return toPublicSignal(innerSignal);
70
- }
71
- setOrCreateSignal(id, initialValue, readonly = false) {
72
- const existingSignal = this.signalsStore.get(id);
73
- if (existingSignal) {
74
- return toPublicSignal(existingSignal);
75
- }
76
- return this._createSignal(initialValue, id, readonly);
77
- }
78
- createSignal(initialValue, id) {
79
- return this._createSignal(initialValue, id);
80
- }
81
- createComputedSignal(fn, id = generateSignalId()) {
82
- const sig = (0, signals_core_1.computed)(fn);
83
- const signal = {
84
- get: () => sig.value,
85
- peek: () => sig.peek(),
86
- id,
87
- subscribe: (sfn) => sig.subscribe(sfn),
88
- isSignal: true,
89
- };
90
- // a replica of the signal that can be used to subscribe to the computed signal and set the value
91
- const replicaSignal = this.createInnerSignal(sig.peek(), id, true);
92
- this.signalsStore.set(signal.id, replicaSignal);
93
- sig.subscribe((newValue) => {
94
- replicaSignal.set(newValue);
95
- this.replicators.forEach((replicator) => {
96
- try {
97
- replicator(signal.id, newValue, replicaSignal.getRevision());
98
- }
99
- catch (e) {
100
- console.error(`Error replicating signal ${signal.id}`, e);
101
- }
102
- });
103
- });
104
- return signal;
105
- }
106
- getSignalById(id) {
107
- return this.signalsStore.get(id);
108
- }
109
- addReplicator(replicator) {
110
- this.replicators.push(replicator);
111
- }
112
- getServiceSignals(serviceId) {
113
- return this.serviceSignalsRegistry.get(serviceId);
114
- }
115
- setServiceSignals(serviceId, signals) {
116
- this.serviceSignalsRegistry.set(serviceId, signals);
117
- }
118
- }
119
- exports.SignalsRegistry = SignalsRegistry;
120
- const createSignalsRegistry = () => new SignalsRegistry();
121
- exports.createSignalsRegistry = createSignalsRegistry;
@@ -1,2 +0,0 @@
1
- import { SignalsRegistry } from './registry.js';
2
- export declare const createSignalsTransferHandler: (signalsRegistry: SignalsRegistry) => void;