@wix/services-manager 0.2.1 → 0.2.4

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.
@@ -1 +1,4 @@
1
+ import { GetService, ThreadMode } from '@wix/services-definitions';
1
2
  export { defineService, implementService } from '@wix/services-definitions';
3
+ export declare const resolveServiceGetterFromContext: <M extends ThreadMode = ThreadMode.REMOTE>() => GetService<M>;
4
+ export declare const resolveSignalsReadyFromContext: () => Promise<void>;
package/build/helpers.js CHANGED
@@ -1 +1,9 @@
1
+ import { wixContext } from '@wix/sdk-context';
1
2
  export { defineService, implementService } from '@wix/services-definitions';
3
+ export const resolveServiceGetterFromContext = () => wixContext?.getService || globalThis?.__wix_context__?.getService;
4
+ export const resolveSignalsReadyFromContext = () => {
5
+ const awaitRemoteSignals = wixContext?.awaitRemoteSignals ||
6
+ globalThis?.__wix_context__?.awaitRemoteSignals ||
7
+ (() => Promise.resolve());
8
+ return awaitRemoteSignals();
9
+ };
@@ -12,9 +12,10 @@ export type RemoteServicesManager = ServicesManager<ThreadMode.REMOTE> & {
12
12
  signals: any;
13
13
  }[];
14
14
  awaitConnectionFromMain: () => Promise<boolean>;
15
+ enableContext: (context: 'global' | 'module') => RemoteServicesManager;
15
16
  };
16
17
  export type ProxyServiceManager = Comlink.Remote<RemoteServicesManager>;
17
- export declare function createServiceProxy<T extends ServiceDefinition<any, any>>(definition: T, remoteServiceManager: ProxyServiceManager, localServicesManager: ServicesManager): PromisifiedServiceAPI<T>;
18
+ export declare function createServiceProxy<T extends ServiceDefinition<any, any>>(definition: T, remoteServiceManager: ProxyServiceManager | Promise<ProxyServiceManager>, localServicesManager: ServicesManager): PromisifiedServiceAPI<T>;
18
19
  export declare enum SERVICE_MANAGER_MESSAGES {
19
20
  INIT_PORT = "WIX_MESSAGE.SERVICE_MANAGER.INIT_PORT",
20
21
  SIGNAL = "WIX_MESSAGE.SERVICE_MANAGER.SIGNAL",
@@ -8,7 +8,10 @@ export function createServiceProxy(definition, remoteServiceManager, localServic
8
8
  return localServicesManager.getServiceSignals(definition);
9
9
  }
10
10
  return async (...args) => {
11
- let service = remoteServiceManager.getServiceProxy(definition);
11
+ const remoteManager = remoteServiceManager instanceof Promise
12
+ ? await remoteServiceManager
13
+ : remoteServiceManager;
14
+ let service = remoteManager.getServiceProxy(definition);
12
15
  if (!service[prop]) {
13
16
  service = await service;
14
17
  }
@@ -52,24 +55,26 @@ retryOptions: { timeout = 10000, interval = 11000 } = {}, remoteServices = [], a
52
55
  console.warn('setting a low interval might cause a race condition on the response message');
53
56
  }
54
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
+ };
55
75
  if (awaitInitialConnection && typeof window !== 'undefined') {
56
76
  await new Promise((resolve) => {
57
- if (type === 'iframe') {
58
- window.addEventListener('message', (event) => {
59
- if (event.data?.type ===
60
- SERVICE_MANAGER_MESSAGES.READY_FOR_CONNECTION &&
61
- event.source === target) {
62
- resolve();
63
- }
64
- });
65
- }
66
- else {
67
- target.onmessage = (event) => {
68
- if (event.data?.type === SERVICE_MANAGER_MESSAGES.READY_FOR_CONNECTION) {
69
- resolve();
70
- }
71
- };
72
- }
77
+ onReadyFromRemote(resolve);
73
78
  });
74
79
  }
