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
@@ -396,12 +396,12 @@ class trieNode {
396
396
  // what is currently t.prefix[0] will lead to prefixNode, and
397
397
  // looking up key[0] will lead to keyNode.
398
398
  const prefixNode =
399
- $.len(t!.prefix) == 1
400
- ? t!.next
401
- : new trieNode({
402
- next: t!.next,
403
- prefix: $.sliceString(t!.prefix, 1, undefined),
404
- })
399
+ $.len(t!.prefix) == 1 ?
400
+ t!.next
401
+ : new trieNode({
402
+ next: t!.next,
403
+ prefix: $.sliceString(t!.prefix, 1, undefined),
404
+ })
405
405
  let keyNode = new trieNode()
406
406
  t!.table = $.makeSlice<trieNode | null>(r!.tableSize)
407
407
  t!.table![r!.mapping![$.indexString(t!.prefix, 0)]] = prefixNode
@@ -203,6 +203,7 @@ describe('strings', () => {
203
203
  expect(Index('hello world', 'xyz')).toBe(-1)
204
204
  expect(Index('hello', 'hello')).toBe(0)
205
205
  expect(Index('', '')).toBe(0)
206
+ expect(Index('世界,你好', ',')).toBe(6)
206
207
  })
207
208
  })
208
209
 
@@ -219,6 +220,7 @@ describe('strings', () => {
219
220
  expect(IndexByte('hello', 101)).toBe(1) // 'e'
220
221
  expect(IndexByte('hello', 120)).toBe(-1) // 'x'
221
222
  expect(IndexByte('', 97)).toBe(-1) // 'a'
223
+ expect(IndexByte('世界,你好', 44)).toBe(6)
222
224
  })
223
225
  })
224
226
 
@@ -257,6 +259,7 @@ describe('strings', () => {
257
259
  expect(LastIndex('hello world hello', 'hello')).toBe(12)
258
260
  expect(LastIndex('hello world', 'xyz')).toBe(-1)
259
261
  expect(LastIndex('hello', 'hello')).toBe(0)
262
+ expect(LastIndex('世界,你好', '你好')).toBe(7)
260
263
  })
261
264
  })
262
265
 
@@ -273,6 +276,7 @@ describe('strings', () => {
273
276
  expect(LastIndexByte('hello', 108)).toBe(3) // 'l'
274
277
  expect(LastIndexByte('hello', 120)).toBe(-1) // 'x'
275
278
  expect(LastIndexByte('', 97)).toBe(-1) // 'a'
279
+ expect(LastIndexByte('世界,你好', 44)).toBe(6)
276
280
  })
277
281
  })
278
282
 
