@openclaw/discord 2026.9.1-beta.1 → 2026.9.2

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 (165) hide show
  1. package/dist/account-inspect-BY-ve3yH.js +45 -0
  2. package/dist/account-inspect-api.js +1 -1
  3. package/dist/{accounts-CfQ-vSyf.js → accounts-CwJQoLjM.js} +89 -45
  4. package/dist/action-runtime-api.js +1 -1
  5. package/dist/{activities-api-q-9PaaHH.js → activities-api-CTcGq3Hf.js} +30 -17
  6. package/dist/activities-api.js +1 -1
  7. package/dist/{allow-list-BDMimASD.js → allow-list-DBTtR2dz.js} +13 -35
  8. package/dist/{api-DNVbJyEy.js → api-BfmEP6wp.js} +6 -5
  9. package/dist/api.js +18 -18
  10. package/dist/{approval-handler.runtime-B7qhK3fR.js → approval-handler.runtime-DUSe5fyH.js} +19 -12
  11. package/dist/{audit-CBEv_ERu.js → audit-DpPfwoJM.js} +8 -7
  12. package/dist/{channel-Dx1tMTfx.js → channel-BHajPgwR.js} +29 -23
  13. package/dist/{channel-actions.runtime-CLWWu9nC.js → channel-actions.runtime-DS8pXo0S.js} +38 -38
  14. package/dist/channel-config-api.js +1 -1
  15. package/dist/channel-plugin-api.js +1 -1
  16. package/dist/{channel.setup-DOzXS2Pk.js → channel.setup-BWmMe1tT.js} +18 -18
  17. package/dist/command-owners-D78sAoOz.js +10 -0
  18. package/dist/{components-B9V5o361.js → components-BimX47Mq.js} +111 -149
  19. package/dist/{config-schema-BR13IAx6.js → config-schema-B797-Spt.js} +19 -12
  20. package/dist/{conversation-binding-route-DJYrY2TQ.js → conversation-binding-route-DuR5NGIx.js} +1 -1
  21. package/dist/{directory-config-BK6eqekJ.js → directory-config-CD2v2Szs.js} +2 -2
  22. package/dist/directory-contract-api.js +1 -1
  23. package/dist/{directory-live-DSAJSrJk.js → directory-live-DaJzWJ2N.js} +4 -4
  24. package/dist/{doctor-Cm7Y1pJ2.js → doctor-D4HH1inA.js} +9 -6
  25. package/dist/{doctor-contract-DsWvKIXF.js → doctor-contract-Co5vRCZ6.js} +9 -6
  26. package/dist/doctor-contract-api.js +31 -28
  27. package/dist/{handle-action.guild-admin-BdwCRHmm.js → handle-action.guild-admin-4We6wWQU.js} +6 -3
  28. package/dist/index.js +1 -1
  29. package/dist/ingress-identity-XNmW-mZS.js +60 -0
  30. package/dist/{message-handler-BXpWZyni.js → message-handler-DhgBabyU.js} +61 -70
  31. package/dist/{message-handler.preflight-Ba5LAY_X.js → message-handler.preflight-oZ7dQCd0.js} +41 -101
  32. package/dist/{message-handler.process-3HEzmemS.js → message-handler.process-BzCYf1pa.js} +82 -108
  33. package/dist/{message-text-aiwO5R2F.js → message-text-DK4NnBg-.js} +11 -6
  34. package/dist/{outbound-adapter-BE4jSq2d.js → outbound-adapter-CtggmGh9.js} +52 -67
  35. package/dist/{outbound-components-oLpg8Qzb.js → outbound-components-Dn8SJWMS.js} +5 -4
  36. package/dist/{outbound-session-route-Cg15ZFJd.js → outbound-session-route-Q_HEusBQ.js} +57 -15
  37. package/dist/{owner-access-UlYi9t0M.js → owner-access-Cp8r6Ipf.js} +9 -7
  38. package/dist/{pluralkit-Tiyl70dx.js → pluralkit-BY75YcK0.js} +2 -2
  39. package/dist/{probe-n6ZXxK8V.js → probe-3ovFAp3b.js} +3 -3
  40. package/dist/{probe.runtime-CN4bdPfZ.js → probe.runtime-BckHn3cJ.js} +1 -1
  41. package/dist/{provider-session.runtime-B9xe-Qaf.js → provider-session.runtime-BL2lHBH7.js} +3 -3
  42. package/dist/{provider-B11xwilq.js → provider-uKmmrDM4.js} +299 -136
  43. package/dist/provider.runtime-C-IkWF2w.js +2 -0
  44. package/dist/{realtime-session.runtime-CU8IQUS-.js → realtime-session.runtime-CGYm1t_0.js} +798 -448
  45. package/dist/{resolve-allowlist-common-BLoYaxEG.js → resolve-allowlist-common-sKIKy-cF.js} +3 -3
  46. package/dist/{resolve-channels-C2sT_n67.js → resolve-channels-CoiMlWy0.js} +4 -4
  47. package/dist/{resolve-users-CzpjLwjy.js → resolve-users-DJpiokfW.js} +5 -4
  48. package/dist/{retry-Cv4jCU5Z.js → retry-DQt1zDgH.js} +356 -214
  49. package/dist/{retry-after-DdLPmPoa.js → retry-after-BrLjLUJi.js} +2 -1
  50. package/dist/{runtime-CY4PRMF-.js → runtime-BHsdEdr5.js} +2 -2
  51. package/dist/{runtime-BHrTlFkf.js → runtime-Ghtfh5ZA.js} +151 -109
  52. package/dist/runtime-api.js +20 -20
  53. package/dist/{secret-config-contract-B3i6WxV5.js → secret-config-contract-DFu9hfU8.js} +14 -6
  54. package/dist/secret-contract-api.js +1 -1
  55. package/dist/{security-audit-BfJhAXZp.js → security-audit-DKfK-iPY.js} +10 -11
  56. package/dist/security-audit-contract-api.js +1 -1
  57. package/dist/{security-audit.runtime-BVKF9VtY.js → security-audit.runtime-sKZyKgpx.js} +1 -1
  58. package/dist/{send-C49MFF9j.js → send-CZeWKUiA.js} +132 -100
  59. package/dist/{send.components-DKKAw5VX.js → send.components-BG5IDABj.js} +21 -15
  60. package/dist/{send.outbound-zam0TrZx.js → send.outbound-DHuFUL6W.js} +42 -63
  61. package/dist/{send.shared-JjljcV4O.js → send.shared-B0n_fWzu.js} +77 -149
  62. package/dist/{sender-identity-BJtfyise.js → sender-identity-B8Ncfi63.js} +1 -1
  63. package/dist/setup-plugin-api.js +1 -1
  64. package/dist/{shared-_5EcP4jW.js → shared-C3dKun_X.js} +24 -15
  65. package/dist/{subagent-hooks-DQzvOptn.js → subagent-hooks-ZoQXEI1E.js} +2 -2
  66. package/dist/subagent-hooks-api.js +1 -1
  67. package/dist/{system-events-C7yxaHWP.js → system-events-DFF_awl7.js} +2 -2
  68. package/dist/{target-resolver-vxIh6O3-.js → target-resolver-DLtHDwMK.js} +6 -5
  69. package/dist/targets-BObRyaKX.js +3 -0
  70. package/dist/{thread-bindings-DW5F9vat.js → thread-bindings-DKvsNjQR.js} +7 -6
  71. package/dist/{thread-bindings.manager-ByOtwjo_.js → thread-bindings.manager-pbbRT5gb.js} +38 -29
  72. package/dist/{thread-bindings.session-updates-CJb-BpPL.js → thread-bindings.session-updates-t6jeFB1-.js} +3 -2
  73. package/dist/{thread-bindings.state-D8OMdk4O.js → thread-bindings.state-DtgOqsbX.js} +34 -1
  74. package/dist/{threading-agH1T_6s.js → threading-BCx49X-6.js} +8 -6
  75. package/dist/{timeouts-B9cy6RvQ.js → timeouts-D86uWLt_.js} +1 -1
  76. package/dist/{transcripts-source-BR11iHA4.js → transcripts-source-Dc6Nnli5.js} +55 -7
  77. package/dist/transcripts-source-api.js +1 -1
  78. package/dist/{typing-Dc_YMY2e.js → typing-CuopV-Hi.js} +2 -2
  79. package/dist/{voice-runtime-DIeaa8fJ.js → voice-runtime-BQnILUbG.js} +492 -105
  80. package/node_modules/@discord/embedded-app-sdk/node_modules/@types/lodash/README.md +1 -1
  81. package/node_modules/@discord/embedded-app-sdk/node_modules/@types/lodash/conforms.d.ts +2 -0
  82. package/node_modules/@discord/embedded-app-sdk/node_modules/@types/lodash/package.json +3 -3
  83. package/node_modules/@discord/embedded-app-sdk/node_modules/@types/lodash/stubArray.d.ts +2 -0
  84. package/node_modules/@discord/embedded-app-sdk/node_modules/@types/lodash/stubObject.d.ts +2 -0
  85. package/node_modules/@discord/embedded-app-sdk/node_modules/@types/lodash/stubString.d.ts +2 -0
  86. package/node_modules/@discordjs/voice/node_modules/@types/node/README.md +1 -1
  87. package/node_modules/@discordjs/voice/node_modules/@types/node/buffer.buffer.d.ts +5 -5
  88. package/node_modules/@discordjs/voice/node_modules/@types/node/crypto.d.ts +2 -2
  89. package/node_modules/@discordjs/voice/node_modules/@types/node/http.d.ts +16 -0
  90. package/node_modules/@discordjs/voice/node_modules/@types/node/http2.d.ts +10 -2
  91. package/node_modules/@discordjs/voice/node_modules/@types/node/package.json +2 -2
  92. package/node_modules/@discordjs/voice/node_modules/@types/node/process.d.ts +52 -0
  93. package/node_modules/@discordjs/voice/node_modules/@types/node/quic.d.ts +210 -28
  94. package/node_modules/@discordjs/voice/node_modules/@types/node/sqlite.d.ts +6 -2
  95. package/node_modules/@discordjs/voice/node_modules/@types/node/test.d.ts +36 -0
  96. package/node_modules/typebox/build/format/email.mjs +1 -1
  97. package/node_modules/typebox/build/format/idna/idn-hostname.mjs +19 -1
  98. package/node_modules/typebox/build/format/json_pointer.d.mts +2 -2
  99. package/node_modules/typebox/build/format/json_pointer.mjs +2 -2
  100. package/node_modules/typebox/build/format/json_pointer_uri_fragment.d.mts +2 -2
  101. package/node_modules/typebox/build/format/json_pointer_uri_fragment.mjs +2 -2
  102. package/node_modules/typebox/build/format/relative_json_pointer.d.mts +2 -2
  103. package/node_modules/typebox/build/format/relative_json_pointer.mjs +2 -2
  104. package/node_modules/typebox/build/system/memory/assign.mjs +2 -1
  105. package/node_modules/typebox/build/system/memory/create.mjs +3 -4
  106. package/node_modules/typebox/build/system/memory/discard.mjs +2 -2
  107. package/node_modules/typebox/build/system/memory/freeze.d.mts +4 -0
  108. package/node_modules/typebox/build/system/memory/freeze.mjs +6 -0
  109. package/node_modules/typebox/build/system/memory/update.mjs +3 -2
  110. package/node_modules/typebox/package.json +1 -1
  111. package/node_modules/undici/docs/docs/api/Client.md +4 -0
  112. package/node_modules/undici/docs/docs/api/EnvHttpProxyAgent.md +3 -2
  113. package/node_modules/undici/docs/docs/api/EventSource.md +4 -0
  114. package/node_modules/undici/docs/docs/api/Interceptors.md +7 -3
  115. package/node_modules/undici/docs/docs/api/Socks5ProxyAgent.md +7 -1
  116. package/node_modules/undici/lib/cache/memory-cache-store.js +2 -2
  117. package/node_modules/undici/lib/core/symbols.js +2 -0
  118. package/node_modules/undici/lib/dispatcher/agent.js +7 -2
  119. package/node_modules/undici/lib/dispatcher/balanced-pool.js +7 -4
  120. package/node_modules/undici/lib/dispatcher/client-h1.js +12 -4
  121. package/node_modules/undici/lib/dispatcher/client-h2.js +43 -3
  122. package/node_modules/undici/lib/dispatcher/client.js +3 -2
  123. package/node_modules/undici/lib/dispatcher/dispatcher-base.js +13 -1
  124. package/node_modules/undici/lib/dispatcher/dispatcher.js +15 -1
  125. package/node_modules/undici/lib/dispatcher/dispatcher1-wrapper.js +3 -0
  126. package/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +10 -3
  127. package/node_modules/undici/lib/dispatcher/proxy-agent.js +18 -1
  128. package/node_modules/undici/lib/dispatcher/retry-agent.js +3 -0
  129. package/node_modules/undici/lib/dispatcher/round-robin-pool.js +1 -1
  130. package/node_modules/undici/lib/dispatcher/socks5-proxy-agent.js +91 -21
  131. package/node_modules/undici/lib/handler/cache-handler.js +29 -5
  132. package/node_modules/undici/lib/handler/decorator-handler.js +7 -1
  133. package/node_modules/undici/lib/handler/deduplication-handler.js +12 -6
  134. package/node_modules/undici/lib/handler/redirect-handler.js +21 -4
  135. package/node_modules/undici/lib/handler/retry-handler.js +148 -30
  136. package/node_modules/undici/lib/interceptor/cache.js +65 -12
  137. package/node_modules/undici/lib/interceptor/decompress.js +115 -13
  138. package/node_modules/undici/lib/interceptor/deduplicate.js +5 -4
  139. package/node_modules/undici/lib/interceptor/dns.js +7 -0
  140. package/node_modules/undici/lib/interceptor/dump.js +10 -23
  141. package/node_modules/undici/lib/mock/mock-agent.js +13 -1
  142. package/node_modules/undici/lib/mock/mock-utils.js +11 -10
  143. package/node_modules/undici/lib/util/cache.js +45 -3
  144. package/node_modules/undici/lib/web/cookies/parse.js +150 -147
  145. package/node_modules/undici/lib/web/eventsource/eventsource-stream.js +28 -1
  146. package/node_modules/undici/lib/web/eventsource/eventsource.js +13 -3
  147. package/node_modules/undici/lib/web/fetch/index.js +6 -0
  148. package/node_modules/undici/lib/web/fetch/request.js +2 -3
  149. package/node_modules/undici/lib/web/fetch/util.js +6 -1
  150. package/node_modules/undici/lib/web/webidl/index.js +3 -3
  151. package/node_modules/undici/lib/web/websocket/connection.js +1 -1
  152. package/node_modules/undici/lib/web/websocket/permessage-deflate.js +5 -0
  153. package/node_modules/undici/lib/web/websocket/stream/websocketstream.js +8 -10
  154. package/node_modules/undici/package.json +3 -3
  155. package/node_modules/undici/types/client.d.ts +10 -0
  156. package/node_modules/undici/types/interceptors.d.ts +2 -0
  157. package/node_modules/undici/types/mock-agent.d.ts +11 -10
  158. package/node_modules/undici/types/socks5-proxy-agent.d.ts +2 -0
  159. package/openclaw.plugin.json +15 -8
  160. package/package.json +7 -6
  161. package/skills/discord/SKILL.md +1 -1
  162. package/dist/account-inspect-BDfKyuvL.js +0 -89
  163. package/dist/provider.runtime-DiYaHvOz.js +0 -2
  164. package/dist/sdk-runtime-4geQHtXc.js +0 -338
  165. package/dist/targets-CtTKvntJ.js +0 -3
