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,274 @@
1
+ import * as $ from '@goscript/builtin/index.js'
2
+ import * as io from '@goscript/io/index.js'
3
+
4
+ export type Curve = x25519Curve | unsupportedCurve
5
+ export type KeyExchanger = PrivateKey
6
+
7
+ const x25519PublicKeySize = 32
8
+ const x25519PrivateKeySize = 32
9
+ const x25519SharedSecretSize = 32
10
+ const p = (1n << 255n) - 19n
11
+ const a24 = 121665n
12
+
13
+ export class PublicKey {
14
+ public curve: Curve
15
+ public publicKey: $.Bytes
16
+
17
+ constructor(init?: Partial<{ curve: Curve; publicKey: $.Bytes }>) {
18
+ this.curve = init?.curve ?? x25519
19
+ this.publicKey = copyBytes(init?.publicKey ?? null)
20
+ }
21
+
22
+ public Bytes(): $.Bytes {
23
+ return copyBytes(this.publicKey)
24
+ }
25
+
26
+ public Curve(): Curve {
27
+ return this.curve
28
+ }
29
+
30
+ public Equal(x: PublicKey | $.VarRef<PublicKey> | null): boolean {
31
+ const other = $.pointerValueOrNil(x)
32
+ return other instanceof PublicKey && bytesEqual(this.publicKey, other.publicKey)
33
+ }
34
+ }
35
+
36
+ export class PrivateKey {
37
+ public curve: Curve
38
+ public privateKey: $.Bytes
39
+ public publicKey: PublicKey
40
+
41
+ constructor(
42
+ init?: Partial<{ curve: Curve; privateKey: $.Bytes; publicKey: PublicKey }>,
43
+ ) {
44
+ this.curve = init?.curve ?? x25519
45
+ this.privateKey = copyBytes(init?.privateKey ?? null)
46
+ this.publicKey = init?.publicKey ?? new PublicKey({ curve: this.curve })
47
+ }
48
+
49
+ public Bytes(): $.Bytes {
50
+ return copyBytes(this.privateKey)
51
+ }
52
+
53
+ public Curve(): Curve {
54
+ return this.curve
55
+ }
56
+
57
+ public ECDH(remote: PublicKey | $.VarRef<PublicKey> | null): [$.Bytes, $.GoError] {
58
+ const remoteKey = $.pointerValueOrNil(remote)
59
+ if (remoteKey == null || remoteKey.curve !== this.curve) {
60
+ return [null, $.newError('crypto/ecdh: private key and public key curves do not match')]
61
+ }
62
+ return this.curve.ecdh(this, remoteKey)
63
+ }
64
+
65
+ public Equal(x: PrivateKey | $.VarRef<PrivateKey> | null): boolean {
66
+ const other = $.pointerValueOrNil(x)
67
+ return other instanceof PrivateKey && bytesEqual(this.privateKey, other.privateKey)
68
+ }
69
+
70
+ public Public(): PublicKey {
71
+ return this.publicKey
72
+ }
73
+
74
+ public PublicKey(): PublicKey {
75
+ return this.publicKey
76
+ }
77
+ }
78
+
79
+ export class x25519Curve {
80
+ public GenerateKey(r: io.Reader | null): [PrivateKey | null, $.GoError] {
81
+ const key = new Uint8Array(x25519PrivateKeySize)
82
+ if (r != null) {
83
+ throw new Error('crypto/ecdh: custom random readers are not implemented in GoScript')
84
+ }
85
+ globalThis.crypto.getRandomValues(key)
86
+ return this.NewPrivateKey(key)
87
+ }
88
+
89
+ public NewPrivateKey(key: $.Bytes): [PrivateKey | null, $.GoError] {
90
+ if ($.len(key) !== x25519PrivateKeySize) {
91
+ return [null, $.newError('crypto/ecdh: invalid private key size')]
92
+ }
93
+ const privateKey = copyBytes(key)
94
+ const publicKey = scalarMult(privateKey, basepoint())
95
+ return [
96
+ new PrivateKey({
97
+ curve: this,
98
+ privateKey,
99
+ publicKey: new PublicKey({ curve: this, publicKey }),
100
+ }),
101
+ null,
102
+ ]
103
+ }
104
+
105
+ public NewPublicKey(key: $.Bytes): [PublicKey | null, $.GoError] {
106
+ if ($.len(key) !== x25519PublicKeySize) {
107
+ return [null, $.newError('crypto/ecdh: invalid public key')]
108
+ }
109
+ return [new PublicKey({ curve: this, publicKey: key }), null]
110
+ }
111
+
112
+ public String(): string {
113
+ return 'X25519'
114
+ }
115
+
116
+ public ecdh(local: PrivateKey | null, remote: PublicKey | null): [$.Bytes, $.GoError] {
117
+ const out = scalarMult(local?.privateKey ?? null, remote?.publicKey ?? null)
118
+ if (isZero(out)) {
119
+ return [null, $.newError('crypto/ecdh: bad X25519 remote ECDH input: low order point')]
120
+ }
121
+ return [out, null]
122
+ }
123
+ }
124
+
125
+ export function X25519(): Curve {
126
+ return x25519
127
+ }
128
+
129
+ export const x25519 = new x25519Curve()
130
+
131
+ export class unsupportedCurve {
132
+ constructor(private readonly name: string) {}
133
+
134
+ public GenerateKey(_r: io.Reader | null): [PrivateKey | null, $.GoError] {
135
+ return [null, $.newError(`crypto/ecdh: ${this.name} is not implemented in GoScript`)]
136
+ }
137
+
138
+ public NewPrivateKey(_key: $.Bytes): [PrivateKey | null, $.GoError] {
139
+ return [null, $.newError(`crypto/ecdh: ${this.name} is not implemented in GoScript`)]
140
+ }
141
+
142
+ public NewPublicKey(_key: $.Bytes): [PublicKey | null, $.GoError] {
143
+ return [null, $.newError(`crypto/ecdh: ${this.name} is not implemented in GoScript`)]
144
+ }
145
+
146
+ public String(): string {
147
+ return this.name
148
+ }
149
+
150
+ public ecdh(_local: PrivateKey | null, _remote: PublicKey | null): [$.Bytes, $.GoError] {
151
+ return [null, $.newError(`crypto/ecdh: ${this.name} is not implemented in GoScript`)]
152
+ }
153
+ }
154
+
155
+ export function P256(): Curve {
156
+ return p256
157
+ }
158
+
159
+ export function P384(): Curve {
160
+ return p384
161
+ }
162
+
163
+ export function P521(): Curve {
164
+ return p521
165
+ }
166
+
167
+ const p256 = new unsupportedCurve('P-256')
168
+ const p384 = new unsupportedCurve('P-384')
169
+ const p521 = new unsupportedCurve('P-521')
170
+
171
+ function scalarMult(scalar: $.Bytes, point: $.Bytes): Uint8Array {
172
+ const e = copyBytes(scalar)
173
+ const uBytes = copyBytes(point)
174
+ e[0] &= 248
175
+ e[31] &= 127
176
+ e[31] |= 64
177
+ uBytes[31] &= 127
178
+
179
+ const x1 = decodeLittleEndian(uBytes)
180
+ let x2 = 1n
181
+ let z2 = 0n
182
+ let x3 = x1
183
+ let z3 = 1n
184
+ let swap = 0n
185
+
186
+ for (let t = 254; t >= 0; t--) {
187
+ const k = (BigInt(e[Math.floor(t / 8)]) >> BigInt(t & 7)) & 1n
188
+ swap ^= k
189
+ ;[x2, x3] = cswap(swap, x2, x3)
190
+ ;[z2, z3] = cswap(swap, z2, z3)
191
+ swap = k
192
+
193
+ const a = mod(x2 + z2)
194
+ const aa = mod(a * a)
195
+ const b = mod(x2 - z2)
196
+ const bb = mod(b * b)
197
+ const eDiff = mod(aa - bb)
198
+ const c = mod(x3 + z3)
199
+ const d = mod(x3 - z3)
200
+ const da = mod(d * a)
201
+ const cb = mod(c * b)
202
+ x3 = mod((da + cb) ** 2n)
203
+ z3 = mod(x1 * mod((da - cb) ** 2n))
204
+ x2 = mod(aa * bb)
205
+ z2 = mod(eDiff * mod(aa + a24 * eDiff))
206
+ }
207
+
208
+ x2 = cswap(swap, x2, x3)[0]
209
+ z2 = cswap(swap, z2, z3)[0]
210
+
211
+ return encodeLittleEndian(mod(x2 * modInverse(z2)))
212
+ }
213
+
214
+ function cswap(swap: bigint, x: bigint, y: bigint): [bigint, bigint] {
215
+ const mask = -swap
216
+ const t = mask & (x ^ y)
217
+ return [x ^ t, y ^ t]
218
+ }
219
+
220
+ function mod(value: bigint): bigint {
221
+ const result = value % p
222
+ return result >= 0n ? result : result + p
223
+ }
224
+
225
+ function modInverse(value: bigint): bigint {
226
+ let lm = 1n
227
+ let hm = 0n
228
+ let low = mod(value)
229
+ let high = p
230
+ while (low > 1n) {
231
+ const r = high / low
232
+ ;[lm, hm] = [hm - lm * r, lm]
233
+ ;[low, high] = [high - low * r, low]
234
+ }
235
+ return mod(lm)
236
+ }
237
+
238
+ function decodeLittleEndian(bytes: Uint8Array): bigint {
239
+ let out = 0n
240
+ for (let i = bytes.length - 1; i >= 0; i--) {
241
+ out = (out << 8n) | BigInt(bytes[i])
242
+ }
243
+ return out
244
+ }
245
+
246
+ function encodeLittleEndian(value: bigint): Uint8Array {
247
+ const out = new Uint8Array(x25519SharedSecretSize)
248
+ let v = mod(value)
249
+ for (let i = 0; i < out.length; i++) {
250
+ out[i] = Number(v & 0xffn)
251
+ v >>= 8n
252
+ }
253
+ return out
254
+ }
255
+
256
+ function basepoint(): Uint8Array {
257
+ const out = new Uint8Array(x25519PublicKeySize)
258
+ out[0] = 9
259
+ return out
260
+ }
261
+
262
+ function copyBytes(bytes: $.Bytes | null): Uint8Array {
263
+ return new Uint8Array($.bytesToUint8Array(bytes ?? null))
264
+ }
265
+
266
+ function bytesEqual(a: $.Bytes, b: $.Bytes): boolean {
267
+ const aa = $.bytesToUint8Array(a)
268
+ const bb = $.bytesToUint8Array(b)
269
+ return aa.length === bb.length && aa.every((v, i) => v === bb[i])
270
+ }
271
+
272
+ function isZero(bytes: Uint8Array): boolean {
273
+ return bytes.every((b) => b === 0)
274
+ }
@@ -0,0 +1,41 @@
1
+ import { describe, expect, test } from 'vitest'
2
+ import * as $ from '@goscript/builtin/index.js'
3
+
4
+ import {
5
+ GenerateKey,
6
+ PrivateKeySize,
7
+ PrivateKey_Public,
8
+ PublicKeySize,
9
+ SignatureSize,
10
+ Sign,
11
+ Verify,
12
+ } from './index.js'
13
+
14
+ describe('crypto/ed25519 override', () => {
15
+ test('generates keys and verifies signatures', async () => {
16
+ const [pub, priv, err] = await GenerateKey(null)
17
+ expect(err).toBeNull()
18
+ expect($.len(pub)).toBe(PublicKeySize)
19
+ expect($.len(priv)).toBe(PrivateKeySize)
20
+
21
+ const message = $.stringToBytes('goscript')
22
+ const sig = await Sign(priv, message)
23
+ expect($.len(sig)).toBe(SignatureSize)
24
+ expect(await Verify(pub, message, sig)).toBe(true)
25
+ expect(await Verify(pub, $.stringToBytes('wrong'), sig)).toBe(false)
26
+ })
27
+
28
+ test('boxes public keys as crypto public keys', async () => {
29
+ const [pub, priv, err] = await GenerateKey(null)
30
+ expect(err).toBeNull()
31
+
32
+ const boxed = PrivateKey_Public(priv)
33
+ const [unboxed, ok] = $.typeAssertTuple<Uint8Array>(
34
+ boxed,
35
+ 'ed25519.PublicKey',
36
+ )
37
+ expect(ok).toBe(true)
38
+ expect(Array.from(unboxed)).toEqual(Array.from(pub))
39
+ expect((boxed as any).Equal(boxed)).toBe(true)
40
+ })
41
+ })
@@ -0,0 +1,238 @@
1
+ import * as $ from '@goscript/builtin/index.js'
2
+ import * as io from '@goscript/io/index.js'
3
+
4
+ export type PublicKey = $.Bytes
5
+ export type PrivateKey = $.Bytes
6
+ type Hash = number
7
+ type PublicKeyInterface = any
8
+ type PrivateKeyInterface = any
9
+ type SignerOpts = { HashFunc(): Hash }
10
+
11
+ export const PublicKeySize = 32
12
+ export const PrivateKeySize = 64
13
+ export const SignatureSize = 64
14
+ export const SeedSize = 32
15
+
16
+ const pkcs8Prefix = new Uint8Array([
17
+ 0x30, 0x2e, 0x02, 0x01, 0x00, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70,
18
+ 0x04, 0x22, 0x04, 0x20,
19
+ ])
20
+
21
+ export class Options {
22
+ public Hash: Hash = 0
23
+ public Context = ''
24
+
25
+ constructor(init?: Partial<{ Hash: Hash; Context: string }>) {
26
+ this.Hash = init?.Hash ?? 0
27
+ this.Context = init?.Context ?? ''
28
+ }
29
+
30
+ public HashFunc(): Hash {
31
+ return this.Hash
32
+ }
33
+ }
34
+
35
+ export function PublicKey_Equal(pub: PublicKey, x: PublicKeyInterface | null): boolean {
36
+ const [xx, ok] = $.typeAssertTuple<PublicKey>(x, 'ed25519.PublicKey')
37
+ return ok && bytesEqual(pub, xx)
38
+ }
39
+
40
+ export function PrivateKey_Public(priv: PrivateKey): PublicKeyInterface | null {
41
+ const publicKey = new Uint8Array(PublicKeySize)
42
+ publicKey.set($.bytesToUint8Array(priv).subarray(SeedSize, PrivateKeySize))
43
+ return $.namedValueInterfaceValue<PublicKeyInterface | null>(
44
+ publicKey,
45
+ 'ed25519.PublicKey',
46
+ { Equal: PublicKey_Equal },
47
+ )
48
+ }
49
+
50
+ export function PrivateKey_Equal(priv: PrivateKey, x: PrivateKeyInterface | null): boolean {
51
+ const [xx, ok] = $.typeAssertTuple<PrivateKey>(x, 'ed25519.PrivateKey')
52
+ return ok && bytesEqual(priv, xx)
53
+ }
54
+
55
+ export function PrivateKey_Seed(priv: PrivateKey): $.Bytes {
56
+ return new Uint8Array($.bytesToUint8Array(priv).subarray(0, SeedSize))
57
+ }
58
+
59
+ export async function PrivateKey_Sign(
60
+ priv: PrivateKey,
61
+ _rand: io.Reader | null,
62
+ message: $.Bytes,
63
+ opts: SignerOpts | null,
64
+ ): Promise<[$.Bytes, $.GoError]> {
65
+ if (opts != null && opts.HashFunc() !== 0) {
66
+ return [null, new Ed25519Error('ed25519: expected opts.HashFunc() zero')]
67
+ }
68
+ return [await Sign(priv, message), null]
69
+ }
70
+
71
+ export async function GenerateKey(random: io.Reader | null): Promise<[PublicKey, PrivateKey, $.GoError]> {
72
+ const seed = new Uint8Array(SeedSize)
73
+ if (random == null) {
74
+ const subtle = subtleCrypto()
75
+ if (subtle == null) {
76
+ return [
77
+ null as PublicKey,
78
+ null as PrivateKey,
79
+ new Ed25519Error('crypto/ed25519: WebCrypto is unavailable'),
80
+ ]
81
+ }
82
+ globalThis.crypto.getRandomValues(seed)
83
+ } else {
84
+ const [, err] = await io.ReadFull(random, seed)
85
+ if (err != null) {
86
+ return [null as PublicKey, null as PrivateKey, err]
87
+ }
88
+ }
89
+
90
+ const privateKey = await NewKeyFromSeed(seed)
91
+ return [
92
+ $.mustTypeAssert<PublicKey>(
93
+ PrivateKey_Public(privateKey),
94
+ 'ed25519.PublicKey',
95
+ ),
96
+ privateKey,
97
+ null,
98
+ ]
99
+ }
100
+
101
+ export async function NewKeyFromSeed(seed: $.Bytes): Promise<PrivateKey> {
102
+ const seedBytes = $.bytesToUint8Array(seed)
103
+ if (seedBytes.length !== SeedSize) {
104
+ throw new Error(`ed25519: bad seed length: ${seedBytes.length}`)
105
+ }
106
+
107
+ const subtle = requireSubtle()
108
+ const key = await subtle.importKey(
109
+ 'pkcs8',
110
+ pkcs8FromSeed(seedBytes) as unknown as BufferSource,
111
+ { name: 'Ed25519' },
112
+ true,
113
+ ['sign'],
114
+ )
115
+ const jwk = await subtle.exportKey('jwk', key)
116
+ if (typeof jwk.x !== 'string') {
117
+ throw new Error('crypto/ed25519: imported key did not expose public key')
118
+ }
119
+
120
+ const publicKey = base64URLDecode(jwk.x)
121
+ const privateKey = new Uint8Array(PrivateKeySize)
122
+ privateKey.set(seedBytes, 0)
123
+ privateKey.set(publicKey, SeedSize)
124
+ return privateKey
125
+ }
126
+
127
+ export async function Sign(privateKey: PrivateKey, message: $.Bytes): Promise<$.Bytes> {
128
+ const priv = $.bytesToUint8Array(privateKey)
129
+ if (priv.length !== PrivateKeySize) {
130
+ throw new Error(`ed25519: bad private key length: ${priv.length}`)
131
+ }
132
+
133
+ const key = await requireSubtle().importKey(
134
+ 'pkcs8',
135
+ pkcs8FromSeed(priv.subarray(0, SeedSize)) as unknown as BufferSource,
136
+ { name: 'Ed25519' },
137
+ false,
138
+ ['sign'],
139
+ )
140
+ const sig = await requireSubtle().sign(
141
+ 'Ed25519',
142
+ key,
143
+ $.bytesToUint8Array(message) as unknown as BufferSource,
144
+ )
145
+ return new Uint8Array(sig)
146
+ }
147
+
148
+ export async function Verify(
149
+ publicKey: PublicKey,
150
+ message: $.Bytes,
151
+ sig: $.Bytes,
152
+ ): Promise<boolean> {
153
+ return (await VerifyWithOptions(publicKey, message, sig, new Options())) == null
154
+ }
155
+
156
+ export async function VerifyWithOptions(
157
+ publicKey: PublicKey,
158
+ message: $.Bytes,
159
+ sig: $.Bytes,
160
+ opts: Options | $.VarRef<Options> | null,
161
+ ): Promise<$.GoError> {
162
+ if ($.len(publicKey) !== PublicKeySize) {
163
+ throw new Error(`ed25519: bad public key length: ${$.len(publicKey)}`)
164
+ }
165
+ if ($.len(sig) !== SignatureSize) {
166
+ return new Ed25519Error('ed25519: bad signature length')
167
+ }
168
+
169
+ const options = $.pointerValueOrNil(opts)
170
+ if (options != null && (options.Hash !== 0 || options.Context !== '')) {
171
+ return new Ed25519Error('ed25519: only pure Ed25519 is supported')
172
+ }
173
+
174
+ const key = await requireSubtle().importKey(
175
+ 'raw',
176
+ $.bytesToUint8Array(publicKey) as unknown as BufferSource,
177
+ { name: 'Ed25519' },
178
+ false,
179
+ ['verify'],
180
+ )
181
+ const ok = await requireSubtle().verify(
182
+ 'Ed25519',
183
+ key,
184
+ $.bytesToUint8Array(sig) as unknown as BufferSource,
185
+ $.bytesToUint8Array(message) as unknown as BufferSource,
186
+ )
187
+ return ok ? null : new Ed25519Error('ed25519: invalid signature')
188
+ }
189
+
190
+ class Ed25519Error {
191
+ constructor(private readonly message: string) {}
192
+
193
+ Error(): string {
194
+ return this.message
195
+ }
196
+ }
197
+
198
+ function requireSubtle(): SubtleCrypto {
199
+ const subtle = subtleCrypto()
200
+ if (subtle == null) {
201
+ throw new Error('crypto/ed25519: WebCrypto Ed25519 is unavailable')
202
+ }
203
+ return subtle
204
+ }
205
+
206
+ function subtleCrypto(): SubtleCrypto | null {
207
+ const crypto = globalThis.crypto
208
+ if (crypto?.subtle && typeof crypto.subtle.importKey === 'function') {
209
+ return crypto.subtle
210
+ }
211
+ return null
212
+ }
213
+
214
+ function pkcs8FromSeed(seed: Uint8Array): Uint8Array {
215
+ const out = new Uint8Array(pkcs8Prefix.length + SeedSize)
216
+ out.set(pkcs8Prefix)
217
+ out.set(seed, pkcs8Prefix.length)
218
+ return out
219
+ }
220
+
221
+ function bytesEqual(a: $.Bytes, b: $.Bytes): boolean {
222
+ const aa = $.bytesToUint8Array(a)
223
+ const bb = $.bytesToUint8Array(b)
224
+ if (aa.length !== bb.length) {
225
+ return false
226
+ }
227
+ let diff = 0
228
+ for (let i = 0; i < aa.length; i++) {
229
+ diff |= aa[i] ^ bb[i]
230
+ }
231
+ return diff === 0
232
+ }
233
+
234
+ function base64URLDecode(value: string): Uint8Array {
235
+ const normalized = value.replace(/-/g, '+').replace(/_/g, '/')
236
+ const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, '=')
237
+ return Uint8Array.from(atob(padded), (c) => c.charCodeAt(0))
238
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "dependencies": [
3
+ "io"
4
+ ],
5
+ "asyncFunctions": {
6
+ "GenerateKey": true,
7
+ "NewKeyFromSeed": true,
8
+ "Sign": true,
9
+ "Verify": true,
10
+ "VerifyWithOptions": true,
11
+ "PrivateKey_Sign": true
12
+ }
13
+ }
@@ -0,0 +1,25 @@
1
+ import { describe, expect, test } from 'vitest'
2
+
3
+ import { ByteEq, Eq, LessOrEq, Select } from './index.js'
4
+
5
+ describe('crypto/internal/constanttime override', () => {
6
+ test('selects on any non-zero selector', () => {
7
+ expect(Select(0, 11, 22)).toBe(22)
8
+ expect(Select(1, 11, 22)).toBe(11)
9
+ expect(Select(7, 11, 22)).toBe(11)
10
+ })
11
+
12
+ test('compares bytes and int32 values', () => {
13
+ expect(ByteEq(0xff, 0xff)).toBe(1)
14
+ expect(ByteEq(0x1ff, 0xff)).toBe(1)
15
+ expect(ByteEq(0x01, 0x02)).toBe(0)
16
+ expect(Eq(12, 12)).toBe(1)
17
+ expect(Eq(12, 13)).toBe(0)
18
+ })
19
+
20
+ test('compares integer ordering', () => {
21
+ expect(LessOrEq(1, 1)).toBe(1)
22
+ expect(LessOrEq(1, 2)).toBe(1)
23
+ expect(LessOrEq(2, 1)).toBe(0)
24
+ })
25
+ })
@@ -0,0 +1,22 @@
1
+ import * as $ from '@goscript/builtin/index.js'
2
+
3
+ export function Select(v: number, x: number, y: number): number {
4
+ v = boolToUint8(v !== 0)
5
+ return (~(v - 1) & x) | ((v - 1) & y)
6
+ }
7
+
8
+ export function ByteEq(x: number, y: number): number {
9
+ return $.int(boolToUint8($.uint(x, 8) === $.uint(y, 8)))
10
+ }
11
+
12
+ export function Eq(x: number, y: number): number {
13
+ return $.int(boolToUint8($.int(x, 32) === $.int(y, 32)))
14
+ }
15
+
16
+ export function LessOrEq(x: number, y: number): number {
17
+ return $.int(boolToUint8(x <= y))
18
+ }
19
+
20
+ function boolToUint8(b: boolean): number {
21
+ return b ? 1 : 0
22
+ }
@@ -0,0 +1 @@
1
+ export * from '@goscript/internal/byteorder/index.js'
@@ -0,0 +1 @@
1
+ export { New, Setting, Value } from '@goscript/internal/godebug/index.js'