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
@@ -0,0 +1,172 @@
1
+ import * as $ from '../../../../builtin/index.js'
2
+ import * as context from '../../../../context/index.js'
3
+
4
+ type Job = (() => void | globalThis.Promise<void>) | null
5
+
6
+ // ConcurrentQueue runs jobs with a bounded number of active workers.
7
+ export class ConcurrentQueue {
8
+ private readonly maxConcurrency: number
9
+ private running = 0
10
+ private readonly queue: Job[] = []
11
+ private waitCh = $.makeChannel<{}>(0, {}, 'both')
12
+
13
+ constructor(maxConcurrency: number, initialElems: $.Slice<Job> = null) {
14
+ this.maxConcurrency = maxConcurrency
15
+ for (const job of initialElems ?? []) {
16
+ this.queue.push(job)
17
+ }
18
+ this.update()
19
+ }
20
+
21
+ public Enqueue(jobs: $.Slice<Job>): [number, number]
22
+ public Enqueue(...jobs: Job[]): [number, number]
23
+ public Enqueue(...args: [$.Slice<Job>] | Job[]): [number, number] {
24
+ const jobs = normalizeJobs(args)
25
+ for (const job of jobs) {
26
+ if (this.maxConcurrency <= 0 || this.running < this.maxConcurrency) {
27
+ this.running++
28
+ this.start(job)
29
+ continue
30
+ }
31
+ this.queue.push(job)
32
+ }
33
+ if (jobs.length !== 0) {
34
+ this.notify()
35
+ }
36
+ return [this.queue.length, this.running]
37
+ }
38
+
39
+ public async WaitIdle(
40
+ ctx: context.Context,
41
+ errCh: $.Channel<$.GoError> | null,
42
+ ): Promise<$.GoError> {
43
+ for (;;) {
44
+ if (this.running === 0 && this.queue.length === 0) {
45
+ return null
46
+ }
47
+ const waitCh = this.waitCh
48
+ const [hasReturn, err] = await $.selectStatement<unknown, $.GoError>(
49
+ [
50
+ {
51
+ id: 0,
52
+ isSend: false,
53
+ channel: ctx?.Done() ?? null,
54
+ onSelected: async () => context.Canceled,
55
+ },
56
+ {
57
+ id: 1,
58
+ isSend: false,
59
+ channel: errCh,
60
+ onSelected: async (result) => {
61
+ if (!result.ok) {
62
+ return context.Canceled
63
+ }
64
+ return result.value ?? null
65
+ },
66
+ },
67
+ {
68
+ id: 2,
69
+ isSend: false,
70
+ channel: waitCh,
71
+ onSelected: async () => null,
72
+ },
73
+ ],
74
+ false,
75
+ )
76
+ if (hasReturn && err != null) {
77
+ return err
78
+ }
79
+ }
80
+ }
81
+
82
+ public async WatchState(
83
+ ctx: context.Context,
84
+ _errCh: $.Channel<$.GoError> | null,
85
+ cb: ((queued: number, running: number) => [boolean, $.GoError]) | null,
86
+ ): Promise<$.GoError> {
87
+ if (cb == null) {
88
+ return null
89
+ }
90
+ for (;;) {
91
+ const waitCh = this.waitCh
92
+ const [cont, err] = cb(this.queue.length, this.running)
93
+ if (err != null || !cont) {
94
+ return err
95
+ }
96
+ const [hasReturn, waitErr] = await $.selectStatement<unknown, $.GoError>(
97
+ [
98
+ {
99
+ id: 0,
100
+ isSend: false,
101
+ channel: ctx?.Done() ?? null,
102
+ onSelected: async () => context.Canceled,
103
+ },
104
+ {
105
+ id: 1,
106
+ isSend: false,
107
+ channel: waitCh,
108
+ onSelected: async () => null,
109
+ },
110
+ ],
111
+ false,
112
+ )
113
+ if (hasReturn && waitErr != null) {
114
+ return waitErr
115
+ }
116
+ }
117
+ }
118
+
119
+ private start(job: Job): void {
120
+ queueMicrotask(async () => {
121
+ try {
122
+ await job?.()
123
+ } finally {
124
+ this.running--
125
+ this.update()
126
+ this.notify()
127
+ }
128
+ })
129
+ }
130
+
131
+ private update(): void {
132
+ while (
133
+ this.queue.length !== 0 &&
134
+ (this.maxConcurrency <= 0 || this.running < this.maxConcurrency)
135
+ ) {
136
+ const job = this.queue.shift() ?? null
137
+ this.running++
138
+ this.start(job)
139
+ }
140
+ }
141
+
142
+ private notify(): void {
143
+ const waitCh = this.waitCh
144
+ this.waitCh = $.makeChannel<{}>(0, {}, 'both')
145
+ waitCh.close()
146
+ }
147
+ }
148
+
149
+ export function NewConcurrentQueue(
150
+ maxConcurrency: number,
151
+ initialElems?: $.Slice<Job>,
152
+ ): ConcurrentQueue
153
+ export function NewConcurrentQueue(
154
+ maxConcurrency: number,
155
+ ...initialElems: Job[]
156
+ ): ConcurrentQueue
157
+ export function NewConcurrentQueue(
158
+ maxConcurrency: number,
159
+ ...args: [$.Slice<Job>?] | Job[]
160
+ ): ConcurrentQueue {
161
+ return new ConcurrentQueue(maxConcurrency, normalizeJobs(args))
162
+ }
163
+
164
+ function normalizeJobs(args: [$.Slice<Job>?] | Job[]): Job[] {
165
+ if (args.length === 0) {
166
+ return []
167
+ }
168
+ if (args.length === 1 && (Array.isArray(args[0]) || args[0] == null)) {
169
+ return Array.from((args[0] as $.Slice<Job>) ?? [])
170
+ }
171
+ return args as Job[]
172
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "dependencies": [
3
+ "context"
4
+ ],
5
+ "asyncMethods": {
6
+ "ConcurrentQueue.WaitIdle": true,
7
+ "ConcurrentQueue.WatchState": true
8
+ }
9
+ }
@@ -8,10 +8,7 @@ export class Runtime implements vmruntime.VmRuntime {
8
8
  constructor() {}
9
9
 
10
10
  // Compile calls WebAssembly.compile and returns a Module.
11
- async Compile(
12
- _ctx: any,
13
- wasm: Uint8Array | number[],
14
- ): Promise<Module> {
11
+ async Compile(_ctx: any, wasm: Uint8Array | number[]): Promise<Module> {
15
12
  const bytes = wasm instanceof Uint8Array ? wasm : new Uint8Array(wasm)
16
13
  const compiled = await WebAssembly.compile(bytes.buffer as ArrayBuffer)
17
14
  return new Module(compiled)
@@ -0,0 +1,35 @@
1
+ import { describe, expect, test } from 'vitest'
2
+ import * as $ from '@goscript/builtin/index.js'
3
+ import * as js from '@goscript/syscall/js/index.js'
4
+
5
+ import { Try, TrySideEffect } from './index.js'
6
+
7
+ describe('safejs catch override', () => {
8
+ test('returns happy path result', async () => {
9
+ await expect(Try(() => 'ok')).resolves.toEqual(['ok', null])
10
+ })
11
+
12
+ test('converts Go panic payloads to errors', async () => {
13
+ const [, err] = await Try(() => {
14
+ $.panic('some error')
15
+ })
16
+
17
+ expect(err?.Error()).toBe('some error')
18
+ })
19
+
20
+ test('converts syscall/js values to js errors', async () => {
21
+ const err = await TrySideEffect(() => {
22
+ $.panic(js.ValueOf(new Error('bad js')))
23
+ })
24
+
25
+ expect(err?.Error()).toBe('JavaScript error: bad js')
26
+ })
27
+
28
+ test('converts JavaScript throws to js errors', async () => {
29
+ const [, err] = await Try(() => {
30
+ throw new Error('bad throw')
31
+ })
32
+
33
+ expect(err?.Error()).toBe('JavaScript error: bad throw')
34
+ })
35
+ })
@@ -0,0 +1,65 @@
1
+ import * as $ from '@goscript/builtin/index.js'
2
+ import * as js from '@goscript/syscall/js/index.js'
3
+
4
+ class CatchError {
5
+ constructor(private readonly message: string) {}
6
+
7
+ Error(): string {
8
+ return this.message
9
+ }
10
+ }
11
+
12
+ export async function Try(
13
+ fn: (() => unknown | Promise<unknown>) | null,
14
+ ): Promise<[unknown, $.GoError]> {
15
+ try {
16
+ return [await fn!(), null]
17
+ } catch (caught) {
18
+ return [null, recoverValueToError($.panicValue(caught))]
19
+ }
20
+ }
21
+
22
+ export async function TrySideEffect(
23
+ fn: (() => void | Promise<void>) | null,
24
+ ): Promise<$.GoError> {
25
+ try {
26
+ await fn!()
27
+ return null
28
+ } catch (caught) {
29
+ return recoverValueToError($.panicValue(caught))
30
+ }
31
+ }
32
+
33
+ function recoverValueToError(value: unknown): $.GoError {
34
+ if (value == null) {
35
+ return null
36
+ }
37
+ if (isGoError(value)) {
38
+ return value
39
+ }
40
+ if (value instanceof js.Value) {
41
+ return $.interfaceValue<$.GoError>(
42
+ $.markAsStructValue(new js.Error({ Value: value })),
43
+ 'js.Error',
44
+ )
45
+ }
46
+ if (value instanceof Error) {
47
+ return $.interfaceValue<$.GoError>(
48
+ $.markAsStructValue(new js.Error({ Value: js.ValueOf(value) })),
49
+ 'js.Error',
50
+ )
51
+ }
52
+ return $.interfaceValue<$.GoError>(
53
+ new CatchError(String(value)),
54
+ 'catch.catchError',
55
+ )
56
+ }
57
+
58
+ function isGoError(value: unknown): value is Exclude<$.GoError, null> {
59
+ return (
60
+ value !== null &&
61
+ typeof value === 'object' &&
62
+ 'Error' in value &&
63
+ typeof (value as { Error?: unknown }).Error === 'function'
64
+ )
65
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "asyncFunctions": {
3
+ "Try": true,
4
+ "TrySideEffect": true
5
+ },
6
+ "dependencies": [
7
+ "syscall/js"
8
+ ]
9
+ }
@@ -10,7 +10,8 @@ function bytes(value: string): number[] {
10
10
  }
11
11
 
12
12
  function matchBytes(a: number[], b: number[]): number {
13
- const diff = (Load64(undefined, arrayToSlice(a), 0) as unknown as bigint) ^
13
+ const diff =
14
+ (Load64(undefined, arrayToSlice(a), 0) as unknown as bigint) ^
14
15
  (Load64(undefined, arrayToSlice(b), 0) as unknown as bigint)
15
16
  return TrailingZeros64(diff) >> 3
16
17
  }
@@ -55,11 +55,12 @@ export function Load32(
55
55
  ): number {
56
56
  const [b, off] = loadArgs(typeArgsOrB, bOrI, i)
57
57
  return (
58
- byteAt(b, off) |
59
- (byteAt(b, off + 1) << 8) |
60
- (byteAt(b, off + 2) << 16) |
61
- (byteAt(b, off + 3) << 24)
62
- ) >>> 0
58
+ (byteAt(b, off) |
59
+ (byteAt(b, off + 1) << 8) |
60
+ (byteAt(b, off + 2) << 16) |
61
+ (byteAt(b, off + 3) << 24)) >>>
62
+ 0
63
+ )
63
64
  }
64
65
 
65
66
  export function Load64(
@@ -0,0 +1,70 @@
1
+ import { describe, expect, test } from 'vitest'
2
+
3
+ import {
4
+ Decode,
5
+ DecodeAlphabet,
6
+ Encode,
7
+ EncodeAlphabet,
8
+ FlickrAlphabet,
9
+ NewAlphabet,
10
+ } from './index.js'
11
+
12
+ const roundTrips = [
13
+ [0],
14
+ [0, 0, 1, 2, 3],
15
+ [255, 254, 253, 0, 1, 2, 3],
16
+ Array.from({ length: 64 }, (_, i) => (i * 37) & 0xff),
17
+ ]
18
+
19
+ describe('base58 override', () => {
20
+ test('matches known bitcoin alphabet encodings', () => {
21
+ expect(Encode(new Uint8Array([0]))).toBe('1')
22
+ expect(Encode(new Uint8Array([0, 0, 1]))).toBe('112')
23
+ expect(Encode(new Uint8Array([97, 98, 99]))).toBe('ZiCa')
24
+ expect(
25
+ Encode(new Uint8Array([0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff])),
26
+ ).toBe('jpXCZedGfVQ')
27
+ })
28
+
29
+ test('round trips bytes', () => {
30
+ for (const input of roundTrips) {
31
+ const encoded = Encode(new Uint8Array(input))
32
+ const [decoded, err] = Decode(encoded)
33
+ expect(err).toBeNull()
34
+ expect(Array.from(decoded ?? [])).toEqual(input)
35
+ }
36
+ })
37
+
38
+ test('supports custom alphabets', () => {
39
+ const input = new Uint8Array([0, 1, 2, 3, 4, 5])
40
+ const flickr = EncodeAlphabet(input, FlickrAlphabet)
41
+ const [decoded, err] = DecodeAlphabet(flickr, FlickrAlphabet)
42
+ expect(err).toBeNull()
43
+ expect(Array.from(decoded ?? [])).toEqual(Array.from(input))
44
+
45
+ const reversed = NewAlphabet(
46
+ '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
47
+ .split('')
48
+ .reverse()
49
+ .join(''),
50
+ )
51
+ const encoded = EncodeAlphabet(input, reversed)
52
+ const [decodedReversed, reversedErr] = DecodeAlphabet(encoded, reversed)
53
+ expect(reversedErr).toBeNull()
54
+ expect(Array.from(decodedReversed ?? [])).toEqual(Array.from(input))
55
+ })
56
+
57
+ test('returns Go errors for invalid input', () => {
58
+ const [empty, emptyErr] = Decode('')
59
+ expect(empty).toBeNull()
60
+ expect(emptyErr?.Error()).toBe('zero length string')
61
+
62
+ const [invalid, invalidErr] = Decode('0')
63
+ expect(invalid).toBeNull()
64
+ expect(invalidErr?.Error()).toContain('Invalid base58 digit')
65
+
66
+ const [highBit, highBitErr] = Decode('é')
67
+ expect(highBit).toBeNull()
68
+ expect(highBitErr?.Error()).toBe('High-bit set on invalid digit')
69
+ })
70
+ })
@@ -0,0 +1,231 @@
1
+ import * as $ from '@goscript/builtin/index.js'
2
+
3
+ const btcAlphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
4
+ const flickrAlphabet = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'
5
+
6
+ export class Alphabet {
7
+ decode: Int8Array
8
+ encode: Uint8Array
9
+
10
+ constructor(init?: Partial<{ decode?: Int8Array; encode?: Uint8Array }>) {
11
+ this.decode = init?.decode?.slice() ?? new Int8Array(128)
12
+ this.encode = init?.encode?.slice() ?? new Uint8Array(58)
13
+ }
14
+
15
+ clone(): Alphabet {
16
+ return new Alphabet({ decode: this.decode, encode: this.encode })
17
+ }
18
+ }
19
+
20
+ export function NewAlphabet(s: string): Alphabet {
21
+ const bytes = $.stringToBytes(s)
22
+ if (bytes.length !== 58) {
23
+ $.panic('base58 alphabets must be 58 bytes long')
24
+ }
25
+
26
+ const alphabet = new Alphabet()
27
+ alphabet.decode.fill(-1)
28
+ for (let i = 0; i < bytes.length; i++) {
29
+ const code = bytes[i]
30
+ if (code > 127) {
31
+ $.panic('base58 alphabets must be valid ASCII')
32
+ }
33
+ alphabet.encode[i] = code
34
+ alphabet.decode[code] = i
35
+ }
36
+ return alphabet
37
+ }
38
+
39
+ export let BTCAlphabet: Alphabet | $.VarRef<Alphabet> | null =
40
+ NewAlphabet(btcAlphabet)
41
+
42
+ export function __goscript_set_BTCAlphabet(
43
+ value: Alphabet | $.VarRef<Alphabet> | null,
44
+ ): void {
45
+ BTCAlphabet = value
46
+ }
47
+
48
+ export let FlickrAlphabet: Alphabet | $.VarRef<Alphabet> | null =
49
+ NewAlphabet(flickrAlphabet)
50
+
51
+ export function __goscript_set_FlickrAlphabet(
52
+ value: Alphabet | $.VarRef<Alphabet> | null,
53
+ ): void {
54
+ FlickrAlphabet = value
55
+ }
56
+
57
+ export function Encode(bin: $.Bytes): string {
58
+ return FastBase58Encoding(bin)
59
+ }
60
+
61
+ export function EncodeAlphabet(
62
+ bin: $.Bytes,
63
+ alphabet: Alphabet | $.VarRef<Alphabet> | null,
64
+ ): string {
65
+ return FastBase58EncodingAlphabet(bin, alphabet)
66
+ }
67
+
68
+ export function FastBase58Encoding(bin: $.Bytes): string {
69
+ return FastBase58EncodingAlphabet(bin, BTCAlphabet)
70
+ }
71
+
72
+ export function FastBase58EncodingAlphabet(
73
+ bin: $.Bytes,
74
+ alphabet: Alphabet | $.VarRef<Alphabet> | null,
75
+ ): string {
76
+ const bytes = $.bytesToUint8Array(bin)
77
+ const alpha = $.pointerValue(alphabet)
78
+ if (alpha == null) {
79
+ $.panic('base58 alphabet is nil')
80
+ }
81
+
82
+ const zero = alpha.encode[0]
83
+ const binsz = bytes.length
84
+ let zcount = 0
85
+ while (zcount < binsz && bytes[zcount] === 0) {
86
+ zcount++
87
+ }
88
+
89
+ const size = Math.trunc(((binsz - zcount) * 138) / 100) + 1
90
+ let value = 0n
91
+ for (let i = zcount; i < binsz; i++) {
92
+ value = (value << 8n) + BigInt(bytes[i])
93
+ }
94
+
95
+ const out = new Uint8Array(size + zcount)
96
+ let offset = out.length
97
+ while (value > 0n) {
98
+ const digit = Number(value % 58n)
99
+ value /= 58n
100
+ offset--
101
+ out[offset] = alpha.encode[digit]
102
+ }
103
+ for (let i = 0; i < zcount; i++) {
104
+ offset--
105
+ out[offset] = zero
106
+ }
107
+
108
+ return $.bytesToString(out.subarray(offset))
109
+ }
110
+
111
+ export function TrivialBase58Encoding(a: $.Bytes): string {
112
+ return FastBase58Encoding(a)
113
+ }
114
+
115
+ export function TrivialBase58EncodingAlphabet(
116
+ a: $.Bytes,
117
+ alphabet: Alphabet | $.VarRef<Alphabet> | null,
118
+ ): string {
119
+ return FastBase58EncodingAlphabet(a, alphabet)
120
+ }
121
+
122
+ export function Decode(str: string): [Uint8Array | null, $.GoError] {
123
+ return FastBase58Decoding(str)
124
+ }
125
+
126
+ export function DecodeAlphabet(
127
+ str: string,
128
+ alphabet: Alphabet | $.VarRef<Alphabet> | null,
129
+ ): [Uint8Array | null, $.GoError] {
130
+ return FastBase58DecodingAlphabet(str, alphabet)
131
+ }
132
+
133
+ export function FastBase58Decoding(str: string): [Uint8Array | null, $.GoError] {
134
+ return FastBase58DecodingAlphabet(str, BTCAlphabet)
135
+ }
136
+
137
+ export function FastBase58DecodingAlphabet(
138
+ str: string,
139
+ alphabet: Alphabet | $.VarRef<Alphabet> | null,
140
+ ): [Uint8Array | null, $.GoError] {
141
+ if (str.length === 0) {
142
+ return [null, $.newError('zero length string')]
143
+ }
144
+
145
+ const alpha = $.pointerValue(alphabet)
146
+ if (alpha == null) {
147
+ $.panic('base58 alphabet is nil')
148
+ }
149
+
150
+ const b58sz = str.length
151
+ const outisz = Math.trunc((b58sz + 3) / 4)
152
+ const binu = new Uint8Array((b58sz + 3) * 3)
153
+ let bytesleft = b58sz % 4
154
+ const zero = alpha.encode[0]
155
+
156
+ let zmask = 0
157
+ if (bytesleft > 0) {
158
+ zmask = (0xffffffff << (bytesleft * 8)) >>> 0
159
+ } else {
160
+ bytesleft = 4
161
+ }
162
+
163
+ const outi = new Uint32Array(outisz)
164
+ let zcount = 0
165
+ while (zcount < b58sz && str.charCodeAt(zcount) === zero) {
166
+ zcount++
167
+ }
168
+
169
+ for (let i = 0; i < b58sz; i++) {
170
+ const r = str.charCodeAt(i)
171
+ if (r > 127) {
172
+ return [null, $.newError('High-bit set on invalid digit')]
173
+ }
174
+ const decoded = alpha.decode[r]
175
+ if (decoded === -1) {
176
+ return [
177
+ null,
178
+ $.newError(`Invalid base58 digit ('${String.fromCodePoint(r)}')`),
179
+ ]
180
+ }
181
+
182
+ let c = decoded >>> 0
183
+ for (let j = outisz - 1; j >= 0; j--) {
184
+ const t = outi[j] * 58 + c
185
+ c = Math.floor(t / 0x100000000)
186
+ outi[j] = t >>> 0
187
+ }
188
+
189
+ if (c > 0) {
190
+ return [null, $.newError('Output number too big (carry to the next int32)')]
191
+ }
192
+ if ((outi[0] & zmask) !== 0) {
193
+ return [
194
+ null,
195
+ $.newError('Output number too big (last int32 filled too far)'),
196
+ ]
197
+ }
198
+ }
199
+
200
+ let cnt = 0
201
+ for (let j = 0; j < outisz; j++) {
202
+ for (let mask = (bytesleft - 1) * 8; mask >= 0; mask -= 8) {
203
+ binu[cnt] = (outi[j] >>> mask) & 0xff
204
+ cnt++
205
+ }
206
+ if (j === 0) {
207
+ bytesleft = 4
208
+ }
209
+ }
210
+
211
+ for (let n = 0; n < binu.length; n++) {
212
+ if (binu[n] > 0) {
213
+ const start = Math.max(n - zcount, 0)
214
+ return [binu.subarray(start, cnt), null]
215
+ }
216
+ }
217
+ return [binu.subarray(0, cnt), null]
218
+ }
219
+
220
+ export function TrivialBase58Decoding(
221
+ str: string,
222
+ ): [Uint8Array | null, $.GoError] {
223
+ return FastBase58Decoding(str)
224
+ }
225
+
226
+ export function TrivialBase58DecodingAlphabet(
227
+ str: string,
228
+ alphabet: Alphabet | $.VarRef<Alphabet> | null,
229
+ ): [Uint8Array | null, $.GoError] {
230
+ return FastBase58DecodingAlphabet(str, alphabet)
231
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "dependencies": []
3
+ }
@@ -0,0 +1,46 @@
1
+ import { describe, expect, test } from 'vitest'
2
+
3
+ import {
4
+ BlockLen,
5
+ ChunkLen,
6
+ Flag_ChunkEnd,
7
+ Flag_ChunkStart,
8
+ Flag_DeriveKeyContext,
9
+ Flag_DeriveKeyMaterial,
10
+ Flag_Keyed,
11
+ Flag_Parent,
12
+ Flag_Root,
13
+ HasAVX2,
14
+ HasSSE41,
15
+ IV,
16
+ IV0,
17
+ OptimizeLittleEndian,
18
+ } from './index.js'
19
+
20
+ describe('blake3 consts override', () => {
21
+ test('uses portable constants for GoScript', () => {
22
+ expect(IV).toEqual([
23
+ 0x6a09e667,
24
+ 0xbb67ae85,
25
+ 0x3c6ef372,
26
+ 0xa54ff53a,
27
+ 0x510e527f,
28
+ 0x9b05688c,
29
+ 0x1f83d9ab,
30
+ 0x5be0cd19,
31
+ ])
32
+ expect(IV[0]).toBe(IV0)
33
+ expect(BlockLen).toBe(64)
34
+ expect(ChunkLen).toBe(1024)
35
+ expect(Flag_ChunkStart).toBe(1)
36
+ expect(Flag_ChunkEnd).toBe(2)
37
+ expect(Flag_Parent).toBe(4)
38
+ expect(Flag_Root).toBe(8)
39
+ expect(Flag_Keyed).toBe(16)
40
+ expect(Flag_DeriveKeyContext).toBe(32)
41
+ expect(Flag_DeriveKeyMaterial).toBe(64)
42
+ expect(HasAVX2).toBe(false)
43
+ expect(HasSSE41).toBe(false)
44
+ expect(OptimizeLittleEndian).toBe(false)
45
+ })
46
+ })