@procedures/client 0.3.0 → 0.4.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.
Files changed (120) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +16 -6
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/adapters/http/server/transport.d.ts.map +1 -1
  5. package/dist/adapters/http/server/transport.js +2 -3
  6. package/dist/adapters/http/server/transport.js.map +1 -1
  7. package/dist/adapters/local/client/transport.d.ts.map +1 -1
  8. package/dist/adapters/local/client/transport.js +4 -2
  9. package/dist/adapters/local/client/transport.js.map +1 -1
  10. package/dist/adapters/websocket/client/node.d.ts +30 -0
  11. package/dist/adapters/websocket/client/node.d.ts.map +1 -0
  12. package/dist/adapters/websocket/client/node.js +32 -0
  13. package/dist/adapters/websocket/client/node.js.map +1 -0
  14. package/dist/adapters/websocket/client/transport.d.ts.map +1 -1
  15. package/dist/adapters/websocket/client/transport.js +17 -9
  16. package/dist/adapters/websocket/client/transport.js.map +1 -1
  17. package/dist/adapters/websocket/client/types.d.ts +3 -2
  18. package/dist/adapters/websocket/client/types.d.ts.map +1 -1
  19. package/dist/adapters/websocket/client/types.js.map +1 -1
  20. package/dist/client/errors/http-errors.d.ts.map +1 -1
  21. package/dist/client/errors/http-errors.js +6 -0
  22. package/dist/client/errors/http-errors.js.map +1 -1
  23. package/dist/client/errors/index.d.ts +1 -1
  24. package/dist/client/errors/index.js +1 -1
  25. package/dist/client/errors/registry.d.ts +2 -1
  26. package/dist/client/errors/registry.d.ts.map +1 -1
  27. package/dist/client/errors/registry.js +72 -22
  28. package/dist/client/errors/registry.js.map +1 -1
  29. package/dist/client/middleware/rate-limit.d.ts.map +1 -1
  30. package/dist/client/middleware/rate-limit.js +0 -1
  31. package/dist/client/middleware/rate-limit.js.map +1 -1
  32. package/dist/client/middleware/timeout.d.ts.map +1 -1
  33. package/dist/client/middleware/timeout.js +2 -9
  34. package/dist/client/middleware/timeout.js.map +1 -1
  35. package/dist/index.d.ts +4 -0
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +4 -0
  38. package/dist/index.js.map +1 -1
  39. package/dist/node.d.ts +11 -0
  40. package/dist/node.d.ts.map +1 -0
  41. package/dist/node.js +10 -0
  42. package/dist/node.js.map +1 -0
  43. package/dist/procedures/core/array.d.ts +1 -1
  44. package/dist/procedures/core/array.d.ts.map +1 -1
  45. package/dist/procedures/core/array.js +56 -15
  46. package/dist/procedures/core/array.js.map +1 -1
  47. package/dist/procedures/core/index.d.ts.map +1 -1
  48. package/dist/procedures/core/index.js +9 -2
  49. package/dist/procedures/core/index.js.map +1 -1
  50. package/dist/procedures/core/logic.js +1 -1
  51. package/dist/procedures/core/logic.js.map +1 -1
  52. package/dist/procedures/core/math.d.ts.map +1 -1
  53. package/dist/procedures/core/math.js +5 -1
  54. package/dist/procedures/core/math.js.map +1 -1
  55. package/dist/procedures/core/meta.d.ts.map +1 -1
  56. package/dist/procedures/core/meta.js +41 -7
  57. package/dist/procedures/core/meta.js.map +1 -1
  58. package/dist/procedures/core/type.d.ts.map +1 -1
  59. package/dist/procedures/core/type.js +4 -2
  60. package/dist/procedures/core/type.js.map +1 -1
  61. package/dist/procedures/discovery.d.ts +4 -6
  62. package/dist/procedures/discovery.d.ts.map +1 -1
  63. package/dist/procedures/discovery.js +4 -6
  64. package/dist/procedures/discovery.js.map +1 -1
  65. package/dist/procedures/ref.d.ts +4 -2
  66. package/dist/procedures/ref.d.ts.map +1 -1
  67. package/dist/procedures/ref.js +2 -1
  68. package/dist/procedures/ref.js.map +1 -1
  69. package/dist/protocol.d.ts +9 -2
  70. package/dist/protocol.d.ts.map +1 -1
  71. package/dist/protocol.js +12 -2
  72. package/dist/protocol.js.map +1 -1
  73. package/dist/server/procedure-server.d.ts +2 -1
  74. package/dist/server/procedure-server.d.ts.map +1 -1
  75. package/dist/server/procedure-server.js +4 -2
  76. package/dist/server/procedure-server.js.map +1 -1
  77. package/package.json +5 -4
  78. package/src/adapters/http/server/transport.ts +2 -3
  79. package/src/adapters/local/client/transport.ts +4 -2
  80. package/src/adapters/websocket/client/node.ts +34 -0
  81. package/src/adapters/websocket/client/transport.ts +20 -9
  82. package/src/adapters/websocket/client/types.ts +3 -2
  83. package/src/client/errors/README.md +2 -0
  84. package/src/client/errors/http-errors.ts +5 -0
  85. package/src/client/errors/index.ts +1 -1
  86. package/src/client/errors/registry.ts +79 -22
  87. package/src/client/middleware/rate-limit.ts +0 -2
  88. package/src/client/middleware/timeout.ts +2 -9
  89. package/src/index.ts +4 -0
  90. package/src/node.ts +11 -0
  91. package/src/procedures/core/array.ts +53 -16
  92. package/src/procedures/core/index.ts +9 -2
  93. package/src/procedures/core/logic.ts +1 -1
  94. package/src/procedures/core/math.ts +5 -1
  95. package/src/procedures/core/meta.ts +43 -7
  96. package/src/procedures/core/type.ts +4 -2
  97. package/src/procedures/discovery.ts +4 -6
  98. package/src/procedures/ref.ts +4 -2
  99. package/src/protocol.ts +13 -2
  100. package/src/server/procedure-server.ts +4 -2
  101. package/dist/procedures/cli/announce.d.ts +0 -67
  102. package/dist/procedures/cli/announce.d.ts.map +0 -1
  103. package/dist/procedures/cli/announce.js +0 -392
  104. package/dist/procedures/cli/announce.js.map +0 -1
  105. package/dist/procedures/cli/discover.d.ts +0 -66
  106. package/dist/procedures/cli/discover.d.ts.map +0 -1
  107. package/dist/procedures/cli/discover.js +0 -310
  108. package/dist/procedures/cli/discover.js.map +0 -1
  109. package/dist/procedures/cli/index.d.ts +0 -13
  110. package/dist/procedures/cli/index.d.ts.map +0 -1
  111. package/dist/procedures/cli/index.js +0 -203
  112. package/dist/procedures/cli/index.js.map +0 -1
  113. package/dist/procedures/cli/init.d.ts +0 -17
  114. package/dist/procedures/cli/init.d.ts.map +0 -1
  115. package/dist/procedures/cli/init.js +0 -336
  116. package/dist/procedures/cli/init.js.map +0 -1
  117. package/src/procedures/cli/announce.ts +0 -470
  118. package/src/procedures/cli/discover.ts +0 -390
  119. package/src/procedures/cli/index.ts +0 -231
  120. package/src/procedures/cli/init.ts +0 -370
