@graphql-box/worker-client 5.4.1 → 5.4.3

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.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@graphql-box/worker-client",
3
3
  "description": "The GraphQL Box web worker client module.",
4
- "version": "5.4.1",
4
+ "version": "5.4.3",
5
5
  "author": "Dylan Aubrey",
6
6
  "license": "MIT",
7
7
  "homepage": "https://github.com/badbatch/graphql-box",
package/src/main.ts CHANGED
@@ -26,6 +26,7 @@ import { logRequest } from './debug/logRequest.ts';
26
26
  import { logSubscription } from './debug/logSubscription.ts';
27
27
  import {
28
28
  type MessageContext,
29
+ type MessageRequestPayload,
29
30
  type MessageResponsePayload,
30
31
  type PendingResolver,
31
32
  type PendingTracker,
@@ -99,8 +100,9 @@ export class WorkerClient {
99
100
  private _debugManager: DebugManagerDef | null;
100
101
  private _eventEmitter: EventEmitter;
101
102
  private _experimentalDeferStreamSupport: boolean;
103
+ private _messageQueue: MessageRequestPayload[] = [];
102
104
  private _pending: PendingTracker = new Map();
103
- private _worker: Worker;
105
+ private _worker: Worker | undefined;
104
106
 
105
107
  constructor(options: UserOptions) {
106
108
  const errors: ArgsError[] = [];
@@ -125,8 +127,21 @@ export class WorkerClient {
125
127
  this._debugManager = options.debugManager ?? null;
126
128
  this._eventEmitter = new EventEmitter();
127
129
  this._experimentalDeferStreamSupport = options.experimentalDeferStreamSupport ?? false;
128
- this._worker = options.worker;
129
- this._addEventListener();
130
+
131
+ if (typeof options.worker === 'function') {
132
+ Promise.resolve(options.worker())
133
+ .then(worker => {
134
+ this._worker = worker;
135
+ this._addEventListener();
136
+ this._releaseMessageQueue();
137
+ })
138
+ .catch((error: unknown) => {
139
+ throw error;
140
+ });
141
+ } else {
142
+ this._worker = options.worker;
143
+ this._addEventListener();
144
+ }
130
145
  }
131
146
 
132
147
  get cache(): CoreWorker {
@@ -150,6 +165,10 @@ export class WorkerClient {
150
165
  }
151
166
 
152
167
  private _addEventListener(): void {
168
+ if (!this._worker) {
169
+ throw new Error('A worker is required for the WorkerClient to work correctly.');
170
+ }
171
+
153
172
  this._worker.addEventListener(MESSAGE, this._onMessage);
154
173
  }
155
174
 
@@ -176,6 +195,16 @@ export class WorkerClient {
176
195
  };
177
196
  }
178
197
 
198
+ private _releaseMessageQueue(): void {
199
+ if (!this._worker) {
200
+ throw new Error('A worker is required for the WorkerClient to work correctly.');
201
+ }
202
+
203
+ for (const message of this._messageQueue) {
204
+ this._worker.postMessage(message);
205
+ }
206
+ }
207
+
179
208
  @logRequest()
180
209
  private async _request(
181
210
  request: string,
@@ -184,13 +213,23 @@ export class WorkerClient {
184
213
  ): Promise<PartialRequestResult | AsyncIterableIterator<PartialRequestResult | undefined>> {
185
214
  try {
186
215
  return await new Promise((resolve: PendingResolver) => {
187
- this._worker.postMessage({
188
- context: WorkerClient._getMessageContext(context),
189
- method: REQUEST,
190
- options,
191
- request,
192
- type: GRAPHQL_BOX,
193
- });
216
+ if (this._worker) {
217
+ this._worker.postMessage({
218
+ context: WorkerClient._getMessageContext(context),
219
+ method: REQUEST,
220
+ options,
221
+ request,
222
+ type: GRAPHQL_BOX,
223
+ });
224
+ } else {
225
+ this._messageQueue.push({
226
+ context: WorkerClient._getMessageContext(context),
227
+ method: REQUEST,
228
+ options,
229
+ request,
230
+ type: GRAPHQL_BOX,
231
+ });
232
+ }
194
233
 
195
234
  this._pending.set(context.requestID, { resolve });
196
235
  });
@@ -210,13 +249,23 @@ export class WorkerClient {
210
249
  context: RequestContext,
211
250
  ): Promise<PartialRequestResult | AsyncIterableIterator<PartialRequestResult | undefined>> {
212
251
  try {
213
- this._worker.postMessage({
214
- context: WorkerClient._getMessageContext(context),
215
- method: SUBSCRIBE,
216
- options,
217
- request,
218
- type: GRAPHQL_BOX,
219
- });
252
+ if (this._worker) {
253
+ this._worker.postMessage({
254
+ context: WorkerClient._getMessageContext(context),
255
+ method: SUBSCRIBE,
256
+ options,
257
+ request,
258
+ type: GRAPHQL_BOX,
259
+ });
260
+ } else {
261
+ this._messageQueue.push({
262
+ context: WorkerClient._getMessageContext(context),
263
+ method: SUBSCRIBE,
264
+ options,
265
+ request,
266
+ type: GRAPHQL_BOX,
267
+ });
268
+ }
220
269
 
221
270
  const eventAsyncIterator = new EventAsyncIterator<PartialRequestResult>(this._eventEmitter, context.requestID);
222
271
  return Promise.resolve(eventAsyncIterator.getIterator());
package/src/types.ts CHANGED
@@ -12,22 +12,19 @@ export interface UserOptions {
12
12
  * The cache.
13
13
  */
14
14
  cache: CoreWorker;
15
-
16
15
  /**
17
16
  * The debug manager.
18
17
  */
19
18
  debugManager?: DebugManagerDef;
20
-
21
19
  /**
22
20
  * Enable support for defer and stream directives. Based on version
23
21
  * of spec in 16.1.0-experimental-stream-defer.6
24
22
  */
25
23
  experimentalDeferStreamSupport?: boolean;
26
-
27
24
  /**
28
25
  * The web worker instance.
29
26
  */
30
- worker: Worker;
27
+ worker: Worker | (() => Worker | Promise<Worker>);
31
28
  }
32
29
 
33
30
  export type MethodNames = 'request' | 'subscribe';