js-rpc2 1.0.5 → 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 +1 -1
- package/src/lib.js +33 -9
- package/src/server.js +3 -2
package/package.json
CHANGED
package/src/lib.js
CHANGED
@@ -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,14 +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
|
-
})).catch(
|
636
|
-
console.error(e)
|
637
|
-
})
|
657
|
+
})).catch(console.error)
|
638
658
|
|
639
659
|
/** @type{RPC_HELPER_SERVER} */
|
640
660
|
let ret = { writable: decode.writable, readable: encode.readable }
|
@@ -764,6 +784,7 @@ export function createRpcClientHelper(param) {
|
|
764
784
|
* url:string;
|
765
785
|
* rpcKey:string;
|
766
786
|
* signal:AbortSignal;
|
787
|
+
* intercept?:(e:Event)=>void;
|
767
788
|
* }} param
|
768
789
|
*/
|
769
790
|
export function createRpcClientWebSocket(param) {
|
@@ -799,6 +820,9 @@ export function createRpcClientWebSocket(param) {
|
|
799
820
|
signal.resolve()
|
800
821
|
})
|
801
822
|
ws.addEventListener('error', (e) => {
|
823
|
+
if (param.intercept) {
|
824
|
+
param.intercept(e)
|
825
|
+
}
|
802
826
|
console.error('createRpcClientWebSocket createWebSocket ws error', e)
|
803
827
|
promise.resolve()
|
804
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,12 +58,13 @@ 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
|
+
let helper = createRpcServerHelper({ rpcKey: param.rpcKey, extension: param.extension, logger: param.logger })
|
67
68
|
/** @type{ReadableStream} */
|
68
69
|
let a = Readable.toWeb(ctx.req)
|
69
70
|
await a.pipeTo(helper.writable)
|