package/CHANGELOG.md CHANGED
@@ -1,5 +1,34 @@
1
1
  # @procedures/client
2
2
 
3
+ ## 0.4.0
4
+
5
+ ### Minor Changes
6
+
7
+ - d919678: `ERROR_REGISTRY` agrees with `ERROR_CODES` of the wire protocol. `ERROR_CODES` is the source: the registry has an entry for each code of the protocol, and that entry takes its HTTP status and its retry flag from `ERROR_CODES`. Changes that a caller sees:
8
+
9
+ - `TIMEOUT` has the status 504 and is not retryable (before: 408, retryable).
10
+ - `INTERNAL_ERROR` is not retryable (before: retryable).
11
+ - `ABORTED` has the status 499 (before: none).
12
+ - The codes of the protocol that the registry did not have (`HANDLER_ERROR`, `VALIDATION_ERROR`, `UNAVAILABLE` and the others) have entries, with the meaning of the protocol as their texts.
13
+ - `errorCodeToHTTPStatus` gives the status of `ERROR_CODES` for a code of the protocol, for example 504 for `TIMEOUT`.
14
+ - b2a1a1e: A handler error keeps its own code on each face, as `WIRE-PROTOCOL.md` says. `errorResponse` (the server, and through it HTTP, WebSocket and MCP) and `LocalTransport` give the code of the thrown error when it is a string. Before, they changed it to `HANDLER_ERROR` for a value, and `LocalTransport` also for a stream. An error without a code is still `HANDLER_ERROR`.
15
+
16
+ The HTTP status follows the code: a code of `ERROR_CODES` gets its status, another code of `ERROR_REGISTRY` gets the status of the registry, and each other code gets 500. For example, a handler error with the code `UNAVAILABLE` now gives 503.
17
+ - 057d69a: `client.import` gives `success: true` only for a procedure reference: an object whose `$proc` is a list of texts. Other JSON, for example `42`, an object without `$proc` or a list of calls, gives `success: false` and an error. Before, each JSON value gave `success: true`.
18
+ - 057d69a: `client.isObject` gives true only for a plain object: an object literal, or an object without a prototype. A `Date`, a `Map` or another class instance gives false. Before, each object that is not an array gave true.
19
+ - 057d69a: `client.stringifyJson` and `client.export` refuse a missing value (undefined) with `VALIDATION_ERROR`, because undefined has no JSON text. Before, the call failed with `OUTPUT_VALIDATION_ERROR`. The `value` field of `client.stringifyJson` and the `procedure` field of `client.export` are now required. A value without JSON text, for example a function, gives an error from `client.stringifyJson` and an error result from `client.export`.
20
+ - 057d69a: `client.mod` refuses `b = 0` with the error `Division by zero`, as `client.divide` does. Before, it gave `NaN`.
21
+ - afd6a19: The `client-registry` command is removed. `mark` finds the packages, and the `/register` entries register them.
22
+ - 057d69a: `client.unique` compares the items by value: two equal JSON values are duplicates. An array compares by its items in order, and a plain object by its fields in any order. With `key`, the values of the field compare by value too. The result keeps the first item of each value, in the order of the input. Before, objects and arrays compared by reference, so two equal objects both stayed.
23
+ - 4e751da: The new entry `@procedures/client/node` exports a `WebSocketTransport` whose sockets are of the `WebSocket` class of the `ws` package. A Node application gets `terminate()` without the option `webSocket`: a drop by the heartbeat or by the time limit of the handshake ends the socket at once. The option `webSocket` still gives another class. The other entries keep the global `WebSocket`, and the browser entry does not import `ws`.
24
+
25
+ A socket of the `ws` package that closes during its handshake emits an error. Before, the transport removed its error handler first, so a handshake timeout or a `close()` during the handshake ended the process with an uncaught error. The transport now keeps a handler that ignores that error.
26
+
27
+ ### Patch Changes
28
+
29
+ - 057d69a: The description of the `match` field of `client.filter` lists all 11 modes. Before, it did not name `gt`, `gte`, `lt` and `lte`.
30
+ - 057d69a: The input schemas of `client.not`, `client.all`, `client.any` and `client.none` say "values", not "values or calls". These procedures do not run a call in their operands: a call is an object, thus truthy. In a program, the calls of their input run first, as for each procedure that is not control flow. `client.and` and `client.or` run calls. The behavior does not change.
31
+
3
32
  ## 0.3.0