@@ -677,6 +677,12 @@ declare module "node:test" {
677
677
  * The nesting level of the test.
678
678
  */
679
679
  nesting: number;
680
+ /**
681
+ * The `testId` of the enclosing test, or
682
+ * `undefined` for top-level tests. Lets custom reporters track lineage
683
+ * when concurrent siblings at the same nesting level interleave.
684
+ */
685
+ parentId: number | undefined;
680
686
  /**
681
687
  * The flattened lowercased tags declared on the test
682
688
  * and its ancestor suites, in declaration order. Empty for untagged tests.
@@ -711,6 +717,12 @@ declare module "node:test" {
711
717
  * The nesting level of the test.
712
718
  */
713
719
  nesting: number;
720
+ /**
721
+ * The `testId` of the enclosing test, or
722
+ * `undefined` for top-level tests. Lets custom reporters track lineage
723
+ * when concurrent siblings at the same nesting level interleave.
724
+ */
725
+ parentId: number | undefined;
714
726
  /**
715
727
  * The flattened lowercased tags declared on the test
716
728
  * and its ancestor suites, in declaration order. Empty for untagged tests.
@@ -738,6 +750,12 @@ declare module "node:test" {
738
750
  * The nesting level of the test.
739
751
  */
740
752
  nesting: number;
753
+ /**
754
+ * The `testId` of the enclosing test, or
755
+ * `undefined` for top-level tests. Lets custom reporters track lineage
756
+ * when concurrent siblings at the same nesting level interleave.
757
+ */
758
+ parentId: number | undefined;
741
759
  /**
742
760
  * The flattened lowercased tags declared on the test
743
761
  * and its ancestor suites, in declaration order. Empty for untagged tests.
@@ -789,6 +807,12 @@ declare module "node:test" {
789
807
  * The nesting level of the test.
790
808
  */
791
809
  nesting: number;
810
+ /**
811
+ * The `testId` of the enclosing test, or
812
+ * `undefined` for top-level tests. Lets custom reporters track lineage
813
+ * when concurrent siblings at the same nesting level interleave.
814
+ */
815
+ parentId: number | undefined;
792
816
  /**
793
817
  * The flattened lowercased tags declared on the test
794
818
  * and its ancestor suites, in declaration order. Empty for untagged tests.
@@ -856,6 +880,12 @@ declare module "node:test" {
856
880
  * The nesting level of the test.
857
881
  */
858
882
  nesting: number;
883
+ /**
884
+ * The `testId` of the enclosing test, or
885
+ * `undefined` for top-level tests. Lets custom reporters track lineage
886
+ * when concurrent siblings at the same nesting level interleave.
887
+ */
888
+ parentId: number | undefined;
859
889
  /**
860
890
  * The flattened lowercased tags declared on the test
861
891
  * and its ancestor suites, in declaration order. Empty for untagged tests.
@@ -900,6 +930,12 @@ declare module "node:test" {
900
930
  * The nesting level of the test.
901
931
  */
902
932
  nesting: number;
933
+ /**
934
+ * The `testId` of the enclosing test, or
935
+ * `undefined` for top-level tests. Lets custom reporters track lineage
936
+ * when concurrent siblings at the same nesting level interleave.
937
+ */
938
+ parentId: number | undefined;
903
939
  /**
904
940
  * The flattened lowercased tags declared on the test
905
941
  * and its ancestor suites, in declaration order. Empty for untagged tests.
@@ -1,4 +1,4 @@
1
- const Email = /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[^"\\]|\\.)*")@(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*|\[(?:IPv6:[a-f0-9:]+|(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?:\.(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3})\])$/i;
1
+ const Email = /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[^"\\]|\\[\x20-\x7e])*")@(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*|\[(?:IPv6:[a-f0-9:]+|(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?:\.(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3})\])$/i;
2
2
  /**
3
3
  * Returns true if the value is an Email
4
4
  * @specification https://datatracker.ietf.org/doc/html/rfc5322
@@ -1,6 +1,9 @@
1
1
  import * as FormatBidi from './format/bidi.mjs';
2
2
  import * as LabelUnicode from './label/unicode.mjs';
3
3
  import * as LabelPuny from './label/puny.mjs';
4
+ // ------------------------------------------------------------------
5
+ // IsLabel
6
+ // ------------------------------------------------------------------
4
7
  function IsValidLabelLength(value) {
5
8
  return value.length > 0 && value.length <= 63;
6
9
  }
@@ -8,9 +11,24 @@ function IsLabel(value) {
8
11
  return IsValidLabelLength(value) && (LabelPuny.IsPunyLabel(value) ||
9
12
  LabelUnicode.IsUnicodeLabel(value));
10
13
  }
14
+ // ------------------------------------------------------------------
15
+ // NormalizeHostname
16
+ //
17
+ // Normalizes a hostname for label validation. Normalizes for NFC
18
+ // such that equivalent codepoint sequences can be uniformly
19
+ // compared. It also removes codepoints that IDNA mapping ignores,
20
+ // and converts full stop variants to ASCII '.' so the hostname can
21
+ // be split into labels.
22
+ // ------------------------------------------------------------------
11
23
  function NormalizeHostname(value) {
12
- return value.normalize('NFC').replace(/[\u002E\u3002\uFF0E\uFF61]/g, '.');
24
+ return value
25
+ .normalize('NFC')
26
+ .replace(/[\u00ad\u034f\u180b-\u180d\u200b\ufe00-\ufe0f\u{e0100}-\u{e01ef}]/gu, '') // RE_IGNORED_MAPPING
27
+ .replace(/[\u002E\u3002\uFF0E\uFF61]/g, '.'); // RE_FULL_STOP_MAPPING
13
28
  }
29
+ // ------------------------------------------------------------------
30
+ // IsIdnHostname
31
+ // ------------------------------------------------------------------
14
32
  export function IsIdnHostname(value) {
15
33
  if (value.length === 0 || value.includes(' '))
16
34
  return false;
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Returns true if the value is a json pointer
3
- * @specification
4
- * @source ajv-formats
3
+ * @specification https://datatracker.ietf.org/doc/html/rfc6901
4
+ * @source https://github.com/ajv-validator/ajv-formats
5
5
  */
6
6
  export declare function IsJsonPointer(value: string): boolean;
@@ -1,8 +1,8 @@
1
1
  const JsonPointer = /^(?:\/(?:[^~/]|~0|~1)*)*$/;
2
2
  /**
3
3
  * Returns true if the value is a json pointer
4
- * @specification
5
- * @source ajv-formats
4
+ * @specification https://datatracker.ietf.org/doc/html/rfc6901
5
+ * @source https://github.com/ajv-validator/ajv-formats
6
6
  */
7
7
  export function IsJsonPointer(value) {
8
8
  return JsonPointer.test(value);
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Returns true if the value is a json pointer uri fragment
3
- * @specification
4
- * @source ajv-formats
3
+ * @specification https://datatracker.ietf.org/doc/html/rfc6901
4
+ * @source https://github.com/ajv-validator/ajv-formats
5
5
  */
6
6
  export declare function IsJsonPointerUriFragment(value: string): boolean;
@@ -1,8 +1,8 @@
1
1
  const JsonPointerUriFragment = /^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i;
2
2
  /**
3
3
  * Returns true if the value is a json pointer uri fragment
4
- * @specification
5
- * @source ajv-formats
4
+ * @specification https://datatracker.ietf.org/doc/html/rfc6901
5
+ * @source https://github.com/ajv-validator/ajv-formats
6
6
  */
7
7
  export function IsJsonPointerUriFragment(value) {
8
8
  return JsonPointerUriFragment.test(value);
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Returns true if the value is a relative json pointer
3
- * @specification
4
- * @source ajv-formats
3
+ * @specification https://datatracker.ietf.org/doc/html/rfc6901
4
+ * @source https://github.com/ajv-validator/ajv-formats
5
5
  */
6
6
  export declare function IsRelativeJsonPointer(value: string): boolean;
@@ -1,8 +1,8 @@
1
1
  const RelativeJsonPointer = /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/;
2
2
  /**
3
3
  * Returns true if the value is a relative json pointer
4
- * @specification
5
- * @source ajv-formats
4
+ * @specification https://datatracker.ietf.org/doc/html/rfc6901
5
+ * @source https://github.com/ajv-validator/ajv-formats
6
6
  */
7
7
  export function IsRelativeJsonPointer(value) {
8
8
  return RelativeJsonPointer.test(value);
@@ -1,11 +1,12 @@
1
1
  // deno-lint-ignore-file ban-types no-explicit-any
2
2
  // deno-fmt-ignore-file
3
3
  import { Metrics } from './metrics.mjs';
4
+ import { Freeze } from './freeze.mjs';
4
5
  /**
5
6
  * Performs an Object assign using the Left and Right object types. We track this operation as it
6
7
  * creates a new GC handle per assignment.
7
8
  */
8
9
  export function Assign(left, right) {
9
10
  Metrics.assign += 1;
10
- return { ...left, ...right };
11
+ return Freeze({ ...left, ...right });
11
12
  }
@@ -1,7 +1,7 @@
1
1
  // deno-lint-ignore-file no-explicit-any
2
- // deno-fmt-ignore-file
3
2
  import { Settings } from '../settings/index.mjs';
4
3
  import { Metrics } from './metrics.mjs';
4
+ import { Freeze } from './freeze.mjs';
5
5
  function MergeHidden(left, right) {
6
6
  for (const key of Object.keys(right)) {
7
7
  Object.defineProperty(left, key, {
@@ -23,8 +23,7 @@ function Merge(left, right) {
23
23
  */
24
24
  export function Create(hidden, enumerable, options = {}) {
25
25
  Metrics.create += 1;
26
- const settings = Settings.Get();
27
26
  const withOptions = Merge(enumerable, options);
28
- const withHidden = settings.enumerableKind ? Merge(withOptions, hidden) : MergeHidden(withOptions, hidden);
29
- return settings.immutableTypes ? Object.freeze(withHidden) : withHidden;
27
+ const withHidden = Settings.Get().enumerableKind ? Merge(withOptions, hidden) : MergeHidden(withOptions, hidden);
28
+ return Freeze(withHidden);
30
29
  }
@@ -1,7 +1,7 @@
1
1
  // deno-lint-ignore-file no-explicit-any
2
- // deno-fmt-ignore-file
3
2
  import { Guard } from '../../guard/index.mjs';
4
3
  import { Metrics } from './metrics.mjs';
4
+ import { Freeze } from './freeze.mjs';
5
5
  import { Clone } from './clone.mjs';
6
6
  /** Discards multiple property keys from the given object value */
7
7
  export function Discard(value, propertyKeys) {
@@ -14,5 +14,5 @@ export function Discard(value, propertyKeys) {
14
14
  descriptor.value = Clone(descriptor.value);
15
15
  Object.defineProperty(result, key, descriptor);
16
16
  }
17
- return result;
17
+ return Freeze(result);
18
18
  }
@@ -0,0 +1,4 @@
1
+ type ObjectLike = Record<PropertyKey, any>;
2
+ /** Conditionally freezes the value if `immutableTypes` is true, otherwise no action. */
3
+ export declare function Freeze(value: ObjectLike): ObjectLike;
4
+ export {};
@@ -0,0 +1,6 @@
1
+ // deno-lint-ignore-file no-explicit-any
2
+ import { Settings } from '../settings/index.mjs';
3
+ /** Conditionally freezes the value if `immutableTypes` is true, otherwise no action. */
4
+ export function Freeze(value) {
5
+ return Settings.Get().immutableTypes ? Object.freeze(value) : value;
6
+ }
@@ -1,6 +1,7 @@
1
- // deno-fmt-ignore-file
1
+ // deno-lint-ignore-file no-explicit-any
2
2
  import { Settings } from '../settings/index.mjs';
3
3
  import { Metrics } from './metrics.mjs';
4
+ import { Freeze } from './freeze.mjs';
4
5
  import { Clone } from './clone.mjs';
5
6
  /**
6
7
  * Updates a value with new properties while preserving property enumerability. Use this function to modify
@@ -28,5 +29,5 @@ export function Update(current, hidden, enumerable) {
28
29
  value: enumerable[key]
29
30
  });
30
31
  }
31
- return result;
32
+ return Freeze(result);
32
33
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "typebox",
3
3
  "description": "Json Schema Type Builder with Static Type Resolution for TypeScript",
4
- "version": "1.3.16",
4
+ "version": "1.3.18",
5
5
  "keywords": [
6
6
  "typescript",
7
7
  "jsonschema"
@@ -147,6 +147,10 @@ added: v1.0.0
147
147
  WebSocket messages. Applied to uncompressed messages, compressed frame
148
148
  payloads, and decompressed (`permessage-deflate`) messages. Set to `0` to
149
149
  disable the limit. **Default:** `134217728`.
150
+ * `eventSource` {Object} (optional) EventSource-specific configuration.
151
+ * `maxEventSize` {number} The maximum allowed event size, in bytes, for
152
+ EventSource messages. Set to `0` to disable the limit.
153
+ **Default:** `buffer.kStringMaxLength`.
150
154
  * Returns: {Client}
151
155
 
152
156
  Instantiating a `Client` does not open a connection; the connection is
@@ -25,8 +25,9 @@ it is used only for HTTPS requests.
25
25
  proxied. Each entry may include a leading dot or `*.` wildcard (for example
26
26
  `.example.com`) to match subdomains, and an optional `:port` suffix to restrict
27
27
  the match to a specific port. A request bypasses the proxy when its host equals
28
- an entry or is a subdomain of one. Setting `no_proxy` to `*` bypasses the proxy
29
- for every request.
28
+ an entry or is a subdomain of one. A trailing dot is ignored on both sides, so
29
+ `example.com.` and `example.com` match each other. Setting `no_proxy` to `*`
30
+ bypasses the proxy for every request.
30
31
 
31
32
  The uppercase variants `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY` are also
32
33
  honored. When both the lowercase and uppercase forms of a variable are set, the
@@ -66,6 +66,9 @@ added: v6.5.0
66
66
  wait before re-establishing a dropped connection. The server may override
67
67
  this value with a `retry` field. **Default:** `3000`.
68
68
 
69
+ EventSource-specific limits can be configured on the dispatcher using the
70
+ `eventSource` option. See [`Client`][] for details.
71
+
69
72
  Creates a new `EventSource` and immediately begins connecting to `url`. The
70
73
  request is sent with the `Accept: text/event-stream` header, a cache mode of
71
74
  `no-store`, and an initiator type of `other`.
@@ -349,6 +352,7 @@ eventSource.onerror = () => {
349
352
  ```
350
353
 
351
354
  [WHATWG-conformant]: https://html.spec.whatwg.org/multipage/server-sent-events.html#server-sent-events
355
+ [`Client`]: Client.md#new-clienturl-options
352
356
  [`Dispatcher`]: Dispatcher.md#class-dispatcher
353
357
  [`addEventListener()`]: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener
354
358
  [server-sent events]: https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events
@@ -101,8 +101,8 @@ body yourself.
101
101
 
102
102
  * `opts` {Object} (optional)
103
103
  * `maxSize` {number} Maximum number of bytes to read and discard. Responses
104
- whose `Content-Length` exceeds this value are aborted. **Default:**
105
- `1_048_576` (1 MiB).
104
+ whose declared or received body size exceeds this value are aborted.
105
+ **Default:** `1_048_576` (1 MiB).
106
106
 
107
107
  Per-request override: set `dumpMaxSize` on the dispatch options to override
108
108
  the global `maxSize` for a specific request.
@@ -210,6 +210,9 @@ Automatically decompresses response bodies encoded with `gzip`, `x-gzip`,
210
210
  skipped. **Default:** `[204, 304]`.
211
211
  * `skipErrorResponses` {boolean} When `true`, responses with a status code
212
212
  >= 400 are not decompressed. **Default:** `true`.
213
+ * `maxSize` {number} Maximum decompressed response size in bytes. The request
214
+ fails with a `ResponseExceededMaxSizeError` if the decoded body exceeds
215
+ this limit. **Default:** `67108864` (64 MiB).
213
216
 
214
217
  **Returns:** {Dispatcher.DispatcherComposeInterceptor}
215
218
 
@@ -221,7 +224,8 @@ import { Agent, interceptors } from 'undici'
221
224
  const agent = new Agent().compose(
222
225
  interceptors.decompress({
223
226
  skipStatusCodes: [204, 304],
224
- skipErrorResponses: false // decompress error bodies too
227
+ skipErrorResponses: false, // decompress error bodies too
228
+ maxSize: 16 * 1024 * 1024 // limit decoded bodies to 16 MiB
225
229
  })
226
230
  )
227
231
  ```
@@ -60,6 +60,11 @@ added: v7.23.0
60
60
  a password embedded in `proxyUrl`. **Default:** the URL password, if any.
61
61
  * `connect` {Function} Custom connector used to open the socket to the proxy.
62
62
  **Default:** a connector built from `proxyTls`.
63
+ * `connectTimeout` {number} Maximum time in milliseconds for each proxy
64
+ connection, SOCKS5 negotiation, and target TLS negotiation stage. A value of
65
+ `0` disables these stage timeouts. `proxyTls.timeout` and
66
+ `requestTls.timeout` override it for their respective TLS stages.
67
+ **Default:** `5000`.
63
68
  * `proxyTls` {BuildOptions} TLS options for the connection to the proxy itself
64
69
  (SOCKS5 over TLS). When set, the proxy connection is established over TLS and
65
70
  `servername` defaults to the proxy host name.
@@ -69,7 +74,8 @@ added: v7.23.0
69
74
  host name.
70
75
 
71
76
  Throws an `InvalidArgumentError` if `proxyUrl` is missing or does not use the
72
- `socks5:` or `socks:` protocol.
77
+ `socks5:` or `socks:` protocol, or if `connectTimeout`, `proxyTls.timeout`, or
78
+ `requestTls.timeout` is not a finite, non-negative number.
73
79
 
74
80
  ```mjs
75
81
  import { Socks5ProxyAgent } from 'undici'
@@ -87,7 +87,7 @@ class MemoryCacheStore extends EventEmitter {
87
87
  }
88
88
 
89
89
  /**
90
- * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} req
90
+ * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key
91
91
  * @returns {import('../../types/cache-interceptor.d.ts').default.GetResult | undefined}
92
92
  */
93
93
  get (key) {
@@ -179,7 +179,7 @@ class MemoryCacheStore extends EventEmitter {
179
179
 
180
180
  // Perform eviction
181
181
  for (const [key, entries] of store.#entries) {
182
- for (const entry of entries.splice(0, entries.length / 2)) {
182
+ for (const entry of entries.splice(0, Math.ceil(entries.length / 2))) {
183
183
  store.#size -= entry.size
184
184
  store.#count -= 1
185
185
  }
@@ -5,6 +5,8 @@ module.exports = {
5
5
  kDestroy: Symbol('destroy'),
6
6
  kDispatch: Symbol('dispatch'),
7
7
  kUrl: Symbol('url'),
8
+ kRequestOrigin: Symbol('request origin'),
9
+ kOriginless: Symbol('originless'),
8
10
  kWriting: Symbol('writing'),
9
11
  kResuming: Symbol('resuming'),
10
12
  kQueue: Symbol('queue'),
@@ -1,7 +1,7 @@
1
1
  'use strict'
2
2
 
3
3
  const { InvalidArgumentError, MaxOriginsReachedError } = require('../core/errors')
4
- const { kBusy, kClients, kConnected, kRunning, kClose, kDestroy, kDispatch, kUrl } = require('../core/symbols')
4
+ const { kBusy, kClients, kConnected, kRunning, kPending, kClose, kDestroy, kDispatch, kUrl } = require('../core/symbols')
5
5
  const DispatcherBase = require('./dispatcher-base')
6
6
  const Pool = require('./pool')
7
7
  const Client = require('./client')
@@ -97,7 +97,12 @@ class Agent extends DispatcherBase {
97
97
  return
98
98
  }
99
99
 
100
- if (dispatcher[kConnected] > 0 || dispatcher[kBusy]) {
100
+ // A GOAWAY detaches the HTTP/2 session before requeued requests are
101
+ // dispatched on a replacement connection. At that point the pool has
102
+ // no connected clients and is not busy, but it still has pending work.
103
+ // Closing it here lets the replacement Client finish those requests
104
+ // and then destroys that new connection with ClientDestroyedError.
105
+ if (dispatcher[kConnected] > 0 || dispatcher[kBusy] || dispatcher[kPending] > 0) {
101
106
  return
102
107
  }
103
108
 
@@ -13,7 +13,7 @@ const {
13
13
  kGetDispatcher
14
14
  } = require('./pool-base')
15
15
  const Pool = require('./pool')
16
- const { kUrl } = require('../core/symbols')
16
+ const { kOriginless, kUrl } = require('../core/symbols')
17
17
  const util = require('../core/util')
18
18
  const kFactory = Symbol('factory')
19
19
 
@@ -49,14 +49,17 @@ function defaultFactory (origin, opts) {
49
49
  }
50
50
 
51
51
  class BalancedPool extends PoolBase {
52
- constructor (upstreams = [], { factory = defaultFactory, ...opts } = {}) {
52
+ constructor (upstreams = [], { factory = defaultFactory, connect, tls, ...opts } = {}) {
53
53
  if (typeof factory !== 'function') {
54
54
  throw new InvalidArgumentError('factory must be a function.')
55
55
  }
56
56
 
57
- super()
57
+ super(opts)
58
58
 
59
- this[kOptions] = { ...util.deepClone(opts) }
59
+ this[kOriginless] = true
60
+ if (connect && typeof connect !== 'function') connect = { ...connect }
61
+ if (tls && typeof tls !== 'function') tls = { ...tls }
62
+ this[kOptions] = { ...util.deepClone(opts), connect, tls }
60
63
  this[kIndex] = -1
61
64
  this[kCurrentWeight] = 0
62
65
 
@@ -1052,7 +1052,7 @@ function onSocketClose () {
1052
1052
 
1053
1053
  function clearIdleSocketValidation (socket) {
1054
1054
  if (socket[kIdleSocketValidationTimeout]) {
1055
- clearTimeout(socket[kIdleSocketValidationTimeout])
1055
+ clearImmediate(socket[kIdleSocketValidationTimeout])
1056
1056
  socket[kIdleSocketValidationTimeout] = null
1057
1057
  }
1058
1058
 
@@ -1061,15 +1061,23 @@ function clearIdleSocketValidation (socket) {
1061
1061
 
1062
1062
  function scheduleIdleSocketValidation (client, socket) {
1063
1063
  socket[kIdleSocketValidation] = 1
1064
- socket[kIdleSocketValidationTimeout] = setTimeout(() => {
1064
+ // Yield to the check phase (after poll) so unsolicited bytes / FIN / RST
1065
+ // already pending on this idle keep-alive socket are processed before the
1066
+ // next request is written (GHSA-35p6-xmwp-9g52).
1067
+ //
1068
+ // setTimeout(0) pays Node's ~1ms timer floor on every sequential reuse
1069
+ // (#5493). setImmediate avoids that, but an *unref'd* Immediate lets poll
1070
+ // block for ~500ms when the event loop is otherwise idle (#5600 / #5606).
1071
+ // A ref'd Immediate both keeps the pending request alive and makes poll
1072
+ // return immediately — the hybrid those issues asked for.
1073
+ socket[kIdleSocketValidationTimeout] = setImmediate(() => {
1065
1074
  socket[kIdleSocketValidationTimeout] = null
1066
1075
  socket[kIdleSocketValidation] = 2
1067
1076
 
1068
1077
  if (client[kSocket] === socket && !socket.destroyed) {
1069
1078
  client[kResume]()
1070
1079
  }
1071
- }, 0)
1072
- socket[kIdleSocketValidationTimeout].unref?.()
1080
+ })
1073
1081
  }
1074
1082
 
1075
1083
  /**
@@ -10,7 +10,8 @@ const {
10
10
  InformationalError,
11
11
  InvalidArgumentError,
12
12
  HeadersTimeoutError,
13
- BodyTimeoutError
13
+ BodyTimeoutError,
14
+ ResponseExceededMaxSizeError
14
15
  } = require('../core/errors.js')
15
16
  const {
16
17
  kUrl,
@@ -39,7 +40,8 @@ const {
39
40
  kRemoteSettings,
40
41
  kHTTP2Stream,
41
42
  kHTTP2SessionState,
42
- kHTTP2Options
43
+ kHTTP2Options,
44
+ kMaxResponseSize
43
45
  } = require('../core/symbols.js')
44
46
  const { channels } = require('../core/diagnostics.js')
45
47
 
@@ -1022,9 +1024,11 @@ function writeH2 (client, request) {
1022
1024
  const state = {
1023
1025
  abort: null,
1024
1026
  body: request.body,
1027
+ bytesRead: 0,
1025
1028
  client,
1026
1029
  contentLength: null,
1027
1030
  expectsPayload: false,
1031
+ maxResponseSize: client[kMaxResponseSize],
1028
1032
  request,
1029
1033
  headersTimeout,
1030
1034
  bodyTimeout,
@@ -1260,6 +1264,7 @@ function writeH2 (client, request) {
1260
1264
  // become unreachable once the stream closes, so plain `on` avoids the
1261
1265
  // per-listener `once` wrapper allocation.
1262
1266
  stream.on('response', onResponse)
1267
+ stream.on('headers', onInterimResponse)
1263
1268
  stream.on('end', onEnd)
1264
1269
  stream.on('error', onError)
1265
1270
  stream.on('frameError', onFrameError)
@@ -1280,6 +1285,7 @@ function removeRequestStreamListeners (stream) {
1280
1285
  stream.off('error', noop)
1281
1286
  stream.off('continue', writeBodyH2)
1282
1287
  stream.off('response', onResponse)
1288
+ stream.off('headers', onInterimResponse)
1283
1289
  stream.off('end', onEnd)
1284
1290
  stream.off('error', onError)
1285
1291
  stream.off('frameError', onFrameError)
@@ -1322,17 +1328,51 @@ function onData (chunk) {
1322
1328
  return
1323
1329
  }
1324
1330
 
1325
- const { request } = state
1331
+ const { request, maxResponseSize } = state
1326
1332
 
1327
1333
  if (request.aborted || request.completed) {
1328
1334
  return
1329
1335
  }
1330
1336
 
1337
+ if (maxResponseSize > -1 && state.bytesRead + chunk.length > maxResponseSize) {
1338
+ // Unlike HTTP/1.1, which destroys the socket because it cannot abandon one
1339
+ // response without losing framing, resetting the offending stream leaves
1340
+ // the session usable for its siblings.
1341
+ state.abort(new ResponseExceededMaxSizeError())
1342
+ return
1343
+ }
1344
+
1345
+ state.bytesRead += chunk.length
1346
+
1331
1347
  if (request.onResponseData(chunk) === false) {
1332
1348
  stream.pause()
1333
1349
  }
1334
1350
  }
1335
1351
 
1352
+ function onInterimResponse (headers) {
1353
+ const stream = this
1354
+ const state = stream[kRequestStreamState]
1355
+
1356
+ if (state == null) {
1357
+ return
1358
+ }
1359
+
1360
+ const { request } = state
1361
+
1362
+ if (request.aborted || request.completed) {
1363
+ return
1364
+ }
1365
+
1366
+ // node http2 emits 'headers' for interim (1xx) informational responses,
1367
+ // while the final response arrives via 'response'. Forward these to the
1368
+ // handler so that onInfo is invoked, matching the HTTP/1 behaviour and the
1369
+ // documented onInfo contract.
1370
+ const statusCode = headers[HTTP2_HEADER_STATUS]
1371
+ delete headers[HTTP2_HEADER_STATUS]
1372
+
1373
+ request.onResponseStart(Number(statusCode), headers, noop, '')
1374
+ }
1375
+
1336
1376
  function onResponse (headers) {
1337
1377
  const stream = this
1338
1378
  const state = stream[kRequestStreamState]
@@ -137,7 +137,8 @@ class Client extends DispatcherBase {
137
137
  connectionWindowSize,
138
138
  pingInterval,
139
139
  webSocket,
140
- h2Options
140
+ h2Options,
141
+ eventSource
141
142
  } = {}) {
142
143
  if (keepAlive !== undefined) {
143
144
  throw new InvalidArgumentError('unsupported keepAlive, use pipelining=0 instead')
@@ -276,7 +277,7 @@ class Client extends DispatcherBase {
276
277
  }
277
278
  }
278
279
 
279
- super({ webSocket })
280
+ super({ webSocket, eventSource })
280
281
 
281
282
  if (typeof connect !== 'function') {
282
283
  connect = buildConnector({