goscript 0.1.0 → 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 (495) hide show
  1. package/README.md +267 -255
  2. package/cmd/goscript/cmd-test.go +286 -0
  3. package/cmd/goscript/cmd-test_test.go +76 -0
  4. package/cmd/goscript/cmd_compile.go +9 -0
  5. package/cmd/goscript/main.go +1 -0
  6. package/compiler/build-flags.go +38 -0
  7. package/compiler/compile-request.go +33 -0
  8. package/compiler/compiler.go +1 -1
  9. package/compiler/compliance_test.go +0 -10
  10. package/compiler/config.go +2 -0
  11. package/compiler/gotest/owner.go +24 -0
  12. package/compiler/gotest/package-result.go +69 -0
  13. package/compiler/gotest/request.go +210 -0
  14. package/compiler/gotest/result.go +28 -0
  15. package/compiler/gotest/runner.go +1225 -0
  16. package/compiler/gotest/runner_test.go +1271 -0
  17. package/compiler/gotest/test.go +9 -0
  18. package/compiler/index.test.ts +1 -1
  19. package/compiler/lowered-program.go +80 -21
  20. package/compiler/lowering.go +6754 -602
  21. package/compiler/override-facts.go +357 -0
  22. package/compiler/override-registry.go +52 -190
  23. package/compiler/override-registry_test.go +182 -0
  24. package/compiler/package-graph.go +50 -27
  25. package/compiler/package-graph_test.go +99 -9
  26. package/compiler/package-test-function.go +9 -0
  27. package/compiler/package-test-graph-package.go +40 -0
  28. package/compiler/package-test-graph-variant.go +129 -0
  29. package/compiler/package-test-graph.go +112 -0
  30. package/compiler/package-test-graph_test.go +202 -0
  31. package/compiler/runtime-contract.go +229 -29
  32. package/compiler/runtime-contract_test.go +44 -30
  33. package/compiler/semantic-model-types.go +25 -6
  34. package/compiler/semantic-model.go +819 -74
  35. package/compiler/semantic-model_test.go +104 -0
  36. package/compiler/service.go +10 -4
  37. package/compiler/skeleton_test.go +2777 -524
  38. package/compiler/tsworkspace/owner-process-unix_test.go +72 -0
  39. package/compiler/tsworkspace/owner.go +342 -0
  40. package/compiler/tsworkspace/owner_test.go +93 -0
  41. package/compiler/tsworkspace/result.go +17 -0
  42. package/compiler/tsworkspace/tool-process-other.go +14 -0
  43. package/compiler/tsworkspace/tool-process-unix.go +19 -0
  44. package/compiler/typescript-emitter.go +576 -86
  45. package/compiler/wasm/compile.go +1 -1
  46. package/compiler/wasm/compile_test.go +61 -11
  47. package/compiler/wasm_api.go +172 -7
  48. package/dist/gs/builtin/builtin.d.ts +40 -3
  49. package/dist/gs/builtin/builtin.js +430 -22
  50. package/dist/gs/builtin/builtin.js.map +1 -1
  51. package/dist/gs/builtin/channel.d.ts +32 -10
  52. package/dist/gs/builtin/channel.js +119 -25
  53. package/dist/gs/builtin/channel.js.map +1 -1
  54. package/dist/gs/builtin/defer.d.ts +1 -0
  55. package/dist/gs/builtin/defer.js +12 -2
  56. package/dist/gs/builtin/defer.js.map +1 -1
  57. package/dist/gs/builtin/hostio.d.ts +9 -0
  58. package/dist/gs/builtin/hostio.js +25 -0
  59. package/dist/gs/builtin/hostio.js.map +1 -1
  60. package/dist/gs/builtin/map.js +40 -6
  61. package/dist/gs/builtin/map.js.map +1 -1
  62. package/dist/gs/builtin/print.js.map +1 -1
  63. package/dist/gs/builtin/slice.d.ts +64 -10
  64. package/dist/gs/builtin/slice.js +619 -244
  65. package/dist/gs/builtin/slice.js.map +1 -1
  66. package/dist/gs/builtin/type.d.ts +7 -2
  67. package/dist/gs/builtin/type.js +128 -29
  68. package/dist/gs/builtin/type.js.map +1 -1
  69. package/dist/gs/builtin/varRef.d.ts +7 -0
  70. package/dist/gs/builtin/varRef.js +23 -0
  71. package/dist/gs/builtin/varRef.js.map +1 -1
  72. package/dist/gs/bytes/buffer.gs.js +74 -70
  73. package/dist/gs/bytes/buffer.gs.js.map +1 -1
  74. package/dist/gs/bytes/iter.gs.js +13 -13
  75. package/dist/gs/bytes/iter.gs.js.map +1 -1
  76. package/dist/gs/bytes/reader.gs.js +20 -18
  77. package/dist/gs/bytes/reader.gs.js.map +1 -1
  78. package/dist/gs/compress/zlib/index.d.ts +26 -0
  79. package/dist/gs/compress/zlib/index.js +168 -0
  80. package/dist/gs/compress/zlib/index.js.map +1 -0
  81. package/dist/gs/context/context.d.ts +6 -5
  82. package/dist/gs/context/context.js +17 -12
  83. package/dist/gs/context/context.js.map +1 -1
  84. package/dist/gs/crypto/ecdh/index.d.ts +52 -0
  85. package/dist/gs/crypto/ecdh/index.js +226 -0
  86. package/dist/gs/crypto/ecdh/index.js.map +1 -0
  87. package/dist/gs/crypto/ed25519/index.d.ts +34 -0
  88. package/dist/gs/crypto/ed25519/index.js +160 -0
  89. package/dist/gs/crypto/ed25519/index.js.map +1 -0
  90. package/dist/gs/crypto/internal/constanttime/index.d.ts +4 -0
  91. package/dist/gs/crypto/internal/constanttime/index.js +18 -0
  92. package/dist/gs/crypto/internal/constanttime/index.js.map +1 -0
  93. package/dist/gs/crypto/internal/fips140deps/byteorder/index.d.ts +1 -0
  94. package/dist/gs/crypto/internal/fips140deps/byteorder/index.js +2 -0
  95. package/dist/gs/crypto/internal/fips140deps/byteorder/index.js.map +1 -0
  96. package/dist/gs/crypto/internal/fips140deps/godebug/index.d.ts +1 -0
  97. package/dist/gs/crypto/internal/fips140deps/godebug/index.js +2 -0
  98. package/dist/gs/crypto/internal/fips140deps/godebug/index.js.map +1 -0
  99. package/dist/gs/crypto/rand/index.d.ts +2 -0
  100. package/dist/gs/crypto/rand/index.js +85 -0
  101. package/dist/gs/crypto/rand/index.js.map +1 -1
  102. package/dist/gs/crypto/sha256/index.d.ts +8 -0
  103. package/dist/gs/crypto/sha256/index.js +118 -0
  104. package/dist/gs/crypto/sha256/index.js.map +1 -0
  105. package/dist/gs/crypto/sha512/index.d.ts +14 -0
  106. package/dist/gs/crypto/sha512/index.js +129 -0
  107. package/dist/gs/crypto/sha512/index.js.map +1 -0
  108. package/dist/gs/embed/index.d.ts +7 -0
  109. package/dist/gs/embed/index.js +16 -0
  110. package/dist/gs/embed/index.js.map +1 -0
  111. package/dist/gs/encoding/json/index.d.ts +4 -0
  112. package/dist/gs/encoding/json/index.js +33 -0
  113. package/dist/gs/encoding/json/index.js.map +1 -1
  114. package/dist/gs/errors/errors.d.ts +4 -0
  115. package/dist/gs/errors/errors.js +108 -4
  116. package/dist/gs/errors/errors.js.map +1 -1
  117. package/dist/gs/fmt/fmt.d.ts +4 -4
  118. package/dist/gs/fmt/fmt.js +42 -11
  119. package/dist/gs/fmt/fmt.js.map +1 -1
  120. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +37 -2
  121. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +245 -1
  122. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  123. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.d.ts +189 -0
  124. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +861 -0
  125. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -0
  126. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +217 -0
  127. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +814 -0
  128. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +1 -0
  129. package/dist/gs/github.com/aperturerobotics/util/conc/index.d.ts +20 -0
  130. package/dist/gs/github.com/aperturerobotics/util/conc/index.js +134 -0
  131. package/dist/gs/github.com/aperturerobotics/util/conc/index.js.map +1 -0
  132. package/dist/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.js.map +1 -1
  133. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.d.ts +3 -0
  134. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js +50 -0
  135. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js.map +1 -0
  136. package/dist/gs/github.com/klauspost/compress/internal/le/index.d.ts +9 -0
  137. package/dist/gs/github.com/klauspost/compress/internal/le/index.js +72 -0
  138. package/dist/gs/github.com/klauspost/compress/internal/le/index.js.map +1 -0
  139. package/dist/gs/github.com/mr-tron/base58/base58/index.d.ts +27 -0
  140. package/dist/gs/github.com/mr-tron/base58/base58/index.js +172 -0
  141. package/dist/gs/github.com/mr-tron/base58/base58/index.js.map +1 -0
  142. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.d.ts +21 -0
  143. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js +22 -0
  144. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js.map +1 -0
  145. package/dist/gs/go/internal/scannerhooks/index.d.ts +3 -0
  146. package/dist/gs/go/internal/scannerhooks/index.js +5 -0
  147. package/dist/gs/go/internal/scannerhooks/index.js.map +1 -0
  148. package/dist/gs/go/scanner/index.d.ts +13 -0
  149. package/dist/gs/go/scanner/index.js +35 -0
  150. package/dist/gs/go/scanner/index.js.map +1 -1
  151. package/dist/gs/go/token/index.d.ts +156 -0
  152. package/dist/gs/go/token/index.js +507 -4
  153. package/dist/gs/go/token/index.js.map +1 -1
  154. package/dist/gs/hash/fnv/index.d.ts +57 -0
  155. package/dist/gs/hash/fnv/index.js +299 -0
  156. package/dist/gs/hash/fnv/index.js.map +1 -0
  157. package/dist/gs/hash/index.d.ts +17 -0
  158. package/dist/gs/hash/index.js +94 -0
  159. package/dist/gs/hash/index.js.map +1 -0
  160. package/dist/gs/internal/abi/index.d.ts +4 -0
  161. package/dist/gs/internal/abi/index.js +10 -0
  162. package/dist/gs/internal/abi/index.js.map +1 -1
  163. package/dist/gs/internal/bytealg/index.d.ts +2 -0
  164. package/dist/gs/internal/bytealg/index.js +14 -0
  165. package/dist/gs/internal/bytealg/index.js.map +1 -1
  166. package/dist/gs/internal/byteorder/index.d.ts +8 -2
  167. package/dist/gs/internal/byteorder/index.js +56 -25
  168. package/dist/gs/internal/byteorder/index.js.map +1 -1
  169. package/dist/gs/internal/godebug/index.d.ts +12 -0
  170. package/dist/gs/internal/godebug/index.js +30 -0
  171. package/dist/gs/internal/godebug/index.js.map +1 -0
  172. package/dist/gs/io/fs/index.d.ts +1 -0
  173. package/dist/gs/io/fs/index.js +1 -0
  174. package/dist/gs/io/fs/index.js.map +1 -1
  175. package/dist/gs/io/fs/readlink.d.ts +8 -0
  176. package/dist/gs/io/fs/readlink.js +60 -0
  177. package/dist/gs/io/fs/readlink.js.map +1 -0
  178. package/dist/gs/io/fs/walk.d.ts +3 -3
  179. package/dist/gs/io/fs/walk.js +7 -7
  180. package/dist/gs/io/fs/walk.js.map +1 -1
  181. package/dist/gs/io/io.d.ts +40 -6
  182. package/dist/gs/io/io.js +151 -26
  183. package/dist/gs/io/io.js.map +1 -1
  184. package/dist/gs/iter/iter.d.ts +3 -2
  185. package/dist/gs/iter/iter.js.map +1 -1
  186. package/dist/gs/maps/iter.d.ts +5 -5
  187. package/dist/gs/maps/iter.js +48 -21
  188. package/dist/gs/maps/iter.js.map +1 -1
  189. package/dist/gs/maps/maps.d.ts +6 -6
  190. package/dist/gs/maps/maps.js +1 -1
  191. package/dist/gs/maps/maps.js.map +1 -1
  192. package/dist/gs/math/bits/index.d.ts +13 -4
  193. package/dist/gs/math/bits/index.js +70 -48
  194. package/dist/gs/math/bits/index.js.map +1 -1
  195. package/dist/gs/math/const.gs.d.ts +5 -5
  196. package/dist/gs/math/const.gs.js +4 -4
  197. package/dist/gs/math/const.gs.js.map +1 -1
  198. package/dist/gs/mime/index.d.ts +1 -0
  199. package/dist/gs/mime/index.js +52 -0
  200. package/dist/gs/mime/index.js.map +1 -0
  201. package/dist/gs/net/http/httptest/index.d.ts +30 -0
  202. package/dist/gs/net/http/httptest/index.js +101 -0
  203. package/dist/gs/net/http/httptest/index.js.map +1 -0
  204. package/dist/gs/net/http/index.d.ts +131 -0
  205. package/dist/gs/net/http/index.js +307 -0
  206. package/dist/gs/net/http/index.js.map +1 -0
  207. package/dist/gs/net/http/pprof/index.d.ts +8 -0
  208. package/dist/gs/net/http/pprof/index.js +59 -0
  209. package/dist/gs/net/http/pprof/index.js.map +1 -0
  210. package/dist/gs/os/dir_unix.gs.js +2 -2
  211. package/dist/gs/os/dir_unix.gs.js.map +1 -1
  212. package/dist/gs/os/error.gs.js +9 -7
  213. package/dist/gs/os/error.gs.js.map +1 -1
  214. package/dist/gs/os/types_js.gs.js +95 -15
  215. package/dist/gs/os/types_js.gs.js.map +1 -1
  216. package/dist/gs/path/filepath/match.js +165 -3
  217. package/dist/gs/path/filepath/match.js.map +1 -1
  218. package/dist/gs/path/filepath/path.d.ts +8 -4
  219. package/dist/gs/path/filepath/path.js +192 -8
  220. package/dist/gs/path/filepath/path.js.map +1 -1
  221. package/dist/gs/path/path.d.ts +4 -1
  222. package/dist/gs/path/path.js +16 -4
  223. package/dist/gs/path/path.js.map +1 -1
  224. package/dist/gs/reflect/index.d.ts +4 -3
  225. package/dist/gs/reflect/index.js +3 -2
  226. package/dist/gs/reflect/index.js.map +1 -1
  227. package/dist/gs/reflect/iter.js +2 -2
  228. package/dist/gs/reflect/iter.js.map +1 -1
  229. package/dist/gs/reflect/map.js +29 -0
  230. package/dist/gs/reflect/map.js.map +1 -1
  231. package/dist/gs/reflect/type.d.ts +31 -9
  232. package/dist/gs/reflect/type.js +536 -43
  233. package/dist/gs/reflect/type.js.map +1 -1
  234. package/dist/gs/reflect/types.d.ts +1 -0
  235. package/dist/gs/reflect/types.js +3 -1
  236. package/dist/gs/reflect/types.js.map +1 -1
  237. package/dist/gs/reflect/value.d.ts +4 -1
  238. package/dist/gs/reflect/value.js +39 -1
  239. package/dist/gs/reflect/value.js.map +1 -1
  240. package/dist/gs/reflect/visiblefields.js +1 -1
  241. package/dist/gs/reflect/visiblefields.js.map +1 -1
  242. package/dist/gs/runtime/debug/index.d.ts +41 -0
  243. package/dist/gs/runtime/debug/index.js +66 -0
  244. package/dist/gs/runtime/debug/index.js.map +1 -0
  245. package/dist/gs/runtime/pprof/index.d.ts +20 -0
  246. package/dist/gs/runtime/pprof/index.js +85 -0
  247. package/dist/gs/runtime/pprof/index.js.map +1 -0
  248. package/dist/gs/runtime/runtime.d.ts +35 -3
  249. package/dist/gs/runtime/runtime.js +72 -0
  250. package/dist/gs/runtime/runtime.js.map +1 -1
  251. package/dist/gs/runtime/trace/index.d.ts +19 -0
  252. package/dist/gs/runtime/trace/index.js +64 -0
  253. package/dist/gs/runtime/trace/index.js.map +1 -0
  254. package/dist/gs/slices/slices.d.ts +42 -8
  255. package/dist/gs/slices/slices.js +425 -11
  256. package/dist/gs/slices/slices.js.map +1 -1
  257. package/dist/gs/sort/slice.gs.d.ts +5 -3
  258. package/dist/gs/sort/slice.gs.js +60 -22
  259. package/dist/gs/sort/slice.gs.js.map +1 -1
  260. package/dist/gs/sort/sort.gs.d.ts +4 -4
  261. package/dist/gs/sort/sort.gs.js +11 -8
  262. package/dist/gs/sort/sort.gs.js.map +1 -1
  263. package/dist/gs/strings/builder.d.ts +1 -1
  264. package/dist/gs/strings/builder.js +29 -19
  265. package/dist/gs/strings/builder.js.map +1 -1
  266. package/dist/gs/strings/iter.js +140 -75
  267. package/dist/gs/strings/iter.js.map +1 -1
  268. package/dist/gs/strings/replace.js +2 -2
  269. package/dist/gs/strings/replace.js.map +1 -1
  270. package/dist/gs/strings/strings.js +52 -6
  271. package/dist/gs/strings/strings.js.map +1 -1
  272. package/dist/gs/sync/atomic/type.gs.d.ts +9 -8
  273. package/dist/gs/sync/atomic/type.gs.js +0 -2
  274. package/dist/gs/sync/atomic/type.gs.js.map +1 -1
  275. package/dist/gs/sync/sync.d.ts +8 -3
  276. package/dist/gs/sync/sync.js +66 -11
  277. package/dist/gs/sync/sync.js.map +1 -1
  278. package/dist/gs/syscall/constants.d.ts +36 -24
  279. package/dist/gs/syscall/constants.js +12 -0
  280. package/dist/gs/syscall/constants.js.map +1 -1
  281. package/dist/gs/syscall/errors.d.ts +117 -111
  282. package/dist/gs/syscall/errors.js +45 -0
  283. package/dist/gs/syscall/errors.js.map +1 -1
  284. package/dist/gs/syscall/fs.d.ts +37 -0
  285. package/dist/gs/syscall/fs.js +102 -0
  286. package/dist/gs/syscall/fs.js.map +1 -1
  287. package/dist/gs/syscall/js/index.d.ts +90 -0
  288. package/dist/gs/syscall/js/index.js +383 -0
  289. package/dist/gs/syscall/js/index.js.map +1 -0
  290. package/dist/gs/syscall/types.d.ts +26 -1
  291. package/dist/gs/syscall/types.js +45 -1
  292. package/dist/gs/syscall/types.js.map +1 -1
  293. package/dist/gs/testing/index.d.ts +1 -0
  294. package/dist/gs/testing/index.js +2 -0
  295. package/dist/gs/testing/index.js.map +1 -0
  296. package/dist/gs/testing/testing.d.ts +78 -0
  297. package/dist/gs/testing/testing.js +318 -0
  298. package/dist/gs/testing/testing.js.map +1 -0
  299. package/dist/gs/time/time.d.ts +41 -4
  300. package/dist/gs/time/time.js +227 -36
  301. package/dist/gs/time/time.js.map +1 -1
  302. package/dist/gs/unicode/unicode.d.ts +23 -1
  303. package/dist/gs/unicode/unicode.js +79 -10
  304. package/dist/gs/unicode/unicode.js.map +1 -1
  305. package/dist/gs/unicode/utf8/utf8.d.ts +4 -4
  306. package/dist/gs/unicode/utf8/utf8.js +24 -11
  307. package/dist/gs/unicode/utf8/utf8.js.map +1 -1
  308. package/dist/gs/unique/index.d.ts +11 -0
  309. package/dist/gs/unique/index.js +76 -0
  310. package/dist/gs/unique/index.js.map +1 -0
  311. package/go.mod +8 -8
  312. package/go.sum +14 -14
  313. package/gs/builtin/builtin.ts +585 -27
  314. package/gs/builtin/channel.ts +183 -29
  315. package/gs/builtin/defer.ts +13 -2
  316. package/gs/builtin/hostio.test.ts +1 -0
  317. package/gs/builtin/hostio.ts +38 -0
  318. package/gs/builtin/map.ts +46 -6
  319. package/gs/builtin/print.ts +12 -3
  320. package/gs/builtin/runtime-contract.test.ts +383 -10
  321. package/gs/builtin/slice.test.ts +70 -0
  322. package/gs/builtin/slice.ts +785 -265
  323. package/gs/builtin/type.ts +160 -41
  324. package/gs/builtin/varRef.ts +40 -1
  325. package/gs/bytes/buffer.gs.ts +74 -70
  326. package/gs/bytes/iter.gs.ts +13 -14
  327. package/gs/bytes/meta.json +8 -3
  328. package/gs/bytes/reader.gs.ts +20 -19
  329. package/gs/compress/zlib/index.test.ts +28 -0
  330. package/gs/compress/zlib/index.ts +200 -0
  331. package/gs/compress/zlib/meta.json +3 -0
  332. package/gs/context/context.test.ts +71 -0
  333. package/gs/context/context.ts +30 -29
  334. package/gs/crypto/ecdh/index.test.ts +43 -0
  335. package/gs/crypto/ecdh/index.ts +274 -0
  336. package/gs/crypto/ed25519/index.test.ts +41 -0
  337. package/gs/crypto/ed25519/index.ts +238 -0
  338. package/gs/crypto/ed25519/meta.json +13 -0
  339. package/gs/crypto/internal/constanttime/index.test.ts +25 -0
  340. package/gs/crypto/internal/constanttime/index.ts +22 -0
  341. package/gs/crypto/internal/fips140deps/byteorder/index.ts +1 -0
  342. package/gs/crypto/internal/fips140deps/godebug/index.ts +1 -0
  343. package/gs/crypto/rand/index.test.ts +89 -1
  344. package/gs/crypto/rand/index.ts +103 -1
  345. package/gs/crypto/rand/meta.json +4 -1
  346. package/gs/crypto/sha256/index.test.ts +78 -0
  347. package/gs/crypto/sha256/index.ts +150 -0
  348. package/gs/crypto/sha256/meta.json +9 -0
  349. package/gs/crypto/sha512/index.test.ts +31 -0
  350. package/gs/crypto/sha512/index.ts +161 -0
  351. package/gs/crypto/sha512/meta.json +11 -0
  352. package/gs/embed/index.ts +20 -0
  353. package/gs/embed/meta.json +5 -0
  354. package/gs/encoding/json/index.test.ts +39 -3
  355. package/gs/encoding/json/index.ts +45 -3
  356. package/gs/errors/errors.test.ts +85 -0
  357. package/gs/errors/errors.ts +132 -4
  358. package/gs/fmt/fmt.test.ts +3 -1
  359. package/gs/fmt/fmt.ts +55 -19
  360. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +128 -1
  361. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +342 -4
  362. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +180 -0
  363. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +1084 -0
  364. package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +31 -0
  365. package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +1233 -0
  366. package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +46 -0
  367. package/gs/github.com/aperturerobotics/util/conc/index.test.ts +30 -0
  368. package/gs/github.com/aperturerobotics/util/conc/index.ts +172 -0
  369. package/gs/github.com/aperturerobotics/util/conc/meta.json +9 -0
  370. package/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.ts +1 -4
  371. package/gs/github.com/hack-pad/safejs/internal/catch/index.test.ts +35 -0
  372. package/gs/github.com/hack-pad/safejs/internal/catch/index.ts +65 -0
  373. package/gs/github.com/hack-pad/safejs/internal/catch/meta.json +9 -0
  374. package/gs/github.com/klauspost/compress/internal/le/index.test.ts +37 -0
  375. package/gs/github.com/klauspost/compress/internal/le/index.ts +115 -0
  376. package/gs/github.com/mr-tron/base58/base58/index.test.ts +70 -0
  377. package/gs/github.com/mr-tron/base58/base58/index.ts +231 -0
  378. package/gs/github.com/mr-tron/base58/base58/meta.json +3 -0
  379. package/gs/github.com/zeebo/blake3/internal/consts/index.test.ts +46 -0
  380. package/gs/github.com/zeebo/blake3/internal/consts/index.ts +26 -0
  381. package/gs/go/internal/scannerhooks/index.test.ts +14 -0
  382. package/gs/go/internal/scannerhooks/index.ts +9 -0
  383. package/gs/go/scanner/index.test.ts +22 -0
  384. package/gs/go/scanner/index.ts +47 -0
  385. package/gs/go/token/index.test.ts +47 -1
  386. package/gs/go/token/index.ts +583 -4
  387. package/gs/hash/fnv/index.test.ts +67 -0
  388. package/gs/hash/fnv/index.ts +351 -0
  389. package/gs/hash/fnv/meta.json +3 -0
  390. package/gs/hash/index.test.ts +37 -0
  391. package/gs/hash/index.ts +118 -0
  392. package/gs/hash/meta.json +5 -0
  393. package/gs/internal/abi/index.test.ts +18 -0
  394. package/gs/internal/abi/index.ts +14 -0
  395. package/gs/internal/bytealg/index.test.ts +18 -0
  396. package/gs/internal/bytealg/index.ts +16 -0
  397. package/gs/internal/byteorder/index.test.ts +39 -0
  398. package/gs/internal/byteorder/index.ts +100 -27
  399. package/gs/internal/godebug/index.test.ts +16 -0
  400. package/gs/internal/godebug/index.ts +35 -0
  401. package/gs/io/fs/index.ts +1 -0
  402. package/gs/io/fs/meta.json +5 -0
  403. package/gs/io/fs/readlink.test.ts +43 -0
  404. package/gs/io/fs/readlink.ts +69 -0
  405. package/gs/io/fs/walk.test.ts +61 -0
  406. package/gs/io/fs/walk.ts +17 -9
  407. package/gs/io/io.ts +177 -31
  408. package/gs/io/meta.json +10 -2
  409. package/gs/iter/iter.ts +8 -2
  410. package/gs/maps/iter.ts +75 -26
  411. package/gs/maps/maps.test.ts +23 -0
  412. package/gs/maps/maps.ts +13 -11
  413. package/gs/math/bits/index.test.ts +20 -0
  414. package/gs/math/bits/index.ts +107 -64
  415. package/gs/math/const.gs.test.ts +11 -5
  416. package/gs/math/const.gs.ts +5 -6
  417. package/gs/mime/index.ts +60 -0
  418. package/gs/net/http/httptest/index.test.ts +53 -0
  419. package/gs/net/http/httptest/index.ts +120 -0
  420. package/gs/net/http/index.test.ts +148 -0
  421. package/gs/net/http/index.ts +432 -0
  422. package/gs/net/http/meta.json +6 -0
  423. package/gs/net/http/pprof/index.test.ts +47 -0
  424. package/gs/net/http/pprof/index.ts +65 -0
  425. package/gs/os/dir_unix.gs.ts +2 -3
  426. package/gs/os/error.gs.ts +9 -10
  427. package/gs/os/error.test.ts +41 -0
  428. package/gs/os/file_unix_js.test.ts +55 -0
  429. package/gs/os/tempfile.gs.test.ts +37 -10
  430. package/gs/os/types_js.gs.ts +96 -17
  431. package/gs/path/filepath/match.test.ts +31 -12
  432. package/gs/path/filepath/match.ts +181 -3
  433. package/gs/path/filepath/meta.json +6 -0
  434. package/gs/path/filepath/path.test.ts +80 -0
  435. package/gs/path/filepath/path.ts +244 -11
  436. package/gs/path/path.ts +20 -5
  437. package/gs/reflect/field.test.ts +63 -0
  438. package/gs/reflect/index.ts +5 -1
  439. package/gs/reflect/iter.ts +2 -2
  440. package/gs/reflect/map.test.ts +42 -1
  441. package/gs/reflect/map.ts +39 -0
  442. package/gs/reflect/type.ts +728 -65
  443. package/gs/reflect/typefor.test.ts +100 -0
  444. package/gs/reflect/types.ts +3 -1
  445. package/gs/reflect/value.ts +50 -1
  446. package/gs/reflect/visiblefields.ts +1 -1
  447. package/gs/runtime/debug/index.test.ts +45 -0
  448. package/gs/runtime/debug/index.ts +96 -0
  449. package/gs/runtime/pprof/index.test.ts +36 -0
  450. package/gs/runtime/pprof/index.ts +104 -0
  451. package/gs/runtime/pprof/meta.json +6 -0
  452. package/gs/runtime/runtime.test.ts +19 -0
  453. package/gs/runtime/runtime.ts +98 -3
  454. package/gs/runtime/trace/index.test.ts +45 -0
  455. package/gs/runtime/trace/index.ts +97 -0
  456. package/gs/runtime/trace/meta.json +7 -0
  457. package/gs/slices/meta.json +2 -1
  458. package/gs/slices/slices.test.ts +180 -0
  459. package/gs/slices/slices.ts +502 -15
  460. package/gs/sort/meta.json +7 -0
  461. package/gs/sort/slice.gs.ts +85 -26
  462. package/gs/sort/slice.test.ts +40 -0
  463. package/gs/sort/sort.gs.ts +16 -13
  464. package/gs/strings/builder.test.ts +8 -0
  465. package/gs/strings/builder.ts +33 -20
  466. package/gs/strings/iter.test.ts +5 -7
  467. package/gs/strings/iter.ts +146 -71
  468. package/gs/strings/replace.test.ts +1 -4
  469. package/gs/strings/replace.ts +6 -6
  470. package/gs/strings/strings.test.ts +4 -0
  471. package/gs/strings/strings.ts +54 -6
  472. package/gs/sync/atomic/type.gs.ts +13 -14
  473. package/gs/sync/meta.json +3 -1
  474. package/gs/sync/sync.test.ts +69 -1
  475. package/gs/sync/sync.ts +72 -13
  476. package/gs/syscall/constants.ts +39 -24
  477. package/gs/syscall/errors.ts +165 -112
  478. package/gs/syscall/fs.ts +195 -0
  479. package/gs/syscall/js/index.ts +485 -0
  480. package/gs/syscall/js/meta.json +4 -0
  481. package/gs/syscall/net.test.ts +111 -0
  482. package/gs/syscall/types.ts +63 -2
  483. package/gs/testing/index.ts +1 -0
  484. package/gs/testing/meta.json +5 -0
  485. package/gs/testing/testing.test.ts +146 -0
  486. package/gs/testing/testing.ts +399 -0
  487. package/gs/time/meta.json +2 -2
  488. package/gs/time/time.test.ts +110 -0
  489. package/gs/time/time.ts +309 -57
  490. package/gs/unicode/unicode.test.ts +36 -0
  491. package/gs/unicode/unicode.ts +115 -9
  492. package/gs/unicode/utf8/utf8.test.ts +13 -0
  493. package/gs/unicode/utf8/utf8.ts +28 -16
  494. package/gs/unique/index.ts +98 -0
  495. package/package.json +3 -2
