@lvce-editor/json-rpc 1.0.0 → 1.2.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/dist/index.js +132 -174
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -4,14 +4,14 @@ const create$4 = (method, params) => {
|
|
|
4
4
|
return {
|
|
5
5
|
jsonrpc: Two,
|
|
6
6
|
method,
|
|
7
|
-
params
|
|
8
|
-
}
|
|
7
|
+
params
|
|
8
|
+
};
|
|
9
9
|
};
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
const JsonRpcEvent = {
|
|
12
12
|
__proto__: null,
|
|
13
13
|
create: create$4
|
|
14
|
-
}
|
|
14
|
+
};
|
|
15
15
|
|
|
16
16
|
class AssertionError extends Error {
|
|
17
17
|
constructor(message) {
|
|
@@ -19,43 +19,53 @@ class AssertionError extends Error {
|
|
|
19
19
|
this.name = 'AssertionError';
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
|
-
|
|
23
|
-
const getType = (value) => {
|
|
22
|
+
const getType = value => {
|
|
24
23
|
switch (typeof value) {
|
|
25
24
|
case 'number':
|
|
26
|
-
return 'number'
|
|
25
|
+
return 'number';
|
|
27
26
|
case 'function':
|
|
28
|
-
return 'function'
|
|
27
|
+
return 'function';
|
|
29
28
|
case 'string':
|
|
30
|
-
return 'string'
|
|
29
|
+
return 'string';
|
|
31
30
|
case 'object':
|
|
32
31
|
if (value === null) {
|
|
33
|
-
return 'null'
|
|
32
|
+
return 'null';
|
|
34
33
|
}
|
|
35
34
|
if (Array.isArray(value)) {
|
|
36
|
-
return 'array'
|
|
35
|
+
return 'array';
|
|
37
36
|
}
|
|
38
|
-
return 'object'
|
|
37
|
+
return 'object';
|
|
39
38
|
case 'boolean':
|
|
40
|
-
return 'boolean'
|
|
39
|
+
return 'boolean';
|
|
41
40
|
default:
|
|
42
|
-
return 'unknown'
|
|
41
|
+
return 'unknown';
|
|
43
42
|
}
|
|
44
43
|
};
|
|
45
|
-
|
|
46
|
-
const number = (value) => {
|
|
44
|
+
const number = value => {
|
|
47
45
|
const type = getType(value);
|
|
48
46
|
if (type !== 'number') {
|
|
49
|
-
throw new AssertionError('expected value to be of type number')
|
|
47
|
+
throw new AssertionError('expected value to be of type number');
|
|
50
48
|
}
|
|
51
49
|
};
|
|
52
50
|
|
|
53
51
|
const state$1 = {
|
|
54
|
-
|
|
52
|
+
callbacks: Object.create(null)
|
|
53
|
+
};
|
|
54
|
+
const set = (id, fn) => {
|
|
55
|
+
state$1.callbacks[id] = fn;
|
|
56
|
+
};
|
|
57
|
+
const get = id => {
|
|
58
|
+
return state$1.callbacks[id];
|
|
59
|
+
};
|
|
60
|
+
const remove = id => {
|
|
61
|
+
delete state$1.callbacks[id];
|
|
55
62
|
};
|
|
56
63
|
|
|
64
|
+
const state = {
|
|
65
|
+
id: 0
|
|
66
|
+
};
|
|
57
67
|
const create$3 = () => {
|
|
58
|
-
return ++state
|
|
68
|
+
return ++state.id;
|
|
59
69
|
};
|
|
60
70
|
|
|
61
71
|
const warn = (...args) => {
|
|
@@ -67,61 +77,60 @@ const withResolvers = () => {
|
|
|
67
77
|
* @type {any}
|
|
68
78
|
*/
|
|
69
79
|
let _resolve;
|
|
70
|
-
|
|
71
|
-
* @type {any}
|
|
72
|
-
*/
|
|
73
|
-
let _reject;
|
|
74
|
-
const promise = new Promise((resolve, reject) => {
|
|
80
|
+
const promise = new Promise(resolve => {
|
|
75
81
|
_resolve = resolve;
|
|
76
|
-
_reject = reject;
|
|
77
82
|
});
|
|
78
83
|
return {
|
|
79
84
|
resolve: _resolve,
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
}
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
const state = {
|
|
86
|
-
callbacks: Object.create(null),
|
|
85
|
+
promise
|
|
86
|
+
};
|
|
87
87
|
};
|
|
88
88
|
|
|
89
89
|
const registerPromise = () => {
|
|
90
90
|
const id = create$3();
|
|
91
|
-
const {
|
|
92
|
-
|
|
93
|
-
|
|
91
|
+
const {
|
|
92
|
+
resolve,
|
|
93
|
+
promise
|
|
94
|
+
} = withResolvers();
|
|
95
|
+
set(id, resolve);
|
|
96
|
+
return {
|
|
97
|
+
id,
|
|
98
|
+
promise
|
|
99
|
+
};
|
|
94
100
|
};
|
|
95
|
-
|
|
96
101
|
const resolve = (id, args) => {
|
|
97
102
|
number(id);
|
|
98
|
-
|
|
103
|
+
const fn = get(id);
|
|
104
|
+
if (!fn) {
|
|
99
105
|
console.log(args);
|
|
100
106
|
warn(`callback ${id} may already be disposed`);
|
|
101
|
-
return
|
|
107
|
+
return;
|
|
102
108
|
}
|
|
103
|
-
|
|
104
|
-
|
|
109
|
+
fn(args);
|
|
110
|
+
remove(id);
|
|
105
111
|
};
|
|
106
112
|
|
|
107
113
|
const create$2 = (method, params) => {
|
|
108
|
-
const {
|
|
114
|
+
const {
|
|
115
|
+
id,
|
|
116
|
+
promise
|
|
117
|
+
} = registerPromise();
|
|
109
118
|
const message = {
|
|
110
119
|
jsonrpc: Two,
|
|
111
120
|
method,
|
|
112
121
|
params,
|
|
113
|
-
id
|
|
122
|
+
id
|
|
114
123
|
};
|
|
115
124
|
return {
|
|
116
125
|
message,
|
|
117
|
-
promise
|
|
118
|
-
}
|
|
126
|
+
promise
|
|
127
|
+
};
|
|
119
128
|
};
|
|
120
129
|
|
|
121
|
-
|
|
130
|
+
const JsonRpcRequest = {
|
|
122
131
|
__proto__: null,
|
|
123
132
|
create: create$2
|
|
124
|
-
}
|
|
133
|
+
};
|
|
125
134
|
|
|
126
135
|
class JsonRpcError extends Error {
|
|
127
136
|
constructor(message) {
|
|
@@ -130,6 +139,8 @@ class JsonRpcError extends Error {
|
|
|
130
139
|
}
|
|
131
140
|
}
|
|
132
141
|
|
|
142
|
+
const NewLine = '\n';
|
|
143
|
+
|
|
133
144
|
const DomException = 'DOMException';
|
|
134
145
|
const ReferenceError$1 = 'ReferenceError';
|
|
135
146
|
const SyntaxError$1 = 'SyntaxError';
|
|
@@ -139,85 +150,78 @@ const getErrorConstructor = (message, type) => {
|
|
|
139
150
|
if (type) {
|
|
140
151
|
switch (type) {
|
|
141
152
|
case DomException:
|
|
142
|
-
|
|
153
|
+
// @ts-ignore
|
|
154
|
+
return DOMException;
|
|
143
155
|
case TypeError$1:
|
|
144
|
-
return TypeError
|
|
156
|
+
return TypeError;
|
|
145
157
|
case SyntaxError$1:
|
|
146
|
-
return SyntaxError
|
|
158
|
+
return SyntaxError;
|
|
147
159
|
case ReferenceError$1:
|
|
148
|
-
return ReferenceError
|
|
160
|
+
return ReferenceError;
|
|
149
161
|
default:
|
|
150
|
-
return Error
|
|
162
|
+
return Error;
|
|
151
163
|
}
|
|
152
164
|
}
|
|
153
165
|
if (message.startsWith('TypeError: ')) {
|
|
154
|
-
return TypeError
|
|
166
|
+
return TypeError;
|
|
155
167
|
}
|
|
156
168
|
if (message.startsWith('SyntaxError: ')) {
|
|
157
|
-
return SyntaxError
|
|
169
|
+
return SyntaxError;
|
|
158
170
|
}
|
|
159
171
|
if (message.startsWith('ReferenceError: ')) {
|
|
160
|
-
return ReferenceError
|
|
172
|
+
return ReferenceError;
|
|
161
173
|
}
|
|
162
|
-
return Error
|
|
163
|
-
};
|
|
164
|
-
|
|
165
|
-
const NewLine = '\n';
|
|
166
|
-
|
|
167
|
-
/**
|
|
168
|
-
*
|
|
169
|
-
* @param {string} string
|
|
170
|
-
* @param {number|undefined} startIndex
|
|
171
|
-
* @returns
|
|
172
|
-
*/
|
|
173
|
-
const getNewLineIndex = (string, startIndex = undefined) => {
|
|
174
|
-
return string.indexOf(NewLine, startIndex)
|
|
175
|
-
};
|
|
176
|
-
|
|
177
|
-
const joinLines = (lines) => {
|
|
178
|
-
return lines.join(NewLine)
|
|
179
|
-
};
|
|
180
|
-
|
|
181
|
-
const MethodNotFound = -32601;
|
|
182
|
-
const Custom = -32001;
|
|
183
|
-
|
|
184
|
-
const splitLines = (lines) => {
|
|
185
|
-
return lines.split(NewLine)
|
|
174
|
+
return Error;
|
|
186
175
|
};
|
|
187
176
|
|
|
188
177
|
const constructError = (message, type, name) => {
|
|
189
178
|
const ErrorConstructor = getErrorConstructor(message, type);
|
|
179
|
+
// @ts-ignore
|
|
190
180
|
if (ErrorConstructor === DOMException && name) {
|
|
191
|
-
return new ErrorConstructor(message, name)
|
|
181
|
+
return new ErrorConstructor(message, name);
|
|
192
182
|
}
|
|
193
183
|
if (ErrorConstructor === Error) {
|
|
194
184
|
const error = new Error(message);
|
|
195
185
|
if (name && name !== 'VError') {
|
|
196
186
|
error.name = name;
|
|
197
187
|
}
|
|
198
|
-
return error
|
|
188
|
+
return error;
|
|
199
189
|
}
|
|
200
|
-
return new ErrorConstructor(message)
|
|
190
|
+
return new ErrorConstructor(message);
|
|
201
191
|
};
|
|
202
192
|
|
|
203
|
-
const
|
|
193
|
+
const getNewLineIndex = (string, startIndex = undefined) => {
|
|
194
|
+
return string.indexOf(NewLine, startIndex);
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
const joinLines = lines => {
|
|
198
|
+
return lines.join(NewLine);
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
const MethodNotFound = -32601;
|
|
202
|
+
const Custom = -32001;
|
|
203
|
+
|
|
204
|
+
const splitLines = lines => {
|
|
205
|
+
return lines.split(NewLine);
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
const getParentStack = error => {
|
|
204
209
|
let parentStack = error.stack || error.data || error.message || '';
|
|
205
210
|
if (parentStack.startsWith(' at')) {
|
|
206
211
|
parentStack = error.message + NewLine + parentStack;
|
|
207
212
|
}
|
|
208
|
-
return parentStack
|
|
213
|
+
return parentStack;
|
|
209
214
|
};
|
|
210
|
-
|
|
211
|
-
const restoreJsonRpcError = (error) => {
|
|
215
|
+
const restoreJsonRpcError = error => {
|
|
212
216
|
if (error && error instanceof Error) {
|
|
213
|
-
return error
|
|
217
|
+
return error;
|
|
214
218
|
}
|
|
215
219
|
const currentStack = joinLines(splitLines(new Error().stack).slice(1));
|
|
216
220
|
if (error && error.code && error.code === MethodNotFound) {
|
|
217
221
|
const restoredError = new JsonRpcError(error.message);
|
|
218
222
|
const parentStack = getParentStack(error);
|
|
219
223
|
restoredError.stack = parentStack + NewLine + currentStack;
|
|
220
|
-
return restoredError
|
|
224
|
+
return restoredError;
|
|
221
225
|
}
|
|
222
226
|
if (error && error.message) {
|
|
223
227
|
const restoredError = constructError(error.message, error.type, error.name);
|
|
@@ -254,31 +258,31 @@ const restoreJsonRpcError = (error) => {
|
|
|
254
258
|
restoredError.codeFrame = error.codeFrame;
|
|
255
259
|
}
|
|
256
260
|
}
|
|
257
|
-
return restoredError
|
|
261
|
+
return restoredError;
|
|
258
262
|
}
|
|
259
263
|
if (typeof error === 'string') {
|
|
260
|
-
return new Error(`JsonRpc Error: ${error}`)
|
|
264
|
+
return new Error(`JsonRpc Error: ${error}`);
|
|
261
265
|
}
|
|
262
|
-
return new Error(`JsonRpc Error: ${error}`)
|
|
266
|
+
return new Error(`JsonRpc Error: ${error}`);
|
|
263
267
|
};
|
|
264
268
|
|
|
265
|
-
const unwrapJsonRpcResult =
|
|
269
|
+
const unwrapJsonRpcResult = responseMessage => {
|
|
266
270
|
if ('error' in responseMessage) {
|
|
267
271
|
const restoredError = restoreJsonRpcError(responseMessage.error);
|
|
268
|
-
throw restoredError
|
|
272
|
+
throw restoredError;
|
|
269
273
|
}
|
|
270
274
|
if ('result' in responseMessage) {
|
|
271
|
-
return responseMessage.result
|
|
275
|
+
return responseMessage.result;
|
|
272
276
|
}
|
|
273
|
-
throw new JsonRpcError('unexpected response message')
|
|
277
|
+
throw new JsonRpcError('unexpected response message');
|
|
274
278
|
};
|
|
275
279
|
|
|
276
280
|
const create$1 = (message, error) => {
|
|
277
281
|
return {
|
|
278
282
|
jsonrpc: Two,
|
|
279
283
|
id: message.id,
|
|
280
|
-
error
|
|
281
|
-
}
|
|
284
|
+
error
|
|
285
|
+
};
|
|
282
286
|
};
|
|
283
287
|
|
|
284
288
|
const E_COMMAND_NOT_FOUND = 'E_COMMAND_NOT_FOUND';
|
|
@@ -288,8 +292,8 @@ const getErrorProperty = (error, prettyError) => {
|
|
|
288
292
|
return {
|
|
289
293
|
code: MethodNotFound,
|
|
290
294
|
message: error.message,
|
|
291
|
-
data: error.stack
|
|
292
|
-
}
|
|
295
|
+
data: error.stack
|
|
296
|
+
};
|
|
293
297
|
}
|
|
294
298
|
return {
|
|
295
299
|
code: Custom,
|
|
@@ -298,130 +302,84 @@ const getErrorProperty = (error, prettyError) => {
|
|
|
298
302
|
stack: prettyError.stack,
|
|
299
303
|
codeFrame: prettyError.codeFrame,
|
|
300
304
|
type: prettyError.type,
|
|
301
|
-
code: prettyError.code
|
|
302
|
-
}
|
|
303
|
-
}
|
|
305
|
+
code: prettyError.code
|
|
306
|
+
}
|
|
307
|
+
};
|
|
304
308
|
};
|
|
305
|
-
|
|
306
|
-
const getErrorResponse = (
|
|
307
|
-
message,
|
|
308
|
-
error,
|
|
309
|
-
ipc,
|
|
310
|
-
preparePrettyError,
|
|
311
|
-
logError,
|
|
312
|
-
) => {
|
|
309
|
+
const getErrorResponse = (message, error, ipc, preparePrettyError, logError) => {
|
|
313
310
|
const prettyError = preparePrettyError(error);
|
|
314
311
|
logError(error, prettyError);
|
|
315
312
|
const errorProperty = getErrorProperty(error, prettyError);
|
|
316
|
-
return create$1(message, errorProperty)
|
|
313
|
+
return create$1(message, errorProperty);
|
|
317
314
|
};
|
|
318
315
|
|
|
319
316
|
const create = (message, result) => {
|
|
320
317
|
return {
|
|
321
318
|
jsonrpc: Two,
|
|
322
319
|
id: message.id,
|
|
323
|
-
result: result ?? null
|
|
324
|
-
}
|
|
320
|
+
result: result ?? null
|
|
321
|
+
};
|
|
325
322
|
};
|
|
326
323
|
|
|
327
324
|
const getSuccessResponse = (message, result) => {
|
|
328
325
|
const resultProperty = result ?? null;
|
|
329
|
-
return create(message, resultProperty)
|
|
326
|
+
return create(message, resultProperty);
|
|
330
327
|
};
|
|
331
328
|
|
|
332
|
-
const getResponse = async (
|
|
333
|
-
message,
|
|
334
|
-
ipc,
|
|
335
|
-
execute,
|
|
336
|
-
preparePrettyError,
|
|
337
|
-
logError,
|
|
338
|
-
requiresSocket,
|
|
339
|
-
) => {
|
|
329
|
+
const getResponse = async (message, ipc, execute, preparePrettyError, logError, requiresSocket) => {
|
|
340
330
|
try {
|
|
341
|
-
const result = requiresSocket(message.method)
|
|
342
|
-
|
|
343
|
-
: await execute(message.method, ...message.params);
|
|
344
|
-
return getSuccessResponse(message, result)
|
|
331
|
+
const result = requiresSocket(message.method) ? await execute(message.method, ipc, ...message.params) : await execute(message.method, ...message.params);
|
|
332
|
+
return getSuccessResponse(message, result);
|
|
345
333
|
} catch (error) {
|
|
346
|
-
return getErrorResponse(
|
|
347
|
-
message,
|
|
348
|
-
error,
|
|
349
|
-
ipc,
|
|
350
|
-
preparePrettyError,
|
|
351
|
-
logError,
|
|
352
|
-
)
|
|
334
|
+
return getErrorResponse(message, error, ipc, preparePrettyError, logError);
|
|
353
335
|
}
|
|
354
336
|
};
|
|
355
337
|
|
|
356
|
-
const handleJsonRpcMessage = async (
|
|
357
|
-
ipc,
|
|
358
|
-
message,
|
|
359
|
-
execute,
|
|
360
|
-
resolve,
|
|
361
|
-
preparePrettyError,
|
|
362
|
-
logError,
|
|
363
|
-
requiresSocket,
|
|
364
|
-
) => {
|
|
338
|
+
const handleJsonRpcMessage = async (ipc, message, execute, resolve, preparePrettyError, logError, requiresSocket) => {
|
|
365
339
|
if ('id' in message) {
|
|
366
340
|
if ('method' in message) {
|
|
367
|
-
const response = await getResponse(
|
|
368
|
-
message,
|
|
369
|
-
ipc,
|
|
370
|
-
execute,
|
|
371
|
-
preparePrettyError,
|
|
372
|
-
logError,
|
|
373
|
-
requiresSocket,
|
|
374
|
-
);
|
|
341
|
+
const response = await getResponse(message, ipc, execute, preparePrettyError, logError, requiresSocket);
|
|
375
342
|
try {
|
|
376
343
|
ipc.send(response);
|
|
377
344
|
} catch (error) {
|
|
378
|
-
const errorResponse = getErrorResponse(
|
|
379
|
-
message,
|
|
380
|
-
error,
|
|
381
|
-
ipc,
|
|
382
|
-
preparePrettyError,
|
|
383
|
-
logError,
|
|
384
|
-
);
|
|
345
|
+
const errorResponse = getErrorResponse(message, error, ipc, preparePrettyError, logError);
|
|
385
346
|
ipc.send(errorResponse);
|
|
386
347
|
}
|
|
387
|
-
return
|
|
348
|
+
return;
|
|
388
349
|
}
|
|
389
350
|
resolve(message.id, message);
|
|
390
|
-
return
|
|
351
|
+
return;
|
|
391
352
|
}
|
|
392
353
|
if ('method' in message) {
|
|
393
|
-
await getResponse(
|
|
394
|
-
|
|
395
|
-
ipc,
|
|
396
|
-
execute,
|
|
397
|
-
preparePrettyError,
|
|
398
|
-
logError,
|
|
399
|
-
requiresSocket,
|
|
400
|
-
);
|
|
401
|
-
return
|
|
354
|
+
await getResponse(message, ipc, execute, preparePrettyError, logError, requiresSocket);
|
|
355
|
+
return;
|
|
402
356
|
}
|
|
403
|
-
throw new JsonRpcError('unexpected message')
|
|
357
|
+
throw new JsonRpcError('unexpected message');
|
|
404
358
|
};
|
|
405
359
|
|
|
406
360
|
const send = (transport, method, ...params) => {
|
|
407
361
|
const message = create$4(method, params);
|
|
408
362
|
transport.send(message);
|
|
409
363
|
};
|
|
410
|
-
|
|
411
364
|
const invoke = async (ipc, method, ...params) => {
|
|
412
|
-
const {
|
|
365
|
+
const {
|
|
366
|
+
message,
|
|
367
|
+
promise
|
|
368
|
+
} = create$2(method, params);
|
|
413
369
|
ipc.send(message);
|
|
414
370
|
const responseMessage = await promise;
|
|
415
371
|
const result = unwrapJsonRpcResult(responseMessage);
|
|
416
|
-
return result
|
|
372
|
+
return result;
|
|
417
373
|
};
|
|
418
|
-
|
|
419
374
|
const invokeAndTransfer = async (ipc, handle, method, ...params) => {
|
|
420
|
-
const {
|
|
375
|
+
const {
|
|
376
|
+
message,
|
|
377
|
+
promise
|
|
378
|
+
} = create$2(method, params);
|
|
421
379
|
ipc.sendAndTransfer(message, handle);
|
|
422
380
|
const responseMessage = await promise;
|
|
423
381
|
const result = unwrapJsonRpcResult(responseMessage);
|
|
424
|
-
return result
|
|
382
|
+
return result;
|
|
425
383
|
};
|
|
426
384
|
|
|
427
385
|
export { JsonRpcEvent, JsonRpcRequest, getErrorResponse, getSuccessResponse, handleJsonRpcMessage, invoke, invokeAndTransfer, resolve, send };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lvce-editor/json-rpc",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "JsonRpc implementation",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -11,6 +11,6 @@
|
|
|
11
11
|
"author": "Lvce Editor",
|
|
12
12
|
"license": "MIT",
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@lvce-editor/assert": "^1.0
|
|
14
|
+
"@lvce-editor/assert": "^1.2.0"
|
|
15
15
|
}
|
|
16
16
|
}
|