4
33
 
5
34
  ### Minor Changes
package/README.md CHANGED
@@ -267,8 +267,14 @@ interface WebSocketTransportOptions {
267
267
  timeout?: number; // default: 5000ms
268
268
  misses?: number; // default: 1; pings without a pong that drop the connection
269
269
  };
270
+ webSocket?: WebSocketClass; // the class of the sockets; default: the global WebSocket
270
271
  }
271
272
 
273
+ // In Node, import the transport of the Node entry. Its sockets are of the `ws` package, so a
274
+ // drop ends a socket at once with terminate(). The global WebSocket has only close(): with a
275
+ // dead peer, its socket stays open until the kernel stops it (924.6 s in the cells of R36).
276
+ import { WebSocketTransport } from "@procedures/client/node";
277
+
272
278
  // The server pings each connection, and closes one that misses 2 pongs (option heartbeat)
273
279
  new WebSocketServerTransport(server, { server: http, heartbeat: { interval: seconds(30), misses: 2 } });
274
280
 
@@ -587,22 +593,26 @@ import { ... } from "@procedures/client/procedures";
587
593
  import { ... } from "@procedures/client/events";
588
594
  ```
589
595
 
590
- ## Procedure Auto-Discovery
596
+ | Entry | Use |
597
+ |---|---|
598
+ | `@procedures/client` | Node. The browser entry and the server transports. Its `WebSocketTransport` uses the global `WebSocket`. |
599
+ | `@procedures/client/browser` | A browser bundle. It does not import `http` or `ws`. |
600
+ | `@procedures/client/node` | Node. A `WebSocketTransport` whose sockets are of the `ws` package: a drop ends a socket at once. |
601
+ | `@procedures/client/register` | It registers the core procedures in the global registry. |
602
+
603
+ ## Procedure Discovery
591
604
 
592
- Packages can declare procedures in `package.json`:
605
+ A package declares its procedures in `package.json`:
593
606
 
594
607
  ```json
595
608
  {
596
609
  "client": {
597
610
  "procedures": "./dist/register.js"
598
- },
599
- "scripts": {
600
- "postinstall": "client-registry announce"
601
611
  }
602
612
  }
603
613
  ```
604
614
 
605
- When installed, the package announces its procedures in `.client-registry.json`. Run `client-registry discover` to generate a file that imports the register entry of each announced package.
615
+ The `mark` CLI finds the packages by the `client.procedures` field. An app imports the `/register` entry of each package that it uses, for example `import "@procedures/fs/register"`.
606
616
 
607
617
  ## Type-Safe Middleware
608
618