@@ -0,0 +1,1233 @@
1
+ import * as $ from '@goscript/builtin/index.js'
2
+ import * as context from '@goscript/context/index.js'
3
+ import * as io from '@goscript/io/index.js'
4
+ import * as protobuf_go_lite from '@goscript/github.com/aperturerobotics/protobuf-go-lite/index.js'
5
+ import type {
6
+ Client as StarpcClient,
7
+ Mux as StarpcMux,
8
+ Server as StarpcServer,
9
+ } from 'starpc'
10
+
11
+ export type Message = protobuf_go_lite.Message
12
+ export type TypeScriptClient = StarpcClient
13
+ export type TypeScriptMux = StarpcMux
14
+ export type TypeScriptServer = StarpcServer
15
+
16
+ type MaybePromise<T> = T | Promise<T>
17
+
18
+ export const ErrReset = $.newError('stream reset')
19
+ export const ErrUnimplemented = $.newError('unimplemented')
20
+ export const ErrCompleted = $.newError(
21
+ 'unexpected packet after rpc was completed',
22
+ )
23
+ export const ErrUnrecognizedPacket = $.newError('unrecognized packet type')
24
+ export const ErrEmptyPacket = $.newError('invalid empty packet')
25
+ export const ErrInvalidMessage = $.newError('invalid message')
26
+ export const ErrEmptyMethodID = $.newError('method id empty')
27
+ export const ErrEmptyServiceID = $.newError('service id empty')
28
+ export const ErrNoAvailableClients = $.newError('no available rpc clients')
29
+ export const ErrNilWriter = $.newError('writer cannot be nil')
30
+
31
+ export class RawMessage implements Message {
32
+ private data: $.Slice<number>
33
+ private copyData: boolean
34
+
35
+ constructor(init?: Partial<{ data?: $.Slice<number>; copy?: boolean }>) {
36
+ this.data = init?.data ?? null
37
+ this.copyData = init?.copy ?? false
38
+ }
39
+
40
+ public GetData(): $.Slice<number> {
41
+ return this.data
42
+ }
43
+
44
+ public SetData(data: $.Slice<number>): void {
45
+ if (!this.copyData) {
46
+ this.data = data
47
+ return
48
+ }
49
+ const next = new Uint8Array($.len(data))
50
+ $.copy(next, data)
51
+ this.data = next
52
+ }
53
+
54
+ public Clear(): void {
55
+ this.data = $.goSlice(this.data, 0, 0)
56
+ }
57
+
58
+ public Reset(): void {
59
+ this.data = null
60
+ }
61
+
62
+ public MarshalVT(): [$.Slice<number>, $.GoError] {
63
+ if (!this.copyData) {
64
+ return [this.data, null]
65
+ }
66
+ const next = new Uint8Array($.len(this.data))
67
+ $.copy(next, this.data)
68
+ return [next, null]
69
+ }
70
+
71
+ public UnmarshalVT(data: $.Slice<number>): $.GoError {
72
+ this.SetData(data)
73
+ return null
74
+ }
75
+
76
+ public SizeVT(): number {
77
+ return $.len(this.data)
78
+ }
79
+
80
+ public MarshalToSizedBufferVT(dAtA: $.Slice<number>): [number, $.GoError] {
81
+ if ($.len(dAtA) !== $.len(this.data)) {
82
+ return [0, $.newError('invalid buffer length')]
83
+ }
84
+ $.copy(dAtA, this.data)
85
+ return [$.len(dAtA), null]
86
+ }
87
+
88
+ public clone(): RawMessage {
89
+ const cloned = new RawMessage({ copy: this.copyData })
90
+ cloned.SetData(this.data)
91
+ return $.markAsStructValue(cloned)
92
+ }
93
+ }
94
+
95
+ export function NewRawMessage(
96
+ data: $.Slice<number>,
97
+ copy: boolean,
98
+ ): RawMessage {
99
+ return new RawMessage({ data, copy })
100
+ }
101
+
102
+ export interface Client {
103
+ ExecCall(
104
+ ctx: context.Context,
105
+ service: string,
106
+ method: string,
107
+ input: Message | null,
108
+ output: Message | null,
109
+ ): Promise<$.GoError>
110
+ NewStream(
111
+ ctx: context.Context,
112
+ service: string,
113
+ method: string,
114
+ firstMsg: Message | null,
115
+ ): Promise<[Stream | null, $.GoError]>
116
+ }
117
+
118
+ export class ClientSet implements Client {
119
+ private clients: $.Slice<Client | null>
120
+
121
+ constructor(init?: Partial<{ clients?: $.Slice<Client | null> }>) {
122
+ this.clients = init?.clients ?? null
123
+ }
124
+
125
+ public async ExecCall(
126
+ ctx: context.Context,
127
+ service: string,
128
+ method: string,
129
+ input: Message | null,
130
+ output: Message | null,
131
+ ): Promise<$.GoError> {
132
+ return this.execCall(ctx, (client) =>
133
+ client.ExecCall(ctx, service, method, input, output),
134
+ )
135
+ }
136
+
137
+ public async NewStream(
138
+ ctx: context.Context,
139
+ service: string,
140
+ method: string,
141
+ firstMsg: Message | null,
142
+ ): Promise<[Stream | null, $.GoError]> {
143
+ let stream: Stream | null = null
144
+ const err = await this.execCall(ctx, async (client) => {
145
+ const [next, callErr] = await client.NewStream(
146
+ ctx,
147
+ service,
148
+ method,
149
+ firstMsg,
150
+ )
151
+ stream = next
152
+ return callErr
153
+ })
154
+ return [stream, err]
155
+ }
156
+
157
+ private async execCall(
158
+ ctx: context.Context,
159
+ call: (client: Client) => MaybePromise<$.GoError>,
160
+ ): Promise<$.GoError> {
161
+ let anyClient = false
162
+ for (let i = 0; i < $.len(this.clients); i++) {
163
+ const client = this.clients![i]
164
+ if (client == null) {
165
+ continue
166
+ }
167
+ anyClient = true
168
+ const err = await call(client)
169
+ if (err == null) {
170
+ return null
171
+ }
172
+ if (err === context.Canceled && contextErr(ctx) === context.Canceled) {
173
+ return context.Canceled
174
+ }
175
+ if (err.Error() === ErrUnimplemented!.Error()) {
176
+ continue
177
+ }
178
+ return err
179
+ }
180
+ return anyClient ? ErrUnimplemented : ErrNoAvailableClients
181
+ }
182
+ }
183
+
184
+ export function NewClientSet(clients: $.Slice<Client | null>): ClientSet {
185
+ return new ClientSet({ clients })
186
+ }
187
+
188
+ export class PrefixClient implements Client {
189
+ private client: Client | null
190
+ private serviceIDPrefixes: $.Slice<string>
191
+
192
+ constructor(
193
+ clientOrInit?:
194
+ | Client
195
+ | Partial<{ client?: Client | null; serviceIDPrefixes?: $.Slice<string> }>
196
+ | null,
197
+ serviceIDPrefixes?: $.Slice<string>,
198
+ ) {
199
+ if (
200
+ clientOrInit != null &&
201
+ typeof clientOrInit === 'object' &&
202
+ 'client' in clientOrInit
203
+ ) {
204
+ this.client = clientOrInit.client ?? null
205
+ this.serviceIDPrefixes = clientOrInit.serviceIDPrefixes ?? null
206
+ return
207
+ }
208
+ this.client = clientOrInit as Client | null
209
+ this.serviceIDPrefixes = serviceIDPrefixes ?? null
210
+ }
211
+
212
+ public async ExecCall(
213
+ ctx: context.Context,
214
+ service: string,
215
+ method: string,
216
+ input: Message | null,
217
+ output: Message | null,
218
+ ): Promise<$.GoError> {
219
+ const [stripped, err] = this.stripCheckServiceIDPrefix(service)
220
+ if (err != null) {
221
+ return err
222
+ }
223
+ if (this.client == null) {
224
+ return ErrNoAvailableClients
225
+ }
226
+ return this.client.ExecCall(ctx, stripped, method, input, output)
227
+ }
228
+
229
+ public async NewStream(
230
+ ctx: context.Context,
231
+ service: string,
232
+ method: string,
233
+ firstMsg: Message | null,
234
+ ): Promise<[Stream | null, $.GoError]> {
235
+ const [stripped, err] = this.stripCheckServiceIDPrefix(service)
236
+ if (err != null) {
237
+ return [null, err]
238
+ }
239
+ if (this.client == null) {
240
+ return [null, ErrNoAvailableClients]
241
+ }
242
+ return this.client.NewStream(ctx, stripped, method, firstMsg)
243
+ }
244
+
245
+ private stripCheckServiceIDPrefix(service: string): [string, $.GoError] {
246
+ if ($.len(this.serviceIDPrefixes) === 0) {
247
+ return [service, null]
248
+ }
249
+ const [stripped, matched] = CheckStripPrefix(
250
+ service,
251
+ this.serviceIDPrefixes,
252
+ )
253
+ if (matched === '') {
254
+ return [service, ErrUnimplemented]
255
+ }
256
+ return [stripped, null]
257
+ }
258
+ }
259
+
260
+ export function NewPrefixClient(
261
+ client: Client | null,
262
+ serviceIDPrefixes: $.Slice<string>,
263
+ ): PrefixClient {
264
+ return new PrefixClient(client, serviceIDPrefixes)
265
+ }
266
+
267
+ export interface Stream {
268
+ Context(): context.Context
269
+ MsgSend(msg: Message | null): MaybePromise<$.GoError>
270
+ MsgRecv(msg: Message | null): MaybePromise<$.GoError>
271
+ CloseSend(): MaybePromise<$.GoError>
272
+ Close(): MaybePromise<$.GoError>
273
+ }
274
+
275
+ export interface StreamRecv<T> extends Stream {
276
+ Recv(): MaybePromise<[T, $.GoError]>
277
+ RecvTo(value: T): MaybePromise<$.GoError>
278
+ }
279
+
280
+ export interface StreamSend<T> extends Stream {
281
+ Send(value: T): MaybePromise<$.GoError>
282
+ }
283
+
284
+ export interface StreamSendAndClose<T> extends StreamSend<T> {
285
+ SendAndClose(value: T): MaybePromise<$.GoError>
286
+ }
287
+
288
+ class emptyStream implements Stream {
289
+ private ctx: context.Context
290
+ private closed = false
291
+
292
+ constructor(ctx: context.Context = context.Background()) {
293
+ this.ctx = ctx
294
+ }
295
+
296
+ public Context(): context.Context {
297
+ return this.ctx
298
+ }
299
+
300
+ public MsgSend(_msg: Message | null): $.GoError {
301
+ return this.closed ? ErrCompleted : null
302
+ }
303
+
304
+ public MsgRecv(_msg: Message | null): $.GoError {
305
+ return this.closed ? io.EOF : io.EOF
306
+ }
307
+
308
+ public CloseSend(): $.GoError {
309
+ this.closed = true
310
+ return null
311
+ }
312
+
313
+ public Close(): $.GoError {
314
+ this.closed = true
315
+ return null
316
+ }
317
+ }
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
+
398
+ class streamWithClose implements Stream {
399
+ constructor(
400
+ private stream: Stream,
401
+ private closeFn: () => MaybePromise<$.GoError>,
402
+ ) {}
403
+
404
+ public Context(): context.Context {
405
+ return this.stream.Context()
406
+ }
407
+
408
+ public MsgSend(msg: Message | null): MaybePromise<$.GoError> {
409
+ return this.stream.MsgSend(msg)
410
+ }
411
+
412
+ public MsgRecv(msg: Message | null): MaybePromise<$.GoError> {
413
+ return this.stream.MsgRecv(msg)
414
+ }
415
+
416
+ public CloseSend(): MaybePromise<$.GoError> {
417
+ return this.stream.CloseSend()
418
+ }
419
+
420
+ public async Close(): Promise<$.GoError> {
421
+ const err = await this.stream.Close()
422
+ const closeErr = await this.closeFn()
423
+ return err ?? closeErr
424
+ }
425
+ }
426
+
427
+ export function NewStreamWithClose(
428
+ stream: Stream | null,
429
+ close: () => MaybePromise<$.GoError>,
430
+ ): Stream {
431
+ return new streamWithClose(stream ?? new emptyStream(), close)
432
+ }
433
+
434
+ export interface Invoker {
435
+ InvokeMethod(
436
+ serviceID: string,
437
+ methodID: string,
438
+ stream: Stream | null,
439
+ ): MaybePromise<[boolean, $.GoError]>
440
+ }
441
+
442
+ export interface QueryableInvoker {
443
+ HasService(serviceID: string): boolean
444
+ HasServiceMethod(serviceID: string, methodID: string): boolean
445
+ }
446
+
447
+ export type InvokerFunc = (
448
+ serviceID: string,
449
+ methodID: string,
450
+ stream: Stream | null,
451
+ ) => [boolean, $.GoError] | Promise<[boolean, $.GoError]>
452
+
453
+ export async function InvokeMethod(
454
+ fn: InvokerFunc,
455
+ serviceID: string,
456
+ methodID: string,
457
+ stream: Stream | null,
458
+ ): Promise<[boolean, $.GoError]> {
459
+ if (fn == null) {
460
+ return [false, null]
461
+ }
462
+ return fn(serviceID, methodID, stream)
463
+ }
464
+
465
+ export async function InvokerFunc_InvokeMethod(
466
+ fn: InvokerFunc,
467
+ serviceID: string,
468
+ methodID: string,
469
+ stream: Stream | null,
470
+ ): Promise<[boolean, $.GoError]> {
471
+ return InvokeMethod(fn, serviceID, methodID, stream)
472
+ }
473
+
474
+ export type InvokerSlice = $.Slice<Invoker | null>
475
+
476
+ export async function InvokerSlice_InvokeMethod(
477
+ s: InvokerSlice,
478
+ serviceID: string,
479
+ methodID: string,
480
+ stream: Stream | null,
481
+ ): Promise<[boolean, $.GoError]> {
482
+ for (let i = 0; i < $.len(s); i++) {
483
+ const invoker = s![i]
484
+ if (invoker == null) {
485
+ continue
486
+ }
487
+ const [handled, err] = await invoker.InvokeMethod(
488
+ serviceID,
489
+ methodID,
490
+ stream,
491
+ )
492
+ if (handled || err != null) {
493
+ return [true, err]
494
+ }
495
+ }
496
+ return [false, null]
497
+ }
498
+
499
+ export interface Handler extends Invoker {
500
+ GetServiceID(): string
501
+ GetMethodIDs(): $.Slice<string>
502
+ }
503
+
504
+ type HandlerMap = Map<string, Handler>
505
+
506
+ export interface Mux extends Invoker, QueryableInvoker {
507
+ Register(handler: Handler | null): $.GoError
508
+ }
509
+
510
+ class defaultMux implements Mux {
511
+ private fallback: $.Slice<Invoker | null>
512
+ private services = new Map<string, HandlerMap>()
513
+
514
+ constructor(fallback: $.Slice<Invoker | null>) {
515
+ this.fallback = fallback
516
+ }
517
+
518
+ public Register(handler: Handler | null): $.GoError {
519
+ if (handler == null) {
520
+ return ErrUnimplemented
521
+ }
522
+ const serviceID = handler.GetServiceID()
523
+ if (serviceID === '') {
524
+ return ErrEmptyServiceID
525
+ }
526
+ let methods = this.services.get(serviceID)
527
+ if (methods === undefined) {
528
+ methods = new Map()
529
+ this.services.set(serviceID, methods)
530
+ }
531
+ const methodIDs = handler.GetMethodIDs()
532
+ for (let i = 0; i < $.len(methodIDs); i++) {
533
+ const methodID = methodIDs![i]
534
+ if (methodID !== '') {
535
+ methods.set(methodID, handler)
536
+ }
537
+ }
538
+ return null
539
+ }
540
+
541
+ public HasService(serviceID: string): boolean {
542
+ return serviceID !== '' && (this.services.get(serviceID)?.size ?? 0) !== 0
543
+ }
544
+
545
+ public HasServiceMethod(serviceID: string, methodID: string): boolean {
546
+ if (serviceID === '' || methodID === '') {
547
+ return false
548
+ }
549
+ return this.services.get(serviceID)?.has(methodID) ?? false
550
+ }
551
+
552
+ public async InvokeMethod(
553
+ serviceID: string,
554
+ methodID: string,
555
+ stream: Stream | null,
556
+ ): Promise<[boolean, $.GoError]> {
557
+ let handler: Handler | undefined
558
+ if (serviceID === '') {
559
+ for (const methods of this.services.values()) {
560
+ handler = methods.get(methodID)
561
+ if (handler !== undefined) {
562
+ break
563
+ }
564
+ }
565
+ } else {
566
+ handler = this.services.get(serviceID)?.get(methodID)
567
+ }
568
+ if (handler !== undefined) {
569
+ return handler.InvokeMethod(serviceID, methodID, stream)
570
+ }
571
+ for (let i = 0; i < $.len(this.fallback); i++) {
572
+ const invoker = this.fallback![i]
573
+ if (invoker == null) {
574
+ continue
575
+ }
576
+ const [handled, err] = await invoker.InvokeMethod(
577
+ serviceID,
578
+ methodID,
579
+ stream,
580
+ )
581
+ if (handled || err != null) {
582
+ return [handled, err]
583
+ }
584
+ }
585
+ return [false, null]
586
+ }
587
+ }
588
+
589
+ export function NewMux(...fallbackInvokers: (Invoker | null)[]): Mux {
590
+ return new defaultMux(fallbackInvokers)
591
+ }
592
+
593
+ export class PrefixInvoker implements Invoker {
594
+ private inv: Invoker | null
595
+ private serviceIDPrefixes: $.Slice<string>
596
+
597
+ constructor(
598
+ invOrInit?:
599
+ | Invoker
600
+ | Partial<{ inv?: Invoker | null; serviceIDPrefixes?: $.Slice<string> }>
601
+ | null,
602
+ serviceIDPrefixes?: $.Slice<string>,
603
+ ) {
604
+ if (
605
+ invOrInit != null &&
606
+ typeof invOrInit === 'object' &&
607
+ 'inv' in invOrInit
608
+ ) {
609
+ this.inv = invOrInit.inv ?? null
610
+ this.serviceIDPrefixes = invOrInit.serviceIDPrefixes ?? null
611
+ return
612
+ }
613
+ this.inv = invOrInit as Invoker | null
614
+ this.serviceIDPrefixes = serviceIDPrefixes ?? null
615
+ }
616
+
617
+ public async InvokeMethod(
618
+ serviceID: string,
619
+ methodID: string,
620
+ stream: Stream | null,
621
+ ): Promise<[boolean, $.GoError]> {
622
+ if ($.len(this.serviceIDPrefixes) !== 0) {
623
+ const [strippedID, matchedPrefix] = CheckStripPrefix(
624
+ serviceID,
625
+ this.serviceIDPrefixes,
626
+ )
627
+ if (matchedPrefix === '') {
628
+ return [false, null]
629
+ }
630
+ serviceID = strippedID
631
+ }
632
+ if (this.inv == null) {
633
+ return [false, null]
634
+ }
635
+ return this.inv.InvokeMethod(serviceID, methodID, stream)
636
+ }
637
+ }
638
+
639
+ export function NewPrefixInvoker(
640
+ inv: Invoker | null,
641
+ serviceIDPrefixes: $.Slice<string>,
642
+ ): PrefixInvoker {
643
+ return new PrefixInvoker(inv, serviceIDPrefixes)
644
+ }
645
+
646
+ export function CheckStripPrefix(
647
+ serviceID: string,
648
+ serviceIDPrefixes: $.Slice<string>,
649
+ ): [string, string] {
650
+ for (let i = 0; i < $.len(serviceIDPrefixes); i++) {
651
+ const prefix = serviceIDPrefixes![i]
652
+ if (prefix !== '' && serviceID.startsWith(prefix)) {
653
+ return [serviceID.slice(prefix.length), prefix]
654
+ }
655
+ }
656
+ return [serviceID, '']
657
+ }
658
+
659
+ export class Server {
660
+ private invoker: Invoker | null
661
+
662
+ constructor(init?: Partial<{ invoker?: Invoker | null }>) {
663
+ this.invoker = init?.invoker ?? null
664
+ }
665
+
666
+ public GetInvoker(): Invoker | null {
667
+ return this.invoker
668
+ }
669
+
670
+ public HandleStream(
671
+ _ctx: context.Context,
672
+ _rwc: io.ReadWriteCloser | null,
673
+ ): void {}
674
+
675
+ public AcceptMuxedConn(
676
+ _ctx: context.Context,
677
+ _conn: MuxedConn | null,
678
+ ): $.GoError {
679
+ return null
680
+ }
681
+ }
682
+
683
+ export function NewServer(invoker: Invoker | null): Server {
684
+ return new Server({ invoker })
685
+ }
686
+
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
+ }
1086
+
1087
+ export class Packet {
1088
+ public Body: unknown = null
1089
+
1090
+ public GetBody(): unknown {
1091
+ return this.Body
1092
+ }
1093
+
1094
+ public MarshalVT(): [$.Slice<number>, $.GoError] {
1095
+ return [new Uint8Array(), null]
1096
+ }
1097
+
1098
+ public UnmarshalVT(_data: $.Slice<number>): $.GoError {
1099
+ return null
1100
+ }
1101
+
1102
+ public SizeVT(): number {
1103
+ return 0
1104
+ }
1105
+
1106
+ public MarshalToSizedBufferVT(_data: $.Slice<number>): [number, $.GoError] {
1107
+ return [0, null]
1108
+ }
1109
+
1110
+ public Reset(): void {
1111
+ this.Body = null
1112
+ }
1113
+ }
1114
+
1115
+ export class CallStart {
1116
+ public RpcService = ''
1117
+ public RpcMethod = ''
1118
+ public Data: $.Slice<number> = null
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
+ }
1136
+ }
1137
+
1138
+ export class CallData {
1139
+ public Data: $.Slice<number> = null
1140
+ public DataIsZero = false
1141
+ public Complete = false
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
+ }
1159
+ }
1160
+
1161
+ export class Packet_CallStart {
1162
+ constructor(public CallStart: CallStart | null = null) {}
1163
+ }
1164
+
1165
+ export class Packet_CallData {
1166
+ constructor(public CallData: CallData | null = null) {}
1167
+ }
1168
+
1169
+ export class Packet_CallCancel {
1170
+ constructor(public CallCancel = true) {}
1171
+ }
1172
+
1173
+ export function NewPacketDataHandler(
1174
+ handler: PacketHandler,
1175
+ ): PacketDataHandler {
1176
+ return (data) => {
1177
+ const pkt = new Packet()
1178
+ const err = pkt.UnmarshalVT(data)
1179
+ if (err != null) {
1180
+ return err
1181
+ }
1182
+ return handler?.(pkt) ?? null
1183
+ }
1184
+ }
1185
+
1186
+ export function NewCallStartPacket(
1187
+ service: string,
1188
+ method: string,
1189
+ data: $.Slice<number>,
1190
+ dataIsZero: boolean,
1191
+ ): Packet {
1192
+ const pkt = new Packet()
1193
+ pkt.Body = new Packet_CallStart(
1194
+ Object.assign(new CallStart(), {
1195
+ RpcService: service,
1196
+ RpcMethod: method,
1197
+ Data: data,
1198
+ DataIsZero: dataIsZero,
1199
+ }),
1200
+ )
1201
+ return pkt
1202
+ }
1203
+
1204
+ export function NewCallDataPacket(
1205
+ data: $.Slice<number>,
1206
+ dataIsZero: boolean,
1207
+ complete: boolean,
1208
+ err: $.GoError,
1209
+ ): Packet {
1210
+ const pkt = new Packet()
1211
+ pkt.Body = new Packet_CallData(
1212
+ Object.assign(new CallData(), {
1213
+ Data: data,
1214
+ DataIsZero: dataIsZero,
1215
+ Complete: complete || err != null,
1216
+ Error: err?.Error() ?? '',
1217
+ }),
1218
+ )
1219
+ return pkt
1220
+ }
1221
+
1222
+ export function NewCallCancelPacket(): Packet {
1223
+ const pkt = new Packet()
1224
+ pkt.Body = new Packet_CallCancel(true)
1225
+ return pkt
1226
+ }
1227
+
1228
+ function contextErr(ctx: context.Context): $.GoError {
1229
+ if (ctx == null) {
1230
+ return null
1231
+ }
1232
+ return ctx.Err()
1233
+ }