@delight-rpc/child-process 0.6.5 → 0.7.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/lib/client.d.ts CHANGED
@@ -1,5 +1,3 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
- /// <reference types="node" resolution-mode="require"/>
3
1
  import * as DelightRPC from 'delight-rpc';
4
2
  import { ChildProcess } from 'child_process';
5
3
  import { CustomError } from '@blackglory/errors';
package/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/lib/server.d.ts CHANGED
@@ -1,5 +1,3 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
- /// <reference types="node" resolution-mode="require"/>
3
1
  import * as DelightRPC from 'delight-rpc';
4
2
  import { ChildProcess } from 'child_process';
5
3
  export declare function createServer<IAPI extends object>(api: DelightRPC.ImplementationOf<IAPI>, process: ChildProcess | NodeJS.Process, { parameterValidators, version, channel, ownPropsOnly }?: {
package/lib/server.js CHANGED
@@ -1,40 +1,51 @@
1
1
  import * as DelightRPC from 'delight-rpc';
2
- import { isntNull } from '@blackglory/prelude';
2
+ import { isntNull, pass } from '@blackglory/prelude';
3
3
  import { AbortController } from 'extra-abort';
4
+ import { HashMap } from '@blackglory/structures';
4
5
  export function createServer(api, process, { parameterValidators, version, channel, ownPropsOnly } = {}) {
5
- const idToController = new Map();
6
+ const channelIdToController = new HashMap(({ channel, id }) => JSON.stringify([channel, id]));
6
7
  process.on('message', handler);
7
8
  process.on('disconnect', () => {
8
- for (const controller of idToController.values()) {
9
+ for (const controller of channelIdToController.values()) {
9
10
  controller.abort();
10
11
  }
11
- idToController.clear();
12
+ channelIdToController.clear();
12
13
  });
13
14
  return () => process.off('message', handler);
14
15
  async function handler(message) {
15
16
  var _a;
16
17
  if (DelightRPC.isRequest(message) || DelightRPC.isBatchRequest(message)) {
17
18
  const controller = new AbortController();
18
- idToController.set(message.id, controller);
19
+ channelIdToController.set(message, controller);
19
20
  try {
20
21
  const result = await DelightRPC.createResponse(api, message, {
21
22
  parameterValidators,
22
23
  version,
23
24
  channel,
24
- ownPropsOnly
25
+ ownPropsOnly,
26
+ signal: controller.signal
25
27
  });
26
28
  if (isntNull(result)) {
27
- process.send(result);
29
+ process.send(result, err => {
30
+ if (err) {
31
+ if (err.code === 'ERR_IPC_CHANNEL_CLOSED') {
32
+ pass();
33
+ }
34
+ else {
35
+ throw err;
36
+ }
37
+ }
38
+ });
28
39
  }
29
40
  }
30
41
  finally {
31
- idToController.delete(message.id);
42
+ channelIdToController.delete(message);
32
43
  }
33
44
  }
34
45
  else if (DelightRPC.isAbort(message)) {
35
46
  if (DelightRPC.matchChannel(message, channel)) {
36
- (_a = idToController.get(message.id)) === null || _a === void 0 ? void 0 : _a.abort();
37
- idToController.delete(message.id);
47
+ (_a = channelIdToController.get(message)) === null || _a === void 0 ? void 0 : _a.abort();
48
+ channelIdToController.delete(message);
38
49
  }
39
50
  }
40
51
  }
package/lib/server.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,aAAa,CAAA;AAEzC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAE7C,MAAM,UAAU,YAAY,CAC1B,GAAsC,EACtC,OAAsC,EACtC,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,KAKjD,EAAE;IAEN,MAAM,cAAc,GAAiC,IAAI,GAAG,EAAE,CAAA;IAE9D,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IAC9B,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE;QAC5B,KAAK,MAAM,UAAU,IAAI,cAAc,CAAC,MAAM,EAAE,EAAE;YAChD,UAAU,CAAC,KAAK,EAAE,CAAA;SACnB;QAED,cAAc,CAAC,KAAK,EAAE,CAAA;IACxB,CAAC,CAAC,CAAA;IACF,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IAE5C,KAAK,UAAU,OAAO,CAAC,OAAgB;;QACrC,IAAI,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE;YACvE,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;YACxC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC,CAAA;YAE1C,IAAI;gBACF,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,cAAc,CAC5C,GAAG,EACH,OAAO,EACP;oBACE,mBAAmB;oBACnB,OAAO;oBACP,OAAO;oBACP,YAAY;iBACb,CACF,CAAA;gBAED,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE;oBACpB,OAAO,CAAC,IAAK,CAAC,MAAM,CAAC,CAAA;iBACtB;aACF;oBAAS;gBACR,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;aAClC;SACF;aAAM,IAAI,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YACtC,IAAI,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE;gBAC7C,MAAA,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,0CAAE,KAAK,EAAE,CAAA;gBACvC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;aAClC;SACF;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,aAAa,CAAA;AAEzC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAEhD,MAAM,UAAU,YAAY,CAC1B,GAAsC,EACtC,OAAsC,EACtC,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,KAKjD,EAAE;IAEN,MAAM,qBAAqB,GAMvB,IAAI,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;IAEnE,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IAC9B,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE;QAC5B,KAAK,MAAM,UAAU,IAAI,qBAAqB,CAAC,MAAM,EAAE,EAAE,CAAC;YACxD,UAAU,CAAC,KAAK,EAAE,CAAA;QACpB,CAAC;QAED,qBAAqB,CAAC,KAAK,EAAE,CAAA;IAC/B,CAAC,CAAC,CAAA;IACF,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IAE5C,KAAK,UAAU,OAAO,CAAC,OAAgB;;QACrC,IAAI,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;YACxE,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;YACxC,qBAAqB,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;YAE9C,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,cAAc,CAC5C,GAAG,EACH,OAAO,EACP;oBACE,mBAAmB;oBACnB,OAAO;oBACP,OAAO;oBACP,YAAY;oBACZ,MAAM,EAAE,UAAU,CAAC,MAAM;iBAC1B,CACF,CAAA;gBAED,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBAErB,OAAO,CAAC,IAAK,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE;wBAC1B,IAAI,GAAG,EAAE,CAAC;4BACR,IAAK,GAA6B,CAAC,IAAI,KAAK,wBAAwB,EAAE,CAAC;gCACrE,IAAI,EAAE,CAAA;4BACR,CAAC;iCAAM,CAAC;gCACN,MAAM,GAAG,CAAA;4BACX,CAAC;wBACH,CAAC;oBACH,CAAC,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,qBAAqB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YACvC,CAAC;QACH,CAAC;aAAM,IAAI,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,IAAI,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;gBAC9C,MAAA,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,0CAAE,KAAK,EAAE,CAAA;gBAC3C,qBAAqB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YACvC,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@delight-rpc/child-process",
3
- "version": "0.6.5",
3
+ "version": "0.7.0",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "files": [
@@ -12,7 +12,7 @@
12
12
  "types": "lib/index.d.ts",
13
13
  "sideEffects": false,
14
14
  "engines": {
15
- "node": ">=16"
15
+ "node": ">=22"
16
16
  },
17
17
  "repository": "git@github.com:delight-rpc/child-process.git",
18
18
  "author": "BlackGlory <woshenmedoubuzhidao@blackglory.me>",
@@ -20,8 +20,7 @@
20
20
  "scripts": {
21
21
  "prepare": "ts-patch install -s",
22
22
  "lint": "eslint --ext .js,.jsx,.ts,.tsx --quiet src",
23
- "test": "cross-env NODE_OPTIONS='--experimental-vm-modules --loader ts-node/esm' jest --runInBand --config jest.config.cjs",
24
- "test:debug": "cross-env NODE_OPTIONS='--experimental-vm-modules --loader ts-node/esm' node --inspect-brk node_modules/.bin/jest --runInBand --config jest.config.cjs",
23
+ "test": "vitest run",
25
24
  "prepublishOnly": "run-s prepare clean build",
26
25
  "clean": "rimraf lib",
27
26
  "build": "tsc --project tsconfig.build.json",
@@ -34,37 +33,34 @@
34
33
  }
35
34
  },
36
35
  "devDependencies": {
37
- "@blackglory/jest-resolver": "^0.3.0",
38
- "@commitlint/cli": "^17.4.4",
39
- "@commitlint/config-conventional": "^17.4.4",
40
- "@types/jest": "^29.5.0",
41
- "@types/node": "16",
42
- "@typescript-eslint/eslint-plugin": "^5.55.0",
43
- "@typescript-eslint/parser": "^5.55.0",
44
- "cross-env": "^7.0.3",
45
- "delight-rpc": "^6.0.0",
46
- "eslint": "8.36.0",
36
+ "@commitlint/cli": "^20.4.2",
37
+ "@commitlint/config-conventional": "^20.4.2",
38
+ "@eslint/js": "^10.0.1",
39
+ "@types/node": "22",
40
+ "delight-rpc": "^7.0.0",
41
+ "eslint": "^10.0.2",
47
42
  "husky": "4",
48
- "jest": "^29.5.0",
49
- "jest-resolve": "^29.5.0",
50
43
  "npm-run-all": "^4.1.5",
51
- "return-style": "^3.0.0",
52
- "rimraf": "^3.0.2",
44
+ "return-style": "^4.0.0",
45
+ "rimraf": "^6.1.3",
53
46
  "standard-version": "^9.5.0",
54
- "ts-jest": "^29.0.3",
55
- "ts-node": "^10.9.1",
56
- "ts-patch": "^2.1.0",
57
- "typescript": "4.8",
58
- "typescript-transform-paths": "^3.4.4"
47
+ "ts-patch": "^3.3.0",
48
+ "typescript": "^5.9.3",
49
+ "typescript-eslint": "^8.56.1",
50
+ "typescript-transform-paths": "^3.5.6",
51
+ "vite": "^7.3.1",
52
+ "vite-tsconfig-paths": "^6.1.1",
53
+ "vitest": "^4.0.18"
59
54
  },
60
55
  "dependencies": {
61
- "@blackglory/errors": "^3.0.0",
62
- "@blackglory/prelude": "^0.3.1",
56
+ "@blackglory/errors": "^3.1.0",
57
+ "@blackglory/prelude": "^0.4.0",
58
+ "@blackglory/structures": "^0.14.13",
63
59
  "@delight-rpc/protocol": "^4.0.0",
64
- "extra-abort": "^0.3.2",
65
- "extra-promise": "^6.0.5"
60
+ "extra-abort": "^0.4.1",
61
+ "extra-promise": "^7.1.1"
66
62
  },
67
63
  "peerDependencies": {
68
- "delight-rpc": "^5.0.0 || ^6.0.0"
64
+ "delight-rpc": "^5.0.0 || ^6.0.0 || ^7.0.0"
69
65
  }
70
66
  }
package/src/server.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  import * as DelightRPC from 'delight-rpc'
2
2
  import { ChildProcess } from 'child_process'
3
- import { isntNull } from '@blackglory/prelude'
3
+ import { isntNull, pass } from '@blackglory/prelude'
4
4
  import { AbortController } from 'extra-abort'
5
+ import { HashMap } from '@blackglory/structures'
5
6
 
6
7
  export function createServer<IAPI extends object>(
7
8
  api: DelightRPC.ImplementationOf<IAPI>
@@ -13,22 +14,28 @@ export function createServer<IAPI extends object>(
13
14
  ownPropsOnly?: boolean
14
15
  } = {}
15
16
  ): () => void {
16
- const idToController: Map<string, AbortController> = new Map()
17
+ const channelIdToController: HashMap<
18
+ {
19
+ channel?: string
20
+ , id: string
21
+ }
22
+ , AbortController
23
+ > = new HashMap(({ channel, id }) => JSON.stringify([channel, id]))
17
24
 
18
25
  process.on('message', handler)
19
26
  process.on('disconnect', () => {
20
- for (const controller of idToController.values()) {
27
+ for (const controller of channelIdToController.values()) {
21
28
  controller.abort()
22
29
  }
23
30
 
24
- idToController.clear()
31
+ channelIdToController.clear()
25
32
  })
26
33
  return () => process.off('message', handler)
27
34
 
28
35
  async function handler(message: unknown): Promise<void> {
29
36
  if (DelightRPC.isRequest(message) || DelightRPC.isBatchRequest(message)) {
30
37
  const controller = new AbortController()
31
- idToController.set(message.id, controller)
38
+ channelIdToController.set(message, controller)
32
39
 
33
40
  try {
34
41
  const result = await DelightRPC.createResponse(
@@ -39,19 +46,29 @@ export function createServer<IAPI extends object>(
39
46
  , version
40
47
  , channel
41
48
  , ownPropsOnly
49
+ , signal: controller.signal
42
50
  }
43
51
  )
44
52
 
45
53
  if (isntNull(result)) {
46
- process.send!(result)
54
+ // @ts-expect-error TypeScript无法正确合并`ChildProcess` 和 `NodeJS.Process`的send方法.
55
+ process.send!(result, err => {
56
+ if (err) {
57
+ if ((err as NodeJS.ErrnoException).code === 'ERR_IPC_CHANNEL_CLOSED') {
58
+ pass()
59
+ } else {
60
+ throw err
61
+ }
62
+ }
63
+ })
47
64
  }
48
65
  } finally {
49
- idToController.delete(message.id)
66
+ channelIdToController.delete(message)
50
67
  }
51
68
  } else if (DelightRPC.isAbort(message)) {
52
69
  if (DelightRPC.matchChannel(message, channel)) {
53
- idToController.get(message.id)?.abort()
54
- idToController.delete(message.id)
70
+ channelIdToController.get(message)?.abort()
71
+ channelIdToController.delete(message)
55
72
  }
56
73
  }
57
74
  }