goscript 0.1.3 → 0.2.0

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 (330) hide show
  1. package/README.md +5 -2
  2. package/cmd/go_js_wasm_exec/main.go +201 -0
  3. package/cmd/go_js_wasm_exec/main_test.go +83 -0
  4. package/cmd/goscript/{cmd_compile.go → cmd-compile.go} +35 -8
  5. package/cmd/goscript/cmd-test.go +14 -0
  6. package/cmd/goscript/cmd-test_test.go +1 -1
  7. package/cmd/goscript/cmd_compile_test.go +105 -6
  8. package/compiler/build-flags.go +9 -10
  9. package/compiler/compile-request.go +12 -9
  10. package/compiler/compliance_test.go +0 -1
  11. package/compiler/config.go +2 -0
  12. package/compiler/gotest/request.go +28 -0
  13. package/compiler/gotest/runner.go +353 -27
  14. package/compiler/gotest/runner_test.go +400 -1
  15. package/compiler/gotest/testdata/browserapi/browserapi_test.go +20 -0
  16. package/compiler/gotest/testdata/browserapi/go.mod +3 -0
  17. package/compiler/lowered-program.go +24 -17
  18. package/compiler/lowering.go +988 -263
  19. package/compiler/lowering_bench_test.go +364 -0
  20. package/compiler/override-facts.go +15 -0
  21. package/compiler/override-parity-verifier.go +450 -0
  22. package/compiler/override-parity.go +122 -0
  23. package/compiler/override-registry_test.go +559 -0
  24. package/compiler/package-graph.go +61 -4
  25. package/compiler/package-graph_test.go +30 -0
  26. package/compiler/protobuf-ts-binding.go +514 -0
  27. package/compiler/protobuf-ts-binding_test.go +172 -0
  28. package/compiler/semantic-model-types.go +17 -4
  29. package/compiler/semantic-model.go +709 -72
  30. package/compiler/semantic-model_test.go +219 -0
  31. package/compiler/service.go +20 -1
  32. package/compiler/skeleton_test.go +1008 -20
  33. package/compiler/typescript-emitter.go +147 -15
  34. package/dist/gs/builtin/builtin.d.ts +2 -2
  35. package/dist/gs/builtin/builtin.js +20 -0
  36. package/dist/gs/builtin/builtin.js.map +1 -1
  37. package/dist/gs/builtin/slice.d.ts +2 -1
  38. package/dist/gs/builtin/slice.js +34 -4
  39. package/dist/gs/builtin/slice.js.map +1 -1
  40. package/dist/gs/builtin/type.d.ts +14 -6
  41. package/dist/gs/builtin/type.js +224 -64
  42. package/dist/gs/builtin/type.js.map +1 -1
  43. package/dist/gs/builtin/varRef.d.ts +11 -0
  44. package/dist/gs/builtin/varRef.js +57 -2
  45. package/dist/gs/builtin/varRef.js.map +1 -1
  46. package/dist/gs/bytes/buffer.gs.js +1 -1
  47. package/dist/gs/bytes/buffer.gs.js.map +1 -1
  48. package/dist/gs/bytes/reader.gs.js +1 -1
  49. package/dist/gs/bytes/reader.gs.js.map +1 -1
  50. package/dist/gs/compress/zlib/index.d.ts +13 -6
  51. package/dist/gs/compress/zlib/index.js +131 -35
  52. package/dist/gs/compress/zlib/index.js.map +1 -1
  53. package/dist/gs/crypto/sha1/index.js +2 -5
  54. package/dist/gs/crypto/sha1/index.js.map +1 -1
  55. package/dist/gs/crypto/sha256/index.js +2 -5
  56. package/dist/gs/crypto/sha256/index.js.map +1 -1
  57. package/dist/gs/crypto/sha512/index.js +2 -5
  58. package/dist/gs/crypto/sha512/index.js.map +1 -1
  59. package/dist/gs/embed/index.d.ts +6 -0
  60. package/dist/gs/embed/index.js +210 -5
  61. package/dist/gs/embed/index.js.map +1 -1
  62. package/dist/gs/encoding/json/index.d.ts +114 -0
  63. package/dist/gs/encoding/json/index.js +544 -36
  64. package/dist/gs/encoding/json/index.js.map +1 -1
  65. package/dist/gs/fmt/fmt.d.ts +3 -3
  66. package/dist/gs/fmt/fmt.js +29 -16
  67. package/dist/gs/fmt/fmt.js.map +1 -1
  68. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +100 -0
  69. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +564 -0
  70. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  71. package/dist/gs/github.com/go-git/go-billy/v6/osfs/index.d.ts +45 -0
  72. package/dist/gs/github.com/go-git/go-billy/v6/osfs/index.js +229 -0
  73. package/dist/gs/github.com/go-git/go-billy/v6/osfs/index.js.map +1 -0
  74. package/dist/gs/github.com/pkg/errors/errors.js +54 -30
  75. package/dist/gs/github.com/pkg/errors/errors.js.map +1 -1
  76. package/dist/gs/go/scanner/index.d.ts +2 -0
  77. package/dist/gs/go/scanner/index.js +29 -5
  78. package/dist/gs/go/scanner/index.js.map +1 -1
  79. package/dist/gs/go/token/index.js +22 -6
  80. package/dist/gs/go/token/index.js.map +1 -1
  81. package/dist/gs/hash/index.d.ts +6 -0
  82. package/dist/gs/hash/index.js +20 -0
  83. package/dist/gs/hash/index.js.map +1 -1
  84. package/dist/gs/internal/goarch/index.d.ts +43 -3
  85. package/dist/gs/internal/goarch/index.js +42 -10
  86. package/dist/gs/internal/goarch/index.js.map +1 -1
  87. package/dist/gs/io/fs/fs.js +26 -14
  88. package/dist/gs/io/fs/fs.js.map +1 -1
  89. package/dist/gs/io/fs/readdir.js +8 -4
  90. package/dist/gs/io/fs/readdir.js.map +1 -1
  91. package/dist/gs/io/fs/sub.js +8 -1
  92. package/dist/gs/io/fs/sub.js.map +1 -1
  93. package/dist/gs/io/io.d.ts +12 -6
  94. package/dist/gs/io/io.js +87 -42
  95. package/dist/gs/io/io.js.map +1 -1
  96. package/dist/gs/math/bits/index.d.ts +31 -5
  97. package/dist/gs/math/bits/index.js +29 -28
  98. package/dist/gs/math/bits/index.js.map +1 -1
  99. package/dist/gs/mime/index.d.ts +16 -0
  100. package/dist/gs/mime/index.js +315 -6
  101. package/dist/gs/mime/index.js.map +1 -1
  102. package/dist/gs/net/http/httptest/index.d.ts +12 -0
  103. package/dist/gs/net/http/httptest/index.js +85 -6
  104. package/dist/gs/net/http/httptest/index.js.map +1 -1
  105. package/dist/gs/net/http/index.d.ts +303 -6
  106. package/dist/gs/net/http/index.js +1615 -58
  107. package/dist/gs/net/http/index.js.map +1 -1
  108. package/dist/gs/os/dir_unix.gs.js +1 -1
  109. package/dist/gs/os/dir_unix.gs.js.map +1 -1
  110. package/dist/gs/os/error.gs.js +1 -1
  111. package/dist/gs/os/error.gs.js.map +1 -1
  112. package/dist/gs/os/exec.gs.d.ts +1 -0
  113. package/dist/gs/os/exec.gs.js +4 -8
  114. package/dist/gs/os/exec.gs.js.map +1 -1
  115. package/dist/gs/os/exec_posix.gs.js +1 -1
  116. package/dist/gs/os/exec_posix.gs.js.map +1 -1
  117. package/dist/gs/os/index.d.ts +1 -1
  118. package/dist/gs/os/index.js +1 -1
  119. package/dist/gs/os/index.js.map +1 -1
  120. package/dist/gs/os/proc.gs.d.ts +4 -0
  121. package/dist/gs/os/proc.gs.js +12 -6
  122. package/dist/gs/os/proc.gs.js.map +1 -1
  123. package/dist/gs/os/root_js.gs.js +1 -1
  124. package/dist/gs/os/root_js.gs.js.map +1 -1
  125. package/dist/gs/os/types.gs.js +1 -1
  126. package/dist/gs/os/types.gs.js.map +1 -1
  127. package/dist/gs/os/types_js.gs.d.ts +6 -2
  128. package/dist/gs/os/types_js.gs.js +170 -9
  129. package/dist/gs/os/types_js.gs.js.map +1 -1
  130. package/dist/gs/os/types_unix.gs.js +1 -1
  131. package/dist/gs/os/types_unix.gs.js.map +1 -1
  132. package/dist/gs/path/path.js +11 -7
  133. package/dist/gs/path/path.js.map +1 -1
  134. package/dist/gs/reflect/index.d.ts +5 -4
  135. package/dist/gs/reflect/index.js +4 -3
  136. package/dist/gs/reflect/index.js.map +1 -1
  137. package/dist/gs/reflect/map.js +15 -0
  138. package/dist/gs/reflect/map.js.map +1 -1
  139. package/dist/gs/reflect/type.d.ts +26 -6
  140. package/dist/gs/reflect/type.js +1498 -279
  141. package/dist/gs/reflect/type.js.map +1 -1
  142. package/dist/gs/reflect/types.d.ts +14 -6
  143. package/dist/gs/reflect/types.js +35 -1
  144. package/dist/gs/reflect/types.js.map +1 -1
  145. package/dist/gs/reflect/value.d.ts +1 -0
  146. package/dist/gs/reflect/value.js +83 -41
  147. package/dist/gs/reflect/value.js.map +1 -1
  148. package/dist/gs/reflect/visiblefields.js +4 -140
  149. package/dist/gs/reflect/visiblefields.js.map +1 -1
  150. package/dist/gs/runtime/pprof/index.d.ts +8 -2
  151. package/dist/gs/runtime/pprof/index.js +50 -30
  152. package/dist/gs/runtime/pprof/index.js.map +1 -1
  153. package/dist/gs/runtime/runtime.js +5 -4
  154. package/dist/gs/runtime/runtime.js.map +1 -1
  155. package/dist/gs/runtime/trace/index.js +5 -19
  156. package/dist/gs/runtime/trace/index.js.map +1 -1
  157. package/dist/gs/strconv/atoi.gs.js +1 -1
  158. package/dist/gs/strconv/atoi.gs.js.map +1 -1
  159. package/dist/gs/strconv/complex.gs.d.ts +3 -0
  160. package/dist/gs/strconv/complex.gs.js +148 -0
  161. package/dist/gs/strconv/complex.gs.js.map +1 -0
  162. package/dist/gs/strconv/index.d.ts +1 -0
  163. package/dist/gs/strconv/index.js +1 -0
  164. package/dist/gs/strconv/index.js.map +1 -1
  165. package/dist/gs/strings/builder.js +1 -1
  166. package/dist/gs/strings/reader.d.ts +1 -1
  167. package/dist/gs/strings/reader.js +11 -7
  168. package/dist/gs/strings/reader.js.map +1 -1
  169. package/dist/gs/strings/replace.js +15 -7
  170. package/dist/gs/strings/replace.js.map +1 -1
  171. package/dist/gs/strings/strings.d.ts +5 -0
  172. package/dist/gs/strings/strings.js +57 -5
  173. package/dist/gs/strings/strings.js.map +1 -1
  174. package/dist/gs/sync/atomic/type.gs.js +9 -9
  175. package/dist/gs/sync/atomic/type.gs.js.map +1 -1
  176. package/dist/gs/sync/atomic/value.gs.js +2 -2
  177. package/dist/gs/sync/atomic/value.gs.js.map +1 -1
  178. package/dist/gs/sync/sync.d.ts +2 -1
  179. package/dist/gs/sync/sync.js +37 -16
  180. package/dist/gs/sync/sync.js.map +1 -1
  181. package/dist/gs/syscall/env.js +22 -14
  182. package/dist/gs/syscall/env.js.map +1 -1
  183. package/dist/gs/syscall/js/index.js +9 -0
  184. package/dist/gs/syscall/js/index.js.map +1 -1
  185. package/dist/gs/testing/testing.js +59 -15
  186. package/dist/gs/testing/testing.js.map +1 -1
  187. package/dist/gs/time/time.d.ts +24 -1
  188. package/dist/gs/time/time.js +43 -3
  189. package/dist/gs/time/time.js.map +1 -1
  190. package/dist/gs/unique/index.js +7 -1
  191. package/dist/gs/unique/index.js.map +1 -1
  192. package/go.mod +3 -3
  193. package/go.sum +16 -0
  194. package/gs/builtin/builtin.ts +25 -2
  195. package/gs/builtin/runtime-contract.test.ts +260 -18
  196. package/gs/builtin/slice.ts +51 -4
  197. package/gs/builtin/type.ts +310 -63
  198. package/gs/builtin/varRef.ts +85 -2
  199. package/gs/bytes/buffer.gs.ts +1 -1
  200. package/gs/bytes/reader.gs.ts +1 -1
  201. package/gs/compress/zlib/index.test.ts +159 -1
  202. package/gs/compress/zlib/index.ts +164 -37
  203. package/gs/compress/zlib/meta.json +4 -1
  204. package/gs/compress/zlib/parity.json +51 -0
  205. package/gs/crypto/sha1/index.test.ts +19 -2
  206. package/gs/crypto/sha1/index.ts +3 -6
  207. package/gs/crypto/sha256/index.test.ts +14 -2
  208. package/gs/crypto/sha256/index.ts +3 -6
  209. package/gs/crypto/sha512/index.test.ts +17 -2
  210. package/gs/crypto/sha512/index.ts +3 -6
  211. package/gs/embed/index.test.ts +87 -0
  212. package/gs/embed/index.ts +229 -5
  213. package/gs/encoding/json/index.test.ts +360 -6
  214. package/gs/encoding/json/index.ts +679 -38
  215. package/gs/encoding/json/parity.json +81 -0
  216. package/gs/fmt/fmt.test.ts +41 -3
  217. package/gs/fmt/fmt.ts +40 -17
  218. package/gs/fmt/meta.json +6 -1
  219. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +211 -3
  220. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +857 -1
  221. package/gs/github.com/go-git/go-billy/v6/osfs/index.test.ts +110 -0
  222. package/gs/github.com/go-git/go-billy/v6/osfs/index.ts +280 -0
  223. package/gs/github.com/go-git/go-billy/v6/osfs/meta.json +8 -0
  224. package/gs/github.com/pkg/errors/errors.ts +54 -30
  225. package/gs/go/scanner/index.test.ts +39 -56
  226. package/gs/go/scanner/index.ts +33 -5
  227. package/gs/go/scanner/parity.json +27 -0
  228. package/gs/go/token/index.ts +22 -6
  229. package/gs/hash/index.test.ts +20 -33
  230. package/gs/hash/index.ts +28 -0
  231. package/gs/hash/parity.json +21 -0
  232. package/gs/internal/goarch/index.test.ts +32 -0
  233. package/gs/internal/goarch/index.ts +45 -13
  234. package/gs/internal/goarch/parity.json +144 -0
  235. package/gs/io/fs/fs.ts +26 -14
  236. package/gs/io/fs/readdir.test.ts +38 -0
  237. package/gs/io/fs/readdir.ts +8 -4
  238. package/gs/io/fs/sub.ts +8 -1
  239. package/gs/io/io.test.ts +77 -6
  240. package/gs/io/io.ts +115 -52
  241. package/gs/io/meta.json +7 -1
  242. package/gs/io/parity.json +162 -0
  243. package/gs/math/bits/index.test.ts +14 -1
  244. package/gs/math/bits/index.ts +75 -32
  245. package/gs/math/bits/parity.json +156 -0
  246. package/gs/mime/index.test.ts +90 -0
  247. package/gs/mime/index.ts +369 -6
  248. package/gs/mime/parity.json +36 -0
  249. package/gs/net/http/httptest/index.test.ts +98 -2
  250. package/gs/net/http/httptest/index.ts +101 -6
  251. package/gs/net/http/httptest/parity.json +15 -0
  252. package/gs/net/http/index.test.ts +797 -12
  253. package/gs/net/http/index.ts +1874 -136
  254. package/gs/net/http/meta.json +16 -1
  255. package/gs/net/http/parity.json +193 -0
  256. package/gs/os/dir_unix.gs.ts +1 -1
  257. package/gs/os/error.gs.ts +1 -1
  258. package/gs/os/exec.gs.ts +4 -8
  259. package/gs/os/exec_posix.gs.ts +1 -1
  260. package/gs/os/file_unix_js.test.ts +52 -0
  261. package/gs/os/index.test.ts +9 -0
  262. package/gs/os/index.ts +1 -0
  263. package/gs/os/meta.json +4 -0
  264. package/gs/os/parity.json +9 -0
  265. package/gs/os/proc.gs.ts +18 -5
  266. package/gs/os/proc.test.ts +26 -0
  267. package/gs/os/readdir.test.ts +56 -0
  268. package/gs/os/root_js.gs.ts +1 -1
  269. package/gs/os/types.gs.ts +1 -1
  270. package/gs/os/types_js.gs.ts +170 -9
  271. package/gs/os/types_unix.gs.ts +1 -1
  272. package/gs/path/path.ts +11 -7
  273. package/gs/reflect/deepequal.test.ts +10 -1
  274. package/gs/reflect/field.test.ts +37 -15
  275. package/gs/reflect/function-types.test.ts +518 -22
  276. package/gs/reflect/index.ts +8 -6
  277. package/gs/reflect/map.ts +20 -0
  278. package/gs/reflect/meta.json +6 -4
  279. package/gs/reflect/parity.json +234 -0
  280. package/gs/reflect/sliceat.test.ts +156 -0
  281. package/gs/reflect/structof.test.ts +401 -0
  282. package/gs/reflect/type.ts +1980 -365
  283. package/gs/reflect/typefor.test.ts +540 -10
  284. package/gs/reflect/types.ts +43 -18
  285. package/gs/reflect/value.ts +105 -45
  286. package/gs/reflect/visiblefields.ts +5 -168
  287. package/gs/runtime/parity.json +24 -0
  288. package/gs/runtime/pprof/index.test.ts +29 -7
  289. package/gs/runtime/pprof/index.ts +56 -30
  290. package/gs/runtime/pprof/parity.json +27 -0
  291. package/gs/runtime/runtime.test.ts +3 -1
  292. package/gs/runtime/runtime.ts +4 -3
  293. package/gs/runtime/trace/index.test.ts +5 -3
  294. package/gs/runtime/trace/index.ts +8 -20
  295. package/gs/runtime/trace/parity.json +36 -0
  296. package/gs/strconv/atoi.gs.ts +1 -1
  297. package/gs/strconv/complex.gs.ts +174 -0
  298. package/gs/strconv/complex.test.ts +65 -0
  299. package/gs/strconv/index.ts +1 -0
  300. package/gs/strconv/parity.json +120 -0
  301. package/gs/strings/builder.ts +1 -1
  302. package/gs/strings/meta.json +5 -2
  303. package/gs/strings/parity.json +186 -0
  304. package/gs/strings/reader.test.ts +2 -2
  305. package/gs/strings/reader.ts +11 -7
  306. package/gs/strings/replace.ts +15 -7
  307. package/gs/strings/strings.test.ts +22 -2
  308. package/gs/strings/strings.ts +64 -6
  309. package/gs/sync/atomic/type.gs.ts +9 -9
  310. package/gs/sync/atomic/value.gs.ts +2 -2
  311. package/gs/sync/meta.json +1 -0
  312. package/gs/sync/sync.test.ts +41 -1
  313. package/gs/sync/sync.ts +41 -16
  314. package/gs/syscall/env.ts +29 -14
  315. package/gs/syscall/js/index.test.ts +18 -0
  316. package/gs/syscall/js/index.ts +12 -0
  317. package/gs/testing/testing.test.ts +99 -3
  318. package/gs/testing/testing.ts +95 -24
  319. package/gs/time/parity.json +225 -0
  320. package/gs/time/time.test.ts +20 -2
  321. package/gs/time/time.ts +49 -7
  322. package/gs/unique/index.ts +7 -1
  323. package/package.json +4 -2
  324. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +0 -217
  325. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +0 -814
  326. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +0 -1
  327. package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +0 -31
  328. package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +0 -1233
  329. package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +0 -46
  330. /package/compiler/{wasm_api.go → wasm-api.go} +0 -0
