goscript 0.1.1 → 0.1.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 (356) hide show
  1. package/cmd/goscript/cmd-test.go +104 -11
  2. package/cmd/goscript/cmd-test_test.go +1 -1
  3. package/cmd/goscript/cmd_compile.go +9 -0
  4. package/compiler/compile-request.go +31 -0
  5. package/compiler/compiler.go +1 -1
  6. package/compiler/compliance_test.go +0 -2
  7. package/compiler/config.go +2 -0
  8. package/compiler/gotest/package-result.go +2 -0
  9. package/compiler/gotest/request.go +85 -20
  10. package/compiler/gotest/runner.go +733 -96
  11. package/compiler/gotest/runner_test.go +647 -3
  12. package/compiler/lowered-program.go +9 -2
  13. package/compiler/lowering.go +2001 -345
  14. package/compiler/override-facts.go +77 -27
  15. package/compiler/override-registry.go +5 -4
  16. package/compiler/override-registry_test.go +135 -0
  17. package/compiler/package-graph_test.go +62 -7
  18. package/compiler/package-test-graph-variant.go +40 -16
  19. package/compiler/package-test-graph.go +0 -5
  20. package/compiler/package-test-graph_test.go +61 -3
  21. package/compiler/runtime-contract.go +40 -0
  22. package/compiler/semantic-model-types.go +16 -0
  23. package/compiler/semantic-model.go +336 -91
  24. package/compiler/semantic-model_test.go +50 -1
  25. package/compiler/service.go +9 -3
  26. package/compiler/skeleton_test.go +1921 -298
  27. package/compiler/tsworkspace/owner-process-unix_test.go +72 -0
  28. package/compiler/tsworkspace/owner.go +8 -0
  29. package/compiler/tsworkspace/tool-process-other.go +14 -0
  30. package/compiler/tsworkspace/tool-process-unix.go +19 -0
  31. package/compiler/typescript-emitter.go +122 -9
  32. package/dist/gs/builtin/builtin.d.ts +20 -1
  33. package/dist/gs/builtin/builtin.js +246 -26
  34. package/dist/gs/builtin/builtin.js.map +1 -1
  35. package/dist/gs/builtin/channel.d.ts +24 -10
  36. package/dist/gs/builtin/channel.js +107 -25
  37. package/dist/gs/builtin/channel.js.map +1 -1
  38. package/dist/gs/builtin/defer.d.ts +1 -0
  39. package/dist/gs/builtin/defer.js +12 -2
  40. package/dist/gs/builtin/defer.js.map +1 -1
  41. package/dist/gs/builtin/hostio.d.ts +9 -0
  42. package/dist/gs/builtin/hostio.js +25 -0
  43. package/dist/gs/builtin/hostio.js.map +1 -1
  44. package/dist/gs/builtin/map.js +40 -6
  45. package/dist/gs/builtin/map.js.map +1 -1
  46. package/dist/gs/builtin/print.js.map +1 -1
  47. package/dist/gs/builtin/slice.d.ts +43 -9
  48. package/dist/gs/builtin/slice.js +437 -234
  49. package/dist/gs/builtin/slice.js.map +1 -1
  50. package/dist/gs/builtin/type.d.ts +2 -0
  51. package/dist/gs/builtin/type.js +47 -7
  52. package/dist/gs/builtin/type.js.map +1 -1
  53. package/dist/gs/builtin/varRef.d.ts +2 -0
  54. package/dist/gs/builtin/varRef.js.map +1 -1
  55. package/dist/gs/bytes/buffer.gs.js +28 -28
  56. package/dist/gs/bytes/buffer.gs.js.map +1 -1
  57. package/dist/gs/bytes/iter.gs.js +13 -13
  58. package/dist/gs/bytes/iter.gs.js.map +1 -1
  59. package/dist/gs/compress/zlib/index.d.ts +26 -0
  60. package/dist/gs/compress/zlib/index.js +168 -0
  61. package/dist/gs/compress/zlib/index.js.map +1 -0
  62. package/dist/gs/context/context.d.ts +1 -1
  63. package/dist/gs/context/context.js +8 -3
  64. package/dist/gs/context/context.js.map +1 -1
  65. package/dist/gs/crypto/ecdh/index.d.ts +52 -0
  66. package/dist/gs/crypto/ecdh/index.js +226 -0
  67. package/dist/gs/crypto/ecdh/index.js.map +1 -0
  68. package/dist/gs/crypto/ed25519/index.d.ts +34 -0
  69. package/dist/gs/crypto/ed25519/index.js +160 -0
  70. package/dist/gs/crypto/ed25519/index.js.map +1 -0
  71. package/dist/gs/crypto/internal/constanttime/index.d.ts +4 -0
  72. package/dist/gs/crypto/internal/constanttime/index.js +18 -0
  73. package/dist/gs/crypto/internal/constanttime/index.js.map +1 -0
  74. package/dist/gs/crypto/rand/index.d.ts +2 -0
  75. package/dist/gs/crypto/rand/index.js +85 -0
  76. package/dist/gs/crypto/rand/index.js.map +1 -1
  77. package/dist/gs/crypto/sha256/index.d.ts +8 -0
  78. package/dist/gs/crypto/sha256/index.js +118 -0
  79. package/dist/gs/crypto/sha256/index.js.map +1 -0
  80. package/dist/gs/crypto/sha512/index.d.ts +14 -0
  81. package/dist/gs/crypto/sha512/index.js +129 -0
  82. package/dist/gs/crypto/sha512/index.js.map +1 -0
  83. package/dist/gs/encoding/json/index.d.ts +3 -0
  84. package/dist/gs/encoding/json/index.js +15 -0
  85. package/dist/gs/encoding/json/index.js.map +1 -1
  86. package/dist/gs/errors/errors.js +29 -6
  87. package/dist/gs/errors/errors.js.map +1 -1
  88. package/dist/gs/fmt/fmt.js.map +1 -1
  89. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +7 -7
  90. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +52 -18
  91. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  92. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +56 -20
  93. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -1
  94. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +57 -3
  95. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +366 -1
  96. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +1 -1
  97. package/dist/gs/github.com/aperturerobotics/util/conc/index.d.ts +20 -0
  98. package/dist/gs/github.com/aperturerobotics/util/conc/index.js +134 -0
  99. package/dist/gs/github.com/aperturerobotics/util/conc/index.js.map +1 -0
  100. package/dist/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.js.map +1 -1
  101. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.d.ts +3 -0
  102. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js +50 -0
  103. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js.map +1 -0
  104. package/dist/gs/github.com/klauspost/compress/internal/le/index.js +3 -2
  105. package/dist/gs/github.com/klauspost/compress/internal/le/index.js.map +1 -1
  106. package/dist/gs/github.com/mr-tron/base58/base58/index.d.ts +27 -0
  107. package/dist/gs/github.com/mr-tron/base58/base58/index.js +172 -0
  108. package/dist/gs/github.com/mr-tron/base58/base58/index.js.map +1 -0
  109. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.d.ts +21 -0
  110. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js +22 -0
  111. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js.map +1 -0
  112. package/dist/gs/go/token/index.js +11 -4
  113. package/dist/gs/go/token/index.js.map +1 -1
  114. package/dist/gs/hash/fnv/index.d.ts +57 -0
  115. package/dist/gs/hash/fnv/index.js +299 -0
  116. package/dist/gs/hash/fnv/index.js.map +1 -0
  117. package/dist/gs/hash/index.d.ts +17 -0
  118. package/dist/gs/hash/index.js +94 -0
  119. package/dist/gs/hash/index.js.map +1 -0
  120. package/dist/gs/io/fs/readlink.js +2 -6
  121. package/dist/gs/io/fs/readlink.js.map +1 -1
  122. package/dist/gs/io/fs/walk.js.map +1 -1
  123. package/dist/gs/io/io.js.map +1 -1
  124. package/dist/gs/iter/iter.d.ts +3 -2
  125. package/dist/gs/iter/iter.js.map +1 -1
  126. package/dist/gs/maps/iter.d.ts +5 -5
  127. package/dist/gs/maps/iter.js +48 -21
  128. package/dist/gs/maps/iter.js.map +1 -1
  129. package/dist/gs/maps/maps.d.ts +6 -6
  130. package/dist/gs/math/bits/index.js +14 -24
  131. package/dist/gs/math/bits/index.js.map +1 -1
  132. package/dist/gs/mime/index.js +3 -1
  133. package/dist/gs/mime/index.js.map +1 -1
  134. package/dist/gs/net/http/httptest/index.d.ts +20 -1
  135. package/dist/gs/net/http/httptest/index.js +83 -3
  136. package/dist/gs/net/http/httptest/index.js.map +1 -1
  137. package/dist/gs/net/http/index.d.ts +110 -6
  138. package/dist/gs/net/http/index.js +262 -16
  139. package/dist/gs/net/http/index.js.map +1 -1
  140. package/dist/gs/net/http/pprof/index.d.ts +8 -0
  141. package/dist/gs/net/http/pprof/index.js +59 -0
  142. package/dist/gs/net/http/pprof/index.js.map +1 -0
  143. package/dist/gs/os/error.gs.js +9 -7
  144. package/dist/gs/os/error.gs.js.map +1 -1
  145. package/dist/gs/os/types_js.gs.js +95 -15
  146. package/dist/gs/os/types_js.gs.js.map +1 -1
  147. package/dist/gs/path/filepath/match.js.map +1 -1
  148. package/dist/gs/path/filepath/path.d.ts +5 -3
  149. package/dist/gs/path/filepath/path.js +65 -10
  150. package/dist/gs/path/filepath/path.js.map +1 -1
  151. package/dist/gs/reflect/index.d.ts +3 -2
  152. package/dist/gs/reflect/index.js +2 -1
  153. package/dist/gs/reflect/index.js.map +1 -1
  154. package/dist/gs/reflect/iter.js +2 -2
  155. package/dist/gs/reflect/iter.js.map +1 -1
  156. package/dist/gs/reflect/map.js +26 -0
  157. package/dist/gs/reflect/map.js.map +1 -1
  158. package/dist/gs/reflect/type.d.ts +24 -5
  159. package/dist/gs/reflect/type.js +390 -38
  160. package/dist/gs/reflect/type.js.map +1 -1
  161. package/dist/gs/reflect/types.d.ts +1 -0
  162. package/dist/gs/reflect/types.js +3 -1
  163. package/dist/gs/reflect/types.js.map +1 -1
  164. package/dist/gs/reflect/value.d.ts +4 -1
  165. package/dist/gs/reflect/value.js +39 -1
  166. package/dist/gs/reflect/value.js.map +1 -1
  167. package/dist/gs/reflect/visiblefields.js +1 -1
  168. package/dist/gs/reflect/visiblefields.js.map +1 -1
  169. package/dist/gs/runtime/debug/index.d.ts +39 -0
  170. package/dist/gs/runtime/debug/index.js +58 -0
  171. package/dist/gs/runtime/debug/index.js.map +1 -1
  172. package/dist/gs/runtime/pprof/index.d.ts +20 -0
  173. package/dist/gs/runtime/pprof/index.js +85 -0
  174. package/dist/gs/runtime/pprof/index.js.map +1 -0
  175. package/dist/gs/runtime/trace/index.d.ts +19 -0
  176. package/dist/gs/runtime/trace/index.js +64 -0
  177. package/dist/gs/runtime/trace/index.js.map +1 -0
  178. package/dist/gs/slices/slices.d.ts +24 -9
  179. package/dist/gs/slices/slices.js +229 -24
  180. package/dist/gs/slices/slices.js.map +1 -1
  181. package/dist/gs/sort/slice.gs.d.ts +5 -3
  182. package/dist/gs/sort/slice.gs.js +55 -17
  183. package/dist/gs/sort/slice.gs.js.map +1 -1
  184. package/dist/gs/strings/builder.js +26 -17
  185. package/dist/gs/strings/builder.js.map +1 -1
  186. package/dist/gs/strings/iter.js +140 -75
  187. package/dist/gs/strings/iter.js.map +1 -1
  188. package/dist/gs/strings/replace.js +2 -2
  189. package/dist/gs/strings/replace.js.map +1 -1
  190. package/dist/gs/strings/strings.js +52 -6
  191. package/dist/gs/strings/strings.js.map +1 -1
  192. package/dist/gs/sync/sync.d.ts +6 -3
  193. package/dist/gs/sync/sync.js +39 -11
  194. package/dist/gs/sync/sync.js.map +1 -1
  195. package/dist/gs/syscall/errors.d.ts +116 -112
  196. package/dist/gs/syscall/errors.js +38 -1
  197. package/dist/gs/syscall/errors.js.map +1 -1
  198. package/dist/gs/syscall/fs.d.ts +2 -8
  199. package/dist/gs/syscall/fs.js.map +1 -1
  200. package/dist/gs/syscall/js/index.js +20 -12
  201. package/dist/gs/syscall/js/index.js.map +1 -1
  202. package/dist/gs/syscall/types.d.ts +4 -1
  203. package/dist/gs/syscall/types.js.map +1 -1
  204. package/dist/gs/testing/testing.d.ts +4 -3
  205. package/dist/gs/testing/testing.js +21 -4
  206. package/dist/gs/testing/testing.js.map +1 -1
  207. package/dist/gs/time/time.js +22 -0
  208. package/dist/gs/time/time.js.map +1 -1
  209. package/dist/gs/unicode/unicode.js.map +1 -1
  210. package/dist/gs/unique/index.js +7 -2
  211. package/dist/gs/unique/index.js.map +1 -1
  212. package/go.mod +8 -8
  213. package/go.sum +14 -23
  214. package/gs/builtin/builtin.ts +364 -37
  215. package/gs/builtin/channel.ts +161 -29
  216. package/gs/builtin/defer.ts +13 -2
  217. package/gs/builtin/hostio.test.ts +1 -0
  218. package/gs/builtin/hostio.ts +38 -0
  219. package/gs/builtin/map.ts +46 -6
  220. package/gs/builtin/print.ts +12 -3
  221. package/gs/builtin/runtime-contract.test.ts +257 -10
  222. package/gs/builtin/slice.test.ts +70 -0
  223. package/gs/builtin/slice.ts +566 -255
  224. package/gs/builtin/type.ts +53 -9
  225. package/gs/builtin/varRef.ts +2 -0
  226. package/gs/bytes/buffer.gs.ts +28 -28
  227. package/gs/bytes/iter.gs.ts +13 -14
  228. package/gs/compress/zlib/index.test.ts +28 -0
  229. package/gs/compress/zlib/index.ts +200 -0
  230. package/gs/compress/zlib/meta.json +3 -0
  231. package/gs/context/context.test.ts +31 -1
  232. package/gs/context/context.ts +9 -4
  233. package/gs/crypto/ecdh/index.test.ts +43 -0
  234. package/gs/crypto/ecdh/index.ts +274 -0
  235. package/gs/crypto/ed25519/index.test.ts +41 -0
  236. package/gs/crypto/ed25519/index.ts +238 -0
  237. package/gs/crypto/ed25519/meta.json +13 -0
  238. package/gs/crypto/internal/constanttime/index.test.ts +25 -0
  239. package/gs/crypto/internal/constanttime/index.ts +22 -0
  240. package/gs/crypto/rand/index.test.ts +89 -1
  241. package/gs/crypto/rand/index.ts +103 -1
  242. package/gs/crypto/rand/meta.json +4 -1
  243. package/gs/crypto/sha256/index.test.ts +78 -0
  244. package/gs/crypto/sha256/index.ts +150 -0
  245. package/gs/crypto/sha256/meta.json +9 -0
  246. package/gs/crypto/sha512/index.test.ts +31 -0
  247. package/gs/crypto/sha512/index.ts +161 -0
  248. package/gs/crypto/sha512/meta.json +11 -0
  249. package/gs/encoding/json/index.test.ts +25 -3
  250. package/gs/encoding/json/index.ts +21 -3
  251. package/gs/errors/errors.test.ts +4 -1
  252. package/gs/errors/errors.ts +32 -8
  253. package/gs/fmt/fmt.test.ts +3 -1
  254. package/gs/fmt/fmt.ts +1 -5
  255. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +62 -7
  256. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +78 -36
  257. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +32 -11
  258. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +122 -43
  259. package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +31 -0
  260. package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +518 -4
  261. package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +6 -0
  262. package/gs/github.com/aperturerobotics/util/conc/index.test.ts +30 -0
  263. package/gs/github.com/aperturerobotics/util/conc/index.ts +172 -0
  264. package/gs/github.com/aperturerobotics/util/conc/meta.json +9 -0
  265. package/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.ts +1 -4
  266. package/gs/github.com/hack-pad/safejs/internal/catch/index.test.ts +35 -0
  267. package/gs/github.com/hack-pad/safejs/internal/catch/index.ts +65 -0
  268. package/gs/github.com/hack-pad/safejs/internal/catch/meta.json +9 -0
  269. package/gs/github.com/klauspost/compress/internal/le/index.test.ts +2 -1
  270. package/gs/github.com/klauspost/compress/internal/le/index.ts +6 -5
  271. package/gs/github.com/mr-tron/base58/base58/index.test.ts +70 -0
  272. package/gs/github.com/mr-tron/base58/base58/index.ts +231 -0
  273. package/gs/github.com/mr-tron/base58/base58/meta.json +3 -0
  274. package/gs/github.com/zeebo/blake3/internal/consts/index.test.ts +46 -0
  275. package/gs/github.com/zeebo/blake3/internal/consts/index.ts +26 -0
  276. package/gs/go/token/index.ts +17 -4
  277. package/gs/hash/fnv/index.test.ts +67 -0
  278. package/gs/hash/fnv/index.ts +351 -0
  279. package/gs/hash/fnv/meta.json +3 -0
  280. package/gs/hash/index.test.ts +37 -0
  281. package/gs/hash/index.ts +118 -0
  282. package/gs/hash/meta.json +5 -0
  283. package/gs/internal/byteorder/index.test.ts +6 -6
  284. package/gs/io/fs/readlink.ts +40 -48
  285. package/gs/io/fs/walk.ts +10 -2
  286. package/gs/io/io.ts +4 -1
  287. package/gs/iter/iter.ts +8 -2
  288. package/gs/maps/iter.ts +69 -26
  289. package/gs/maps/maps.test.ts +23 -0
  290. package/gs/maps/maps.ts +6 -6
  291. package/gs/math/bits/index.test.ts +20 -0
  292. package/gs/math/bits/index.ts +15 -28
  293. package/gs/mime/index.ts +8 -2
  294. package/gs/net/http/httptest/index.test.ts +53 -0
  295. package/gs/net/http/httptest/index.ts +98 -3
  296. package/gs/net/http/index.test.ts +129 -1
  297. package/gs/net/http/index.ts +370 -19
  298. package/gs/net/http/meta.json +6 -0
  299. package/gs/net/http/pprof/index.test.ts +47 -0
  300. package/gs/net/http/pprof/index.ts +65 -0
  301. package/gs/os/error.gs.ts +9 -10
  302. package/gs/os/error.test.ts +41 -0
  303. package/gs/os/file_unix_js.test.ts +55 -0
  304. package/gs/os/tempfile.gs.test.ts +37 -10
  305. package/gs/os/types_js.gs.ts +94 -15
  306. package/gs/path/filepath/match.ts +4 -1
  307. package/gs/path/filepath/meta.json +6 -0
  308. package/gs/path/filepath/path.test.ts +57 -2
  309. package/gs/path/filepath/path.ts +91 -12
  310. package/gs/reflect/field.test.ts +63 -0
  311. package/gs/reflect/index.ts +4 -1
  312. package/gs/reflect/iter.ts +2 -2
  313. package/gs/reflect/map.test.ts +24 -2
  314. package/gs/reflect/map.ts +35 -0
  315. package/gs/reflect/type.ts +543 -60
  316. package/gs/reflect/typefor.test.ts +100 -0
  317. package/gs/reflect/types.ts +3 -1
  318. package/gs/reflect/value.ts +50 -1
  319. package/gs/reflect/visiblefields.ts +1 -1
  320. package/gs/runtime/debug/index.test.ts +22 -1
  321. package/gs/runtime/debug/index.ts +88 -0
  322. package/gs/runtime/pprof/index.test.ts +36 -0
  323. package/gs/runtime/pprof/index.ts +104 -0
  324. package/gs/runtime/pprof/meta.json +6 -0
  325. package/gs/runtime/trace/index.test.ts +45 -0
  326. package/gs/runtime/trace/index.ts +97 -0
  327. package/gs/runtime/trace/meta.json +7 -0
  328. package/gs/slices/meta.json +2 -1
  329. package/gs/slices/slices.test.ts +86 -0
  330. package/gs/slices/slices.ts +284 -37
  331. package/gs/sort/slice.gs.ts +73 -23
  332. package/gs/sort/slice.test.ts +40 -0
  333. package/gs/strings/builder.test.ts +8 -0
  334. package/gs/strings/builder.ts +29 -17
  335. package/gs/strings/iter.test.ts +5 -7
  336. package/gs/strings/iter.ts +146 -71
  337. package/gs/strings/replace.test.ts +1 -4
  338. package/gs/strings/replace.ts +6 -6
  339. package/gs/strings/strings.test.ts +4 -0
  340. package/gs/strings/strings.ts +54 -6
  341. package/gs/sync/sync.test.ts +57 -1
  342. package/gs/sync/sync.ts +45 -13
  343. package/gs/syscall/errors.ts +158 -115
  344. package/gs/syscall/fs.ts +8 -8
  345. package/gs/syscall/js/index.ts +49 -22
  346. package/gs/syscall/net.test.ts +26 -0
  347. package/gs/syscall/types.ts +7 -2
  348. package/gs/testing/testing.test.ts +56 -0
  349. package/gs/testing/testing.ts +27 -10
  350. package/gs/time/meta.json +2 -2
  351. package/gs/time/time.test.ts +4 -0
  352. package/gs/time/time.ts +33 -2
  353. package/gs/unicode/unicode.test.ts +14 -3
  354. package/gs/unicode/unicode.ts +1 -5
  355. package/gs/unique/index.ts +9 -2
  356. package/package.json +3 -3
