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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "js-rpc2",
3
- "version": "1.0.4",
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.9.4",
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
- let fnName = items.at(0).data
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
- await writer.write(buildRpcData(box))
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(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
- await rpcRunServerDecodeBuffer(param.extension, writer, buffer)
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
- await Readable.toWeb(ctx.req).pipeTo(helper.writable)
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
- ctx.body = Readable.fromWeb(helper.readable)
77
+ /** @type{object} */
78
+ let b = helper.readable
79
+ ctx.body = Readable.fromWeb(b)
75
80
  })
76
81
  }