75
80
  return new Promise((resolve, reject) => {
@@ -109,6 +114,7 @@ retryOptions: { timeout = 10000, interval = 11000 } = {}, remoteServices = [], a
109
114
  const remoteServicesManager = createRemoteServicesManager({
110
115
  servicesManager: manager,
111
116
  });
117
+ Comlink.expose(remoteServicesManager, localPort);
112
118
  // sync from main to remote manager when set is from main
113
119
  signalsRegistry.addReplicator((id, value, revision) => {
114
120
  wrappedManager.syncSignal(id, value, revision);
@@ -119,12 +125,15 @@ retryOptions: { timeout = 10000, interval = 11000 } = {}, remoteServices = [], a
119
125
  .forEach(({ serviceId, signals }) => {
120
126
  signalsRegistry.setServiceSignals(serviceId, signals);
121
127
  });
122
- Comlink.expose(remoteServicesManager, localPort);
123
128
  resolve(wrappedManager);
124
129
  }
125
130
  };
126
131
  };
132
+ // first connection
127
133
  triggerConnection();
134
+ // re-establish connection if remote frame is reloaded
135
+ onReadyFromRemote(() => triggerConnection());
136
+ // retries if defined in options
128
137
  const intervalId = setInterval(triggerConnection, interval);
129
138
  const timeoutId = setTimeout(() => {
130
139
  clearInterval(intervalId);
@@ -152,7 +161,12 @@ export function createRemoteServicesManager({ servicesManager, messageFrame, })
152
161
  result = servicesManager.getService(definition, getService, signals || servicesManager.getServiceSignals(definition));
153
162
  }
154
163
  else {
155
- result = createServiceProxy(definition, remoteServiceManager, servicesManager);
164
+ result = createServiceProxy(definition,
165
+ // remoteServiceManager!,
166
+ (async () => {
167
+ await connectedPromise;
168
+ return remoteServiceManager;
169
+ })(), servicesManager);
156
170
  servicesManager.addService(definition, () => result);
157
171
  }
158
172
  if (result) {
@@ -197,6 +211,10 @@ export function createRemoteServicesManager({ servicesManager, messageFrame, })
197
211
  signals: remoteManager.getService(definition).signals,
198
212
  }));
199
213
  },
214
+ enableContext(context) {
215
+ servicesManager.enableContext.bind(this)(context);
216
+ return this;
217
+ },
200
218
  };
201
219
  if (messageFrame) {
202
220
  messageFrame.onmessage = (event) => {
@@ -7,6 +7,6 @@ export declare function createServicesManager<M extends ThreadMode = ThreadMode.
7
7
  }): ServicesManager<M>;
8
8
  export type ServicesRegistrar = {
9
9
  registeredServices: ServiceBinding<any, any>[];
10
- addService<T extends ServiceDefinition<any, any>, Impl extends ServiceFactory<T, any, M>, M extends ThreadMode = any>(definition: T, impl: Impl, config?: ServiceFactoryConfig<Impl, M>): ServicesRegistrar;
10
+ addService<T extends ServiceDefinition<any, any> = any, Impl extends ServiceFactory<T, any, M> = any, M extends ThreadMode = any>(definition: T, impl: Impl, config?: ServiceFactoryConfig<Impl, M>): ServicesRegistrar;
11
11
  };
12
12
  export declare function createServicesMap(registeredServices?: ServiceBinding<any, any>[]): ServicesRegistrar;
@@ -53,19 +53,19 @@ signalsRegistry = createSignalsRegistry(), } = {}) {
53
53
  }
54
54
  },
55
55
  enableContext(context) {
56
+ let resolvedContext = wixContext;
56
57
  if (context === 'global') {
57
- if (globalThis.__wix_context__) {
58
- globalThis.__wix_context__.getService = manager.getService;
58
+ if (!globalThis.__wix_context__) {
59
+ globalThis.__wix_context__ = {};
59
60
  }
60
- else {
61
- globalThis.__wix_context__ = {
62
- getService: manager.getService,
63
- };
64
- }
65
- }
66
- else {
67
- wixContext.getService = manager.getService;
61
+ resolvedContext = globalThis.__wix_context__;
68
62
  }
63
+ resolvedContext.getService = this.getService;
64
+ resolvedContext.awaitRemoteSignals = async () =>
65
+ // remote services manager
66
+ this.awaitConnectionFromMain
67
+ ? this.awaitConnectionFromMain()
68
+ : true;
69
69
  return this;
70
70
  },
71
71
  };
@@ -1 +1,4 @@
1
+ import { GetService, ThreadMode } from '@wix/services-definitions';
1
2
  export { defineService, implementService } from '@wix/services-definitions';
3
+ export declare const resolveServiceGetterFromContext: <M extends ThreadMode = ThreadMode.REMOTE>() => GetService<M>;
4
+ export declare const resolveSignalsReadyFromContext: () => Promise<void>;
@@ -1,6 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.implementService = exports.defineService = void 0;
3
+ exports.resolveSignalsReadyFromContext = exports.resolveServiceGetterFromContext = exports.implementService = exports.defineService = void 0;
4
+ const sdk_context_1 = require("@wix/sdk-context");
4
5
  var services_definitions_1 = require("@wix/services-definitions");
5
6
  Object.defineProperty(exports, "defineService", { enumerable: true, get: function () { return services_definitions_1.defineService; } });