@@ -316,6 +316,85 @@ class emptyStream implements Stream {
316
316
  }
317
317
  }
318
318
 
319
+ class memoryStream implements Stream {
320
+ private sent: Message | null = null
321
+ private sentQueue: (Message | null)[] = []
322
+ private waiters: ((msg: Message | null) => void)[] = []
323
+ private closed = false
324
+ private recvConsumed = false
325
+
326
+ constructor(
327
+ private ctx: context.Context,
328
+ private recv: Message | null,
329
+ ) {}
330
+
331
+ public Context(): context.Context {
332
+ return this.ctx
333
+ }
334
+
335
+ public MsgSend(msg: Message | null): $.GoError {
336
+ this.sent = msg
337
+ const waiter = this.waiters.shift()
338
+ if (waiter != null) {
339
+ waiter(msg)
340
+ return null
341
+ }
342
+ this.sentQueue.push(msg)
343
+ return null
344
+ }
345
+
346
+ public MsgRecv(msg: Message | null): MaybePromise<$.GoError> {
347
+ if (!this.recvConsumed) {
348
+ this.recvConsumed = true
349
+ if (msg != null && this.recv != null) {
350
+ Object.assign(msg, this.recv)
351
+ }
352
+ return null
353
+ }
354
+ const next = this.sentQueue.shift()
355
+ if (next !== undefined) {
356
+ if (msg != null && next != null) {
357
+ Object.assign(msg, next)
358
+ }
359
+ return null
360
+ }
361
+ if (this.closed) {
362
+ return io.EOF
363
+ }
364
+ return new Promise<$.GoError>((resolve) => {
365
+ this.waiters.push((sent) => {
366
+ if (msg != null && sent != null) {
367
+ Object.assign(msg, sent)
368
+ }
369
+ resolve(null)
370
+ })
371
+ })
372
+ }
373
+
374
+ public CloseSend(): $.GoError {
375
+ return null
376
+ }
377
+
378
+ public Close(): $.GoError {
379
+ this.closed = true
380
+ for (const waiter of this.waiters.splice(0)) {
381
+ waiter(null)
382
+ }
383
+ return null
384
+ }
385
+
386
+ public CopySentTo(output: Message | null): void {
387
+ if (output != null && this.sent != null) {
388
+ Object.assign(output, this.sent)
389
+ return
390
+ }
391
+ const next = this.sentQueue.shift()
392
+ if (output != null && next != null) {
393
+ Object.assign(output, next)
394
+ }
395
+ }
396
+ }
397
+
319
398
  class streamWithClose implements Stream {
320
399
  constructor(
321
400
  private stream: Stream,
@@ -592,15 +671,418 @@ export class Server {
592
671
  _ctx: context.Context,
593
672
  _rwc: io.ReadWriteCloser | null,
594
673
  ): void {}
674
+
675
+ public AcceptMuxedConn(
676
+ _ctx: context.Context,
677
+ _conn: MuxedConn | null,
678
+ ): $.GoError {
679
+ return null
680
+ }
595
681
  }
596
682
 
597
683
  export function NewServer(invoker: Invoker | null): Server {
598
684
  return new Server({ invoker })
599
685
  }
600
686
 
601
- export type PacketHandler = (pkt: Packet | null) => $.GoError
602
- export type PacketDataHandler = (data: $.Slice<number>) => $.GoError
603
- export type CloseHandler = (closeErr: $.GoError) => void
687
+ export interface PacketWriter {
688
+ WritePacket(packet: Packet | null): MaybePromise<$.GoError>
689
+ Close(): MaybePromise<$.GoError>
690
+ }
691
+
692
+ export type OpenStreamFunc = ((
693
+ ctx: context.Context,
694
+ msgHandler: PacketDataHandler,
695
+ closeHandler: CloseHandler,
696
+ ) => MaybePromise<[PacketWriter | null, $.GoError]>) & {
697
+ __server?: Server
698
+ }
699
+
700
+ class transportClient implements Client {
701
+ constructor(private openStream: OpenStreamFunc | null) {}
702
+
703
+ public async ExecCall(
704
+ ctx: context.Context,
705
+ service: string,
706
+ method: string,
707
+ input: Message | null,
708
+ output: Message | null,
709
+ ): Promise<$.GoError> {
710
+ if (this.openStream == null) {
711
+ return ErrNoAvailableClients
712
+ }
713
+ const writerResult = await this.openStream(
714
+ ctx,
715
+ () => null,
716
+ () => undefined,
717
+ )
718
+ if (writerResult == null) {
719
+ return ErrNoAvailableClients
720
+ }
721
+ const writer = writerResult[0]
722
+ const err = writerResult[1]
723
+ if (err != null) {
724
+ return err
725
+ }
726
+ if (input != null) {
727
+ const [data, marshalErr] = input.MarshalVT()
728
+ if (marshalErr != null) {
729
+ return marshalErr
730
+ }
731
+ const writeErr = await writer?.WritePacket(
732
+ NewCallStartPacket(service, method, data, $.len(data) === 0),
733
+ )
734
+ if (writeErr != null) {
735
+ return writeErr
736
+ }
737
+ }
738
+ if (output != null) {
739
+ output.Reset()
740
+ }
741
+ return await writer?.Close() ?? null
742
+ }
743
+
744
+ public async NewStream(
745
+ ctx: context.Context,
746
+ service: string,
747
+ method: string,
748
+ firstMsg: Message | null,
749
+ ): Promise<[Stream | null, $.GoError]> {
750
+ if (this.openStream == null) {
751
+ return [null, ErrNoAvailableClients]
752
+ }
753
+ const writerResult = await this.openStream(
754
+ ctx,
755
+ () => null,
756
+ () => undefined,
757
+ )
758
+ if (writerResult == null) {
759
+ return [null, ErrNoAvailableClients]
760
+ }
761
+ const writer = writerResult[0]
762
+ const err = writerResult[1]
763
+ if (err != null) {
764
+ return [null, err]
765
+ }
766
+ if (firstMsg != null) {
767
+ const [data, marshalErr] = firstMsg.MarshalVT()
768
+ if (marshalErr != null) {
769
+ return [null, marshalErr]
770
+ }
771
+ const writeErr = await writer?.WritePacket(
772
+ NewCallStartPacket(service, method, data, $.len(data) === 0),
773
+ )
774
+ if (writeErr != null) {
775
+ return [null, writeErr]
776
+ }
777
+ }
778
+ return [
779
+ NewStreamWithClose(new emptyStream(ctx), () => writer?.Close() ?? null),
780
+ null,
781
+ ]
782
+ }
783
+ }
784
+
785
+ export function NewClient(openStream: OpenStreamFunc | null): Client {
786
+ if (openStream?.__server != null) {
787
+ return NewClientWithInvoker(openStream.__server.GetInvoker())
788
+ }
789
+ return new transportClient(openStream)
790
+ }
791
+
792
+ class invokerClient implements Client {
793
+ constructor(
794
+ private invoker: Invoker | null,
795
+ private contextFn: ((ctx: context.Context) => context.Context) | null = null,
796
+ ) {}
797
+
798
+ public async ExecCall(
799
+ ctx: context.Context,
800
+ service: string,
801
+ method: string,
802
+ input: Message | null,
803
+ output: Message | null,
804
+ ): Promise<$.GoError> {
805
+ if (this.invoker == null) {
806
+ return ErrNoAvailableClients
807
+ }
808
+ const stream = new memoryStream(
809
+ this.contextFn == null ? ctx : this.contextFn(ctx),
810
+ input,
811
+ )
812
+ const [handled, err] = await this.invoker.InvokeMethod(
813
+ service,
814
+ method,
815
+ stream,
816
+ )
817
+ if (err != null) {
818
+ return err
819
+ }
820
+ if (!handled) {
821
+ return ErrUnimplemented
822
+ }
823
+ stream.CopySentTo(output)
824
+ return null
825
+ }
826
+
827
+ public async NewStream(
828
+ ctx: context.Context,
829
+ service: string,
830
+ method: string,
831
+ firstMsg: Message | null,
832
+ ): Promise<[Stream | null, $.GoError]> {
833
+ if (this.invoker == null) {
834
+ return [null, ErrNoAvailableClients]
835
+ }
836
+ const stream = new memoryStream(
837
+ this.contextFn == null ? ctx : this.contextFn(ctx),
838
+ firstMsg,
839
+ )
840
+ const pending = Promise.resolve(
841
+ this.invoker.InvokeMethod(service, method, stream),
842
+ )
843
+ pending.then(([handled, err]) => {
844
+ if (!handled || err != null) {
845
+ stream.Close()
846
+ }
847
+ })
848
+ return [stream, null]
849
+ }
850
+ }
851
+
852
+ export function NewClientWithInvoker(
853
+ invoker: Invoker | null,
854
+ contextFn: ((ctx: context.Context) => context.Context) | null = null,
855
+ ): Client {
856
+ return new invokerClient(invoker, contextFn)
857
+ }
858
+
859
+ export type PacketHandler =
860
+ | ((pkt: Packet | null) => MaybePromise<$.GoError>)
861
+ | null
862
+ export type PacketDataHandler =
863
+ | ((data: $.Slice<number>) => MaybePromise<$.GoError>)
864
+ | null
865
+ export type CloseHandler = ((closeErr: $.GoError) => void) | null
866
+
867
+ class streamWithContext implements Stream {
868
+ constructor(
869
+ private stream: Stream,
870
+ private ctx: context.Context,
871
+ ) {}
872
+
873
+ public Context(): context.Context {
874
+ return this.ctx
875
+ }
876
+
877
+ public MsgSend(msg: Message | null): MaybePromise<$.GoError> {
878
+ return this.stream.MsgSend(msg)
879
+ }
880
+
881
+ public MsgRecv(msg: Message | null): MaybePromise<$.GoError> {
882
+ return this.stream.MsgRecv(msg)
883
+ }
884
+
885
+ public CloseSend(): MaybePromise<$.GoError> {
886
+ return this.stream.CloseSend()
887
+ }
888
+
889
+ public Close(): MaybePromise<$.GoError> {
890
+ return this.stream.Close()
891
+ }
892
+ }
893
+
894
+ export function NewStreamWithContext(
895
+ stream: Stream | null,
896
+ ctx: context.Context,
897
+ ): Stream {
898
+ return new streamWithContext(stream ?? new emptyStream(ctx), ctx)
899
+ }
900
+
901
+ export class ServerRPC {
902
+ constructor(
903
+ private ctx: context.Context,
904
+ private invoker: Invoker | null,
905
+ private writer: PacketWriter | null,
906
+ ) {}
907
+
908
+ public async HandlePacketData(data: $.Slice<number>): Promise<$.GoError> {
909
+ const pkt = new Packet()
910
+ const err = pkt.UnmarshalVT(data)
911
+ if (err != null) {
912
+ return err
913
+ }
914
+ return this.HandlePacket(pkt)
915
+ }
916
+
917
+ public async HandlePacket(pkt: Packet | null): Promise<$.GoError> {
918
+ if (pkt == null) {
919
+ return null
920
+ }
921
+ const body = pkt.GetBody()
922
+ if (body instanceof Packet_CallStart) {
923
+ return this.HandleCallStart(body.CallStart)
924
+ }
925
+ return null
926
+ }
927
+
928
+ public async HandleCallStart(pkt: CallStart | null): Promise<$.GoError> {
929
+ if (pkt == null || this.invoker == null) {
930
+ return ErrUnimplemented
931
+ }
932
+ const stream = new emptyStream(this.ctx)
933
+ const [handled, err] = await this.invoker.InvokeMethod(
934
+ pkt.GetRpcService(),
935
+ pkt.GetRpcMethod(),
936
+ stream,
937
+ )
938
+ const callErr = err ?? (handled ? null : ErrUnimplemented)
939
+ await this.writer?.WritePacket(NewCallDataPacket(null, false, true, callErr))
940
+ return callErr
941
+ }
942
+
943
+ public HandleStreamClose(_closeErr: $.GoError): void {}
944
+
945
+ public Wait(_ctx: context.Context): $.GoError {
946
+ return null
947
+ }
948
+ }
949
+
950
+ export function NewServerRPC(
951
+ ctx: context.Context,
952
+ invoker: Invoker | null,
953
+ writer: PacketWriter | null,
954
+ ): ServerRPC {
955
+ return new ServerRPC(ctx, invoker, writer)
956
+ }
957
+
958
+ export class PacketReadWriter implements PacketWriter {
959
+ constructor(private rw: io.ReadWriteCloser | null) {}
960
+
961
+ public Write(data: $.Slice<number>): [number, $.GoError] {
962
+ if (this.rw == null) {
963
+ return [0, ErrNilWriter]
964
+ }
965
+ return this.rw.Write(data)
966
+ }
967
+
968
+ public WritePacket(_packet: Packet | null): $.GoError {
969
+ return this.rw == null ? ErrNilWriter : null
970
+ }
971
+
972
+ public ReadPump(_cb: PacketDataHandler, closed: CloseHandler): void {
973
+ if (closed != null) {
974
+ closed(null)
975
+ }
976
+ }
977
+
978
+ public ReadToHandler(_cb: PacketDataHandler): $.GoError {
979
+ return null
980
+ }
981
+
982
+ public Close(): $.GoError {
983
+ return this.rw?.Close() ?? null
984
+ }
985
+ }
986
+
987
+ export function NewPacketReadWriter(
988
+ rw: io.ReadWriteCloser | null,
989
+ ): PacketReadWriter {
990
+ return new PacketReadWriter(rw)
991
+ }
992
+
993
+ export function NewServerPipe(server: Server | null): OpenStreamFunc {
994
+ const openStream = ((
995
+ _ctx: context.Context,
996
+ _msgHandler: PacketDataHandler,
997
+ _closeHandler: CloseHandler,
998
+ ): [PacketWriter | null, $.GoError] => [new closedPacketWriter(), null]) as
999
+ OpenStreamFunc
1000
+ if (server != null) {
1001
+ openStream.__server = server
1002
+ }
1003
+ return openStream
1004
+ }
1005
+
1006
+ export class MuxedConn {
1007
+ constructor(
1008
+ public rwc: any = null,
1009
+ public outbound = false,
1010
+ ) {}
1011
+
1012
+ public Close(): $.GoError {
1013
+ return this.rwc?.Close() ?? null
1014
+ }
1015
+ }
1016
+
1017
+ class closedPacketWriter implements PacketWriter {
1018
+ public WritePacket(_packet: Packet | null): $.GoError {
1019
+ return ErrUnimplemented
1020
+ }
1021
+
1022
+ public Close(): $.GoError {
1023
+ return null
1024
+ }
1025
+ }
1026
+
1027
+ export function NewOpenStreamWithMuxedConn(_conn: MuxedConn): OpenStreamFunc {
1028
+ return () => [new closedPacketWriter(), null]
1029
+ }
1030
+
1031
+ export function NewMuxedConn(
1032
+ rwc: any,
1033
+ outbound: boolean,
1034
+ _yamuxConf: unknown,
1035
+ ): [MuxedConn | null, $.GoError] {
1036
+ return [new MuxedConn(rwc, outbound), null]
1037
+ }
1038
+
1039
+ export function NewWebSocketConn(
1040
+ _ctx: context.Context,
1041
+ conn: unknown,
1042
+ isServer: boolean,
1043
+ yamuxConf: unknown,
1044
+ ): [MuxedConn | null, $.GoError] {
1045
+ return NewMuxedConn(conn, !isServer, yamuxConf)
1046
+ }
1047
+
1048
+ export function NewClientWithMuxedConn(_conn: MuxedConn | null): Client {
1049
+ return NewClientWithInvoker(null)
1050
+ }
1051
+
1052
+ export function NewMuxedConnWithRwc(
1053
+ _ctx: context.Context,
1054
+ _rwc: io.ReadWriteCloser | null,
1055
+ _outbound: boolean,
1056
+ _yamuxConf: unknown,
1057
+ ): [MuxedConn | null, $.GoError] {
1058
+ return [new MuxedConn(_rwc, _outbound), null]
1059
+ }
1060
+
1061
+ class clientInvoker implements Invoker {
1062
+ constructor(private client: Client | null) {}
1063
+
1064
+ public async InvokeMethod(
1065
+ serviceID: string,
1066
+ methodID: string,
1067
+ stream: Stream | null,
1068
+ ): Promise<[boolean, $.GoError]> {
1069
+ if (this.client == null || stream == null) {
1070
+ return [false, null]
1071
+ }
1072
+ const [remote, err] = await this.client.NewStream(
1073
+ stream.Context(),
1074
+ serviceID,
1075
+ methodID,
1076
+ null,
1077
+ )
1078
+ await remote?.Close()
1079
+ return [true, err]
1080
+ }
1081
+ }
1082
+
1083
+ export function NewClientInvoker(client: Client | null): Invoker {
1084
+ return new clientInvoker(client)
1085
+ }
604
1086
 
605
1087
  export class Packet {
606
1088
  public Body: unknown = null
@@ -635,6 +1117,22 @@ export class CallStart {
635
1117
  public RpcMethod = ''
636
1118
  public Data: $.Slice<number> = null
637
1119
  public DataIsZero = false
1120
+
1121
+ public GetRpcService(): string {
1122
+ return this.RpcService
1123
+ }
1124
+
1125
+ public GetRpcMethod(): string {
1126
+ return this.RpcMethod
1127
+ }
1128
+
1129
+ public GetData(): $.Slice<number> {
1130
+ return this.Data
1131
+ }
1132
+
1133
+ public GetDataIsZero(): boolean {
1134
+ return this.DataIsZero
1135
+ }
638
1136
  }
639
1137
 
640
1138
  export class CallData {
@@ -642,6 +1140,22 @@ export class CallData {
642
1140
  public DataIsZero = false
643
1141
  public Complete = false
644
1142
  public Error = ''
1143
+
1144
+ public GetData(): $.Slice<number> {
1145
+ return this.Data
1146
+ }
1147
+
1148
+ public GetDataIsZero(): boolean {
1149
+ return this.DataIsZero
1150
+ }
1151
+
1152
+ public GetComplete(): boolean {
1153
+ return this.Complete
1154
+ }
1155
+
1156
+ public GetError(): string {
1157
+ return this.Error
1158
+ }
645
1159
  }
646
1160
 
647
1161
  export class Packet_CallStart {
@@ -665,7 +1179,7 @@ export function NewPacketDataHandler(
665
1179
  if (err != null) {
666
1180
  return err
667
1181
  }
668
- return handler(pkt)
1182
+ return handler?.(pkt) ?? null
669
1183
  }
670
1184
  }
671
1185
 
@@ -10,6 +10,8 @@
10
10
  "Client.NewStream": true,
11
11
  "ClientSet.ExecCall": true,
12
12
  "ClientSet.NewStream": true,
13
+ "PacketWriter.WritePacket": true,
14
+ "PacketWriter.Close": true,
13
15
  "PrefixClient.ExecCall": true,
14
16
  "PrefixClient.NewStream": true,
15
17
  "Stream.MsgSend": true,
@@ -30,6 +32,10 @@
30
32
  "StreamSendAndClose.Close": true,
31
33
  "StreamSendAndClose.Send": true,
32
34
  "StreamSendAndClose.SendAndClose": true,
35
+ "ServerRPC.HandlePacketData": true,
36
+ "ServerRPC.HandlePacket": true,
37
+ "ServerRPC.HandleCallStart": true,
38
+ "clientInvoker.InvokeMethod": true,
33
39
  "InvokerFunc.InvokeMethod": true,
34
40
  "InvokerSlice.InvokeMethod": true,
35
41
  "Invoker.InvokeMethod": true,
@@ -0,0 +1,30 @@
1
+ import { describe, expect, test } from 'vitest'
2
+ import { makeChannel } from '../../../../builtin/index.js'
3
+ import { Background } from '../../../../context/index.js'
4
+ import { NewConcurrentQueue } from './index.js'
5
+
6
+ const tick = () => new Promise<void>((resolve) => queueMicrotask(resolve))
7
+
8
+ describe('util/conc override', () => {
9
+ test('runs queued jobs within the concurrency limit', async () => {
10
+ const release = makeChannel<{}>(0, {}, 'both')
11
+ const started: number[] = []
12
+ const done: number[] = []
13
+ const job = (idx: number) => async () => {
14
+ started.push(idx)
15
+ await release.receive()
16
+ done.push(idx)
17
+ }
18
+
19
+ const q = NewConcurrentQueue(2, job(0), job(1))
20
+ const [queued, running] = q.Enqueue([job(2), job(3), job(4)])
21
+ expect([queued, running]).toEqual([3, 2])
22
+
23
+ await tick()
24
+ expect(started).toEqual([0, 1])
25
+
26
+ release.close()
27
+ expect(await q.WaitIdle(Background(), null)).toBeNull()
28
+ expect(done).toEqual([0, 1, 2, 3, 4])
29
+ })
30
+ })