js-rpc2 1.0.4 → 1.0.6
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 +2 -2
- package/src/lib.js +37 -11
- package/src/server.js +9 -4
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "js-rpc2",
|
3
|
-
"version": "1.0.
|
3
|
+
"version": "1.0.6",
|
4
4
|
"description": "js web websocket http rpc",
|
5
5
|
"main": "index.js",
|
6
6
|
"type": "module",
|
@@ -26,7 +26,7 @@
|
|
26
26
|
"author": "yuanliwei",
|
27
27
|
"license": "MIT",
|
28
28
|
"devDependencies": {
|
29
|
-
"@types/node": "^22.
|
29
|
+
"@types/node": "^22.13.14",
|
30
30
|
"koa": "^2.15.3",
|
31
31
|
"koa-router": "^13.0.1",
|
32
32
|
"ws": "^8.18.0"
|
package/src/lib.js
CHANGED
@@ -88,11 +88,11 @@ export async function buildBufferData(queue, key, iv) {
|
|
88
88
|
/**
|
89
89
|
* @param {Uint8Array<ArrayBuffer>} buffer
|
90
90
|
* @param {CryptoKey} key
|
91
|
-
* @param {Uint8Array} iv
|
92
|
-
* @returns {Promise<[Uint8Array[],Uint8Array<ArrayBuffer>]>}
|
91
|
+
* @param {Uint8Array<ArrayBuffer>} iv
|
92
|
+
* @returns {Promise<[Uint8Array<ArrayBuffer>[],Uint8Array<ArrayBuffer>]>}
|
93
93
|
*/
|
94
94
|
export async function parseBufferData(buffer, key, iv) {
|
95
|
-
/** @type{Uint8Array[]} */
|
95
|
+
/** @type{Uint8Array<ArrayBuffer>[]} */
|
96
96
|
let queue = []
|
97
97
|
let offset = 0
|
98
98
|
let remain = new Uint8Array(0)
|
@@ -310,7 +310,7 @@ export async function encrypt(data, key, iv) {
|
|
310
310
|
}
|
311
311
|
|
312
312
|
/**
|
313
|
-
* @param {Uint8Array} data
|
313
|
+
* @param {Uint8Array<ArrayBuffer>} data
|
314
314
|
* @param {CryptoKey} key
|
315
315
|
* @param {Uint8Array} iv
|
316
316
|
* @returns
|
@@ -538,25 +538,32 @@ export function parseRpcItemData(array) {
|
|
538
538
|
* @param {object} extension
|
539
539
|
* @param {WritableStreamDefaultWriter<Uint8Array>} writer
|
540
540
|
* @param {Uint8Array} buffer
|
541
|
+
* @param {(msg:string)=>void} [logger]
|
541
542
|
*/
|
542
|
-
export async function rpcRunServerDecodeBuffer(extension, writer, buffer) {
|
543
|
+
export async function rpcRunServerDecodeBuffer(extension, writer, buffer, logger) {
|
543
544
|
/** @type{RPC_DATA} */
|
544
545
|
let box = null
|
545
546
|
let dataId = 0
|
547
|
+
let fnName = null
|
548
|
+
let params = []
|
549
|
+
let time = Date.now()
|
546
550
|
try {
|
547
551
|
let o = parseRpcData(buffer)
|
548
552
|
dataId = o.id
|
549
553
|
let items = parseRpcItemData(o.data)
|
550
|
-
|
554
|
+
fnName = items.at(0).data
|
551
555
|
let args = items.slice(1)
|
552
|
-
let params = []
|
553
556
|
for (let i = 0; i < args.length; i++) {
|
554
557
|
const p = args[i]
|
555
558
|
if (p.type == RPC_DATA_ARG_TYPE_FUNCTION) {
|
556
559
|
const callback = async (/** @type {any[]} */ ...args) => {
|
557
560
|
/** @type{RPC_DATA} */
|
558
561
|
let box = { id: p.data, type: RPC_TYPE_CALLBACK, data: buildRpcItemData(args), }
|
559
|
-
|
562
|
+
try {
|
563
|
+
await writer.write(buildRpcData(box))
|
564
|
+
} catch (error) {
|
565
|
+
throw new Error(`rpc callback writer.write()`, { cause: error })
|
566
|
+
}
|
560
567
|
}
|
561
568
|
params.push(callback)
|
562
569
|
} else {
|
@@ -570,13 +577,22 @@ export async function rpcRunServerDecodeBuffer(extension, writer, buffer) {
|
|
570
577
|
box = { id: o.id, type: RPC_TYPE_RETURN, data: buildRpcItemData([ret]), }
|
571
578
|
}
|
572
579
|
} catch (error) {
|
573
|
-
console.error(
|
580
|
+
console.error('rpcRunServerDecodeBuffer', fnName, params.map(o => {
|
581
|
+
if (typeof o == 'function') { return 'function' }
|
582
|
+
return o
|
583
|
+
}), error)
|
574
584
|
box = {
|
575
585
|
id: dataId,
|
576
586
|
type: RPC_TYPE_ERROR,
|
577
587
|
data: buildRpcItemData([error.message, error.stack]),
|
578
588
|
}
|
579
589
|
}
|
590
|
+
if (logger) {
|
591
|
+
logger(`time: ${Date.now() - time}ms ${fnName}(${params.map(o => {
|
592
|
+
if (typeof o == 'function') { return Function }
|
593
|
+
return o
|
594
|
+
}).join(', ')})`)
|
595
|
+
}
|
580
596
|
await writer.write(buildRpcData(box))
|
581
597
|
}
|
582
598
|
|
@@ -618,6 +634,8 @@ export function createRPCProxy(apiInvoke) {
|
|
618
634
|
* @param {{
|
619
635
|
* rpcKey: string;
|
620
636
|
* extension: object;
|
637
|
+
* logger?: (msg:string)=>void;
|
638
|
+
* async?: boolean;
|
621
639
|
* }} param
|
622
640
|
*/
|
623
641
|
export function createRpcServerHelper(param) {
|
@@ -627,12 +645,16 @@ export function createRpcServerHelper(param) {
|
|
627
645
|
let writer = encode.writable.getWriter()
|
628
646
|
decode.readable.pipeTo(new WritableStream({
|
629
647
|
async write(buffer) {
|
630
|
-
|
648
|
+
if (param.async) {
|
649
|
+
rpcRunServerDecodeBuffer(param.extension, writer, buffer, param.logger).catch(console.error)
|
650
|
+
} else {
|
651
|
+
await rpcRunServerDecodeBuffer(param.extension, writer, buffer, param.logger)
|
652
|
+
}
|
631
653
|
},
|
632
654
|
async close() {
|
633
655
|
await writer.close()
|
634
656
|
}
|
635
|
-
}))
|
657
|
+
})).catch(console.error)
|
636
658
|
|
637
659
|
/** @type{RPC_HELPER_SERVER} */
|
638
660
|
let ret = { writable: decode.writable, readable: encode.readable }
|
@@ -762,6 +784,7 @@ export function createRpcClientHelper(param) {
|
|
762
784
|
* url:string;
|
763
785
|
* rpcKey:string;
|
764
786
|
* signal:AbortSignal;
|
787
|
+
* intercept?:(e:Event)=>void;
|
765
788
|
* }} param
|
766
789
|
*/
|
767
790
|
export function createRpcClientWebSocket(param) {
|
@@ -797,6 +820,9 @@ export function createRpcClientWebSocket(param) {
|
|
797
820
|
signal.resolve()
|
798
821
|
})
|
799
822
|
ws.addEventListener('error', (e) => {
|
823
|
+
if (param.intercept) {
|
824
|
+
param.intercept(e)
|
825
|
+
}
|
800
826
|
console.error('createRpcClientWebSocket createWebSocket ws error', e)
|
801
827
|
promise.resolve()
|
802
828
|
})
|
package/src/server.js
CHANGED
@@ -25,7 +25,7 @@ export function createRpcServerWebSocket(param) {
|
|
25
25
|
if (url != param.path) {
|
26
26
|
return
|
27
27
|
}
|
28
|
-
let helper = createRpcServerHelper({ rpcKey: param.rpcKey, extension: param.extension })
|
28
|
+
let helper = createRpcServerHelper({ rpcKey: param.rpcKey, extension: param.extension, async: true, })
|
29
29
|
let writer = helper.writable.getWriter()
|
30
30
|
helper.readable.pipeTo(new WritableStream({
|
31
31
|
async write(chunk) {
|
@@ -58,19 +58,24 @@ export function createRpcServerWebSocket(param) {
|
|
58
58
|
* path: string;
|
59
59
|
* router: Router<any, {}>;
|
60
60
|
* rpcKey?:string;
|
61
|
+
* logger?:(msg:string)=>void;
|
61
62
|
* extension: Object;
|
62
63
|
* }} param
|
63
64
|
*/
|
64
65
|
export function createRpcServerKoaRouter(param) {
|
65
66
|
param.router.post(param.path, async (ctx) => {
|
66
|
-
let helper = createRpcServerHelper({ rpcKey: param.rpcKey, extension: param.extension })
|
67
|
-
|
67
|
+
let helper = createRpcServerHelper({ rpcKey: param.rpcKey, extension: param.extension, logger: param.logger })
|
68
|
+
/** @type{ReadableStream} */
|
69
|
+
let a = Readable.toWeb(ctx.req)
|
70
|
+
await a.pipeTo(helper.writable)
|
68
71
|
ctx.status = 200
|
69
72
|
ctx.response.set({
|
70
73
|
'Connection': 'keep-alive',
|
71
74
|
'Cache-Control': 'no-cache',
|
72
75
|
'Content-Type': 'application/octet-stream'
|
73
76
|
})
|
74
|
-
|
77
|
+
/** @type{object} */
|
78
|
+
let b = helper.readable
|
79
|
+
ctx.body = Readable.fromWeb(b)
|
75
80
|
})
|
76
81
|
}
|