6
7
  Object.defineProperty(exports, "implementService", { enumerable: true, get: function () { return services_definitions_1.implementService; } });
8
+ const resolveServiceGetterFromContext = () => sdk_context_1.wixContext?.getService || globalThis?.__wix_context__?.getService;
9
+ exports.resolveServiceGetterFromContext = resolveServiceGetterFromContext;
10
+ const resolveSignalsReadyFromContext = () => {
11
+ const awaitRemoteSignals = sdk_context_1.wixContext?.awaitRemoteSignals ||
12
+ globalThis?.__wix_context__?.awaitRemoteSignals ||
13
+ (() => Promise.resolve());
14
+ return awaitRemoteSignals();
15
+ };
16
+ exports.resolveSignalsReadyFromContext = resolveSignalsReadyFromContext;
@@ -12,9 +12,10 @@ export type RemoteServicesManager = ServicesManager<ThreadMode.REMOTE> & {
12
12
  signals: any;
13
13
  }[];
14
14
  awaitConnectionFromMain: () => Promise<boolean>;
15
+ enableContext: (context: 'global' | 'module') => RemoteServicesManager;
15
16
  };
16
17
  export type ProxyServiceManager = Comlink.Remote<RemoteServicesManager>;
17
- export declare function createServiceProxy<T extends ServiceDefinition<any, any>>(definition: T, remoteServiceManager: ProxyServiceManager, localServicesManager: ServicesManager): PromisifiedServiceAPI<T>;
18
+ export declare function createServiceProxy<T extends ServiceDefinition<any, any>>(definition: T, remoteServiceManager: ProxyServiceManager | Promise<ProxyServiceManager>, localServicesManager: ServicesManager): PromisifiedServiceAPI<T>;
18
19
  export declare enum SERVICE_MANAGER_MESSAGES {
19
20
  INIT_PORT = "WIX_MESSAGE.SERVICE_MANAGER.INIT_PORT",
20
21
  SIGNAL = "WIX_MESSAGE.SERVICE_MANAGER.SIGNAL",
@@ -48,7 +48,10 @@ function createServiceProxy(definition, remoteServiceManager, localServicesManag
48
48
  return localServicesManager.getServiceSignals(definition);
49
49
  }
50
50
  return async (...args) => {
51
- let service = remoteServiceManager.getServiceProxy(definition);
51
+ const remoteManager = remoteServiceManager instanceof Promise
52
+ ? await remoteServiceManager
53
+ : remoteServiceManager;
54
+ let service = remoteManager.getServiceProxy(definition);
52
55
  if (!service[prop]) {
53
56
  service = await service;
54
57
  }
@@ -92,24 +95,26 @@ retryOptions: { timeout = 10000, interval = 11000 } = {}, remoteServices = [], a
92
95
  console.warn('setting a low interval might cause a race condition on the response message');
93
96
  }
94
97
  const signalsRegistry = manager.getSignalsRegistry();
98
+ const onReadyFromRemote = (callback) => {
99
+ if (type === 'iframe') {
100
+ window.addEventListener('message', (event) => {
101
+ if (event.data?.type === SERVICE_MANAGER_MESSAGES.READY_FOR_CONNECTION &&
102
+ event.source === target) {
103
+ callback();
104
+ }
105
+ });
106
+ }
107
+ else {
108
+ target.onmessage = (event) => {
109
+ if (event.data?.type === SERVICE_MANAGER_MESSAGES.READY_FOR_CONNECTION) {
110
+ callback();
111
+ }
112
+ };
113
+ }
114
+ };
95
115
  if (awaitInitialConnection && typeof window !== 'undefined') {
96
116
  await new Promise((resolve) => {
97
- if (type === 'iframe') {
98
- window.addEventListener('message', (event) => {
99
- if (event.data?.type ===
100
- SERVICE_MANAGER_MESSAGES.READY_FOR_CONNECTION &&
101
- event.source === target) {
102
- resolve();
103
- }
104
- });
105
- }
106
- else {
107
- target.onmessage = (event) => {
108
- if (event.data?.type === SERVICE_MANAGER_MESSAGES.READY_FOR_CONNECTION) {
109
- resolve();
110
- }
111
- };
112
- }
117
+ onReadyFromRemote(resolve);
113
118
  });
114
119
  }
115
120
  return new Promise((resolve, reject) => {
@@ -149,6 +154,7 @@ retryOptions: { timeout = 10000, interval = 11000 } = {}, remoteServices = [], a
149
154
  const remoteServicesManager = createRemoteServicesManager({
150
155
  servicesManager: manager,
151
156
  });
157
+ Comlink.expose(remoteServicesManager, localPort);
152
158
  // sync from main to remote manager when set is from main
153
159
  signalsRegistry.addReplicator((id, value, revision) => {
154
160
  wrappedManager.syncSignal(id, value, revision);
@@ -159,12 +165,15 @@ retryOptions: { timeout = 10000, interval = 11000 } = {}, remoteServices = [], a
159
165
  .forEach(({ serviceId, signals }) => {
160
166
  signalsRegistry.setServiceSignals(serviceId, signals);
161
167
  });
162
- Comlink.expose(remoteServicesManager, localPort);
163
168
  resolve(wrappedManager);
164
169
  }
165
170
  };
166
171
  };
172
+ // first connection
167
173
  triggerConnection();
174
+ // re-establish connection if remote frame is reloaded
175
+ onReadyFromRemote(() => triggerConnection());
176
+ // retries if defined in options
168
177
  const intervalId = setInterval(triggerConnection, interval);
169
178
  const timeoutId = setTimeout(() => {
170
179
  clearInterval(intervalId);
@@ -192,7 +201,12 @@ function createRemoteServicesManager({ servicesManager, messageFrame, }) {
192
201
  result = servicesManager.getService(definition, getService, signals || servicesManager.getServiceSignals(definition));
193
202
  }
194
203
  else {
195
- result = createServiceProxy(definition, remoteServiceManager, servicesManager);
204
+ result = createServiceProxy(definition,
205
+ // remoteServiceManager!,
206
+ (async () => {
207
+ await connectedPromise;
208
+ return remoteServiceManager;
209
+ })(), servicesManager);
196
210
  servicesManager.addService(definition, () => result);
197
211
  }
198
212
  if (result) {
@@ -237,6 +251,10 @@ function createRemoteServicesManager({ servicesManager, messageFrame, }) {
237
251
  signals: remoteManager.getService(definition).signals,
238
252
  }));
239
253
  },
254
+ enableContext(context) {
255
+ servicesManager.enableContext.bind(this)(context);
256
+ return this;
257
+ },
240
258
  };
241
259
  if (messageFrame) {
242
260
  messageFrame.onmessage = (event) => {
@@ -7,6 +7,6 @@ export declare function createServicesManager<M extends ThreadMode = ThreadMode.
7
7
  }): ServicesManager<M>;
8
8
  export type ServicesRegistrar = {
9
9
  registeredServices: ServiceBinding<any, any>[];
10
- addService<T extends ServiceDefinition<any, any>, Impl extends ServiceFactory<T, any, M>, M extends ThreadMode = any>(definition: T, impl: Impl, config?: ServiceFactoryConfig<Impl, M>): ServicesRegistrar;
10
+ addService<T extends ServiceDefinition<any, any> = any, Impl extends ServiceFactory<T, any, M> = any, M extends ThreadMode = any>(definition: T, impl: Impl, config?: ServiceFactoryConfig<Impl, M>): ServicesRegistrar;
11
11
  };
12
12
  export declare function createServicesMap(registeredServices?: ServiceBinding<any, any>[]): ServicesRegistrar;
@@ -59,19 +59,19 @@ signalsRegistry = (0, registry_js_1.createSignalsRegistry)(), } = {}) {
59
59
  }
