@graphql-box/worker-client 4.1.5 → 5.0.0
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/README.md +1 -5
- package/dist/cjs/index.cjs +410 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/esm/index.mjs +401 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/types/cjs/constants.d.cts +6 -0
- package/dist/types/cjs/constants.d.cts.map +1 -0
- package/dist/types/cjs/debug/logRequest.d.cts +6 -0
- package/dist/types/cjs/debug/logRequest.d.cts.map +1 -0
- package/dist/types/cjs/debug/logSubscription.d.cts +6 -0
- package/dist/types/cjs/debug/logSubscription.d.cts.map +1 -0
- package/dist/types/cjs/helpers/isGraphqlBoxMessageRequestPayload.d.cts +4 -0
- package/dist/types/cjs/helpers/isGraphqlBoxMessageRequestPayload.d.cts.map +1 -0
- package/dist/types/cjs/helpers/operationNameRegex.d.cts +2 -0
- package/dist/types/cjs/helpers/operationNameRegex.d.cts.map +1 -0
- package/dist/types/cjs/index.d.cts +5 -0
- package/dist/types/cjs/index.d.cts.map +1 -0
- package/dist/types/cjs/main.d.cts +24 -0
- package/dist/types/cjs/main.d.cts.map +1 -0
- package/dist/types/cjs/registerWorker.d.cts +5 -0
- package/dist/types/cjs/registerWorker.d.cts.map +1 -0
- package/dist/types/cjs/types.d.cts +49 -0
- package/dist/types/cjs/types.d.cts.map +1 -0
- package/dist/types/esm/constants.d.ts +6 -0
- package/dist/types/esm/constants.d.ts.map +1 -0
- package/dist/types/esm/debug/logRequest.d.ts +6 -0
- package/dist/types/esm/debug/logRequest.d.ts.map +1 -0
- package/dist/types/esm/debug/logSubscription.d.ts +6 -0
- package/dist/types/esm/debug/logSubscription.d.ts.map +1 -0
- package/dist/types/esm/helpers/isGraphqlBoxMessageRequestPayload.d.ts +4 -0
- package/dist/types/esm/helpers/isGraphqlBoxMessageRequestPayload.d.ts.map +1 -0
- package/dist/types/esm/helpers/operationNameRegex.d.ts +2 -0
- package/dist/types/esm/helpers/operationNameRegex.d.ts.map +1 -0
- package/dist/types/esm/index.d.ts +5 -0
- package/dist/types/esm/index.d.ts.map +1 -0
- package/dist/types/esm/main.d.ts +24 -0
- package/dist/types/esm/main.d.ts.map +1 -0
- package/dist/types/esm/registerWorker.d.ts +5 -0
- package/dist/types/esm/registerWorker.d.ts.map +1 -0
- package/{lib/types/defs/index.d.ts → dist/types/esm/types.d.ts} +11 -11
- package/dist/types/esm/types.d.ts.map +1 -0
- package/dist/types/tsconfig.build.tsbuildinfo +1 -0
- package/package.json +57 -45
- package/src/constants.ts +5 -0
- package/src/debug/{log-request/index.ts → logRequest.ts} +30 -20
- package/src/debug/logSubscription.ts +50 -0
- package/src/helpers/isGraphqlBoxMessageRequestPayload.ts +7 -0
- package/src/helpers/operationNameRegex.test.ts +26 -14
- package/src/helpers/operationNameRegex.ts +2 -2
- package/src/index.ts +4 -3
- package/src/{main/index.ts → main.ts} +135 -108
- package/src/registerWorker.ts +107 -0
- package/src/{defs/index.ts → types.ts} +14 -9
- package/tsconfig.build.json +10 -0
- package/tsconfig.json +17 -0
- package/lib/browser/index.js +0 -2
- package/lib/browser/index.js.map +0 -1
- package/lib/browser/production.analysis.txt +0 -81
- package/lib/main/consts/index.js +0 -17
- package/lib/main/consts/index.js.map +0 -1
- package/lib/main/debug/log-request/index.js +0 -77
- package/lib/main/debug/log-request/index.js.map +0 -1
- package/lib/main/debug/log-subscription/index.js +0 -55
- package/lib/main/debug/log-subscription/index.js.map +0 -1
- package/lib/main/defs/index.js +0 -2
- package/lib/main/defs/index.js.map +0 -1
- package/lib/main/helpers/operationNameRegex.js +0 -14
- package/lib/main/helpers/operationNameRegex.js.map +0 -1
- package/lib/main/index.js +0 -41
- package/lib/main/index.js.map +0 -1
- package/lib/main/main/index.js +0 -249
- package/lib/main/main/index.js.map +0 -1
- package/lib/main/register-worker/index.js +0 -143
- package/lib/main/register-worker/index.js.map +0 -1
- package/lib/module/consts/index.js +0 -6
- package/lib/module/consts/index.js.map +0 -1
- package/lib/module/debug/log-request/index.js +0 -64
- package/lib/module/debug/log-request/index.js.map +0 -1
- package/lib/module/debug/log-subscription/index.js +0 -43
- package/lib/module/debug/log-subscription/index.js.map +0 -1
- package/lib/module/defs/index.js +0 -2
- package/lib/module/defs/index.js.map +0 -1
- package/lib/module/helpers/operationNameRegex.js +0 -5
- package/lib/module/helpers/operationNameRegex.js.map +0 -1
- package/lib/module/index.js +0 -4
- package/lib/module/index.js.map +0 -1
- package/lib/module/main/index.js +0 -236
- package/lib/module/main/index.js.map +0 -1
- package/lib/module/register-worker/index.js +0 -126
- package/lib/module/register-worker/index.js.map +0 -1
- package/lib/types/consts/index.d.ts +0 -6
- package/lib/types/consts/index.d.ts.map +0 -1
- package/lib/types/debug/log-request/index.d.ts +0 -2
- package/lib/types/debug/log-request/index.d.ts.map +0 -1
- package/lib/types/debug/log-subscription/index.d.ts +0 -2
- package/lib/types/debug/log-subscription/index.d.ts.map +0 -1
- package/lib/types/defs/index.d.ts.map +0 -1
- package/lib/types/helpers/operationNameRegex.d.ts +0 -3
- package/lib/types/helpers/operationNameRegex.d.ts.map +0 -1
- package/lib/types/helpers/operationNameRegex.test.d.ts +0 -2
- package/lib/types/helpers/operationNameRegex.test.d.ts.map +0 -1
- package/lib/types/index.d.ts +0 -4
- package/lib/types/index.d.ts.map +0 -1
- package/lib/types/main/index.d.ts +0 -32
- package/lib/types/main/index.d.ts.map +0 -1
- package/lib/types/register-worker/index.d.ts +0 -5
- package/lib/types/register-worker/index.d.ts.map +0 -1
- package/src/consts/index.ts +0 -7
- package/src/debug/log-subscription/index.ts +0 -41
- package/src/register-worker/index.ts +0 -95
|
@@ -1,32 +1,101 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { type CoreWorker } from '@cachemap/core-worker';
|
|
2
2
|
import {
|
|
3
|
-
DebugManagerDef,
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
MaybeRequestResult,
|
|
7
|
-
QUERY,
|
|
3
|
+
type DebugManagerDef,
|
|
4
|
+
type PartialRequestContext,
|
|
5
|
+
type PartialRequestResult,
|
|
8
6
|
REQUEST_RESOLVED,
|
|
9
|
-
RequestContext,
|
|
10
|
-
RequestOptions,
|
|
11
|
-
SUBSCRIPTION,
|
|
7
|
+
type RequestContext,
|
|
8
|
+
type RequestOptions,
|
|
12
9
|
SUBSCRIPTION_RESOLVED,
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
10
|
+
} from '@graphql-box/core';
|
|
11
|
+
import {
|
|
12
|
+
ArgsError,
|
|
13
|
+
EventAsyncIterator,
|
|
14
|
+
GroupedError,
|
|
15
|
+
deserializeErrors,
|
|
16
|
+
hashRequest,
|
|
17
|
+
isPlainObject,
|
|
18
|
+
rehydrateCacheMetadata,
|
|
19
|
+
} from '@graphql-box/helpers';
|
|
20
|
+
import { EventEmitter } from 'eventemitter3';
|
|
21
|
+
import { OperationTypeNode } from 'graphql';
|
|
22
|
+
import { isError } from 'lodash-es';
|
|
23
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
24
|
+
import { GRAPHQL_BOX, MESSAGE, REQUEST, SUBSCRIBE } from './constants.ts';
|
|
25
|
+
import { logRequest } from './debug/logRequest.ts';
|
|
26
|
+
import { logSubscription } from './debug/logSubscription.ts';
|
|
27
|
+
import {
|
|
28
|
+
type MessageContext,
|
|
29
|
+
type MessageResponsePayload,
|
|
30
|
+
type PendingResolver,
|
|
31
|
+
type PendingTracker,
|
|
32
|
+
type UserOptions,
|
|
33
|
+
} from './types.ts';
|
|
34
|
+
|
|
35
|
+
export class WorkerClient {
|
|
25
36
|
private static _getMessageContext({ hasDeferOrStream = false, requestID }: RequestContext): MessageContext {
|
|
26
37
|
return { hasDeferOrStream, requestID };
|
|
27
38
|
}
|
|
28
39
|
|
|
29
|
-
private
|
|
40
|
+
private _onMessage = ({ data }: MessageEvent<MessageResponsePayload>): void => {
|
|
41
|
+
if (!isPlainObject(data)) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const { context, method, result, type } = data;
|
|
46
|
+
|
|
47
|
+
if (type !== GRAPHQL_BOX) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const { _cacheMetadata, ...otherProps } = result;
|
|
52
|
+
const response: PartialRequestResult = { ...deserializeErrors(otherProps), requestID: context.requestID };
|
|
53
|
+
|
|
54
|
+
if (_cacheMetadata) {
|
|
55
|
+
response._cacheMetadata = rehydrateCacheMetadata(_cacheMetadata);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (method === SUBSCRIBE) {
|
|
59
|
+
this._debugManager?.log(SUBSCRIPTION_RESOLVED, {
|
|
60
|
+
context,
|
|
61
|
+
result: response,
|
|
62
|
+
stats: { endTime: this._debugManager.now() },
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
this._eventEmitter.emit(context.requestID, response);
|
|
66
|
+
} else if (context.hasDeferOrStream) {
|
|
67
|
+
const pending = this._pending.get(context.requestID);
|
|
68
|
+
|
|
69
|
+
if (pending) {
|
|
70
|
+
const eventAsyncIterator = new EventAsyncIterator<PartialRequestResult>(this._eventEmitter, context.requestID);
|
|
71
|
+
pending.resolve(eventAsyncIterator.getIterator());
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
this._debugManager?.log(REQUEST_RESOLVED, {
|
|
75
|
+
context,
|
|
76
|
+
result: response,
|
|
77
|
+
stats: { endTime: this._debugManager.now() },
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
this._eventEmitter.emit(context.requestID, response);
|
|
81
|
+
} else {
|
|
82
|
+
const pending = this._pending.get(context.requestID);
|
|
83
|
+
|
|
84
|
+
if (!pending) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
this._debugManager?.log(REQUEST_RESOLVED, {
|
|
89
|
+
context,
|
|
90
|
+
result: response,
|
|
91
|
+
stats: { endTime: this._debugManager.now() },
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
pending.resolve(response);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
private _cache: CoreWorker;
|
|
30
99
|
private _debugManager: DebugManagerDef | null;
|
|
31
100
|
private _eventEmitter: EventEmitter;
|
|
32
101
|
private _experimentalDeferStreamSupport: boolean;
|
|
@@ -34,22 +103,22 @@ export default class WorkerClient {
|
|
|
34
103
|
private _worker: Worker;
|
|
35
104
|
|
|
36
105
|
constructor(options: UserOptions) {
|
|
37
|
-
const errors:
|
|
106
|
+
const errors: ArgsError[] = [];
|
|
38
107
|
|
|
39
108
|
if (!isPlainObject(options)) {
|
|
40
|
-
errors.push(new
|
|
109
|
+
errors.push(new ArgsError('@graphql-box/worker-client expected options to ba a plain object.'));
|
|
41
110
|
}
|
|
42
111
|
|
|
43
|
-
if (!options
|
|
44
|
-
errors.push(new
|
|
112
|
+
if (!('cache' in options)) {
|
|
113
|
+
errors.push(new ArgsError('@graphql-box/worker-client expected options.cache.'));
|
|
45
114
|
}
|
|
46
115
|
|
|
47
|
-
if (!options
|
|
48
|
-
errors.push(new
|
|
116
|
+
if (!('worker' in options)) {
|
|
117
|
+
errors.push(new ArgsError('@graphql-box/worker-client expected options.worker.'));
|
|
49
118
|
}
|
|
50
119
|
|
|
51
|
-
if (errors.length) {
|
|
52
|
-
throw errors;
|
|
120
|
+
if (errors.length > 0) {
|
|
121
|
+
throw new GroupedError('@graphql-box/worker-client argument validation errors.', errors);
|
|
53
122
|
}
|
|
54
123
|
|
|
55
124
|
this._cache = options.cache;
|
|
@@ -60,24 +129,24 @@ export default class WorkerClient {
|
|
|
60
129
|
this._addEventListener();
|
|
61
130
|
}
|
|
62
131
|
|
|
63
|
-
get cache():
|
|
132
|
+
get cache(): CoreWorker {
|
|
64
133
|
return this._cache;
|
|
65
134
|
}
|
|
66
135
|
|
|
67
|
-
public async mutate(request: string, options: RequestOptions = {}, context:
|
|
68
|
-
return this._request(request, options, this._getRequestContext(MUTATION, request, context));
|
|
136
|
+
public async mutate(request: string, options: RequestOptions = {}, context: PartialRequestContext = {}) {
|
|
137
|
+
return this._request(request, options, this._getRequestContext(OperationTypeNode.MUTATION, request, context));
|
|
69
138
|
}
|
|
70
139
|
|
|
71
|
-
public async query(request: string, options: RequestOptions = {}, context:
|
|
72
|
-
return this._request(request, options, this._getRequestContext(QUERY, request, context));
|
|
140
|
+
public async query(request: string, options: RequestOptions = {}, context: PartialRequestContext = {}) {
|
|
141
|
+
return this._request(request, options, this._getRequestContext(OperationTypeNode.QUERY, request, context));
|
|
73
142
|
}
|
|
74
143
|
|
|
75
|
-
public async request(request: string, options: RequestOptions = {}, context:
|
|
76
|
-
return this._request(request, options, this._getRequestContext(QUERY, request, context));
|
|
144
|
+
public async request(request: string, options: RequestOptions = {}, context: PartialRequestContext = {}) {
|
|
145
|
+
return this._request(request, options, this._getRequestContext(OperationTypeNode.QUERY, request, context));
|
|
77
146
|
}
|
|
78
147
|
|
|
79
148
|
public async subscribe(request: string, options: RequestOptions = {}) {
|
|
80
|
-
return this._subscribe(request, options, this._getRequestContext(SUBSCRIPTION, request));
|
|
149
|
+
return this._subscribe(request, options, this._getRequestContext(OperationTypeNode.SUBSCRIPTION, request));
|
|
81
150
|
}
|
|
82
151
|
|
|
83
152
|
private _addEventListener(): void {
|
|
@@ -85,88 +154,34 @@ export default class WorkerClient {
|
|
|
85
154
|
}
|
|
86
155
|
|
|
87
156
|
private _getRequestContext(
|
|
88
|
-
operation:
|
|
157
|
+
operation: OperationTypeNode,
|
|
89
158
|
request: string,
|
|
90
|
-
context:
|
|
159
|
+
context: PartialRequestContext = {}
|
|
91
160
|
): RequestContext {
|
|
92
161
|
return {
|
|
93
162
|
debugManager: this._debugManager,
|
|
94
163
|
experimentalDeferStreamSupport: this._experimentalDeferStreamSupport,
|
|
95
164
|
fieldTypeMap: new Map(),
|
|
96
|
-
filteredRequest:
|
|
165
|
+
filteredRequest: '',
|
|
97
166
|
operation,
|
|
98
|
-
operationName:
|
|
167
|
+
operationName: '',
|
|
99
168
|
originalRequestHash: hashRequest(request),
|
|
100
|
-
parsedRequest:
|
|
169
|
+
parsedRequest: '',
|
|
101
170
|
queryFiltered: false,
|
|
102
171
|
request,
|
|
103
172
|
requestComplexity: null,
|
|
104
173
|
requestDepth: null,
|
|
105
|
-
requestID:
|
|
174
|
+
requestID: uuidv4(),
|
|
106
175
|
...context,
|
|
107
176
|
};
|
|
108
177
|
}
|
|
109
178
|
|
|
110
|
-
private _onMessage = async ({ data }: MessageEvent): Promise<void> => {
|
|
111
|
-
if (!isPlainObject(data)) {
|
|
112
|
-
return;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
const { context, method, result, type } = data as MessageResponsePayload;
|
|
116
|
-
|
|
117
|
-
if (type !== GRAPHQL_BOX || !isPlainObject(result)) {
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
const { _cacheMetadata, ...otherProps } = result;
|
|
122
|
-
const response: MaybeRequestResult = deserializeErrors({ ...otherProps, requestID: context.requestID });
|
|
123
|
-
|
|
124
|
-
if (_cacheMetadata) {
|
|
125
|
-
response._cacheMetadata = rehydrateCacheMetadata(_cacheMetadata);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
if (method === SUBSCRIBE) {
|
|
129
|
-
this._debugManager?.log(SUBSCRIPTION_RESOLVED, {
|
|
130
|
-
context,
|
|
131
|
-
result: response,
|
|
132
|
-
stats: { endTime: this._debugManager?.now() },
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
this._eventEmitter.emit(context.requestID, response);
|
|
136
|
-
} else if (context.hasDeferOrStream) {
|
|
137
|
-
const pending = this._pending.get(context.requestID);
|
|
138
|
-
|
|
139
|
-
if (pending) {
|
|
140
|
-
const eventAsyncIterator = new EventAsyncIterator<MaybeRequestResult>(this._eventEmitter, context.requestID);
|
|
141
|
-
pending.resolve(eventAsyncIterator.getIterator());
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
this._debugManager?.log(REQUEST_RESOLVED, {
|
|
145
|
-
context,
|
|
146
|
-
result: response,
|
|
147
|
-
stats: { endTime: this._debugManager?.now() },
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
this._eventEmitter.emit(context.requestID, response);
|
|
151
|
-
} else {
|
|
152
|
-
const pending = this._pending.get(context.requestID);
|
|
153
|
-
|
|
154
|
-
if (!pending) {
|
|
155
|
-
return;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
this._debugManager?.log(REQUEST_RESOLVED, {
|
|
159
|
-
context,
|
|
160
|
-
result: response,
|
|
161
|
-
stats: { endTime: this._debugManager?.now() },
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
pending.resolve(response);
|
|
165
|
-
}
|
|
166
|
-
};
|
|
167
|
-
|
|
168
179
|
@logRequest()
|
|
169
|
-
private async _request(
|
|
180
|
+
private async _request(
|
|
181
|
+
request: string,
|
|
182
|
+
options: RequestOptions,
|
|
183
|
+
context: RequestContext
|
|
184
|
+
): Promise<PartialRequestResult | AsyncIterableIterator<PartialRequestResult | undefined>> {
|
|
170
185
|
try {
|
|
171
186
|
return await new Promise((resolve: PendingResolver) => {
|
|
172
187
|
this._worker.postMessage({
|
|
@@ -180,12 +195,20 @@ export default class WorkerClient {
|
|
|
180
195
|
this._pending.set(context.requestID, { resolve });
|
|
181
196
|
});
|
|
182
197
|
} catch (error) {
|
|
183
|
-
|
|
198
|
+
const confirmedError = isError(error)
|
|
199
|
+
? error
|
|
200
|
+
: new Error('@graphql-box/worker-client request had an unexpected error.');
|
|
201
|
+
|
|
202
|
+
return { errors: [confirmedError], requestID: context.requestID };
|
|
184
203
|
}
|
|
185
204
|
}
|
|
186
205
|
|
|
187
206
|
@logSubscription()
|
|
188
|
-
private
|
|
207
|
+
private _subscribe(
|
|
208
|
+
request: string,
|
|
209
|
+
options: RequestOptions,
|
|
210
|
+
context: RequestContext
|
|
211
|
+
): Promise<PartialRequestResult | AsyncIterableIterator<PartialRequestResult | undefined>> {
|
|
189
212
|
try {
|
|
190
213
|
this._worker.postMessage({
|
|
191
214
|
context: WorkerClient._getMessageContext(context),
|
|
@@ -195,10 +218,14 @@ export default class WorkerClient {
|
|
|
195
218
|
type: GRAPHQL_BOX,
|
|
196
219
|
});
|
|
197
220
|
|
|
198
|
-
const eventAsyncIterator = new EventAsyncIterator<
|
|
199
|
-
return eventAsyncIterator.getIterator();
|
|
221
|
+
const eventAsyncIterator = new EventAsyncIterator<PartialRequestResult>(this._eventEmitter, context.requestID);
|
|
222
|
+
return Promise.resolve(eventAsyncIterator.getIterator());
|
|
200
223
|
} catch (error) {
|
|
201
|
-
|
|
224
|
+
const confirmedError = isError(error)
|
|
225
|
+
? error
|
|
226
|
+
: new Error('@graphql-box/worker-client subscribe had an unexpected error.');
|
|
227
|
+
|
|
228
|
+
return Promise.resolve({ errors: [confirmedError], requestID: context.requestID });
|
|
202
229
|
}
|
|
203
230
|
}
|
|
204
231
|
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type PostMessage as CachemapMessageRequestPayload,
|
|
3
|
+
handleMessage as handleCachemapMessage,
|
|
4
|
+
} from '@cachemap/core-worker';
|
|
5
|
+
import { type Client } from '@graphql-box/client';
|
|
6
|
+
import {
|
|
7
|
+
type PartialRequestResult,
|
|
8
|
+
type PartialRequestResultWithDehydratedCacheMetadata,
|
|
9
|
+
type RequestOptions,
|
|
10
|
+
} from '@graphql-box/core';
|
|
11
|
+
import { dehydrateCacheMetadata, serializeErrors } from '@graphql-box/helpers';
|
|
12
|
+
import { forAwaitEach, isAsyncIterable } from 'iterall';
|
|
13
|
+
import { GRAPHQL_BOX, MESSAGE, REQUEST } from './constants.ts';
|
|
14
|
+
import { isGraphqlBoxMessageRequestPayload } from './helpers/isGraphqlBoxMessageRequestPayload.ts';
|
|
15
|
+
import {
|
|
16
|
+
type MessageContext,
|
|
17
|
+
type MessageRequestPayload,
|
|
18
|
+
type MethodNames,
|
|
19
|
+
type RegisterWorkerOptions,
|
|
20
|
+
} from './types.ts';
|
|
21
|
+
|
|
22
|
+
const globalScope = self as unknown as DedicatedWorkerGlobalScope;
|
|
23
|
+
|
|
24
|
+
const handleRequest = async (
|
|
25
|
+
request: string,
|
|
26
|
+
method: MethodNames,
|
|
27
|
+
options: RequestOptions,
|
|
28
|
+
context: MessageContext,
|
|
29
|
+
client: Client
|
|
30
|
+
): Promise<void> => {
|
|
31
|
+
const requestResult = await client.request(request, options, context);
|
|
32
|
+
|
|
33
|
+
if (!isAsyncIterable(requestResult)) {
|
|
34
|
+
const { _cacheMetadata, ...otherProps } = requestResult as PartialRequestResult;
|
|
35
|
+
const result: PartialRequestResultWithDehydratedCacheMetadata = { ...otherProps };
|
|
36
|
+
|
|
37
|
+
if (_cacheMetadata) {
|
|
38
|
+
result._cacheMetadata = dehydrateCacheMetadata(_cacheMetadata);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
globalScope.postMessage({ context, method, result: serializeErrors(result), type: GRAPHQL_BOX });
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
void forAwaitEach(requestResult, ({ _cacheMetadata, ...otherProps }: PartialRequestResult) => {
|
|
46
|
+
const result: PartialRequestResultWithDehydratedCacheMetadata = { ...otherProps };
|
|
47
|
+
|
|
48
|
+
if (_cacheMetadata) {
|
|
49
|
+
result._cacheMetadata = dehydrateCacheMetadata(_cacheMetadata);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
globalScope.postMessage({ context, method, result: serializeErrors(result), type: GRAPHQL_BOX });
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const handleSubscription = async (
|
|
57
|
+
request: string,
|
|
58
|
+
method: MethodNames,
|
|
59
|
+
options: RequestOptions,
|
|
60
|
+
context: MessageContext,
|
|
61
|
+
client: Client
|
|
62
|
+
): Promise<void> => {
|
|
63
|
+
const subscribeResult = await client.subscribe(request, options, context);
|
|
64
|
+
|
|
65
|
+
if (!isAsyncIterable(subscribeResult)) {
|
|
66
|
+
globalScope.postMessage({
|
|
67
|
+
context,
|
|
68
|
+
method,
|
|
69
|
+
result: serializeErrors(subscribeResult as PartialRequestResult),
|
|
70
|
+
type: GRAPHQL_BOX,
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
void forAwaitEach(subscribeResult, ({ _cacheMetadata, ...otherProps }: PartialRequestResult) => {
|
|
77
|
+
const result: PartialRequestResultWithDehydratedCacheMetadata = { ...otherProps };
|
|
78
|
+
|
|
79
|
+
if (_cacheMetadata) {
|
|
80
|
+
result._cacheMetadata = dehydrateCacheMetadata(_cacheMetadata);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
globalScope.postMessage({ context, method, result: serializeErrors(result), type: GRAPHQL_BOX });
|
|
84
|
+
});
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export const handleMessage = (data: MessageRequestPayload, client: Client): void => {
|
|
88
|
+
const { context, method, options, request } = data;
|
|
89
|
+
|
|
90
|
+
if (method === REQUEST) {
|
|
91
|
+
void handleRequest(request, method, options, context, client);
|
|
92
|
+
} else {
|
|
93
|
+
void handleSubscription(request, method, options, context, client);
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
export const registerWorker = ({ client }: RegisterWorkerOptions): void => {
|
|
98
|
+
const onMessage = ({ data }: MessageEvent<MessageRequestPayload | CachemapMessageRequestPayload>): void => {
|
|
99
|
+
if (isGraphqlBoxMessageRequestPayload(data)) {
|
|
100
|
+
handleMessage(data, client);
|
|
101
|
+
} else {
|
|
102
|
+
void handleCachemapMessage(data, client.cache);
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
globalScope.addEventListener(MESSAGE, onMessage);
|
|
107
|
+
};
|
|
@@ -1,12 +1,17 @@
|
|
|
1
|
-
import
|
|
2
|
-
import Client from
|
|
3
|
-
import {
|
|
1
|
+
import { type CoreWorker } from '@cachemap/core-worker';
|
|
2
|
+
import { type Client } from '@graphql-box/client';
|
|
3
|
+
import {
|
|
4
|
+
type DebugManagerDef,
|
|
5
|
+
type PartialRawFetchData,
|
|
6
|
+
type PartialRequestResult,
|
|
7
|
+
type RequestOptions,
|
|
8
|
+
} from '@graphql-box/core';
|
|
4
9
|
|
|
5
10
|
export interface UserOptions {
|
|
6
11
|
/**
|
|
7
12
|
* The cache.
|
|
8
13
|
*/
|
|
9
|
-
cache:
|
|
14
|
+
cache: CoreWorker;
|
|
10
15
|
|
|
11
16
|
/**
|
|
12
17
|
* The debug manager.
|
|
@@ -25,10 +30,10 @@ export interface UserOptions {
|
|
|
25
30
|
worker: Worker;
|
|
26
31
|
}
|
|
27
32
|
|
|
28
|
-
export type MethodNames =
|
|
33
|
+
export type MethodNames = 'request' | 'subscribe';
|
|
29
34
|
|
|
30
35
|
export type PendingResolver = (
|
|
31
|
-
value:
|
|
36
|
+
value: PartialRequestResult | AsyncIterableIterator<PartialRequestResult | undefined>
|
|
32
37
|
) => void;
|
|
33
38
|
|
|
34
39
|
export interface PendingData {
|
|
@@ -42,14 +47,14 @@ export interface MessageRequestPayload {
|
|
|
42
47
|
method: MethodNames;
|
|
43
48
|
options: RequestOptions;
|
|
44
49
|
request: string;
|
|
45
|
-
type:
|
|
50
|
+
type: 'graphqlBox' | 'cachemap';
|
|
46
51
|
}
|
|
47
52
|
|
|
48
53
|
export interface MessageResponsePayload {
|
|
49
54
|
context: MessageContext;
|
|
50
55
|
method: MethodNames;
|
|
51
|
-
result:
|
|
52
|
-
type:
|
|
56
|
+
result: PartialRawFetchData;
|
|
57
|
+
type: 'graphqlBox' | 'cachemap';
|
|
53
58
|
}
|
|
54
59
|
|
|
55
60
|
export interface MessageContext {
|
package/tsconfig.json
ADDED
package/lib/browser/index.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import"core-js/modules/es.object.keys.js";import"core-js/modules/es.symbol.js";import"core-js/modules/es.array.filter.js";import"core-js/modules/web.dom-collections.for-each.js";import"core-js/modules/es.object.get-own-property-descriptors.js";import e from"@babel/runtime/helpers/objectWithoutProperties";import t from"@babel/runtime/helpers/asyncToGenerator";import r from"@babel/runtime/helpers/classCallCheck";import n from"@babel/runtime/helpers/createClass";import o from"@babel/runtime/helpers/defineProperty";import a from"@babel/runtime/helpers/applyDecoratedDescriptor";import s from"lodash/isPlainObject";import u from"lodash/castArray";import c from"@babel/runtime/regenerator";import"core-js/modules/es.array.iterator.js";import"core-js/modules/es.map.js";import"core-js/modules/es.object.to-string.js";import"core-js/modules/es.string.iterator.js";import"core-js/modules/web.dom-collections.iterator.js";import"core-js/modules/es.promise.js";import"core-js/modules/es.object.get-own-property-descriptor.js";import{REQUEST_RESOLVED as i,REQUEST_EXECUTED as p,SUBSCRIPTION_EXECUTED as l,MUTATION as f,QUERY as h,SUBSCRIPTION as b,SUBSCRIPTION_RESOLVED as m}from"@graphql-box/core";import{hashRequest as d,EventAsyncIterator as g,deserializeErrors as v,rehydrateCacheMetadata as y,dehydrateCacheMetadata as w,serializeErrors as x}from"@graphql-box/helpers";import j from"eventemitter3";import{v1 as O}from"uuid";import{isAsyncIterable as _,forAwaitEach as q}from"iterall";import"core-js/modules/es.regexp.exec.js";import{handleMessage as k}from"@cachemap/core-worker";var P,D,M,E=function(e){var t=/(query|mutation|subscription) ([A-Za-z]+)(\(| {)/.exec(e);return t?t[2]:""};function S(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function I(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?S(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):S(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function C(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function T(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?C(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):C(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function B(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function R(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?B(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):B(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}var A=(P=function(r,n,o){var a,s=o.value;s&&(o.value=(a=t(c.mark((function r(){var n,o,a,u=this,l=arguments;return c.wrap((function(r){for(;;)switch(r.prev=r.next){case 0:for(n=l.length,o=new Array(n),a=0;a<n;a++)o[a]=l[a];return r.prev=1,r.abrupt("return",new Promise(function(){var r=t(c.mark((function t(r){var n,a,l,f,h,b,m,d;return c.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(n=o[2],a=n.debugManager,l=e(n,["debugManager"]),a){t.next=8;break}return t.t0=r,t.next=5,s.apply(u,o);case 5:return t.t1=t.sent,(0,t.t0)(t.t1),t.abrupt("return");case 8:return f=E(o[0]),h=a.now(),a.log(p,{context:I(I({},l),{},{operationName:f}),options:o[1],request:o[0],stats:{startTime:h}}),t.next=13,s.apply(u,o);case 13:if(b=t.sent,m=a.now(),d=m-h,r(b),!_(b)){t.next=19;break}return t.abrupt("return");case 19:a.log(i,{context:I(I({},l),{},{operationName:f}),options:o[1],request:o[0],result:b,stats:{duration:d,endTime:m,startTime:h}});case 20:case"end":return t.stop()}}),t)})));return function(e){return r.apply(this,arguments)}}()));case 5:return r.prev=5,r.t0=r.catch(1),r.abrupt("return",Promise.reject(r.t0));case 8:case"end":return r.stop()}}),r,null,[[1,5]])}))),function(){return a.apply(this,arguments)}))},D=function(r,n,o){var a,s=o.value;s&&(o.value=(a=t(c.mark((function r(){var n,o,a,u=this,i=arguments;return c.wrap((function(r){for(;;)switch(r.prev=r.next){case 0:for(n=i.length,o=new Array(n),a=0;a<n;a++)o[a]=i[a];return r.prev=1,r.abrupt("return",new Promise(function(){var r=t(c.mark((function t(r){var n,a,i,p,f,h;return c.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(n=o[2],a=n.debugManager,i=e(n,["debugManager"]),a){t.next=8;break}return t.t0=r,t.next=5,s.apply(u,o);case 5:return t.t1=t.sent,(0,t.t0)(t.t1),t.abrupt("return");case 8:return p=E(o[0]),f=a.now(),a.log(l,{context:T(T({},i),{},{operationName:p}),options:o[1],request:o[0],stats:{startTime:f}}),t.next=13,s.apply(u,o);case 13:h=t.sent,r(h);case 15:case"end":return t.stop()}}),t)})));return function(e){return r.apply(this,arguments)}}()));case 5:return r.prev=5,r.t0=r.catch(1),r.abrupt("return",Promise.reject(r.t0));case 8:case"end":return r.stop()}}),r,null,[[1,5]])}))),function(){return a.apply(this,arguments)}))},a((M=function(){function a(n){var u,p,l,f=this;r(this,a),o(this,"_cache",void 0),o(this,"_debugManager",void 0),o(this,"_eventEmitter",void 0),o(this,"_experimentalDeferStreamSupport",void 0),o(this,"_pending",new Map),o(this,"_worker",void 0),o(this,"_onMessage",(l=t(c.mark((function t(r){var n,o,a,u,p,l,h,b,d,w,x,j,O,_,q,k,P;return c.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(n=r.data,s(n)){t.next=3;break}return t.abrupt("return");case 3:if(a=(o=n).context,u=o.method,p=o.result,"graphqlBox"===o.type&&s(p)){t.next=6;break}return t.abrupt("return");case 6:if(l=p._cacheMetadata,h=e(p,["_cacheMetadata"]),b=v(R(R({},h),{},{requestID:a.requestID})),l&&(b._cacheMetadata=y(l)),"subscribe"!==u){t.next=14;break}null===(d=f._debugManager)||void 0===d||d.log(m,{context:a,result:b,stats:{endTime:null===(w=f._debugManager)||void 0===w?void 0:w.now()}}),f._eventEmitter.emit(a.requestID,b),t.next=26;break;case 14:if(!a.hasDeferOrStream){t.next=21;break}(O=f._pending.get(a.requestID))&&(_=new g(f._eventEmitter,a.requestID),O.resolve(_.getIterator())),null===(x=f._debugManager)||void 0===x||x.log(i,{context:a,result:b,stats:{endTime:null===(j=f._debugManager)||void 0===j?void 0:j.now()}}),f._eventEmitter.emit(a.requestID,b),t.next=26;break;case 21:if(P=f._pending.get(a.requestID)){t.next=24;break}return t.abrupt("return");case 24:null===(q=f._debugManager)||void 0===q||q.log(i,{context:a,result:b,stats:{endTime:null===(k=f._debugManager)||void 0===k?void 0:k.now()}}),P.resolve(b);case 26:case"end":return t.stop()}}),t)}))),function(e){return l.apply(this,arguments)}));var h=[];if(s(n)||h.push(new TypeError("@graphql-box/client expected options to ba a plain object.")),n.cache||h.push(new TypeError("@graphql-box/client expected options.cache.")),n.worker||h.push(new TypeError("@graphql-box/client expected options.worker.")),h.length)throw h;this._cache=n.cache,this._debugManager=null!==(u=n.debugManager)&&void 0!==u?u:null,this._eventEmitter=new j,this._experimentalDeferStreamSupport=null!==(p=n.experimentalDeferStreamSupport)&&void 0!==p&&p,this._worker=n.worker,this._addEventListener()}var p,l,w,x,_,q;return n(a,[{key:"cache",get:function(){return this._cache}},{key:"mutate",value:(q=t(c.mark((function e(t){var r,n,o=arguments;return c.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=o.length>1&&void 0!==o[1]?o[1]:{},n=o.length>2&&void 0!==o[2]?o[2]:{},e.abrupt("return",this._request(t,r,this._getRequestContext(f,t,n)));case 3:case"end":return e.stop()}}),e,this)}))),function(e){return q.apply(this,arguments)})},{key:"query",value:(_=t(c.mark((function e(t){var r,n,o=arguments;return c.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=o.length>1&&void 0!==o[1]?o[1]:{},n=o.length>2&&void 0!==o[2]?o[2]:{},e.abrupt("return",this._request(t,r,this._getRequestContext(h,t,n)));case 3:case"end":return e.stop()}}),e,this)}))),function(e){return _.apply(this,arguments)})},{key:"request",value:(x=t(c.mark((function e(t){var r,n,o=arguments;return c.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=o.length>1&&void 0!==o[1]?o[1]:{},n=o.length>2&&void 0!==o[2]?o[2]:{},e.abrupt("return",this._request(t,r,this._getRequestContext(h,t,n)));case 3:case"end":return e.stop()}}),e,this)}))),function(e){return x.apply(this,arguments)})},{key:"subscribe",value:(w=t(c.mark((function e(t){var r,n=arguments;return c.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=n.length>1&&void 0!==n[1]?n[1]:{},e.abrupt("return",this._subscribe(t,r,this._getRequestContext(b,t)));case 2:case"end":return e.stop()}}),e,this)}))),function(e){return w.apply(this,arguments)})},{key:"_addEventListener",value:function(){this._worker.addEventListener("message",this._onMessage)}},{key:"_getRequestContext",value:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return R({debugManager:this._debugManager,experimentalDeferStreamSupport:this._experimentalDeferStreamSupport,fieldTypeMap:new Map,filteredRequest:"",operation:e,operationName:"",originalRequestHash:d(t),parsedRequest:"",queryFiltered:!1,request:t,requestComplexity:null,requestDepth:null,requestID:O()},r)}},{key:"_request",value:(l=t(c.mark((function e(t,r,n){var o=this;return c.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,new Promise((function(e){o._worker.postMessage({context:a._getMessageContext(n),method:"request",options:r,request:t,type:"graphqlBox"}),o._pending.set(n.requestID,{resolve:e})}));case 3:return e.abrupt("return",e.sent);case 6:return e.prev=6,e.t0=e.catch(0),e.abrupt("return",{errors:u(e.t0)});case 9:case"end":return e.stop()}}),e,null,[[0,6]])}))),function(e,t,r){return l.apply(this,arguments)})},{key:"_subscribe",value:(p=t(c.mark((function e(t,r,n){var o;return c.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,this._worker.postMessage({context:a._getMessageContext(n),method:"subscribe",options:r,request:t,type:"graphqlBox"}),o=new g(this._eventEmitter,n.requestID),e.abrupt("return",o.getIterator());case 6:return e.prev=6,e.t0=e.catch(0),e.abrupt("return",{errors:u(e.t0)});case 9:case"end":return e.stop()}}),e,this,[[0,6]])}))),function(e,t,r){return p.apply(this,arguments)})}],[{key:"_getMessageContext",value:function(e){var t=e.hasDeferOrStream;return{hasDeferOrStream:void 0!==t&&t,requestID:e.requestID}}}]),a}()).prototype,"_request",[P],Object.getOwnPropertyDescriptor(M.prototype,"_request"),M.prototype),a(M.prototype,"_subscribe",[D],Object.getOwnPropertyDescriptor(M.prototype,"_subscribe"),M.prototype),M);function L(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function N(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?L(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):L(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}var z=self,F=z.addEventListener,G=z.postMessage;function H(){return(H=t(c.mark((function t(r,n,o,a,s){var u,i,p,l,f;return c.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,s.request(r,o,a);case 2:if(u=t.sent,_(u)){t.next=9;break}return p=(i=u)._cacheMetadata,l=e(i,["_cacheMetadata"]),f=N({},l),p&&(f._cacheMetadata=w(p)),G({context:a,method:n,result:x(f),type:"graphqlBox"}),t.abrupt("return");case 9:q(u,(function(t){var r=t._cacheMetadata,o=N({},e(t,["_cacheMetadata"]));r&&(o._cacheMetadata=w(r)),G({context:a,method:n,result:x(o),type:"graphqlBox"})}));case 10:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function W(){return(W=t(c.mark((function t(r,n,o,a,s){var u;return c.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,s.subscribe(r,o,a);case 2:if(u=t.sent,_(u)){t.next=6;break}return G({context:a,method:n,result:x(u),type:"graphqlBox"}),t.abrupt("return");case 6:q(u,(function(t){var r=t._cacheMetadata,o=N({},e(t,["_cacheMetadata"]));r&&(o._cacheMetadata=w(r)),G({context:a,method:n,result:x(o),type:"graphqlBox"})}));case 7:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function Z(e,t){var r=e,n=r.context,o=r.method,a=r.options,s=r.request;"request"===o?function(e,t,r,n,o){H.apply(this,arguments)}(s,o,a,n,t):"subscribe"===o&&function(e,t,r,n,o){W.apply(this,arguments)}(s,o,a,n,t)}function J(e){return K.apply(this,arguments)}function K(){return(K=t(c.mark((function e(t){var r,n;return c.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=function(e){var t=e.data;if(s(t)){var n=t.type;"graphqlBox"===n?Z(t,r):"cachemap"===n&&r.cache&&k(t,r.cache)}},r=t.client,F("message",n);case 3:case"end":return e.stop()}}),e)})))).apply(this,arguments)}export default A;export{J as registerWorker};
|
|
2
|
-
//# sourceMappingURL=index.js.map
|
package/lib/browser/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../worker-client/src/consts/index.ts","../worker-client/src/helpers/operationNameRegex.ts","../worker-client/src/main/index.ts","../worker-client/src/debug/log-request/index.ts","../worker-client/src/debug/log-subscription/index.ts","../worker-client/src/register-worker/index.ts"],"sourcesContent":["export const REQUEST = \"request\";\nexport const SUBSCRIBE = \"subscribe\";\n\nexport const MESSAGE = \"message\";\n\nexport const GRAPHQL_BOX = \"graphqlBox\";\nexport const CACHEMAP = \"cachemap\";\n","export default (request: string) => {\n const output = /(query|mutation|subscription) ([A-Za-z]+)(\\(| {)/.exec(request);\n return output ? output[2] : \"\";\n};\n","import WorkerCachemap from \"@cachemap/core-worker\";\nimport {\n DebugManagerDef,\n MUTATION,\n MaybeRequestContext,\n MaybeRequestResult,\n QUERY,\n REQUEST_RESOLVED,\n RequestContext,\n RequestOptions,\n SUBSCRIPTION,\n SUBSCRIPTION_RESOLVED,\n ValidOperations,\n} from \"@graphql-box/core\";\nimport { EventAsyncIterator, deserializeErrors, hashRequest, rehydrateCacheMetadata } from \"@graphql-box/helpers\";\nimport EventEmitter from \"eventemitter3\";\nimport { castArray, isPlainObject } from \"lodash\";\nimport { v1 as uuid } from \"uuid\";\nimport { GRAPHQL_BOX, MESSAGE, REQUEST, SUBSCRIBE } from \"../consts\";\nimport logRequest from \"../debug/log-request\";\nimport logSubscription from \"../debug/log-subscription\";\nimport { MessageContext, MessageResponsePayload, PendingResolver, PendingTracker, UserOptions } from \"../defs\";\n\nexport default class WorkerClient {\n private static _getMessageContext({ hasDeferOrStream = false, requestID }: RequestContext): MessageContext {\n return { hasDeferOrStream, requestID };\n }\n\n private _cache: WorkerCachemap;\n private _debugManager: DebugManagerDef | null;\n private _eventEmitter: EventEmitter;\n private _experimentalDeferStreamSupport: boolean;\n private _pending: PendingTracker = new Map();\n private _worker: Worker;\n\n constructor(options: UserOptions) {\n const errors: TypeError[] = [];\n\n if (!isPlainObject(options)) {\n errors.push(new TypeError(\"@graphql-box/client expected options to ba a plain object.\"));\n }\n\n if (!options.cache) {\n errors.push(new TypeError(\"@graphql-box/client expected options.cache.\"));\n }\n\n if (!options.worker) {\n errors.push(new TypeError(\"@graphql-box/client expected options.worker.\"));\n }\n\n if (errors.length) {\n throw errors;\n }\n\n this._cache = options.cache;\n this._debugManager = options.debugManager ?? null;\n this._eventEmitter = new EventEmitter();\n this._experimentalDeferStreamSupport = options.experimentalDeferStreamSupport ?? false;\n this._worker = options.worker;\n this._addEventListener();\n }\n\n get cache(): WorkerCachemap {\n return this._cache;\n }\n\n public async mutate(request: string, options: RequestOptions = {}, context: MaybeRequestContext = {}) {\n return this._request(request, options, this._getRequestContext(MUTATION, request, context));\n }\n\n public async query(request: string, options: RequestOptions = {}, context: MaybeRequestContext = {}) {\n return this._request(request, options, this._getRequestContext(QUERY, request, context));\n }\n\n public async request(request: string, options: RequestOptions = {}, context: MaybeRequestContext = {}) {\n return this._request(request, options, this._getRequestContext(QUERY, request, context));\n }\n\n public async subscribe(request: string, options: RequestOptions = {}) {\n return this._subscribe(request, options, this._getRequestContext(SUBSCRIPTION, request));\n }\n\n private _addEventListener(): void {\n this._worker.addEventListener(MESSAGE, this._onMessage);\n }\n\n private _getRequestContext(\n operation: ValidOperations,\n request: string,\n context: MaybeRequestContext = {},\n ): RequestContext {\n return {\n debugManager: this._debugManager,\n experimentalDeferStreamSupport: this._experimentalDeferStreamSupport,\n fieldTypeMap: new Map(),\n filteredRequest: \"\",\n operation,\n operationName: \"\",\n originalRequestHash: hashRequest(request),\n parsedRequest: \"\",\n queryFiltered: false,\n request,\n requestComplexity: null,\n requestDepth: null,\n requestID: uuid(),\n ...context,\n };\n }\n\n private _onMessage = async ({ data }: MessageEvent): Promise<void> => {\n if (!isPlainObject(data)) {\n return;\n }\n\n const { context, method, result, type } = data as MessageResponsePayload;\n\n if (type !== GRAPHQL_BOX || !isPlainObject(result)) {\n return;\n }\n\n const { _cacheMetadata, ...otherProps } = result;\n const response: MaybeRequestResult = deserializeErrors({ ...otherProps, requestID: context.requestID });\n\n if (_cacheMetadata) {\n response._cacheMetadata = rehydrateCacheMetadata(_cacheMetadata);\n }\n\n if (method === SUBSCRIBE) {\n this._debugManager?.log(SUBSCRIPTION_RESOLVED, {\n context,\n result: response,\n stats: { endTime: this._debugManager?.now() },\n });\n\n this._eventEmitter.emit(context.requestID, response);\n } else if (context.hasDeferOrStream) {\n const pending = this._pending.get(context.requestID);\n\n if (pending) {\n const eventAsyncIterator = new EventAsyncIterator<MaybeRequestResult>(this._eventEmitter, context.requestID);\n pending.resolve(eventAsyncIterator.getIterator());\n }\n\n this._debugManager?.log(REQUEST_RESOLVED, {\n context,\n result: response,\n stats: { endTime: this._debugManager?.now() },\n });\n\n this._eventEmitter.emit(context.requestID, response);\n } else {\n const pending = this._pending.get(context.requestID);\n\n if (!pending) {\n return;\n }\n\n this._debugManager?.log(REQUEST_RESOLVED, {\n context,\n result: response,\n stats: { endTime: this._debugManager?.now() },\n });\n\n pending.resolve(response);\n }\n };\n\n @logRequest()\n private async _request(request: string, options: RequestOptions, context: RequestContext) {\n try {\n return await new Promise((resolve: PendingResolver) => {\n this._worker.postMessage({\n context: WorkerClient._getMessageContext(context),\n method: REQUEST,\n options,\n request,\n type: GRAPHQL_BOX,\n });\n\n this._pending.set(context.requestID, { resolve });\n });\n } catch (error) {\n return { errors: castArray(error) };\n }\n }\n\n @logSubscription()\n private async _subscribe(request: string, options: RequestOptions, context: RequestContext) {\n try {\n this._worker.postMessage({\n context: WorkerClient._getMessageContext(context),\n method: SUBSCRIBE,\n options,\n request,\n type: GRAPHQL_BOX,\n });\n\n const eventAsyncIterator = new EventAsyncIterator<MaybeRequestResult>(this._eventEmitter, context.requestID);\n return eventAsyncIterator.getIterator();\n } catch (error) {\n return { errors: castArray(error) };\n }\n }\n}\n","import { REQUEST_EXECUTED, REQUEST_RESOLVED, RequestContext } from \"@graphql-box/core\";\nimport { isAsyncIterable } from \"iterall\";\nimport operationNameRegex from \"../../helpers/operationNameRegex\";\n\nexport default function logRequest() {\n return (\n _target: any,\n _propertyName: string,\n descriptor: TypedPropertyDescriptor<(...args: any[]) => Promise<any>>,\n ): void => {\n const method = descriptor.value;\n if (!method) return;\n\n descriptor.value = async function descriptorValue(...args: any[]): Promise<any> {\n try {\n return new Promise(async resolve => {\n const { debugManager, ...otherContext } = args[2] as RequestContext;\n\n if (!debugManager) {\n resolve(await method.apply(this, args));\n return;\n }\n\n const derivedOperationName = operationNameRegex(args[0]);\n const startTime = debugManager.now();\n\n debugManager.log(REQUEST_EXECUTED, {\n context: { ...otherContext, operationName: derivedOperationName },\n options: args[1],\n request: args[0],\n stats: { startTime },\n });\n\n const result = await method.apply(this, args);\n const endTime = debugManager.now();\n const duration = endTime - startTime;\n resolve(result);\n\n if (isAsyncIterable(result)) {\n return;\n }\n\n debugManager.log(REQUEST_RESOLVED, {\n context: { ...otherContext, operationName: derivedOperationName },\n options: args[1],\n request: args[0],\n result,\n stats: { duration, endTime, startTime },\n });\n });\n } catch (error) {\n return Promise.reject(error);\n }\n };\n };\n}\n","import { RequestContext, SUBSCRIPTION_EXECUTED } from \"@graphql-box/core\";\nimport operationNameRegex from \"../../helpers/operationNameRegex\";\n\nexport default function logSubscription() {\n return (\n _target: any,\n _propertyName: string,\n descriptor: TypedPropertyDescriptor<(...args: any[]) => Promise<any>>,\n ): void => {\n const method = descriptor.value;\n if (!method) return;\n\n descriptor.value = async function descriptorValue(...args: any[]): Promise<any> {\n try {\n return new Promise(async resolve => {\n const { debugManager, ...otherContext } = args[2] as RequestContext;\n\n if (!debugManager) {\n resolve(await method.apply(this, args));\n return;\n }\n\n const derivedOperationName = operationNameRegex(args[0]);\n const startTime = debugManager.now();\n\n debugManager.log(SUBSCRIPTION_EXECUTED, {\n context: { ...otherContext, operationName: derivedOperationName },\n options: args[1],\n request: args[0],\n stats: { startTime },\n });\n\n const result = await method.apply(this, args);\n resolve(result);\n });\n } catch (error) {\n return Promise.reject(error);\n }\n };\n };\n}\n","import { handleMessage as handleCachemapMessage } from \"@cachemap/core-worker\";\nimport Client from \"@graphql-box/client\";\nimport { MaybeRequestResult, MaybeRequestResultWithDehydratedCacheMetadata, RequestOptions } from \"@graphql-box/core\";\nimport { dehydrateCacheMetadata, serializeErrors } from \"@graphql-box/helpers\";\nimport { forAwaitEach, isAsyncIterable } from \"iterall\";\nimport { isPlainObject } from \"lodash\";\nimport { CACHEMAP, GRAPHQL_BOX, MESSAGE, REQUEST, SUBSCRIBE } from \"../consts\";\nimport { MessageContext, MessageRequestPayload, MethodNames, RegisterWorkerOptions } from \"../defs\";\n\nconst { addEventListener, postMessage } = (self as unknown) as DedicatedWorkerGlobalScope;\n\nasync function handleRequest(\n request: string,\n method: MethodNames,\n options: RequestOptions,\n context: MessageContext,\n client: Client,\n): Promise<void> {\n const requestResult = await client.request(request, options, context);\n\n if (!isAsyncIterable(requestResult)) {\n const { _cacheMetadata, ...otherProps } = requestResult as MaybeRequestResult;\n const result: MaybeRequestResultWithDehydratedCacheMetadata = { ...otherProps };\n\n if (_cacheMetadata) {\n result._cacheMetadata = dehydrateCacheMetadata(_cacheMetadata);\n }\n\n postMessage({ context, method, result: serializeErrors(result), type: GRAPHQL_BOX });\n return;\n }\n\n forAwaitEach(requestResult, ({ _cacheMetadata, ...otherProps }: MaybeRequestResult) => {\n const result: MaybeRequestResultWithDehydratedCacheMetadata = { ...otherProps };\n\n if (_cacheMetadata) {\n result._cacheMetadata = dehydrateCacheMetadata(_cacheMetadata);\n }\n\n postMessage({ context, method, result: serializeErrors(result), type: GRAPHQL_BOX });\n });\n}\n\nasync function handleSubscription(\n request: string,\n method: MethodNames,\n options: RequestOptions,\n context: MessageContext,\n client: Client,\n): Promise<void> {\n const subscribeResult = await client.subscribe(request, options, context);\n\n if (!isAsyncIterable(subscribeResult)) {\n postMessage({ context, method, result: serializeErrors(subscribeResult as MaybeRequestResult), type: GRAPHQL_BOX });\n return;\n }\n\n forAwaitEach(subscribeResult, ({ _cacheMetadata, ...otherProps }: MaybeRequestResult) => {\n const result: MaybeRequestResultWithDehydratedCacheMetadata = { ...otherProps };\n\n if (_cacheMetadata) {\n result._cacheMetadata = dehydrateCacheMetadata(_cacheMetadata);\n }\n\n postMessage({ context, method, result: serializeErrors(result), type: GRAPHQL_BOX });\n });\n}\n\nexport function handleMessage(data: MessageRequestPayload, client: Client): void {\n const { context, method, options, request } = data as MessageRequestPayload;\n\n if (method === REQUEST) {\n handleRequest(request, method, options, context, client);\n } else if (method === SUBSCRIBE) {\n handleSubscription(request, method, options, context, client);\n }\n}\n\nexport default async function registerWorker({ client }: RegisterWorkerOptions): Promise<void> {\n function onMessage({ data }: MessageEvent): void {\n if (!isPlainObject(data)) {\n return;\n }\n\n const { type } = data as MessageRequestPayload;\n\n if (type === GRAPHQL_BOX) {\n handleMessage(data, client);\n } else if (type === CACHEMAP && client.cache) {\n handleCachemapMessage(data, client.cache);\n }\n }\n\n addEventListener(MESSAGE, onMessage);\n}\n"],"names":["request","output","exec","WorkerClient","_target","_propertyName","descriptor","method","value","args","Promise","resolve","debugManager","otherContext","apply","_this","derivedOperationName","operationNameRegex","startTime","now","log","REQUEST_EXECUTED","context","operationName","options","stats","result","endTime","duration","isAsyncIterable","REQUEST_RESOLVED","reject","SUBSCRIPTION_EXECUTED","Map","data","_isPlainObject","type","_cacheMetadata","otherProps","response","deserializeErrors","requestID","rehydrateCacheMetadata","_debugManager","SUBSCRIPTION_RESOLVED","_this$_debugManager2","_eventEmitter","emit","hasDeferOrStream","pending","_pending","get","eventAsyncIterator","EventAsyncIterator","getIterator","_this$_debugManager4","_this$_debugManager6","errors","push","TypeError","cache","worker","length","_cache","EventEmitter","_experimentalDeferStreamSupport","experimentalDeferStreamSupport","_worker","_addEventListener","this","_request","_getRequestContext","MUTATION","QUERY","_subscribe","SUBSCRIPTION","addEventListener","_onMessage","operation","fieldTypeMap","filteredRequest","originalRequestHash","hashRequest","parsedRequest","queryFiltered","requestComplexity","requestDepth","uuid","_this2","postMessage","_getMessageContext","set","_castArray","self","client","requestResult","dehydrateCacheMetadata","serializeErrors","forAwaitEach","subscribe","subscribeResult","handleMessage","handleRequest","handleSubscription","registerWorker","onMessage","handleCachemapMessage"],"mappings":"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"}
|