@@ -56,18 +56,31 @@ export function ContainsFunc(
56
56
 
57
57
  // Index returns the index of the first instance of substr in s, or -1 if substr is not present in s.
58
58
  export function Index(s: string, substr: string): number {
59
- return s.indexOf(substr)
59
+ if (substr === '') {
60
+ return 0
61
+ }
62
+ return indexBytes($.stringToBytes(s), $.stringToBytes(substr))
60
63
  }
61
64
 
62
65
  // LastIndex returns the index of the last instance of substr in s, or -1 if substr is not present in s.
63
66
  export function LastIndex(s: string, substr: string): number {
64
- return s.lastIndexOf(substr)
67
+ const haystack = $.stringToBytes(s)
68
+ const needle = $.stringToBytes(substr)
69
+ if (needle.length === 0) {
70
+ return haystack.length
71
+ }
72
+ return lastIndexBytes(haystack, needle)
65
73
  }
66
74
 
67
75
  // IndexByte returns the index of the first instance of c in s, or -1 if c is not present in s.
68
76
  export function IndexByte(s: string, c: number): number {
69
- const char = String.fromCharCode(c)
70
- return s.indexOf(char)
77
+ const bytes = $.stringToBytes(s)
78
+ for (let i = 0; i < bytes.length; i++) {
79
+ if (bytes[i] === (c & 0xff)) {
80
+ return i
81
+ }
82
+ }
83
+ return -1
71
84
  }
72
85
 
73
86
  // IndexRune returns the index of the first instance of the Unicode code point r, or -1 if rune is not present in s.
@@ -98,8 +111,43 @@ export function LastIndexAny(s: string, chars: string): number {
98
111
 
99
112
  // LastIndexByte returns the index of the last instance of c in s, or -1 if c is not present in s.
100
113
  export function LastIndexByte(s: string, c: number): number {
101
- const char = String.fromCharCode(c)
102
- return s.lastIndexOf(char)
114
+ const bytes = $.stringToBytes(s)
115
+ for (let i = bytes.length - 1; i >= 0; i--) {
116
+ if (bytes[i] === (c & 0xff)) {
117
+ return i
118
+ }
119
+ }
120
+ return -1
121
+ }
122
+
123
+ function indexBytes(haystack: Uint8Array, needle: Uint8Array): number {
124
+ if (needle.length === 0) {
125
+ return 0
126
+ }
127
+ outer: for (let i = 0; i <= haystack.length - needle.length; i++) {
128
+ for (let j = 0; j < needle.length; j++) {
129
+ if (haystack[i + j] !== needle[j]) {
130
+ continue outer
131
+ }
132
+ }
133
+ return i
134
+ }
135
+ return -1
136
+ }
137
+
138
+ function lastIndexBytes(haystack: Uint8Array, needle: Uint8Array): number {
139
+ if (needle.length === 0) {
140
+ return haystack.length
141
+ }
142
+ outer: for (let i = haystack.length - needle.length; i >= 0; i--) {
143
+ for (let j = 0; j < needle.length; j++) {
144
+ if (haystack[i + j] !== needle[j]) {
145
+ continue outer
146
+ }
147
+ }
148
+ return i
149
+ }
150
+ return -1
103
151
  }
104
152
 
105
153
  // IndexFunc returns the index into s of the first Unicode code point satisfying f(c), or -1 if none do.
@@ -4,6 +4,8 @@ import { AddInt64, AddUint64, AndInt64, AndUint64, CompareAndSwapInt64, CompareA
4
4
 
5
5
  import * as unsafe from "@goscript/unsafe/index.js"
6
6
 
7
+ export type PointerValue<T> = T | $.VarRef<T> | null
8
+
7
9
  export class Bool {
8
10
  public get v(): number {
9
11
  return this._fields.v.value
@@ -74,18 +76,18 @@ export function b32(b: boolean): number {
74
76
 
75
77
 
76
78
  export class Pointer<T> {
77
- public get v(): $.VarRef<T> | null {
79
+ public get v(): PointerValue<T> {
78
80
  return this._fields.v.value
79
81
  }
80
- public set v(value: $.VarRef<T> | null) {
82
+ public set v(value: PointerValue<T>) {
81
83
  this._fields.v.value = value
82
84
  }
83
85
 
84
86
  public _fields: {
85
- v: $.VarRef<$.VarRef<T> | null>;
87
+ v: $.VarRef<PointerValue<T>>;
86
88
  }
87
89
 
88
- constructor(init?: Partial<{v?: $.VarRef<T> | null}>) {
90
+ constructor(init?: Partial<{v?: PointerValue<T>}>) {
89
91
  this._fields = {
90
92
  v: $.varRef(init?.v ?? null)
91
93
  }
@@ -100,14 +102,13 @@ export class Pointer<T> {
100
102
  }
101
103
 
102
104
  // Load atomically loads and returns the value stored in x.
103
- public Load(): $.VarRef<T> | null {
105
+ public Load(): PointerValue<T> {
104
106
  const x = this
105
- return LoadPointer(x._fields.v) as $.VarRef<T> | null
107
+ return LoadPointer(x._fields.v) as PointerValue<T>
106
108
  }
107
109
 
108
110
  // Store atomically stores val into x.
109
- // In Go, this takes *T which can be nil, so we accept VarRef<T> | null
110
- public Store(val: $.VarRef<T> | null): void {
111
+ public Store(val: PointerValue<T>): void {
111
112
  const x = this
112
113
  if (val === null) {
113
114
  StorePointer(x._fields.v, null)
@@ -117,17 +118,16 @@ export class Pointer<T> {
117
118
  }
118
119
 
119
120
  // Swap atomically stores new into x and returns the previous value.
120
- // In Go, this takes *T which can be nil, so we accept VarRef<T> | null
121
- public Swap(_new: $.VarRef<T> | null): $.VarRef<T> | null {
121
+ public Swap(_new: PointerValue<T>): PointerValue<T> {
122
122
  const x = this
123
123
  if (_new === null) {
124
- return SwapPointer(x._fields.v, null) as $.VarRef<T> | null
124
+ return SwapPointer(x._fields.v, null) as PointerValue<T>
125
125
  }
126
- return SwapPointer(x._fields.v, unsafe.Pointer(_new)) as $.VarRef<T> | null
126
+ return SwapPointer(x._fields.v, unsafe.Pointer(_new)) as PointerValue<T>
127
127
  }
128
128
 
129
129
  // CompareAndSwap executes the compare-and-swap operation for x.
130
- public CompareAndSwap(old: $.VarRef<T> | null, _new: $.VarRef<T> | null): boolean {
130
+ public CompareAndSwap(old: PointerValue<T>, _new: PointerValue<T>): boolean {
131
131
  const x = this
132
132
  return CompareAndSwapPointer(x._fields.v, old ? unsafe.Pointer(old) : null, _new ? unsafe.Pointer(_new) : null)
133
133
  }
@@ -598,4 +598,3 @@ class align64 {
598
598
  {}
599
599
  );
600
600
  }
601
-
package/gs/sync/meta.json CHANGED
@@ -9,11 +9,13 @@
9
9
  "WaitGroup.Wait": true,
10
10
  "Once.Do": true,
11
11
  "Cond.Wait": true,
12
+ "Map.CompareAndDelete": true,
12
13
  "Map.Delete": true,
13
14
  "Map.Load": true,
14
15
  "Map.LoadAndDelete": true,
15
16
  "Map.LoadOrStore": true,
16
17
  "Map.Range": true,
17
- "Map.Store": true
18
+ "Map.Store": true,
19
+ "Map.Swap": true
18
20
  }
19
21
  }
@@ -1,6 +1,6 @@
1
1
  import { describe, expect, it } from 'vitest'
2
2
 
3
- import { WaitGroup } from './sync.js'
3
+ import { Cond, Map, Mutex, RWMutex, WaitGroup } from './sync.js'
4
4
 
5
5
  describe('sync.WaitGroup', () => {
6
6
  it('Go tracks scheduled work and unblocks Wait after completion', async () => {
@@ -22,3 +22,71 @@ describe('sync.WaitGroup', () => {
22
22
  expect(events).toEqual(['worker start', 'worker done', 'wait done'])
23
23
  })
24
24
  })
25
+
26
+ describe('sync.Cond', () => {
27
+ it('exposes the Locker as public field L', async () => {
28
+ const mutex = new Mutex()
29
+ const cond = new Cond(mutex)
30
+
31
+ expect(cond.L).toBe(mutex)
32
+ await cond.L.Lock()
33
+ cond.L.Unlock()
34
+ })
35
+ })
36
+
37
+ describe('sync.RWMutex', () => {
38
+ it('exposes RLocker as a read-lock Locker', async () => {
39
+ const rw = new RWMutex()
40
+ const locker = rw.RLocker()
41
+
42
+ await locker.Lock()
43
+ locker.Unlock()
44
+ })
45
+ })
46
+
47
+ describe('sync.Map', () => {
48
+ it('Clear deletes all entries', async () => {
49
+ const m = new Map()
50
+
51
+ await m.Store('first', 1)
52
+ await m.Store('second', 2)
53
+ await m.Clear()
54
+
55
+ expect(await m.Load('first')).toEqual([undefined, false])
56
+ expect(await m.Load('second')).toEqual([undefined, false])
57
+ })
58
+
59
+ it('CompareAndSwap swaps only matching entries', async () => {
60
+ const m = new Map()
61
+
62
+ await m.Store('key', 'value')
63
+ expect(await m.CompareAndSwap('key', 'other', 'next')).toBe(false)
64
+ expect(await m.Load('key')).toEqual(['value', true])
65
+ expect(await m.CompareAndSwap('key', 'value', 'next')).toBe(true)
66
+ expect(await m.Load('key')).toEqual(['next', true])
67
+ })
68
+
69
+ it('CompareAndDelete deletes only matching entries', async () => {
70
+ const m = new Map()
71
+
72
+ await m.Store('key', 'value')
73
+ expect(await m.CompareAndDelete('key', 'other')).toBe(false)
74
+ expect(await m.Load('key')).toEqual(['value', true])
75
+ expect(await m.CompareAndDelete('key', 'value')).toBe(true)
76
+ expect(await m.Load('key')).toEqual([undefined, false])
77
+ })
78
+
79
+ it('Range accepts generated async-shaped callbacks', async () => {
80
+ const m = new Map()
81
+ const visited: string[] = []
82
+
83
+ await m.Store('a', 1)
84
+ await m.Store('b', 2)
85
+ await m.Range(async (key, value) => {
86
+ visited.push(`${key}:${value}`)
87
+ return key !== 'a'
88
+ })
89
+
90
+ expect(visited).toEqual(['a:1'])
91
+ })
92
+ })
package/gs/sync/sync.ts CHANGED
@@ -143,6 +143,15 @@ export class RWMutex {
143
143
  }
144
144
  }
145
145
 
146
+ // RLocker returns a Locker interface that implements Lock and Unlock by
147
+ // calling RLock and RUnlock.
148
+ public RLocker(): Locker {
149
+ return {
150
+ Lock: () => this.RLock(),
151
+ Unlock: () => this.RUnlock(),
152
+ }
153
+ }
154
+
146
155
  private _wakeUpWaiters(): void {
147
156
  // Prioritize writers
148
157
  if (this._writerWaitQueue.length > 0 && this._readers === 0) {
@@ -232,7 +241,7 @@ export class Once {
232
241
  }
233
242
 
234
243
  // Do calls the function f if and only if Do is being called for the first time for this instance of Once
235
- public async Do(f: () => void): Promise<void> {
244
+ public async Do(f: () => void | Promise<void>): Promise<void> {
236
245
  if (this._done) {
237
246
  return
238
247
  }
@@ -240,7 +249,7 @@ export class Once {
240
249
  await this._m.Lock()
241
250
  try {
242
251
  if (!this._done) {
243
- f()
252
+ await f()
244
253
  this._done = true
245
254
  }
246
255
  } finally {
@@ -256,11 +265,11 @@ export class Once {
256
265
 
257
266
  // Cond implements a condition variable, a rendezvous point for goroutines waiting for or announcing the occurrence of an event
258
267
  export class Cond {
259
- private _l: Locker
268
+ public L: Locker
260
269
  private _waiters: Array<() => void> = []
261
270
 
262
271
  constructor(l: Locker) {
263
- this._l = l
272
+ this.L = l
264
273
  }
265
274
 
266
275
  // Broadcast wakes all goroutines waiting on c
@@ -281,11 +290,11 @@ export class Cond {
281
290
 
282
291
  // Wait atomically unlocks c.L and suspends execution of the calling goroutine
283
292
  public async Wait(): Promise<void> {
284
- this._l.Unlock()
293
+ this.L.Unlock()
285
294
 
286
295
  return new Promise<void>((resolve) => {
287
296
  this._waiters.push(async () => {
288
- await this._l.Lock()
297
+ await this.L.Lock()
289
298
  resolve()
290
299
  })
291
300
  })
@@ -293,7 +302,7 @@ export class Cond {
293
302
 
294
303
  // clone returns a copy of this Cond instance
295
304
  public clone(): Cond {
296
- return new Cond(this._l)
305
+ return new Cond(this.L)
297
306
  }
298
307
  }
299
308
 
@@ -311,6 +320,16 @@ export class Map {
311
320
  // Map has no public fields to initialize
312
321
  }
313
322
 
323
+ // Clear deletes all entries.
324
+ public async Clear(): Promise<void> {
325
+ await this._m.Lock()
326
+ try {
327
+ this._data.clear()
328
+ } finally {
329
+ this._m.Unlock()
330
+ }
331
+ }
332
+
314
333
  // Delete deletes the value for a key
315
334
  public async Delete(key: any): Promise<void> {
316
335
  await this._m.Lock()
@@ -321,6 +340,29 @@ export class Map {
321
340
  }
322
341
  }
323
342
 
343
+ // CompareAndDelete deletes the entry for key if its value is equal to old.
344
+ public async CompareAndDelete(key: any, old: any): Promise<boolean> {
345
+ await this._m.Lock()
346
+ try {
347
+ if (!this._data.has(key) || this._data.get(key) !== old) {
348
+ return false
349
+ }
350
+ this._data.delete(key)
351
+ return true
352
+ } finally {
353
+ this._m.Unlock()
354
+ }
355
+ }
356
+
357
+ // CompareAndSwap swaps the old and new values for key if the stored value is old.
358
+ public CompareAndSwap(key: any, old: any, value: any): boolean {
359
+ if (!this._data.has(key) || this._data.get(key) !== old) {
360
+ return false
361
+ }
362
+ this._data.set(key, value)
363
+ return true
364
+ }
365
+
324
366
  // Load returns the value stored in the map for a key, or nil if no value is present
325
367
  public async Load(key: any): Promise<[any, boolean]> {
326
368
  await this._m.RLock()
@@ -360,17 +402,21 @@ export class Map {
360
402
  }
361
403
 
362
404
  // Range calls f sequentially for each key and value present in the map
363
- public async Range(f: (key: any, value: any) => boolean): Promise<void> {
405
+ public async Range(
406
+ f: (key: any, value: any) => boolean | globalThis.Promise<boolean>,
407
+ ): Promise<void> {
364
408
  await this._m.RLock()
409
+ let entries: [any, any][]
365
410
  try {
366
- for (const [key, value] of this._data) {
367
- if (!f(key, value)) {
368
- break
369
- }
370
- }
411
+ entries = Array.from(this._data)
371
412
  } finally {
372
413
  this._m.RUnlock()
373
414
  }
415
+ for (const [key, value] of entries) {
416
+ if (!(await f(key, value))) {
417
+ break
418
+ }
419
+ }
374
420
  }
375
421
 
376
422
  // Store sets the value for a key
@@ -383,6 +429,19 @@ export class Map {
383
429
  }
384
430
  }
385
431
 
432
+ // Swap swaps the value for a key and returns the previous value if any
433
+ public async Swap(key: any, value: any): Promise<[any, boolean]> {
434
+ await this._m.Lock()
435
+ try {
436
+ const previous = this._data.get(key)
437
+ const loaded = this._data.has(key)
438
+ this._data.set(key, value)
439
+ return [previous, loaded]
440
+ } finally {
441
+ this._m.Unlock()
442
+ }
443
+ }
444
+
386
445
  // clone returns a copy of this Map instance
387
446
  public clone(): Map {
388
447
  return new Map()
@@ -1,29 +1,44 @@
1
1
  // Essential syscall constants
2
- export const O_RDONLY = 0
3
- export const O_WRONLY = 1
4
- export const O_RDWR = 2
5
- export const O_APPEND = 8
6
- export const O_CREATE = 64
7
- export const O_EXCL = 128
8
- export const O_SYNC = 256
9
- export const O_TRUNC = 512
2
+ export const O_RDONLY: number = 0
3
+ export const O_WRONLY: number = 1
4
+ export const O_RDWR: number = 2
5
+ export const O_APPEND: number = 8
6
+ export const O_CREATE: number = 64
7
+ export const O_EXCL: number = 128
8
+ export const O_SYNC: number = 256
9
+ export const O_TRUNC: number = 512
10
10
 
11
- export const Stdin = 0
12
- export const Stdout = 1
13
- export const Stderr = 2
11
+ export const Stdin: number = 0
12
+ export const Stdout: number = 1
13
+ export const Stderr: number = 2
14
14
 
15
- export const SIGINT = 2
16
- export const SIGTERM = 15
15
+ export const SIGINT: number = 2
16
+ export const SIGTERM: number = 15
17
+
18
+ export const AF_UNIX: number = 1
19
+ export const AF_INET: number = 2
20
+ export const AF_INET6: number = 10
21
+
22
+ export const SOCK_STREAM: number = 1
23
+ export const SOCK_DGRAM: number = 2
24
+ export const SOCK_RAW: number = 3
25
+ export const SOCK_SEQPACKET: number = 5
26
+
27
+ export const IPPROTO_IPV6: number = 0x29
28
+ export const IPPROTO_TCP: number = 6
29
+ export const IPV6_V6ONLY: number = 0x1a
30
+ export const SOMAXCONN: number = 0x80
31
+ export const F_DUPFD_CLOEXEC: number = 1
17
32
 
18
33
  // File mode constants
19
- export const S_IFMT = 0o170000
20
- export const S_IFREG = 0o100000
21
- export const S_IFDIR = 0o040000
22
- export const S_IFLNK = 0o120000
23
- export const S_IFBLK = 0o060000
24
- export const S_IFCHR = 0o020000
25
- export const S_IFIFO = 0o010000
26
- export const S_IFSOCK = 0o140000
27
- export const S_ISUID = 0o004000
28
- export const S_ISGID = 0o002000
29
- export const S_ISVTX = 0o001000
34
+ export const S_IFMT: number = 0o170000
35
+ export const S_IFREG: number = 0o100000
36
+ export const S_IFDIR: number = 0o040000
37
+ export const S_IFLNK: number = 0o120000
38
+ export const S_IFBLK: number = 0o060000
39
+ export const S_IFCHR: number = 0o020000
40
+ export const S_IFIFO: number = 0o010000
41
+ export const S_IFSOCK: number = 0o140000
42
+ export const S_ISUID: number = 0o004000
43
+ export const S_ISGID: number = 0o002000
44
+ export const S_ISVTX: number = 0o001000