package/gs/io/io.ts CHANGED
@@ -68,71 +68,116 @@ export interface ReadCloser extends Reader, Closer {}
68
68
  export interface WriteCloser extends Writer, Closer {}
69
69
  export interface ReadWriteCloser extends Reader, Writer, Closer {}
70
70
  export interface ReadSeeker extends Reader, Seeker {}
71
+ export interface ReadSeekCloser extends Reader, Seeker, Closer {}
71
72
  export interface WriteSeeker extends Writer, Seeker {}
72
73
  export interface ReadWriteSeeker extends Reader, Writer, Seeker {}
73
74
 
74
75
  class pipeState {
75
- private chunks: Uint8Array[] = []
76
- private readOffset = 0
77
76
  private readerClosed = false
78
77
  private writerClosed = false
79
78
  private readerErr: $.GoError = null
80
79
  private writerErr: $.GoError = null
81
-
82
- Read(p: $.Bytes): [number, $.GoError] {
83
- if (this.readerClosed) {
84
- return [0, this.readerErr ?? ErrClosedPipe]
85
- }
86
- if ($.len(p) === 0) {
87
- return [0, null]
88
- }
89
- if (this.chunks.length === 0) {
80
+ private pendingReads: Array<{
81
+ data: $.Bytes
82
+ resolve: (result: [number, $.GoError]) => void
83
+ }> = []
84
+ private pendingWrites: Array<{
85
+ data: Uint8Array
86
+ offset: number
87
+ resolve: (result: [number, $.GoError]) => void
88
+ }> = []
89
+
90
+ Read(p: $.Bytes): Promise<[number, $.GoError]> {
91
+ return (async (): Promise<[number, $.GoError]> => {
92
+ if (this.readerClosed) {
93
+ return [0, this.readerErr ?? ErrClosedPipe]
94
+ }
95
+ if ($.len(p) === 0) {
96
+ return [0, null]
97
+ }
98
+ if (this.pendingWrites.length > 0) {
99
+ return this.consumeNextWrite(p)
100
+ }
90
101
  if (this.writerClosed) {
91
102
  return [0, this.writerErr ?? EOF]
92
103
  }
93
- return [0, EOF]
94
- }
95
-
96
- let copied = 0
97
- while (copied < $.len(p) && this.chunks.length > 0) {
98
- const chunk = this.chunks[0]
99
- const available = chunk.length - this.readOffset
100
- const want = Math.min($.len(p) - copied, available)
101
- const target = $.goSlice(p, copied, copied + want)
102
- $.copy(target, chunk.subarray(this.readOffset, this.readOffset + want))
103
- copied += want
104
- this.readOffset += want
105
- if (this.readOffset === chunk.length) {
106
- this.chunks.shift()
107
- this.readOffset = 0
108
- }
109
- }
110
- return [copied, null]
104
+ return await new Promise<[number, $.GoError]>((resolve) => {
105
+ this.pendingReads.push({ data: p, resolve })
106
+ })
107
+ })()
111
108
  }
112
109
 
113
- Write(p: $.Bytes): [number, $.GoError] {
114
- if (this.writerClosed || this.readerClosed) {
115
- return [0, this.readerErr ?? ErrClosedPipe]
116
- }
117
- const data = new Uint8Array($.len(p))
118
- $.copy(data, p)
119
- this.chunks.push(data)
120
- return [$.len(p), null]
110
+ Write(p: $.Bytes): Promise<[number, $.GoError]> {
111
+ return (async (): Promise<[number, $.GoError]> => {
112
+ if (this.writerClosed || this.readerClosed) {
113
+ return [0, this.readerErr ?? ErrClosedPipe]
114
+ }
115
+ if ($.len(p) === 0) {
116
+ return [0, null]
117
+ }
118
+ const data = new Uint8Array($.len(p))
119
+ $.copy(data, p)
120
+ return await new Promise<[number, $.GoError]>((resolve) => {
121
+ this.pendingWrites.push({ data, offset: 0, resolve })
122
+ this.drain()
123
+ })
124
+ })()
121
125
  }
122
126
 
123
127
  CloseReader(err: $.GoError): $.GoError {
124
128
  this.readerClosed = true
125
129
  this.readerErr = err
126
- this.chunks = []
127
- this.readOffset = 0
130
+ this.resolvePendingReads(ErrClosedPipe)
131
+ this.resolvePendingWrites(ErrClosedPipe)
128
132
  return null
129
133
  }
130
134
 
131
135
  CloseWriter(err: $.GoError): $.GoError {
132
136
  this.writerClosed = true
133
137
  this.writerErr = err
138
+ if (this.pendingWrites.length === 0) {
139
+ this.resolvePendingReads(err ?? EOF)
140
+ }
134
141
  return null
135
142
  }
143
+
144
+ private drain(): void {
145
+ while (this.pendingWrites.length > 0 && this.pendingReads.length > 0) {
146
+ if (this.readerClosed) {
147
+ this.resolvePendingWrites(this.readerErr ?? ErrClosedPipe)
148
+ return
149
+ }
150
+ const pending = this.pendingReads.shift()!
151
+ pending.resolve(this.consumeNextWrite(pending.data))
152
+ }
153
+ }
154
+
155
+ private consumeNextWrite(p: $.Bytes): [number, $.GoError] {
156
+ const pending = this.pendingWrites[0]
157
+ const n = Math.min($.len(p), pending.data.length - pending.offset)
158
+ $.copy(p, pending.data.subarray(pending.offset, pending.offset + n))
159
+ pending.offset += n
160
+ if (pending.offset === pending.data.length) {
161
+ this.pendingWrites.shift()
162
+ pending.resolve([pending.data.length, null])
163
+ if (this.writerClosed && this.pendingWrites.length === 0) {
164
+ this.resolvePendingReads(this.writerErr ?? EOF)
165
+ }
166
+ }
167
+ return [n, null]
168
+ }
169
+
170
+ private resolvePendingReads(err: $.GoError): void {
171
+ while (this.pendingReads.length > 0) {
172
+ this.pendingReads.shift()!.resolve([0, err])
173
+ }
174
+ }
175
+
176
+ private resolvePendingWrites(err: $.GoError): void {
177
+ while (this.pendingWrites.length > 0) {
178
+ this.pendingWrites.shift()!.resolve([0, err])
179
+ }
180
+ }
136
181
  }
137
182
 
138
183
  // PipeReader is the read half of a pipe.
@@ -140,7 +185,7 @@ export class PipeReader implements Reader, Closer {
140
185
  constructor(private pipe: pipeState) {}
141
186
 
142
187
  Read(data: $.Bytes): [number, $.GoError] {
143
- return this.pipe.Read(data)
188
+ return this.pipe.Read(data) as any
144
189
  }
145
190
 
146
191
  Close(): $.GoError {
@@ -157,7 +202,7 @@ export class PipeWriter implements Writer, Closer {
157
202
  constructor(private pipe: pipeState) {}
158
203
 
159
204
  Write(data: $.Bytes): [number, $.GoError] {
160
- return this.pipe.Write(data)
205
+ return this.pipe.Write(data) as any
161
206
  }
162
207
 
163
208
  Close(): $.GoError {
@@ -235,15 +280,18 @@ class DiscardWriter implements Writer {
235
280
  export const Discard: Writer | null = new DiscardWriter()
236
281
 
237
282
  // WriteString writes the contents of the string s to w, which accepts a slice of bytes
238
- export function WriteString(w: Writer, s: string): [number, $.GoError] {
283
+ export async function WriteString(
284
+ w: Writer,
285
+ s: string,
286
+ ): Promise<[number, $.GoError]> {
239
287
  // Check if w implements StringWriter interface
240
288
  if ('WriteString' in w && typeof (w as any).WriteString === 'function') {
241
- return (w as StringWriter).WriteString(s)
289
+ return await ((w as StringWriter).WriteString(s) as any)
242
290
  }
243
291
 
244
292
  // Convert string to bytes and write
245
293
  const bytes = new TextEncoder().encode(s)
246
- return w.Write(bytes)
294
+ return await (w.Write(bytes) as any)
247
295
  }
248
296
 
249
297
  // LimitedReader reads from R but limits the amount of data returned to just N bytes
@@ -251,7 +299,10 @@ export class LimitedReader implements Reader {
251
299
  public R: Reader | null
252
300
  public N: number
253
301
 
254
- constructor(r?: Reader | { R?: Reader | null; N?: number } | null, n?: number) {
302
+ constructor(
303
+ r?: Reader | { R?: Reader | null; N?: number } | null,
304
+ n?: number,
305
+ ) {
255
306
  if (r != null && typeof (r as { Read?: unknown }).Read !== 'function') {
256
307
  const init = r as { R?: Reader | null; N?: number }
257
308
  this.R = init.R ?? null
@@ -605,7 +656,15 @@ export async function ReadAll(r: Reader): Promise<[$.Bytes, $.GoError]> {
605
656
  }
606
657
 
607
658
  // NopCloser returns a ReadCloser with a no-op Close method wrapping the provided Reader r
608
- export function NopCloser(r: Reader): ReadCloser {
659
+ export function NopCloser(r: Reader | null): ReadCloser {
660
+ if (r == null) {
661
+ return {
662
+ Read: () => {
663
+ throw new Error('nil Reader')
664
+ },
665
+ Close: () => null,
666
+ }
667
+ }
609
668
  return {
610
669
  Read: r.Read.bind(r),
611
670
  Close: () => null,
@@ -655,22 +714,22 @@ class multiReader implements Reader {
655
714
 
656
715
  // MultiWriter creates a writer that duplicates its writes to all the provided writers
657
716
  export function MultiWriter(...writers: (Writer | null)[]): Writer {
658
- return new multiWriter(writers.slice())
717
+ return new multiWriter(writers.slice()) as any
659
718
  }
660
719
 
661
- class multiWriter implements Writer {
720
+ class multiWriter {
662
721
  private writers: (Writer | null)[]
663
722
 
664
723
  constructor(writers: (Writer | null)[]) {
665
724
  this.writers = writers
666
725
  }
667
726
 
668
- Write(p: $.Bytes): [number, $.GoError] {
727
+ async Write(p: $.Bytes): Promise<[number, $.GoError]> {
669
728
  for (const w of this.writers) {
670
729
  if (w == null) {
671
730
  throw new Error('io.MultiWriter: nil writer')
672
731
  }
673
- const [n, err] = w.Write(p)
732
+ const [n, err] = await w.Write(p)
674
733
  if (err !== null) {
675
734
  return [n, err]
676
735
  }
@@ -697,15 +756,19 @@ class teeReader implements Reader {
697
756
  }
698
757
 
699
758
  Read(p: $.Bytes): [number, $.GoError] {
759
+ return this.read(p) as any
760
+ }
761
+
762
+ private async read(p: $.Bytes): Promise<[number, $.GoError]> {
700
763
  if (this.r == null) {
701
764
  throw new Error('io.TeeReader: nil reader')
702
765
  }
703
- const [n, err] = this.r.Read(p)
766
+ const [n, err] = await this.r.Read(p)
704
767
  if (n > 0) {
705
768
  if (this.w == null) {
706
769
  throw new Error('io.TeeReader: nil writer')
707
770
  }
708
- const [nw, ew] = this.w.Write($.goSlice(p, 0, n))
771
+ const [nw, ew] = await this.w.Write($.goSlice(p, 0, n))
709
772
  if (ew !== null) {
710
773
  return [n, ew]
711
774
  }
package/gs/io/meta.json CHANGED
@@ -12,6 +12,12 @@
12
12
  "CopyN": true,
13
13
  "ReadAtLeast": true,
14
14
  "ReadFull": true,
15
- "ReadAll": true
15
+ "ReadAll": true,
16
+ "WriteString": true
17
+ },
18
+ "asyncMethods": {
19
+ "PipeReader.Read": true,
20
+ "PipeWriter.Write": true,
21
+ "TeeReader.Read": true
16
22
  }
17
23
  }
@@ -0,0 +1,162 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "strict": true,
4
+ "symbols": {
5
+ "ByteReader": {
6
+ "status": "real"
7
+ },
8
+ "ByteScanner": {
9
+ "status": "real"
10
+ },
11
+ "ByteWriter": {
12
+ "status": "real"
13
+ },
14
+ "Closer": {
15
+ "status": "real"
16
+ },
17
+ "Copy": {
18
+ "status": "real"
19
+ },
20
+ "CopyBuffer": {
21
+ "status": "real"
22
+ },
23
+ "CopyN": {
24
+ "status": "real"
25
+ },
26
+ "Discard": {
27
+ "status": "real"
28
+ },
29
+ "EOF": {
30
+ "status": "real"
31
+ },
32
+ "ErrClosedPipe": {
33
+ "status": "real"
34
+ },
35
+ "ErrNoProgress": {
36
+ "status": "real"
37
+ },
38
+ "ErrShortBuffer": {
39
+ "status": "real"
40
+ },
41
+ "ErrShortWrite": {
42
+ "status": "real"
43
+ },
44
+ "ErrUnexpectedEOF": {
45
+ "status": "real"
46
+ },
47
+ "LimitedReader": {
48
+ "status": "real"
49
+ },
50
+ "LimitReader": {
51
+ "status": "real"
52
+ },
53
+ "MultiReader": {
54
+ "status": "real"
55
+ },
56
+ "MultiWriter": {
57
+ "status": "real"
58
+ },
59
+ "NewOffsetWriter": {
60
+ "status": "real"
61
+ },
62
+ "NewSectionReader": {
63
+ "status": "real"
64
+ },
65
+ "NopCloser": {
66
+ "status": "real"
67
+ },
68
+ "OffsetWriter": {
69
+ "status": "real"
70
+ },
71
+ "Pipe": {
72
+ "status": "real"
73
+ },
74
+ "PipeReader": {
75
+ "status": "real"
76
+ },
77
+ "PipeWriter": {
78
+ "status": "real"
79
+ },
80
+ "ReadAll": {
81
+ "status": "real"
82
+ },
83
+ "ReadAtLeast": {
84
+ "status": "real"
85
+ },
86
+ "ReadCloser": {
87
+ "status": "real"
88
+ },
89
+ "Reader": {
90
+ "status": "real"
91
+ },
92
+ "ReaderAt": {
93
+ "status": "real"
94
+ },
95
+ "ReaderFrom": {
96
+ "status": "real"
97
+ },
98
+ "ReadFull": {
99
+ "status": "real"
100
+ },
101
+ "ReadSeekCloser": {
102
+ "status": "real"
103
+ },
104
+ "ReadSeeker": {
105
+ "status": "real"
106
+ },
107
+ "ReadWriteCloser": {
108
+ "status": "real"
109
+ },
110
+ "ReadWriter": {
111
+ "status": "real"
112
+ },
113
+ "ReadWriteSeeker": {
114
+ "status": "real"
115
+ },
116
+ "RuneReader": {
117
+ "status": "real"
118
+ },
119
+ "RuneScanner": {
120
+ "status": "real"
121
+ },
122
+ "SectionReader": {
123
+ "status": "real"
124
+ },
125
+ "SeekCurrent": {
126
+ "status": "real"
127
+ },
128
+ "SeekEnd": {
129
+ "status": "real"
130
+ },
131
+ "Seeker": {
132
+ "status": "real"
133
+ },
134
+ "SeekStart": {
135
+ "status": "real"
136
+ },
137
+ "StringWriter": {
138
+ "status": "real"
139
+ },
140
+ "TeeReader": {
141
+ "status": "real"
142
+ },
143
+ "WriteCloser": {
144
+ "status": "real"
145
+ },
146
+ "Writer": {
147
+ "status": "real"
148
+ },
149
+ "WriterAt": {
150
+ "status": "real"
151
+ },
152
+ "WriterTo": {
153
+ "status": "real"
154
+ },
155
+ "WriteSeeker": {
156
+ "status": "real"
157
+ },
158
+ "WriteString": {
159
+ "status": "real"
160
+ }
161
+ }
162
+ }
@@ -1,6 +1,6 @@
1
1
  import { describe, expect, it } from 'vitest'
2
2
 
3
- import { Mul64 } from './index.js'
3
+ import { Mul64, Rem, Rem32, Rem64, RotateLeft16, RotateLeft32, RotateLeft64, RotateLeft8 } from './index.js'
4
4
 
5
5
  describe('math/bits override', () => {
6
6
  it('returns the full 128-bit product from Mul64', () => {
@@ -17,4 +17,17 @@ describe('math/bits override', () => {
17
17
  0xffc0000000000001n,
18
18
  ])
19
19
  })
20
+
21
+ it('returns remainders from double-word division helpers', () => {
22
+ expect(Rem32(1, 0, 3)).toBe(1)
23
+ expect(Rem(1n, 0n, 3n)).toBe(1n)
24
+ expect(Rem64(1n, 0n, 3n)).toBe(1n)
25
+ })
26
+
27
+ it('rotates right for negative counts', () => {
28
+ expect(RotateLeft8(1, -1)).toBe(0x80)
29
+ expect(RotateLeft16(1, -1)).toBe(0x8000)
30
+ expect(RotateLeft32(1, -1)).toBe(0x80000000)
31
+ expect(RotateLeft64(1n, -1)).toBe(0x8000000000000000n)
32
+ })
20
33
  })