60
60
  },
61
61
  enableContext(context) {
62
+ let resolvedContext = sdk_context_1.wixContext;
62
63
  if (context === 'global') {
63
- if (globalThis.__wix_context__) {
64
- globalThis.__wix_context__.getService = manager.getService;
64
+ if (!globalThis.__wix_context__) {
65
+ globalThis.__wix_context__ = {};
65
66
  }
66
- else {
67
- globalThis.__wix_context__ = {
68
- getService: manager.getService,
69
- };
70
- }
71
- }
72
- else {
73
- sdk_context_1.wixContext.getService = manager.getService;
67
+ resolvedContext = globalThis.__wix_context__;
74
68
  }
69
+ resolvedContext.getService = this.getService;
70
+ resolvedContext.awaitRemoteSignals = async () =>
71
+ // remote services manager
72
+ this.awaitConnectionFromMain
73
+ ? this.awaitConnectionFromMain()
74
+ : true;
75
75
  return this;
76
76
  },
77
77
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wix/services-manager",
3
- "version": "0.2.1",
3
+ "version": "0.2.4",
4
4
  "type": "module",
5
5
  "main": "./cjs/build/services-manager.js",
6
6
  "exports": {
@@ -90,5 +90,5 @@
90
90
  ]
91
91
  }
92
92
  },
93
- "falconPackageHash": "db299042061f1059d9b8c0e0c5fe7d87b50de29a2430a530afebd384"
93
+ "falconPackageHash": "db3a2d98d49707022d917c5b3cf20b5969b0a32671ac878a22b5a096"
94
94
  }