typenative 0.1.3 → 0.3.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 (505) hide show
  1. package/.gitattributes +1 -0
  2. package/.github/workflows/ci.yml +39 -2
  3. package/.github/workflows/npm-publish-github-packages.yml +7 -2
  4. package/CHANGELOG.md +293 -0
  5. package/CONTRIBUTION.md +8 -6
  6. package/README.md +15 -11
  7. package/bin/cli.js +7 -1
  8. package/bin/go/bridge.js +919 -0
  9. package/bin/go/convert.js +238 -0
  10. package/bin/go/metadata.js +211 -0
  11. package/bin/go/overrides.js +68 -0
  12. package/bin/go/stdlib.generated.js +175 -0
  13. package/bin/index.js +337 -239
  14. package/bin/main.js +9 -2
  15. package/bin/node/assert.js +344 -0
  16. package/bin/node/async_hooks.js +273 -0
  17. package/bin/node/buffer.js +765 -0
  18. package/bin/node/child_process.js +600 -0
  19. package/bin/node/cluster.js +1002 -0
  20. package/bin/node/console.js +121 -0
  21. package/bin/node/core.js +111 -0
  22. package/bin/node/crypto.js +414 -0
  23. package/bin/node/crypto_keys.js +2685 -0
  24. package/bin/node/dgram.js +388 -0
  25. package/bin/node/diagnostics_channel.js +534 -0
  26. package/bin/node/dns.js +635 -0
  27. package/bin/node/events.js +743 -0
  28. package/bin/node/fetch.js +737 -0
  29. package/bin/node/fs.js +998 -0
  30. package/bin/node/http.js +1500 -0
  31. package/bin/node/http2.js +688 -0
  32. package/bin/node/net.js +1143 -0
  33. package/bin/node/os.js +257 -0
  34. package/bin/node/path.js +758 -0
  35. package/bin/node/process.js +316 -0
  36. package/bin/node/punycode.js +195 -0
  37. package/bin/node/querystring.js +143 -0
  38. package/bin/node/readline.js +299 -0
  39. package/bin/node/registry.js +161 -0
  40. package/bin/node/sqlite.js +1142 -0
  41. package/bin/node/stream.js +1221 -0
  42. package/bin/node/stream_web.js +2259 -0
  43. package/bin/node/string_decoder.js +101 -0
  44. package/bin/node/system_extra.js +714 -0
  45. package/bin/node/test.js +1068 -0
  46. package/bin/node/timers.js +263 -0
  47. package/bin/node/tls.js +719 -0
  48. package/bin/node/url.js +861 -0
  49. package/bin/node/util.js +1311 -0
  50. package/bin/node/util_extra.js +599 -0
  51. package/bin/node/worker_threads.js +745 -0
  52. package/bin/node/zlib.js +263 -0
  53. package/bin/parse-native.js +10 -0
  54. package/bin/parse-node.js +10 -0
  55. package/bin/transpiler.js +2824 -588
  56. package/bin/typecheck-node.js +78 -0
  57. package/bin/version.js +2 -0
  58. package/conformance.md +708 -241
  59. package/govendor/github.com/ncruces/go-sqlite3/LICENSE +21 -0
  60. package/govendor/github.com/ncruces/go-sqlite3/README.md +121 -0
  61. package/govendor/github.com/ncruces/go-sqlite3/backup.go +132 -0
  62. package/govendor/github.com/ncruces/go-sqlite3/blob.go +266 -0
  63. package/govendor/github.com/ncruces/go-sqlite3/config.go +397 -0
  64. package/govendor/github.com/ncruces/go-sqlite3/conn.go +540 -0
  65. package/govendor/github.com/ncruces/go-sqlite3/conn_127.go +93 -0
  66. package/govendor/github.com/ncruces/go-sqlite3/const.go +436 -0
  67. package/govendor/github.com/ncruces/go-sqlite3/context.go +222 -0
  68. package/govendor/github.com/ncruces/go-sqlite3/error.go +182 -0
  69. package/govendor/github.com/ncruces/go-sqlite3/ext.go +153 -0
  70. package/govendor/github.com/ncruces/go-sqlite3/func.go +309 -0
  71. package/govendor/github.com/ncruces/go-sqlite3/go.mod +3 -0
  72. package/govendor/github.com/ncruces/go-sqlite3/internal/dotlk/dotlk.go +29 -0
  73. package/govendor/github.com/ncruces/go-sqlite3/internal/dotlk/dotlk_other.go +13 -0
  74. package/govendor/github.com/ncruces/go-sqlite3/internal/dotlk/dotlk_unix.go +57 -0
  75. package/govendor/github.com/ncruces/go-sqlite3/internal/errutil/error.go +41 -0
  76. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/alloc.go +128 -0
  77. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/const.go +122 -0
  78. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/error.go +77 -0
  79. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/mem.go +116 -0
  80. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/mem_other.go +34 -0
  81. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/mem_unix.go +87 -0
  82. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/mem_windows.go +149 -0
  83. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/mmap_unix.go +80 -0
  84. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/mmap_windows.go +129 -0
  85. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/sys_windows.go +60 -0
  86. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/wrap.go +82 -0
  87. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/wrap_sys.go +113 -0
  88. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/wrap_vfs.go +181 -0
  89. package/govendor/github.com/ncruces/go-sqlite3/internal/testenv/env.go +55 -0
  90. package/govendor/github.com/ncruces/go-sqlite3/internal/util/json.go +54 -0
  91. package/govendor/github.com/ncruces/go-sqlite3/internal/util/json_v2.go +54 -0
  92. package/govendor/github.com/ncruces/go-sqlite3/internal/util/math.go +29 -0
  93. package/govendor/github.com/ncruces/go-sqlite3/internal/util/page.go +5 -0
  94. package/govendor/github.com/ncruces/go-sqlite3/internal/util/parse.go +142 -0
  95. package/govendor/github.com/ncruces/go-sqlite3/internal/util/pointer.go +3 -0
  96. package/govendor/github.com/ncruces/go-sqlite3/internal/util/reflect.go +10 -0
  97. package/govendor/github.com/ncruces/go-sqlite3/json.go +100 -0
  98. package/govendor/github.com/ncruces/go-sqlite3/json_v2.go +116 -0
  99. package/govendor/github.com/ncruces/go-sqlite3/pointer.go +13 -0
  100. package/govendor/github.com/ncruces/go-sqlite3/quote.go +140 -0
  101. package/govendor/github.com/ncruces/go-sqlite3/stmt.go +692 -0
  102. package/govendor/github.com/ncruces/go-sqlite3/time.go +360 -0
  103. package/govendor/github.com/ncruces/go-sqlite3/txn.go +374 -0
  104. package/govendor/github.com/ncruces/go-sqlite3/value.go +212 -0
  105. package/govendor/github.com/ncruces/go-sqlite3/vfs/README.md +133 -0
  106. package/govendor/github.com/ncruces/go-sqlite3/vfs/api.go +239 -0
  107. package/govendor/github.com/ncruces/go-sqlite3/vfs/cksm.go +143 -0
  108. package/govendor/github.com/ncruces/go-sqlite3/vfs/const.go +256 -0
  109. package/govendor/github.com/ncruces/go-sqlite3/vfs/file.go +260 -0
  110. package/govendor/github.com/ncruces/go-sqlite3/vfs/filename.go +187 -0
  111. package/govendor/github.com/ncruces/go-sqlite3/vfs/lock.go +128 -0
  112. package/govendor/github.com/ncruces/go-sqlite3/vfs/lock_other.go +23 -0
  113. package/govendor/github.com/ncruces/go-sqlite3/vfs/map.go +63 -0
  114. package/govendor/github.com/ncruces/go-sqlite3/vfs/map_other.go +13 -0
  115. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_bsd.go +110 -0
  116. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_darwin.go +131 -0
  117. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_dotlk.go +140 -0
  118. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_f2fs_linux.go +56 -0
  119. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_linux.go +117 -0
  120. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_ofd.go +59 -0
  121. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_std.go +50 -0
  122. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_std_alloc.go +19 -0
  123. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_std_atomic.go +9 -0
  124. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_std_rw.go +13 -0
  125. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_std_sync.go +9 -0
  126. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_std_temp.go +16 -0
  127. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_unix.go +108 -0
  128. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_windows.go +180 -0
  129. package/govendor/github.com/ncruces/go-sqlite3/vfs/registry.go +48 -0
  130. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm.go +26 -0
  131. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm_bsd.go +258 -0
  132. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm_copy.go +90 -0
  133. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm_dotlk.go +168 -0
  134. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm_memlk.go +52 -0
  135. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm_ofd.go +185 -0
  136. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm_other.go +21 -0
  137. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm_windows.go +124 -0
  138. package/govendor/github.com/ncruces/go-sqlite3/vfs/vfs.go +455 -0
  139. package/govendor/github.com/ncruces/go-sqlite3/vtab.go +677 -0
  140. package/govendor/github.com/ncruces/go-sqlite3/wrap.go +48 -0
  141. package/govendor/github.com/ncruces/go-sqlite3-wasm/v6/LICENSE +18 -0
  142. package/govendor/github.com/ncruces/go-sqlite3-wasm/v6/README.md +11 -0
  143. package/govendor/github.com/ncruces/go-sqlite3-wasm/v6/go.mod +3 -0
  144. package/govendor/github.com/ncruces/go-sqlite3-wasm/v6/libc.go +215 -0
  145. package/govendor/github.com/ncruces/go-sqlite3-wasm/v6/sqlite3.dat +0 -0
  146. package/govendor/github.com/ncruces/go-sqlite3-wasm/v6/sqlite3.go +157903 -0
  147. package/govendor/github.com/ncruces/go-sqlite3-wasm/v6/tools.sh +38 -0
  148. package/govendor/github.com/ncruces/julianday/LICENSE +21 -0
  149. package/govendor/github.com/ncruces/julianday/README.md +9 -0
  150. package/govendor/github.com/ncruces/julianday/go.mod +3 -0
  151. package/govendor/github.com/ncruces/julianday/julianday.go +124 -0
  152. package/govendor/golang.org/x/sys/LICENSE +27 -0
  153. package/govendor/golang.org/x/sys/PATENTS +22 -0
  154. package/govendor/golang.org/x/sys/go.mod +3 -0
  155. package/govendor/golang.org/x/sys/unix/README.md +184 -0
  156. package/govendor/golang.org/x/sys/unix/affinity_linux.go +189 -0
  157. package/govendor/golang.org/x/sys/unix/aliases.go +13 -0
  158. package/govendor/golang.org/x/sys/unix/asm_aix_ppc64.s +17 -0
  159. package/govendor/golang.org/x/sys/unix/asm_bsd_386.s +27 -0
  160. package/govendor/golang.org/x/sys/unix/asm_bsd_amd64.s +27 -0
  161. package/govendor/golang.org/x/sys/unix/asm_bsd_arm.s +27 -0
  162. package/govendor/golang.org/x/sys/unix/asm_bsd_arm64.s +27 -0
  163. package/govendor/golang.org/x/sys/unix/asm_bsd_ppc64.s +29 -0
  164. package/govendor/golang.org/x/sys/unix/asm_bsd_riscv64.s +27 -0
  165. package/govendor/golang.org/x/sys/unix/asm_linux_386.s +65 -0
  166. package/govendor/golang.org/x/sys/unix/asm_linux_amd64.s +57 -0
  167. package/govendor/golang.org/x/sys/unix/asm_linux_arm.s +56 -0
  168. package/govendor/golang.org/x/sys/unix/asm_linux_arm64.s +50 -0
  169. package/govendor/golang.org/x/sys/unix/asm_linux_loong64.s +51 -0
  170. package/govendor/golang.org/x/sys/unix/asm_linux_mips64x.s +54 -0
  171. package/govendor/golang.org/x/sys/unix/asm_linux_mipsx.s +52 -0
  172. package/govendor/golang.org/x/sys/unix/asm_linux_ppc64x.s +42 -0
  173. package/govendor/golang.org/x/sys/unix/asm_linux_riscv64.s +47 -0
  174. package/govendor/golang.org/x/sys/unix/asm_linux_s390x.s +54 -0
  175. package/govendor/golang.org/x/sys/unix/asm_openbsd_mips64.s +29 -0
  176. package/govendor/golang.org/x/sys/unix/asm_solaris_amd64.s +17 -0
  177. package/govendor/golang.org/x/sys/unix/asm_zos_s390x.s +382 -0
  178. package/govendor/golang.org/x/sys/unix/auxv.go +36 -0
  179. package/govendor/golang.org/x/sys/unix/auxv_unsupported.go +13 -0
  180. package/govendor/golang.org/x/sys/unix/bluetooth_linux.go +36 -0
  181. package/govendor/golang.org/x/sys/unix/bpxsvc_zos.go +657 -0
  182. package/govendor/golang.org/x/sys/unix/bpxsvc_zos.s +192 -0
  183. package/govendor/golang.org/x/sys/unix/cap_freebsd.go +195 -0
  184. package/govendor/golang.org/x/sys/unix/constants.go +13 -0
  185. package/govendor/golang.org/x/sys/unix/dev_aix_ppc.go +26 -0
  186. package/govendor/golang.org/x/sys/unix/dev_aix_ppc64.go +28 -0
  187. package/govendor/golang.org/x/sys/unix/dev_darwin.go +24 -0
  188. package/govendor/golang.org/x/sys/unix/dev_dragonfly.go +30 -0
  189. package/govendor/golang.org/x/sys/unix/dev_freebsd.go +30 -0
  190. package/govendor/golang.org/x/sys/unix/dev_linux.go +42 -0
  191. package/govendor/golang.org/x/sys/unix/dev_netbsd.go +29 -0
  192. package/govendor/golang.org/x/sys/unix/dev_openbsd.go +29 -0
  193. package/govendor/golang.org/x/sys/unix/dev_zos.go +28 -0
  194. package/govendor/golang.org/x/sys/unix/dirent.go +102 -0
  195. package/govendor/golang.org/x/sys/unix/endian_big.go +9 -0
  196. package/govendor/golang.org/x/sys/unix/endian_little.go +9 -0
  197. package/govendor/golang.org/x/sys/unix/env_unix.go +31 -0
  198. package/govendor/golang.org/x/sys/unix/fcntl.go +36 -0
  199. package/govendor/golang.org/x/sys/unix/fcntl_darwin.go +24 -0
  200. package/govendor/golang.org/x/sys/unix/fcntl_linux_32bit.go +13 -0
  201. package/govendor/golang.org/x/sys/unix/fdset.go +27 -0
  202. package/govendor/golang.org/x/sys/unix/gccgo.go +59 -0
  203. package/govendor/golang.org/x/sys/unix/gccgo_c.c +44 -0
  204. package/govendor/golang.org/x/sys/unix/gccgo_linux_amd64.go +20 -0
  205. package/govendor/golang.org/x/sys/unix/ifreq_linux.go +145 -0
  206. package/govendor/golang.org/x/sys/unix/ioctl_linux.go +341 -0
  207. package/govendor/golang.org/x/sys/unix/ioctl_signed.go +74 -0
  208. package/govendor/golang.org/x/sys/unix/ioctl_unsigned.go +74 -0
  209. package/govendor/golang.org/x/sys/unix/ioctl_zos.go +71 -0
  210. package/govendor/golang.org/x/sys/unix/mkall.sh +250 -0
  211. package/govendor/golang.org/x/sys/unix/mkerrors.sh +807 -0
  212. package/govendor/golang.org/x/sys/unix/mmap_nomremap.go +13 -0
  213. package/govendor/golang.org/x/sys/unix/mremap.go +57 -0
  214. package/govendor/golang.org/x/sys/unix/pagesize_unix.go +15 -0
  215. package/govendor/golang.org/x/sys/unix/pledge_openbsd.go +111 -0
  216. package/govendor/golang.org/x/sys/unix/ptrace_darwin.go +11 -0
  217. package/govendor/golang.org/x/sys/unix/ptrace_ios.go +11 -0
  218. package/govendor/golang.org/x/sys/unix/race.go +30 -0
  219. package/govendor/golang.org/x/sys/unix/race0.go +25 -0
  220. package/govendor/golang.org/x/sys/unix/readdirent_getdents.go +12 -0
  221. package/govendor/golang.org/x/sys/unix/readdirent_getdirentries.go +19 -0
  222. package/govendor/golang.org/x/sys/unix/readv_unix.go +103 -0
  223. package/govendor/golang.org/x/sys/unix/sockcmsg_dragonfly.go +16 -0
  224. package/govendor/golang.org/x/sys/unix/sockcmsg_linux.go +85 -0
  225. package/govendor/golang.org/x/sys/unix/sockcmsg_unix.go +106 -0
  226. package/govendor/golang.org/x/sys/unix/sockcmsg_unix_other.go +46 -0
  227. package/govendor/golang.org/x/sys/unix/sockcmsg_zos.go +58 -0
  228. package/govendor/golang.org/x/sys/unix/symaddr_zos_s390x.s +75 -0
  229. package/govendor/golang.org/x/sys/unix/syscall.go +86 -0
  230. package/govendor/golang.org/x/sys/unix/syscall_aix.go +582 -0
  231. package/govendor/golang.org/x/sys/unix/syscall_aix_ppc.go +52 -0
  232. package/govendor/golang.org/x/sys/unix/syscall_aix_ppc64.go +83 -0
  233. package/govendor/golang.org/x/sys/unix/syscall_bsd.go +609 -0
  234. package/govendor/golang.org/x/sys/unix/syscall_darwin.go +711 -0
  235. package/govendor/golang.org/x/sys/unix/syscall_darwin_amd64.go +50 -0
  236. package/govendor/golang.org/x/sys/unix/syscall_darwin_arm64.go +50 -0
  237. package/govendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go +26 -0
  238. package/govendor/golang.org/x/sys/unix/syscall_dragonfly.go +359 -0
  239. package/govendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go +56 -0
  240. package/govendor/golang.org/x/sys/unix/syscall_freebsd.go +455 -0
  241. package/govendor/golang.org/x/sys/unix/syscall_freebsd_386.go +64 -0
  242. package/govendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go +64 -0
  243. package/govendor/golang.org/x/sys/unix/syscall_freebsd_arm.go +60 -0
  244. package/govendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go +60 -0
  245. package/govendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go +60 -0
  246. package/govendor/golang.org/x/sys/unix/syscall_hurd.go +30 -0
  247. package/govendor/golang.org/x/sys/unix/syscall_hurd_386.go +28 -0
  248. package/govendor/golang.org/x/sys/unix/syscall_illumos.go +78 -0
  249. package/govendor/golang.org/x/sys/unix/syscall_linux.go +2574 -0
  250. package/govendor/golang.org/x/sys/unix/syscall_linux_386.go +313 -0
  251. package/govendor/golang.org/x/sys/unix/syscall_linux_alarm.go +12 -0
  252. package/govendor/golang.org/x/sys/unix/syscall_linux_amd64.go +144 -0
  253. package/govendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go +12 -0
  254. package/govendor/golang.org/x/sys/unix/syscall_linux_arm.go +218 -0
  255. package/govendor/golang.org/x/sys/unix/syscall_linux_arm64.go +188 -0
  256. package/govendor/golang.org/x/sys/unix/syscall_linux_gc.go +14 -0
  257. package/govendor/golang.org/x/sys/unix/syscall_linux_gc_386.go +16 -0
  258. package/govendor/golang.org/x/sys/unix/syscall_linux_gc_arm.go +13 -0
  259. package/govendor/golang.org/x/sys/unix/syscall_linux_gccgo_386.go +30 -0
  260. package/govendor/golang.org/x/sys/unix/syscall_linux_gccgo_arm.go +20 -0
  261. package/govendor/golang.org/x/sys/unix/syscall_linux_loong64.go +220 -0
  262. package/govendor/golang.org/x/sys/unix/syscall_linux_mips64x.go +187 -0
  263. package/govendor/golang.org/x/sys/unix/syscall_linux_mipsx.go +173 -0
  264. package/govendor/golang.org/x/sys/unix/syscall_linux_ppc.go +203 -0
  265. package/govendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go +114 -0
  266. package/govendor/golang.org/x/sys/unix/syscall_linux_riscv64.go +193 -0
  267. package/govendor/golang.org/x/sys/unix/syscall_linux_s390x.go +295 -0
  268. package/govendor/golang.org/x/sys/unix/syscall_linux_sparc64.go +111 -0
  269. package/govendor/golang.org/x/sys/unix/syscall_netbsd.go +388 -0
  270. package/govendor/golang.org/x/sys/unix/syscall_netbsd_386.go +37 -0
  271. package/govendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go +37 -0
  272. package/govendor/golang.org/x/sys/unix/syscall_netbsd_arm.go +37 -0
  273. package/govendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go +37 -0
  274. package/govendor/golang.org/x/sys/unix/syscall_openbsd.go +346 -0
  275. package/govendor/golang.org/x/sys/unix/syscall_openbsd_386.go +41 -0
  276. package/govendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go +41 -0
  277. package/govendor/golang.org/x/sys/unix/syscall_openbsd_arm.go +41 -0
  278. package/govendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go +41 -0
  279. package/govendor/golang.org/x/sys/unix/syscall_openbsd_libc.go +26 -0
  280. package/govendor/golang.org/x/sys/unix/syscall_openbsd_mips64.go +39 -0
  281. package/govendor/golang.org/x/sys/unix/syscall_openbsd_ppc64.go +41 -0
  282. package/govendor/golang.org/x/sys/unix/syscall_openbsd_riscv64.go +41 -0
  283. package/govendor/golang.org/x/sys/unix/syscall_solaris.go +1183 -0
  284. package/govendor/golang.org/x/sys/unix/syscall_solaris_amd64.go +27 -0
  285. package/govendor/golang.org/x/sys/unix/syscall_unix.go +619 -0
  286. package/govendor/golang.org/x/sys/unix/syscall_unix_gc.go +14 -0
  287. package/govendor/golang.org/x/sys/unix/syscall_unix_gc_ppc64x.go +22 -0
  288. package/govendor/golang.org/x/sys/unix/syscall_zos_s390x.go +3213 -0
  289. package/govendor/golang.org/x/sys/unix/sysvshm_linux.go +20 -0
  290. package/govendor/golang.org/x/sys/unix/sysvshm_unix.go +51 -0
  291. package/govendor/golang.org/x/sys/unix/sysvshm_unix_other.go +13 -0
  292. package/govendor/golang.org/x/sys/unix/timestruct.go +76 -0
  293. package/govendor/golang.org/x/sys/unix/unveil_openbsd.go +51 -0
  294. package/govendor/golang.org/x/sys/unix/vgetrandom_linux.go +13 -0
  295. package/govendor/golang.org/x/sys/unix/vgetrandom_unsupported.go +11 -0
  296. package/govendor/golang.org/x/sys/unix/xattr_bsd.go +280 -0
  297. package/govendor/golang.org/x/sys/unix/zerrors_aix_ppc.go +1384 -0
  298. package/govendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go +1385 -0
  299. package/govendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go +1922 -0
  300. package/govendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go +1922 -0
  301. package/govendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go +1737 -0
  302. package/govendor/golang.org/x/sys/unix/zerrors_freebsd_386.go +2042 -0
  303. package/govendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go +2039 -0
  304. package/govendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go +2033 -0
  305. package/govendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go +2033 -0
  306. package/govendor/golang.org/x/sys/unix/zerrors_freebsd_riscv64.go +2147 -0
  307. package/govendor/golang.org/x/sys/unix/zerrors_linux.go +4209 -0
  308. package/govendor/golang.org/x/sys/unix/zerrors_linux_386.go +882 -0
  309. package/govendor/golang.org/x/sys/unix/zerrors_linux_amd64.go +882 -0
  310. package/govendor/golang.org/x/sys/unix/zerrors_linux_arm.go +887 -0
  311. package/govendor/golang.org/x/sys/unix/zerrors_linux_arm64.go +884 -0
  312. package/govendor/golang.org/x/sys/unix/zerrors_linux_loong64.go +874 -0
  313. package/govendor/golang.org/x/sys/unix/zerrors_linux_mips.go +888 -0
  314. package/govendor/golang.org/x/sys/unix/zerrors_linux_mips64.go +888 -0
  315. package/govendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go +888 -0
  316. package/govendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go +888 -0
  317. package/govendor/golang.org/x/sys/unix/zerrors_linux_ppc.go +940 -0
  318. package/govendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go +944 -0
  319. package/govendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go +944 -0
  320. package/govendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go +884 -0
  321. package/govendor/golang.org/x/sys/unix/zerrors_linux_s390x.go +943 -0
  322. package/govendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go +992 -0
  323. package/govendor/golang.org/x/sys/unix/zerrors_netbsd_386.go +1779 -0
  324. package/govendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go +1769 -0
  325. package/govendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go +1758 -0
  326. package/govendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go +1769 -0
  327. package/govendor/golang.org/x/sys/unix/zerrors_openbsd_386.go +1905 -0
  328. package/govendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go +1905 -0
  329. package/govendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go +1905 -0
  330. package/govendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go +1905 -0
  331. package/govendor/golang.org/x/sys/unix/zerrors_openbsd_mips64.go +1905 -0
  332. package/govendor/golang.org/x/sys/unix/zerrors_openbsd_ppc64.go +1904 -0
  333. package/govendor/golang.org/x/sys/unix/zerrors_openbsd_riscv64.go +1903 -0
  334. package/govendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go +1556 -0
  335. package/govendor/golang.org/x/sys/unix/zerrors_zos_s390x.go +990 -0
  336. package/govendor/golang.org/x/sys/unix/zptrace_armnn_linux.go +40 -0
  337. package/govendor/golang.org/x/sys/unix/zptrace_linux_arm64.go +17 -0
  338. package/govendor/golang.org/x/sys/unix/zptrace_mipsnn_linux.go +49 -0
  339. package/govendor/golang.org/x/sys/unix/zptrace_mipsnnle_linux.go +49 -0
  340. package/govendor/golang.org/x/sys/unix/zptrace_x86_linux.go +79 -0
  341. package/govendor/golang.org/x/sys/unix/zsymaddr_zos_s390x.s +364 -0
  342. package/govendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go +1461 -0
  343. package/govendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go +1420 -0
  344. package/govendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go +1188 -0
  345. package/govendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go +1069 -0
  346. package/govendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go +2728 -0
  347. package/govendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s +799 -0
  348. package/govendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go +2728 -0
  349. package/govendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s +799 -0
  350. package/govendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go +1666 -0
  351. package/govendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go +1886 -0
  352. package/govendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go +1886 -0
  353. package/govendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go +1886 -0
  354. package/govendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go +1886 -0
  355. package/govendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go +1886 -0
  356. package/govendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go +101 -0
  357. package/govendor/golang.org/x/sys/unix/zsyscall_linux.go +2267 -0
  358. package/govendor/golang.org/x/sys/unix/zsyscall_linux_386.go +469 -0
  359. package/govendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go +636 -0
  360. package/govendor/golang.org/x/sys/unix/zsyscall_linux_arm.go +584 -0
  361. package/govendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go +535 -0
  362. package/govendor/golang.org/x/sys/unix/zsyscall_linux_loong64.go +469 -0
  363. package/govendor/golang.org/x/sys/unix/zsyscall_linux_mips.go +636 -0
  364. package/govendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go +630 -0
  365. package/govendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go +619 -0
  366. package/govendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go +636 -0
  367. package/govendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go +641 -0
  368. package/govendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go +687 -0
  369. package/govendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go +687 -0
  370. package/govendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go +531 -0
  371. package/govendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go +478 -0
  372. package/govendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go +631 -0
  373. package/govendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go +1848 -0
  374. package/govendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go +1848 -0
  375. package/govendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go +1848 -0
  376. package/govendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go +1848 -0
  377. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go +2407 -0
  378. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s +719 -0
  379. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go +2407 -0
  380. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s +719 -0
  381. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go +2407 -0
  382. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s +719 -0
  383. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go +2407 -0
  384. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s +719 -0
  385. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go +2407 -0
  386. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s +719 -0
  387. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go +2407 -0
  388. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s +862 -0
  389. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go +2407 -0
  390. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s +719 -0
  391. package/govendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go +2217 -0
  392. package/govendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go +3458 -0
  393. package/govendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go +280 -0
  394. package/govendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go +280 -0
  395. package/govendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go +280 -0
  396. package/govendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go +280 -0
  397. package/govendor/golang.org/x/sys/unix/zsysctl_openbsd_mips64.go +280 -0
  398. package/govendor/golang.org/x/sys/unix/zsysctl_openbsd_ppc64.go +280 -0
  399. package/govendor/golang.org/x/sys/unix/zsysctl_openbsd_riscv64.go +281 -0
  400. package/govendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go +439 -0
  401. package/govendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go +437 -0
  402. package/govendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go +316 -0
  403. package/govendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go +393 -0
  404. package/govendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go +393 -0
  405. package/govendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go +393 -0
  406. package/govendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go +393 -0
  407. package/govendor/golang.org/x/sys/unix/zsysnum_freebsd_riscv64.go +393 -0
  408. package/govendor/golang.org/x/sys/unix/zsysnum_linux_386.go +470 -0
  409. package/govendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go +394 -0
  410. package/govendor/golang.org/x/sys/unix/zsysnum_linux_arm.go +434 -0
  411. package/govendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go +337 -0
  412. package/govendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go +334 -0
  413. package/govendor/golang.org/x/sys/unix/zsysnum_linux_mips.go +454 -0
  414. package/govendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go +384 -0
  415. package/govendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go +384 -0
  416. package/govendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go +454 -0
  417. package/govendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go +461 -0
  418. package/govendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go +433 -0
  419. package/govendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go +433 -0
  420. package/govendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go +338 -0
  421. package/govendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go +399 -0
  422. package/govendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go +413 -0
  423. package/govendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go +274 -0
  424. package/govendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go +274 -0
  425. package/govendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go +274 -0
  426. package/govendor/golang.org/x/sys/unix/zsysnum_netbsd_arm64.go +274 -0
  427. package/govendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go +219 -0
  428. package/govendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go +219 -0
  429. package/govendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go +219 -0
  430. package/govendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go +218 -0
  431. package/govendor/golang.org/x/sys/unix/zsysnum_openbsd_mips64.go +221 -0
  432. package/govendor/golang.org/x/sys/unix/zsysnum_openbsd_ppc64.go +217 -0
  433. package/govendor/golang.org/x/sys/unix/zsysnum_openbsd_riscv64.go +218 -0
  434. package/govendor/golang.org/x/sys/unix/zsysnum_zos_s390x.go +2852 -0
  435. package/govendor/golang.org/x/sys/unix/ztypes_aix_ppc.go +353 -0
  436. package/govendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go +357 -0
  437. package/govendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go +878 -0
  438. package/govendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go +878 -0
  439. package/govendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go +473 -0
  440. package/govendor/golang.org/x/sys/unix/ztypes_freebsd_386.go +651 -0
  441. package/govendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go +656 -0
  442. package/govendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go +642 -0
  443. package/govendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go +636 -0
  444. package/govendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go +638 -0
  445. package/govendor/golang.org/x/sys/unix/ztypes_linux.go +6547 -0
  446. package/govendor/golang.org/x/sys/unix/ztypes_linux_386.go +747 -0
  447. package/govendor/golang.org/x/sys/unix/ztypes_linux_amd64.go +761 -0
  448. package/govendor/golang.org/x/sys/unix/ztypes_linux_arm.go +741 -0
  449. package/govendor/golang.org/x/sys/unix/ztypes_linux_arm64.go +740 -0
  450. package/govendor/golang.org/x/sys/unix/ztypes_linux_loong64.go +741 -0
  451. package/govendor/golang.org/x/sys/unix/ztypes_linux_mips.go +746 -0
  452. package/govendor/golang.org/x/sys/unix/ztypes_linux_mips64.go +743 -0
  453. package/govendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go +743 -0
  454. package/govendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go +746 -0
  455. package/govendor/golang.org/x/sys/unix/ztypes_linux_ppc.go +754 -0
  456. package/govendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go +749 -0
  457. package/govendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go +749 -0
  458. package/govendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go +828 -0
  459. package/govendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +763 -0
  460. package/govendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go +744 -0
  461. package/govendor/golang.org/x/sys/unix/ztypes_netbsd_386.go +585 -0
  462. package/govendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go +593 -0
  463. package/govendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go +590 -0
  464. package/govendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go +593 -0
  465. package/govendor/golang.org/x/sys/unix/ztypes_openbsd_386.go +568 -0
  466. package/govendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go +568 -0
  467. package/govendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go +575 -0
  468. package/govendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go +568 -0
  469. package/govendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go +568 -0
  470. package/govendor/golang.org/x/sys/unix/ztypes_openbsd_ppc64.go +570 -0
  471. package/govendor/golang.org/x/sys/unix/ztypes_openbsd_riscv64.go +570 -0
  472. package/govendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go +516 -0
  473. package/govendor/golang.org/x/sys/unix/ztypes_zos_s390x.go +552 -0
  474. package/govendor/golang.org/x/sys/windows/aliases.go +13 -0
  475. package/govendor/golang.org/x/sys/windows/dll_windows.go +380 -0
  476. package/govendor/golang.org/x/sys/windows/env_windows.go +57 -0
  477. package/govendor/golang.org/x/sys/windows/eventlog.go +20 -0
  478. package/govendor/golang.org/x/sys/windows/exec_windows.go +248 -0
  479. package/govendor/golang.org/x/sys/windows/memory_windows.go +48 -0
  480. package/govendor/golang.org/x/sys/windows/mkerrors.bash +70 -0
  481. package/govendor/golang.org/x/sys/windows/mkknownfolderids.bash +27 -0
  482. package/govendor/golang.org/x/sys/windows/mksyscall.go +9 -0
  483. package/govendor/golang.org/x/sys/windows/race.go +30 -0
  484. package/govendor/golang.org/x/sys/windows/race0.go +25 -0
  485. package/govendor/golang.org/x/sys/windows/security_windows.go +1537 -0
  486. package/govendor/golang.org/x/sys/windows/service.go +257 -0
  487. package/govendor/golang.org/x/sys/windows/setupapi_windows.go +1425 -0
  488. package/govendor/golang.org/x/sys/windows/str.go +22 -0
  489. package/govendor/golang.org/x/sys/windows/syscall.go +104 -0
  490. package/govendor/golang.org/x/sys/windows/syscall_windows.go +1952 -0
  491. package/govendor/golang.org/x/sys/windows/types_windows.go +4058 -0
  492. package/govendor/golang.org/x/sys/windows/types_windows_386.go +35 -0
  493. package/govendor/golang.org/x/sys/windows/types_windows_amd64.go +34 -0
  494. package/govendor/golang.org/x/sys/windows/types_windows_arm.go +35 -0
  495. package/govendor/golang.org/x/sys/windows/types_windows_arm64.go +34 -0
  496. package/govendor/golang.org/x/sys/windows/zerrors_windows.go +9468 -0
  497. package/govendor/golang.org/x/sys/windows/zknownfolderids_windows.go +149 -0
  498. package/govendor/golang.org/x/sys/windows/zsyscall_windows.go +4828 -0
  499. package/govendor/manifest.txt +7 -0
  500. package/package.json +7 -1
  501. package/tsparser/check.go +157 -0
  502. package/tsparser/main.go +30 -1
  503. package/types/typenative-go.d.ts +15159 -5
  504. package/types/typenative-npm.d.ts +2640 -34
  505. package/types/typenative.d.ts +651 -8
@@ -0,0 +1,2259 @@
1
+ // node:stream/web (+ globals): WHATWG ReadableStream / WritableStream /
2
+ // TransformStream with their readers, writers and controllers, queuing
3
+ // strategies, TextEncoderStream / TextDecoderStream, CompressionStream /
4
+ // DecompressionStream; Readable.toWeb / fromWeb & co. bridge Node streams.
5
+ // Also Blob / File (node:buffer) and FormData. Everything runs on the event
6
+ // loop: promise reactions (pull, write and read completions) are microtasks.
7
+ import { defineClass, defineHelper, defineModule } from './registry.js';
8
+ const streamWebHelper = `// node:stream/web
9
+ type TnReadResult struct {
10
+ value interface{}
11
+ done bool
12
+ }
13
+
14
+ // A JS callback (or a Go func) to call
15
+ func tnWebIsFunc(v interface{}) bool {
16
+ if v == nil {
17
+ return false
18
+ }
19
+ rv := reflect.ValueOf(v)
20
+ return rv.Kind() == reflect.Func && !rv.IsNil()
21
+ }
22
+
23
+ func tnWebNumber(v interface{}) (float64, bool) {
24
+ rv := reflect.ValueOf(v)
25
+ switch rv.Kind() {
26
+ case reflect.Float32, reflect.Float64:
27
+ return rv.Float(), true
28
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
29
+ return float64(rv.Int()), true
30
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
31
+ return float64(rv.Uint()), true
32
+ }
33
+ return 0, false
34
+ }
35
+
36
+ func tnWebArg(args []interface{}) interface{} {
37
+ if len(args) > 0 {
38
+ return args[0]
39
+ }
40
+ return nil
41
+ }
42
+
43
+ func tnWebTypeError(code string, message string) *TnError {
44
+ return TnNodeError("TypeError", code, message)
45
+ }
46
+
47
+ // Calls fn, catching a throw
48
+ func tnWebCall(fn func() interface{}) (result interface{}, thrown interface{}, failed bool) {
49
+ defer func() {
50
+ if r := recover(); r != nil {
51
+ thrown = r
52
+ failed = true
53
+ }
54
+ }()
55
+ return fn(), nil, false
56
+ }
57
+
58
+ // Runs then(value, reason, failed) on the loop once v settles: right after the
59
+ // current code (a microtask) when v is not a promise
60
+ func tnWebWhen(v interface{}, then func(value interface{}, reason interface{}, failed bool)) {
61
+ rv := reflect.ValueOf(v)
62
+ if !rv.IsValid() || rv.Kind() != reflect.Chan || rv.IsNil() {
63
+ TnQueueMicrotask(func() { then(v, nil, false) })
64
+ return
65
+ }
66
+ ctx := TnAsyncSnapshot()
67
+ TnLoopRef()
68
+ go func() {
69
+ x, ok := rv.Recv()
70
+ var value, reason interface{}
71
+ failed := false
72
+ if ok {
73
+ if x.IsValid() {
74
+ value = x.Interface()
75
+ }
76
+ } else {
77
+ reason, failed = tnRejections.Load(v)
78
+ }
79
+ TnLoopPost(func() {
80
+ defer TnLoopUnref()
81
+ TnAsyncRun(ctx, func() { then(value, reason, failed) })
82
+ })
83
+ }()
84
+ }
85
+
86
+ func tnWebResolved() chan struct{} {
87
+ ch := make(chan struct{})
88
+ close(ch)
89
+ return ch
90
+ }
91
+
92
+ func tnWebRejected(reason interface{}) chan struct{} {
93
+ ch := make(chan struct{})
94
+ TnReject(ch, reason)
95
+ return ch
96
+ }
97
+
98
+ // A void promise settled by the outcome of v
99
+ func tnWebPromise(v interface{}) chan struct{} {
100
+ ch := make(chan struct{})
101
+ tnWebWhen(v, func(_ interface{}, reason interface{}, failed bool) {
102
+ if failed {
103
+ TnReject(ch, reason)
104
+ return
105
+ }
106
+ close(ch)
107
+ })
108
+ return ch
109
+ }
110
+
111
+ // --- queuing strategies ---
112
+
113
+ type TnQueuingStrategy struct {
114
+ highWaterMark float64
115
+ bytes bool
116
+ }
117
+
118
+ func TnNewQueuingStrategy(bytes bool, init interface{}) *TnQueuingStrategy {
119
+ q := &TnQueuingStrategy{bytes: bytes}
120
+ if n, ok := tnWebNumber(TnGet(init, "highWaterMark")); ok {
121
+ q.highWaterMark = n
122
+ } else {
123
+ panic(tnWebTypeError("ERR_INVALID_ARG_TYPE", "The \\"init.highWaterMark\\" property must be of type number"))
124
+ }
125
+ return q
126
+ }
127
+
128
+ func (q *TnQueuingStrategy) size(chunk ...interface{}) float64 {
129
+ if q.bytes {
130
+ return tnWebByteLength(tnWebArg(chunk))
131
+ }
132
+ return 1
133
+ }
134
+
135
+ func tnWebByteLength(chunk interface{}) float64 {
136
+ switch c := chunk.(type) {
137
+ case []byte:
138
+ return float64(len(c))
139
+ case string:
140
+ return float64(len(c))
141
+ case *TnBlob:
142
+ return float64(len(c.data))
143
+ }
144
+ if n, ok := tnWebNumber(TnGet(chunk, "byteLength")); ok {
145
+ return n
146
+ }
147
+ return 0
148
+ }
149
+
150
+ type tnWebStrategy struct {
151
+ hwm float64
152
+ size interface{}
153
+ bytes bool
154
+ }
155
+
156
+ func tnWebStrategyOf(strategy []interface{}, defaultHWM float64) tnWebStrategy {
157
+ st := tnWebStrategy{hwm: defaultHWM}
158
+ if len(strategy) == 0 || strategy[0] == nil || TnIsNil(strategy[0]) {
159
+ return st
160
+ }
161
+ if q, ok := strategy[0].(*TnQueuingStrategy); ok {
162
+ st.hwm = q.highWaterMark
163
+ st.bytes = q.bytes
164
+ return st
165
+ }
166
+ if n, ok := tnWebNumber(TnGet(strategy[0], "highWaterMark")); ok {
167
+ st.hwm = n
168
+ }
169
+ if fn := TnGet(strategy[0], "size"); tnWebIsFunc(fn) {
170
+ st.size = fn
171
+ }
172
+ return st
173
+ }
174
+
175
+ func (st tnWebStrategy) sizeOf(chunk interface{}) float64 {
176
+ if st.bytes {
177
+ return tnWebByteLength(chunk)
178
+ }
179
+ if st.size != nil {
180
+ n, _ := tnWebNumber(TnInvoke(st.size, chunk))
181
+ return n
182
+ }
183
+ return 1
184
+ }
185
+
186
+ // --- ReadableStream ---
187
+
188
+ type tnWebChunk struct {
189
+ value interface{}
190
+ size float64
191
+ }
192
+
193
+ // A pending read: a promise, or (internal consumers) a callback run as a microtask
194
+ type tnWebRead struct {
195
+ ch chan *TnReadResult
196
+ cb func(res *TnReadResult, reason interface{}, failed bool)
197
+ }
198
+
199
+ func (r tnWebRead) settle(res *TnReadResult, reason interface{}, failed bool) {
200
+ if r.cb != nil {
201
+ cb := r.cb
202
+ TnQueueMicrotask(func() { cb(res, reason, failed) })
203
+ return
204
+ }
205
+ if failed {
206
+ TnReject(r.ch, reason)
207
+ return
208
+ }
209
+ r.ch <- res
210
+ }
211
+
212
+ type TnReadableStream struct {
213
+ state string
214
+ storedError interface{}
215
+ queue []tnWebChunk
216
+ queueTotal float64
217
+ strategy tnWebStrategy
218
+ closeRequested bool
219
+ started bool
220
+ pulling bool
221
+ pullAgain bool
222
+ disturbed bool
223
+ reader *TnReadableStreamDefaultReader
224
+ controller *TnReadableStreamDefaultController
225
+ pullFn func() interface{}
226
+ cancelFn func(reason interface{}) interface{}
227
+ }
228
+
229
+ type TnReadableStreamDefaultController struct {
230
+ stream *TnReadableStream
231
+ }
232
+
233
+ type TnReadableStreamDefaultReader struct {
234
+ stream *TnReadableStream
235
+ reads []tnWebRead
236
+ closed chan struct{}
237
+ closedSettled bool
238
+ }
239
+
240
+ func tnNewWebReadable(st tnWebStrategy) *TnReadableStream {
241
+ s := &TnReadableStream{state: "readable", strategy: st}
242
+ s.controller = &TnReadableStreamDefaultController{stream: s}
243
+ return s
244
+ }
245
+
246
+ // new ReadableStream(underlyingSource?, strategy?)
247
+ func TnNewReadableStream(args ...interface{}) *TnReadableStream {
248
+ source := tnWebArg(args)
249
+ var rest []interface{}
250
+ if len(args) > 1 {
251
+ rest = args[1:]
252
+ }
253
+ s := tnNewWebReadable(tnWebStrategyOf(rest, 1))
254
+ if source == nil || TnIsNil(source) {
255
+ s.startWith(nil)
256
+ return s
257
+ }
258
+ if t, _ := TnGet(source, "type").(string); t == "bytes" {
259
+ s.strategy.bytes = true
260
+ if len(rest) == 0 {
261
+ s.strategy.hwm = 0
262
+ }
263
+ }
264
+ if pull := TnGet(source, "pull"); tnWebIsFunc(pull) {
265
+ s.pullFn = func() interface{} { return TnInvoke(pull, s.controller) }
266
+ }
267
+ if cancel := TnGet(source, "cancel"); tnWebIsFunc(cancel) {
268
+ s.cancelFn = func(reason interface{}) interface{} { return TnInvoke(cancel, reason) }
269
+ }
270
+ if start := TnGet(source, "start"); tnWebIsFunc(start) {
271
+ s.startWith(func() interface{} { return TnInvoke(start, s.controller) })
272
+ return s
273
+ }
274
+ s.startWith(nil)
275
+ return s
276
+ }
277
+
278
+ // start runs synchronously (a throw escapes the constructor); pulling begins
279
+ // once its result settles
280
+ func (s *TnReadableStream) startWith(start func() interface{}) {
281
+ var result interface{}
282
+ if start != nil {
283
+ result = start()
284
+ }
285
+ tnWebWhen(result, func(_ interface{}, reason interface{}, failed bool) {
286
+ if failed {
287
+ s.fail(reason)
288
+ return
289
+ }
290
+ s.started = true
291
+ s.pullIfNeeded()
292
+ })
293
+ }
294
+
295
+ func (s *TnReadableStream) desiredSize() float64 { return s.strategy.hwm - s.queueTotal }
296
+
297
+ func (s *TnReadableStream) hasPendingReads() bool {
298
+ return s.reader != nil && len(s.reader.reads) > 0
299
+ }
300
+
301
+ // No reader is waiting and the queue is full
302
+ func (s *TnReadableStream) backpressured() bool {
303
+ return s.desiredSize() <= 0 && !s.hasPendingReads()
304
+ }
305
+
306
+ func (s *TnReadableStream) open() bool { return s.state == "readable" && !s.closeRequested }
307
+
308
+ func (s *TnReadableStream) pullIfNeeded() {
309
+ if s.pullFn == nil || !s.started || !s.open() {
310
+ return
311
+ }
312
+ if !s.hasPendingReads() && s.desiredSize() <= 0 {
313
+ return
314
+ }
315
+ if s.pulling {
316
+ s.pullAgain = true
317
+ return
318
+ }
319
+ s.pulling = true
320
+ result, thrown, failed := tnWebCall(s.pullFn)
321
+ if failed {
322
+ s.pulling = false
323
+ s.fail(thrown)
324
+ return
325
+ }
326
+ tnWebWhen(result, func(_ interface{}, reason interface{}, failed bool) {
327
+ s.pulling = false
328
+ if failed {
329
+ s.fail(reason)
330
+ return
331
+ }
332
+ if s.pullAgain {
333
+ s.pullAgain = false
334
+ s.pullIfNeeded()
335
+ }
336
+ })
337
+ }
338
+
339
+ func (s *TnReadableStream) enqueue(v interface{}) {
340
+ if s.hasPendingReads() {
341
+ rd := s.reader.reads[0]
342
+ s.reader.reads = s.reader.reads[1:]
343
+ rd.settle(&TnReadResult{value: v}, nil, false)
344
+ } else {
345
+ size := s.strategy.sizeOf(v)
346
+ s.queue = append(s.queue, tnWebChunk{value: v, size: size})
347
+ s.queueTotal += size
348
+ }
349
+ s.pullIfNeeded()
350
+ }
351
+
352
+ func (s *TnReadableStream) finishClose() {
353
+ s.state = "closed"
354
+ if r := s.reader; r != nil {
355
+ reads := r.reads
356
+ r.reads = nil
357
+ for _, rd := range reads {
358
+ rd.settle(&TnReadResult{done: true}, nil, false)
359
+ }
360
+ r.settleClosed(nil, false)
361
+ }
362
+ }
363
+
364
+ func (s *TnReadableStream) fail(reason interface{}) {
365
+ if s.state != "readable" {
366
+ return
367
+ }
368
+ s.state = "errored"
369
+ s.storedError = reason
370
+ s.queue = nil
371
+ s.queueTotal = 0
372
+ if r := s.reader; r != nil {
373
+ reads := r.reads
374
+ r.reads = nil
375
+ for _, rd := range reads {
376
+ rd.settle(nil, reason, true)
377
+ }
378
+ r.settleClosed(reason, true)
379
+ }
380
+ }
381
+
382
+ func (c *TnReadableStreamDefaultController) enqueue(chunk ...interface{}) {
383
+ if !c.stream.open() {
384
+ panic(tnWebTypeError("ERR_INVALID_STATE", "Invalid state: Controller is already closed"))
385
+ }
386
+ c.stream.enqueue(tnWebArg(chunk))
387
+ }
388
+
389
+ func (c *TnReadableStreamDefaultController) close() {
390
+ s := c.stream
391
+ if !s.open() {
392
+ panic(tnWebTypeError("ERR_INVALID_STATE", "Invalid state: Controller is already closed"))
393
+ }
394
+ s.closeRequested = true
395
+ if len(s.queue) == 0 {
396
+ s.finishClose()
397
+ }
398
+ }
399
+
400
+ func (c *TnReadableStreamDefaultController) error(reason ...interface{}) {
401
+ c.stream.fail(tnWebArg(reason))
402
+ }
403
+
404
+ func (c *TnReadableStreamDefaultController) Get_desiredSize() float64 {
405
+ switch c.stream.state {
406
+ case "errored", "closed":
407
+ return 0
408
+ }
409
+ return c.stream.desiredSize()
410
+ }
411
+
412
+ func (s *TnReadableStream) Get_locked() bool { return s.reader != nil }
413
+
414
+ func (s *TnReadableStream) getReader(options ...interface{}) *TnReadableStreamDefaultReader {
415
+ if s.reader != nil {
416
+ panic(tnWebTypeError("ERR_INVALID_STATE", "Invalid state: ReadableStream is locked"))
417
+ }
418
+ r := &TnReadableStreamDefaultReader{stream: s, closed: make(chan struct{})}
419
+ s.reader = r
420
+ switch s.state {
421
+ case "closed":
422
+ r.settleClosed(nil, false)
423
+ case "errored":
424
+ r.settleClosed(s.storedError, true)
425
+ }
426
+ return r
427
+ }
428
+
429
+ func (r *TnReadableStreamDefaultReader) settleClosed(reason interface{}, failed bool) {
430
+ if r.closedSettled {
431
+ if failed {
432
+ r.closed = tnWebRejected(reason)
433
+ }
434
+ return
435
+ }
436
+ r.closedSettled = true
437
+ if failed {
438
+ TnReject(r.closed, reason)
439
+ return
440
+ }
441
+ close(r.closed)
442
+ }
443
+
444
+ func (r *TnReadableStreamDefaultReader) Get_closed() chan struct{} { return r.closed }
445
+
446
+ // read(): { value, done } — the next chunk, or done once the stream closed
447
+ func (r *TnReadableStreamDefaultReader) read(view ...interface{}) chan *TnReadResult {
448
+ ch := make(chan *TnReadResult, 1)
449
+ r.readInto(tnWebRead{ch: ch})
450
+ return ch
451
+ }
452
+
453
+ func (r *TnReadableStreamDefaultReader) readInto(rd tnWebRead) {
454
+ s := r.stream
455
+ if s == nil {
456
+ rd.settle(nil, tnWebTypeError("ERR_INVALID_STATE", "Invalid state: The reader is not attached to a stream"), true)
457
+ return
458
+ }
459
+ s.disturbed = true
460
+ switch s.state {
461
+ case "closed":
462
+ rd.settle(&TnReadResult{done: true}, nil, false)
463
+ return
464
+ case "errored":
465
+ rd.settle(nil, s.storedError, true)
466
+ return
467
+ }
468
+ if len(s.queue) > 0 {
469
+ c := s.queue[0]
470
+ s.queue = s.queue[1:]
471
+ s.queueTotal -= c.size
472
+ if s.queueTotal < 0 || len(s.queue) == 0 {
473
+ s.queueTotal = 0
474
+ }
475
+ rd.settle(&TnReadResult{value: c.value}, nil, false)
476
+ if s.closeRequested && len(s.queue) == 0 {
477
+ s.finishClose()
478
+ } else {
479
+ s.pullIfNeeded()
480
+ }
481
+ return
482
+ }
483
+ r.reads = append(r.reads, rd)
484
+ s.pullIfNeeded()
485
+ }
486
+
487
+ func (r *TnReadableStreamDefaultReader) releaseLock() {
488
+ s := r.stream
489
+ if s == nil {
490
+ return
491
+ }
492
+ err := tnWebTypeError("ERR_INVALID_STATE", "Invalid state: Releasing reader")
493
+ reads := r.reads
494
+ r.reads = nil
495
+ for _, rd := range reads {
496
+ rd.settle(nil, err, true)
497
+ }
498
+ r.settleClosed(err, true)
499
+ s.reader = nil
500
+ r.stream = nil
501
+ }
502
+
503
+ func (r *TnReadableStreamDefaultReader) cancel(reason ...interface{}) chan struct{} {
504
+ if r.stream == nil {
505
+ return tnWebRejected(tnWebTypeError("ERR_INVALID_STATE", "Invalid state: The reader is not attached to a stream"))
506
+ }
507
+ return r.stream.cancelWith(tnWebArg(reason))
508
+ }
509
+
510
+ func (s *TnReadableStream) cancel(reason ...interface{}) chan struct{} {
511
+ if s.reader != nil {
512
+ return tnWebRejected(tnWebTypeError("ERR_INVALID_STATE", "Invalid state: ReadableStream is locked"))
513
+ }
514
+ return s.cancelWith(tnWebArg(reason))
515
+ }
516
+
517
+ func (s *TnReadableStream) cancelWith(reason interface{}) chan struct{} {
518
+ s.disturbed = true
519
+ switch s.state {
520
+ case "closed":
521
+ return tnWebResolved()
522
+ case "errored":
523
+ return tnWebRejected(s.storedError)
524
+ }
525
+ s.queue = nil
526
+ s.queueTotal = 0
527
+ s.finishClose()
528
+ if s.cancelFn == nil {
529
+ return tnWebResolved()
530
+ }
531
+ result, thrown, failed := tnWebCall(func() interface{} { return s.cancelFn(reason) })
532
+ if failed {
533
+ return tnWebRejected(thrown)
534
+ }
535
+ return tnWebPromise(result)
536
+ }
537
+
538
+ // tee(): two branches that each see every chunk
539
+ func (s *TnReadableStream) tee() []*TnReadableStream {
540
+ reader := s.getReader()
541
+ branches := []*TnReadableStream{tnNewWebReadable(tnWebStrategy{hwm: 1}), tnNewWebReadable(tnWebStrategy{hwm: 1})}
542
+ canceled := []bool{false, false}
543
+ reasons := []interface{}{nil, nil}
544
+ reading := false
545
+ for i := range branches {
546
+ idx := i
547
+ b := branches[i]
548
+ b.pullFn = func() interface{} {
549
+ if reading {
550
+ return nil
551
+ }
552
+ reading = true
553
+ reader.readInto(tnWebRead{cb: func(res *TnReadResult, reason interface{}, failed bool) {
554
+ reading = false
555
+ for j, br := range branches {
556
+ if canceled[j] || !br.open() {
557
+ continue
558
+ }
559
+ switch {
560
+ case failed:
561
+ br.fail(reason)
562
+ case res.done:
563
+ br.controller.close()
564
+ default:
565
+ br.enqueue(res.value)
566
+ }
567
+ }
568
+ }})
569
+ return nil
570
+ }
571
+ b.cancelFn = func(reason interface{}) interface{} {
572
+ canceled[idx] = true
573
+ reasons[idx] = reason
574
+ if canceled[0] && canceled[1] {
575
+ return reader.cancel([]interface{}{reasons[0], reasons[1]})
576
+ }
577
+ return nil
578
+ }
579
+ }
580
+ for _, b := range branches {
581
+ b.startWith(nil)
582
+ }
583
+ return branches
584
+ }
585
+
586
+ // for await (const chunk of stream) / stream.values(): one read ahead
587
+ func (s *TnReadableStream) tnIterator() chan interface{} { return s.values() }
588
+
589
+ func (s *TnReadableStream) values(options ...interface{}) chan interface{} {
590
+ reader := s.getReader()
591
+ out := make(chan interface{})
592
+ go func() {
593
+ for {
594
+ res := make(chan *TnReadResult, 1)
595
+ TnLoopPost(func() { reader.readInto(tnWebRead{ch: res}) })
596
+ v, ok := <-res
597
+ if !ok {
598
+ reason, _ := tnRejections.Load(res)
599
+ TnReject(out, reason)
600
+ return
601
+ }
602
+ if v.done {
603
+ TnLoopPost(func() { reader.releaseLock() })
604
+ close(out)
605
+ return
606
+ }
607
+ out <- v.value
608
+ }
609
+ }()
610
+ return out
611
+ }
612
+
613
+ // Reads every chunk (on the loop); done gets them all, or the error
614
+ func tnWebReadAll(s *TnReadableStream, done func(chunks []interface{}, reason interface{}, failed bool)) {
615
+ if s.reader != nil {
616
+ done(nil, tnWebTypeError("ERR_INVALID_STATE", "Invalid state: ReadableStream is locked"), true)
617
+ return
618
+ }
619
+ reader := s.getReader()
620
+ chunks := []interface{}{}
621
+ var next func()
622
+ next = func() {
623
+ reader.readInto(tnWebRead{cb: func(res *TnReadResult, reason interface{}, failed bool) {
624
+ if failed {
625
+ done(nil, reason, true)
626
+ return
627
+ }
628
+ if res.done {
629
+ reader.releaseLock()
630
+ done(chunks, nil, false)
631
+ return
632
+ }
633
+ chunks = append(chunks, res.value)
634
+ next()
635
+ }})
636
+ }
637
+ next()
638
+ }
639
+
640
+ func tnWebChunkBytes(chunk interface{}) []byte {
641
+ switch c := chunk.(type) {
642
+ case []byte:
643
+ return c
644
+ case string:
645
+ return []byte(c)
646
+ case *TnBlob:
647
+ return c.data
648
+ }
649
+ panic(tnWebTypeError("ERR_INVALID_ARG_TYPE", "The \\"chunk\\" argument must be of type string or an instance of Buffer or Uint8Array"))
650
+ }
651
+
652
+ // ReadableStream.from(iterable): arrays, strings, async iterables, Node streams
653
+ func TnReadableStreamFrom(iterable interface{}) *TnReadableStream {
654
+ if n, ok := iterable.(tnStreamLike); ok {
655
+ return TnReadableToWeb(n, map[string]interface{}{"objectMode": true})
656
+ }
657
+ if ws, ok := iterable.(*TnReadableStream); ok {
658
+ return ws
659
+ }
660
+ s := tnNewWebReadable(tnWebStrategy{hwm: 0})
661
+ if str, ok := iterable.(string); ok {
662
+ for _, r := range str {
663
+ s.enqueue(string(r))
664
+ }
665
+ s.closeRequested = true
666
+ s.startWith(nil)
667
+ if len(s.queue) == 0 {
668
+ s.finishClose()
669
+ }
670
+ return s
671
+ }
672
+ rv := reflect.ValueOf(iterable)
673
+ if rv.Kind() == reflect.Pointer && !rv.IsNil() && rv.Elem().Kind() == reflect.Slice {
674
+ rv = rv.Elem()
675
+ }
676
+ switch rv.Kind() {
677
+ case reflect.Slice, reflect.Array:
678
+ items := []interface{}{}
679
+ for i := 0; i < rv.Len(); i++ {
680
+ items = append(items, rv.Index(i).Interface())
681
+ }
682
+ index := 0
683
+ s.pullFn = func() interface{} {
684
+ if index >= len(items) {
685
+ s.controller.close()
686
+ return nil
687
+ }
688
+ s.enqueue(items[index])
689
+ index++
690
+ return nil
691
+ }
692
+ case reflect.Chan:
693
+ s.pullFn = func() interface{} {
694
+ ch := make(chan struct{})
695
+ TnLoopRef()
696
+ go func() {
697
+ v, ok := rv.Recv()
698
+ var reason interface{}
699
+ failed := false
700
+ if !ok {
701
+ reason, failed = tnRejections.Load(iterable)
702
+ }
703
+ TnLoopPost(func() {
704
+ defer TnLoopUnref()
705
+ switch {
706
+ case failed:
707
+ s.fail(reason)
708
+ case !ok:
709
+ if s.open() {
710
+ s.controller.close()
711
+ }
712
+ default:
713
+ if s.open() {
714
+ s.enqueue(v.Interface())
715
+ }
716
+ }
717
+ close(ch)
718
+ })
719
+ }()
720
+ return ch
721
+ }
722
+ default:
723
+ panic(tnWebTypeError("ERR_ARG_NOT_ITERABLE", "The \\"iterable\\" argument must be an iterable"))
724
+ }
725
+ s.startWith(nil)
726
+ return s
727
+ }
728
+
729
+ // A byte stream reading r on a goroutine, one chunk per pull
730
+ func tnWebFromReader(r io.ReadCloser) *TnReadableStream {
731
+ s := tnNewWebReadable(tnWebStrategy{hwm: 0, bytes: true})
732
+ s.pullFn = func() interface{} {
733
+ ch := make(chan struct{})
734
+ TnLoopRef()
735
+ go func() {
736
+ buf := make([]byte, 65536)
737
+ n, err := r.Read(buf)
738
+ TnLoopPost(func() {
739
+ defer TnLoopUnref()
740
+ if n > 0 && s.open() {
741
+ s.enqueue(buf[:n])
742
+ }
743
+ if err != nil && s.open() {
744
+ r.Close()
745
+ if err == io.EOF {
746
+ s.controller.close()
747
+ } else {
748
+ e := TnNodeError("TypeError", "", "terminated")
749
+ e.props["cause"] = TnNodeError("Error", "UND_ERR_SOCKET", err.Error())
750
+ s.fail(e)
751
+ }
752
+ }
753
+ close(ch)
754
+ })
755
+ }()
756
+ return ch
757
+ }
758
+ s.cancelFn = func(reason interface{}) interface{} {
759
+ r.Close()
760
+ return nil
761
+ }
762
+ s.startWith(nil)
763
+ return s
764
+ }
765
+
766
+ // A byte stream of data, in 64 KiB chunks
767
+ func tnWebFromBytes(data []byte) *TnReadableStream {
768
+ s := tnNewWebReadable(tnWebStrategy{hwm: 0, bytes: true})
769
+ offset := 0
770
+ s.pullFn = func() interface{} {
771
+ if offset >= len(data) {
772
+ s.controller.close()
773
+ return nil
774
+ }
775
+ end := offset + 65536
776
+ if end > len(data) {
777
+ end = len(data)
778
+ }
779
+ s.enqueue(append([]byte{}, data[offset:end]...))
780
+ offset = end
781
+ return nil
782
+ }
783
+ s.startWith(nil)
784
+ return s
785
+ }
786
+
787
+ // An io.Reader over a byte stream: reads hop onto the loop (for Go consumers on other goroutines)
788
+ type tnWebStreamReader struct {
789
+ reader *TnReadableStreamDefaultReader
790
+ buf []byte
791
+ done bool
792
+ }
793
+
794
+ func tnWebIOReader(s *TnReadableStream) *tnWebStreamReader {
795
+ return &tnWebStreamReader{reader: s.getReader()}
796
+ }
797
+
798
+ func (r *tnWebStreamReader) Read(p []byte) (int, error) {
799
+ for len(r.buf) == 0 {
800
+ if r.done {
801
+ return 0, io.EOF
802
+ }
803
+ res := make(chan *TnReadResult, 1)
804
+ TnLoopPost(func() { r.reader.readInto(tnWebRead{ch: res}) })
805
+ v, ok := <-res
806
+ if !ok {
807
+ reason, _ := tnRejections.Load(res)
808
+ return 0, fmt.Errorf("%v", TnJSString(reason))
809
+ }
810
+ if v.done {
811
+ r.done = true
812
+ continue
813
+ }
814
+ r.buf = tnWebChunkBytes(v.value)
815
+ }
816
+ n := copy(p, r.buf)
817
+ r.buf = r.buf[n:]
818
+ return n, nil
819
+ }
820
+
821
+ // pipeTo(destination, { preventClose, preventAbort, preventCancel, signal })
822
+ func (s *TnReadableStream) pipeTo(dest *TnWritableStream, options ...interface{}) chan struct{} {
823
+ ch := make(chan struct{})
824
+ opts := tnWebArg(options)
825
+ flag := func(name string) bool {
826
+ b, _ := TnGet(opts, name).(bool)
827
+ return b
828
+ }
829
+ preventClose, preventAbort, preventCancel := flag("preventClose"), flag("preventAbort"), flag("preventCancel")
830
+ if s.reader != nil || dest.writer != nil {
831
+ TnReject(ch, tnWebTypeError("ERR_INVALID_STATE", "Invalid state: The stream is locked"))
832
+ return ch
833
+ }
834
+ reader := s.getReader()
835
+ writer := dest.getWriter()
836
+ done := false
837
+ finish := func(reason interface{}, failed bool) {
838
+ if done {
839
+ return
840
+ }
841
+ done = true
842
+ reader.releaseLock()
843
+ writer.releaseLock()
844
+ if failed {
845
+ TnReject(ch, reason)
846
+ return
847
+ }
848
+ close(ch)
849
+ }
850
+ if signal, ok := TnGet(opts, "signal").(*TnAbortSignal); ok && signal != nil {
851
+ onAbort := func() {
852
+ reason := tnWebAbortReason(signal)
853
+ if !preventAbort {
854
+ dest.abortWith(reason)
855
+ }
856
+ if !preventCancel {
857
+ s.cancelWith(reason)
858
+ }
859
+ finish(reason, true)
860
+ }
861
+ if signal.aborted {
862
+ onAbort()
863
+ return ch
864
+ }
865
+ signal.addEventListener("abort", func(ev *TnEvent) { onAbort() })
866
+ }
867
+ var step func()
868
+ step = func() {
869
+ if done {
870
+ return
871
+ }
872
+ tnWebWhen(writer.ready, func(_ interface{}, reason interface{}, failed bool) {
873
+ if done {
874
+ return
875
+ }
876
+ if failed || dest.state == "errored" {
877
+ if dest.state == "errored" {
878
+ reason = dest.storedError
879
+ }
880
+ if !preventCancel {
881
+ s.cancelWith(reason)
882
+ }
883
+ finish(reason, true)
884
+ return
885
+ }
886
+ reader.readInto(tnWebRead{cb: func(res *TnReadResult, reason interface{}, failed bool) {
887
+ if done {
888
+ return
889
+ }
890
+ if failed {
891
+ if !preventAbort {
892
+ dest.abortWith(reason)
893
+ }
894
+ finish(reason, true)
895
+ return
896
+ }
897
+ if res.done {
898
+ if preventClose {
899
+ finish(nil, false)
900
+ return
901
+ }
902
+ tnWebWhen(writer.close(), func(_ interface{}, reason interface{}, failed bool) { finish(reason, failed) })
903
+ return
904
+ }
905
+ tnWebWhen(writer.write(res.value), func(_ interface{}, reason interface{}, failed bool) {
906
+ if failed && !done {
907
+ if !preventCancel {
908
+ s.cancelWith(reason)
909
+ }
910
+ finish(reason, true)
911
+ }
912
+ })
913
+ step()
914
+ }})
915
+ })
916
+ }
917
+ step()
918
+ return ch
919
+ }
920
+
921
+ func tnWebAbortReason(signal *TnAbortSignal) interface{} {
922
+ if signal.reason != nil {
923
+ return signal.reason
924
+ }
925
+ return tnAbortError("This operation was aborted", "AbortError")
926
+ }
927
+
928
+ // pipeThrough({ writable, readable }, options): the readable side
929
+ func (s *TnReadableStream) pipeThrough(transform interface{}, options ...interface{}) *TnReadableStream {
930
+ var writable *TnWritableStream
931
+ var readable *TnReadableStream
932
+ if t, ok := transform.(*TnTransformStream); ok {
933
+ writable, readable = t.writable, t.readable
934
+ } else {
935
+ writable, _ = TnGet(transform, "writable").(*TnWritableStream)
936
+ readable, _ = TnGet(transform, "readable").(*TnReadableStream)
937
+ }
938
+ if writable == nil || readable == nil {
939
+ panic(tnWebTypeError("ERR_INVALID_ARG_TYPE", "The \\"transform\\" argument must have readable and writable streams"))
940
+ }
941
+ p := s.pipeTo(writable, options...)
942
+ tnWebWhen(p, func(interface{}, interface{}, bool) {})
943
+ return readable
944
+ }
945
+
946
+ // --- WritableStream ---
947
+
948
+ type tnWebWrite struct {
949
+ chunk interface{}
950
+ size float64
951
+ ch chan struct{}
952
+ }
953
+
954
+ type TnWritableStream struct {
955
+ state string
956
+ storedError interface{}
957
+ queue []tnWebWrite
958
+ queueTotal float64
959
+ strategy tnWebStrategy
960
+ started bool
961
+ inFlight bool
962
+ closeRequested bool
963
+ closeCh chan struct{}
964
+ backpressure bool
965
+ writer *TnWritableStreamDefaultWriter
966
+ controller *TnWritableStreamDefaultController
967
+ writeFn func(chunk interface{}) interface{}
968
+ closeFn func() interface{}
969
+ abortFn func(reason interface{}) interface{}
970
+ }
971
+
972
+ type TnWritableStreamDefaultController struct {
973
+ stream *TnWritableStream
974
+ signal *TnAbortSignal
975
+ }
976
+
977
+ type TnWritableStreamDefaultWriter struct {
978
+ stream *TnWritableStream
979
+ ready chan struct{}
980
+ readySettled bool
981
+ closed chan struct{}
982
+ closedSettled bool
983
+ }
984
+
985
+ func tnNewWebWritable(st tnWebStrategy) *TnWritableStream {
986
+ s := &TnWritableStream{state: "writable", strategy: st}
987
+ s.controller = &TnWritableStreamDefaultController{stream: s, signal: TnNewAbortSignal()}
988
+ s.backpressure = st.hwm <= 0
989
+ return s
990
+ }
991
+
992
+ // new WritableStream(underlyingSink?, strategy?)
993
+ func TnNewWritableStream(args ...interface{}) *TnWritableStream {
994
+ sink := tnWebArg(args)
995
+ var rest []interface{}
996
+ if len(args) > 1 {
997
+ rest = args[1:]
998
+ }
999
+ s := tnNewWebWritable(tnWebStrategyOf(rest, 1))
1000
+ if sink == nil || TnIsNil(sink) {
1001
+ s.startWith(nil)
1002
+ return s
1003
+ }
1004
+ if write := TnGet(sink, "write"); tnWebIsFunc(write) {
1005
+ s.writeFn = func(chunk interface{}) interface{} { return TnInvoke(write, chunk, s.controller) }
1006
+ }
1007
+ if closeFn := TnGet(sink, "close"); tnWebIsFunc(closeFn) {
1008
+ s.closeFn = func() interface{} { return TnInvoke(closeFn) }
1009
+ }
1010
+ if abort := TnGet(sink, "abort"); tnWebIsFunc(abort) {
1011
+ s.abortFn = func(reason interface{}) interface{} { return TnInvoke(abort, reason) }
1012
+ }
1013
+ if start := TnGet(sink, "start"); tnWebIsFunc(start) {
1014
+ s.startWith(func() interface{} { return TnInvoke(start, s.controller) })
1015
+ return s
1016
+ }
1017
+ s.startWith(nil)
1018
+ return s
1019
+ }
1020
+
1021
+ func (s *TnWritableStream) startWith(start func() interface{}) {
1022
+ var result interface{}
1023
+ if start != nil {
1024
+ result = start()
1025
+ }
1026
+ tnWebWhen(result, func(_ interface{}, reason interface{}, failed bool) {
1027
+ if failed {
1028
+ s.fail(reason)
1029
+ return
1030
+ }
1031
+ s.started = true
1032
+ s.advance()
1033
+ })
1034
+ }
1035
+
1036
+ func (s *TnWritableStream) desiredSize() float64 { return s.strategy.hwm - s.queueTotal }
1037
+
1038
+ func (s *TnWritableStream) updateBackpressure() {
1039
+ bp := s.desiredSize() <= 0
1040
+ if bp == s.backpressure || s.state != "writable" || s.closeRequested {
1041
+ return
1042
+ }
1043
+ s.backpressure = bp
1044
+ if w := s.writer; w != nil {
1045
+ if bp {
1046
+ w.ready = make(chan struct{})
1047
+ w.readySettled = false
1048
+ } else {
1049
+ w.settleReady(nil, false)
1050
+ }
1051
+ }
1052
+ }
1053
+
1054
+ func (s *TnWritableStream) enqueueWrite(chunk interface{}) chan struct{} {
1055
+ switch {
1056
+ case s.state == "errored":
1057
+ return tnWebRejected(s.storedError)
1058
+ case s.state == "closed":
1059
+ return tnWebRejected(tnWebTypeError("ERR_INVALID_STATE", "Invalid state: WritableStream is closed"))
1060
+ case s.closeRequested:
1061
+ return tnWebRejected(tnWebTypeError("ERR_INVALID_STATE", "Invalid state: WritableStream is closing"))
1062
+ }
1063
+ ch := make(chan struct{})
1064
+ size := s.strategy.sizeOf(chunk)
1065
+ s.queue = append(s.queue, tnWebWrite{chunk: chunk, size: size, ch: ch})
1066
+ s.queueTotal += size
1067
+ s.updateBackpressure()
1068
+ s.advance()
1069
+ return ch
1070
+ }
1071
+
1072
+ func (s *TnWritableStream) advance() {
1073
+ if !s.started || s.inFlight || s.state != "writable" {
1074
+ return
1075
+ }
1076
+ if len(s.queue) == 0 {
1077
+ if s.closeRequested {
1078
+ s.runClose()
1079
+ }
1080
+ return
1081
+ }
1082
+ w := s.queue[0]
1083
+ s.inFlight = true
1084
+ var result interface{}
1085
+ if s.writeFn != nil {
1086
+ r, thrown, failed := tnWebCall(func() interface{} { return s.writeFn(w.chunk) })
1087
+ if failed {
1088
+ s.inFlight = false
1089
+ s.fail(thrown)
1090
+ return
1091
+ }
1092
+ result = r
1093
+ }
1094
+ tnWebWhen(result, func(_ interface{}, reason interface{}, failed bool) {
1095
+ s.inFlight = false
1096
+ if s.state != "writable" {
1097
+ return
1098
+ }
1099
+ s.queue = s.queue[1:]
1100
+ s.queueTotal -= w.size
1101
+ if s.queueTotal < 0 || len(s.queue) == 0 {
1102
+ s.queueTotal = 0
1103
+ }
1104
+ if failed {
1105
+ TnReject(w.ch, reason)
1106
+ s.fail(reason)
1107
+ return
1108
+ }
1109
+ close(w.ch)
1110
+ s.updateBackpressure()
1111
+ s.advance()
1112
+ })
1113
+ }
1114
+
1115
+ func (s *TnWritableStream) runClose() {
1116
+ s.inFlight = true
1117
+ var result interface{}
1118
+ if s.closeFn != nil {
1119
+ r, thrown, failed := tnWebCall(s.closeFn)
1120
+ if failed {
1121
+ s.inFlight = false
1122
+ s.fail(thrown)
1123
+ return
1124
+ }
1125
+ result = r
1126
+ }
1127
+ tnWebWhen(result, func(_ interface{}, reason interface{}, failed bool) {
1128
+ s.inFlight = false
1129
+ if s.state != "writable" {
1130
+ return
1131
+ }
1132
+ if failed {
1133
+ s.fail(reason)
1134
+ return
1135
+ }
1136
+ s.state = "closed"
1137
+ close(s.closeCh)
1138
+ if w := s.writer; w != nil {
1139
+ w.settleClosed(nil, false)
1140
+ }
1141
+ })
1142
+ }
1143
+
1144
+ func (s *TnWritableStream) closeWith() chan struct{} {
1145
+ if s.state == "closed" || s.state == "errored" || s.closeRequested {
1146
+ return tnWebRejected(tnWebTypeError("ERR_INVALID_STATE", "Invalid state: WritableStream is closed"))
1147
+ }
1148
+ s.closeRequested = true
1149
+ s.closeCh = make(chan struct{})
1150
+ if w := s.writer; w != nil && s.backpressure {
1151
+ w.settleReady(nil, false)
1152
+ }
1153
+ s.advance()
1154
+ return s.closeCh
1155
+ }
1156
+
1157
+ func (s *TnWritableStream) fail(reason interface{}) {
1158
+ if s.state != "writable" {
1159
+ return
1160
+ }
1161
+ s.state = "errored"
1162
+ s.storedError = reason
1163
+ for _, w := range s.queue {
1164
+ TnReject(w.ch, reason)
1165
+ }
1166
+ s.queue = nil
1167
+ s.queueTotal = 0
1168
+ if s.closeCh != nil {
1169
+ TnReject(s.closeCh, reason)
1170
+ }
1171
+ if w := s.writer; w != nil {
1172
+ w.settleReady(reason, true)
1173
+ w.settleClosed(reason, true)
1174
+ }
1175
+ }
1176
+
1177
+ func (s *TnWritableStream) abortWith(reason interface{}) chan struct{} {
1178
+ if s.state != "writable" {
1179
+ return tnWebResolved()
1180
+ }
1181
+ s.controller.signal.abort(reason)
1182
+ var result interface{}
1183
+ if s.abortFn != nil {
1184
+ r, thrown, failed := tnWebCall(func() interface{} { return s.abortFn(reason) })
1185
+ if failed {
1186
+ s.fail(reason)
1187
+ return tnWebRejected(thrown)
1188
+ }
1189
+ result = r
1190
+ }
1191
+ s.fail(reason)
1192
+ return tnWebPromise(result)
1193
+ }
1194
+
1195
+ func (c *TnWritableStreamDefaultController) error(reason ...interface{}) {
1196
+ c.stream.fail(tnWebArg(reason))
1197
+ }
1198
+
1199
+ func (c *TnWritableStreamDefaultController) Get_signal() *TnAbortSignal { return c.signal }
1200
+
1201
+ func (s *TnWritableStream) Get_locked() bool { return s.writer != nil }
1202
+
1203
+ func (s *TnWritableStream) getWriter() *TnWritableStreamDefaultWriter {
1204
+ if s.writer != nil {
1205
+ panic(tnWebTypeError("ERR_INVALID_STATE", "Invalid state: WritableStream is locked"))
1206
+ }
1207
+ w := &TnWritableStreamDefaultWriter{stream: s, ready: make(chan struct{}), closed: make(chan struct{})}
1208
+ s.writer = w
1209
+ switch s.state {
1210
+ case "writable":
1211
+ if !s.backpressure || s.closeRequested {
1212
+ w.settleReady(nil, false)
1213
+ }
1214
+ case "closed":
1215
+ w.settleReady(nil, false)
1216
+ w.settleClosed(nil, false)
1217
+ case "errored":
1218
+ w.settleReady(s.storedError, true)
1219
+ w.settleClosed(s.storedError, true)
1220
+ }
1221
+ return w
1222
+ }
1223
+
1224
+ func (s *TnWritableStream) close() chan struct{} {
1225
+ if s.writer != nil {
1226
+ return tnWebRejected(tnWebTypeError("ERR_INVALID_STATE", "Invalid state: WritableStream is locked"))
1227
+ }
1228
+ return s.closeWith()
1229
+ }
1230
+
1231
+ func (s *TnWritableStream) abort(reason ...interface{}) chan struct{} {
1232
+ if s.writer != nil {
1233
+ return tnWebRejected(tnWebTypeError("ERR_INVALID_STATE", "Invalid state: WritableStream is locked"))
1234
+ }
1235
+ return s.abortWith(tnWebArg(reason))
1236
+ }
1237
+
1238
+ func (w *TnWritableStreamDefaultWriter) settleReady(reason interface{}, failed bool) {
1239
+ if w.readySettled {
1240
+ if failed {
1241
+ w.ready = tnWebRejected(reason)
1242
+ }
1243
+ return
1244
+ }
1245
+ w.readySettled = true
1246
+ if failed {
1247
+ TnReject(w.ready, reason)
1248
+ return
1249
+ }
1250
+ close(w.ready)
1251
+ }
1252
+
1253
+ func (w *TnWritableStreamDefaultWriter) settleClosed(reason interface{}, failed bool) {
1254
+ if w.closedSettled {
1255
+ if failed {
1256
+ w.closed = tnWebRejected(reason)
1257
+ }
1258
+ return
1259
+ }
1260
+ w.closedSettled = true
1261
+ if failed {
1262
+ TnReject(w.closed, reason)
1263
+ return
1264
+ }
1265
+ close(w.closed)
1266
+ }
1267
+
1268
+ func tnWebDetached() chan struct{} {
1269
+ return tnWebRejected(tnWebTypeError("ERR_INVALID_STATE", "Invalid state: Writer is not bound to a WritableStream"))
1270
+ }
1271
+
1272
+ func (w *TnWritableStreamDefaultWriter) Get_ready() chan struct{} { return w.ready }
1273
+ func (w *TnWritableStreamDefaultWriter) Get_closed() chan struct{} { return w.closed }
1274
+ func (w *TnWritableStreamDefaultWriter) Get_desiredSize() float64 {
1275
+ if w.stream == nil || w.stream.state != "writable" {
1276
+ return 0
1277
+ }
1278
+ return w.stream.desiredSize()
1279
+ }
1280
+
1281
+ func (w *TnWritableStreamDefaultWriter) write(chunk ...interface{}) chan struct{} {
1282
+ if w.stream == nil {
1283
+ return tnWebDetached()
1284
+ }
1285
+ return w.stream.enqueueWrite(tnWebArg(chunk))
1286
+ }
1287
+
1288
+ func (w *TnWritableStreamDefaultWriter) close() chan struct{} {
1289
+ if w.stream == nil {
1290
+ return tnWebDetached()
1291
+ }
1292
+ return w.stream.closeWith()
1293
+ }
1294
+
1295
+ func (w *TnWritableStreamDefaultWriter) abort(reason ...interface{}) chan struct{} {
1296
+ if w.stream == nil {
1297
+ return tnWebDetached()
1298
+ }
1299
+ return w.stream.abortWith(tnWebArg(reason))
1300
+ }
1301
+
1302
+ func (w *TnWritableStreamDefaultWriter) releaseLock() {
1303
+ s := w.stream
1304
+ if s == nil {
1305
+ return
1306
+ }
1307
+ err := tnWebTypeError("ERR_INVALID_STATE", "Invalid state: Writer has been released")
1308
+ w.settleReady(err, true)
1309
+ w.settleClosed(err, true)
1310
+ s.writer = nil
1311
+ w.stream = nil
1312
+ }
1313
+
1314
+ // --- TransformStream ---
1315
+
1316
+ type TnTransformStream struct {
1317
+ readable *TnReadableStream
1318
+ writable *TnWritableStream
1319
+ encoding string
1320
+ fatal bool
1321
+ ignoreBOM bool
1322
+ controller *TnTransformStreamDefaultController
1323
+ transformFn func(chunk interface{}) interface{}
1324
+ flushFn func() interface{}
1325
+ cancelFn func(reason interface{}) interface{}
1326
+ // A write waiting for the readable side to want more
1327
+ waiting func()
1328
+ }
1329
+
1330
+ type TnTransformStreamDefaultController struct {
1331
+ ts *TnTransformStream
1332
+ }
1333
+
1334
+ func (c *TnTransformStreamDefaultController) enqueue(chunk ...interface{}) {
1335
+ r := c.ts.readable
1336
+ if !r.open() {
1337
+ panic(tnWebTypeError("ERR_INVALID_STATE", "Invalid state: Controller is already closed"))
1338
+ }
1339
+ r.enqueue(tnWebArg(chunk))
1340
+ }
1341
+
1342
+ func (c *TnTransformStreamDefaultController) error(reason ...interface{}) {
1343
+ e := tnWebArg(reason)
1344
+ c.ts.readable.fail(e)
1345
+ c.ts.writable.fail(e)
1346
+ }
1347
+
1348
+ func (c *TnTransformStreamDefaultController) terminate() {
1349
+ if c.ts.readable.open() {
1350
+ c.ts.readable.controller.close()
1351
+ }
1352
+ c.ts.writable.fail(tnWebTypeError("ERR_INVALID_STATE", "Invalid state: TransformStream has been terminated"))
1353
+ }
1354
+
1355
+ func (c *TnTransformStreamDefaultController) Get_desiredSize() float64 {
1356
+ return c.ts.readable.controller.Get_desiredSize()
1357
+ }
1358
+
1359
+ func tnNewWebTransform(ws tnWebStrategy, rs tnWebStrategy) *TnTransformStream {
1360
+ ts := &TnTransformStream{}
1361
+ ts.controller = &TnTransformStreamDefaultController{ts: ts}
1362
+ ts.readable = tnNewWebReadable(rs)
1363
+ ts.writable = tnNewWebWritable(ws)
1364
+ ts.readable.pullFn = func() interface{} {
1365
+ if fn := ts.waiting; fn != nil {
1366
+ ts.waiting = nil
1367
+ fn()
1368
+ }
1369
+ return nil
1370
+ }
1371
+ ts.readable.cancelFn = func(reason interface{}) interface{} {
1372
+ var result interface{}
1373
+ if ts.cancelFn != nil {
1374
+ result = ts.cancelFn(reason)
1375
+ }
1376
+ ts.writable.fail(reason)
1377
+ return result
1378
+ }
1379
+ ts.writable.writeFn = func(chunk interface{}) interface{} {
1380
+ ch := make(chan struct{})
1381
+ run := func() {
1382
+ result, thrown, failed := tnWebCall(func() interface{} {
1383
+ if ts.transformFn != nil {
1384
+ return ts.transformFn(chunk)
1385
+ }
1386
+ ts.controller.enqueue(chunk)
1387
+ return nil
1388
+ })
1389
+ if failed {
1390
+ ts.readable.fail(thrown)
1391
+ TnReject(ch, thrown)
1392
+ return
1393
+ }
1394
+ tnWebWhen(result, func(_ interface{}, reason interface{}, failed bool) {
1395
+ if failed {
1396
+ ts.readable.fail(reason)
1397
+ TnReject(ch, reason)
1398
+ return
1399
+ }
1400
+ close(ch)
1401
+ })
1402
+ }
1403
+ if ts.readable.backpressured() {
1404
+ ts.waiting = run
1405
+ } else {
1406
+ run()
1407
+ }
1408
+ return ch
1409
+ }
1410
+ ts.writable.closeFn = func() interface{} {
1411
+ ch := make(chan struct{})
1412
+ var result interface{}
1413
+ if ts.flushFn != nil {
1414
+ r, thrown, failed := tnWebCall(ts.flushFn)
1415
+ if failed {
1416
+ ts.readable.fail(thrown)
1417
+ TnReject(ch, thrown)
1418
+ return ch
1419
+ }
1420
+ result = r
1421
+ }
1422
+ tnWebWhen(result, func(_ interface{}, reason interface{}, failed bool) {
1423
+ if failed {
1424
+ ts.readable.fail(reason)
1425
+ TnReject(ch, reason)
1426
+ return
1427
+ }
1428
+ if ts.readable.open() {
1429
+ ts.readable.controller.close()
1430
+ }
1431
+ close(ch)
1432
+ })
1433
+ return ch
1434
+ }
1435
+ ts.writable.abortFn = func(reason interface{}) interface{} {
1436
+ ts.readable.fail(reason)
1437
+ return nil
1438
+ }
1439
+ return ts
1440
+ }
1441
+
1442
+ // new TransformStream(transformer?, writableStrategy?, readableStrategy?)
1443
+ func TnNewTransformStream(args ...interface{}) *TnTransformStream {
1444
+ transformer := tnWebArg(args)
1445
+ var wsArgs, rsArgs []interface{}
1446
+ if len(args) > 1 {
1447
+ wsArgs = args[1:2]
1448
+ }
1449
+ if len(args) > 2 {
1450
+ rsArgs = args[2:3]
1451
+ }
1452
+ ts := tnNewWebTransform(tnWebStrategyOf(wsArgs, 1), tnWebStrategyOf(rsArgs, 0))
1453
+ var start func() interface{}
1454
+ if transformer != nil && !TnIsNil(transformer) {
1455
+ if fn := TnGet(transformer, "transform"); tnWebIsFunc(fn) {
1456
+ ts.transformFn = func(chunk interface{}) interface{} { return TnInvoke(fn, chunk, ts.controller) }
1457
+ }
1458
+ if fn := TnGet(transformer, "flush"); tnWebIsFunc(fn) {
1459
+ ts.flushFn = func() interface{} { return TnInvoke(fn, ts.controller) }
1460
+ }
1461
+ if fn := TnGet(transformer, "cancel"); tnWebIsFunc(fn) {
1462
+ ts.cancelFn = func(reason interface{}) interface{} { return TnInvoke(fn, reason) }
1463
+ }
1464
+ if fn := TnGet(transformer, "start"); tnWebIsFunc(fn) {
1465
+ start = func() interface{} { return TnInvoke(fn, ts.controller) }
1466
+ }
1467
+ }
1468
+ ts.writable.startWith(start)
1469
+ ts.readable.startWith(nil)
1470
+ return ts
1471
+ }
1472
+
1473
+ // A TransformStream running Go code per chunk and at the end
1474
+ func tnGoTransform(transform func(chunk interface{}), flush func()) *TnTransformStream {
1475
+ ts := tnNewWebTransform(tnWebStrategy{hwm: 1}, tnWebStrategy{hwm: 0})
1476
+ ts.transformFn = func(chunk interface{}) interface{} {
1477
+ transform(chunk)
1478
+ return nil
1479
+ }
1480
+ if flush != nil {
1481
+ ts.flushFn = func() interface{} {
1482
+ flush()
1483
+ return nil
1484
+ }
1485
+ }
1486
+ ts.writable.startWith(nil)
1487
+ ts.readable.startWith(nil)
1488
+ return ts
1489
+ }
1490
+
1491
+ // new TextEncoderStream(): strings in, UTF-8 bytes out
1492
+ func TnNewTextEncoderStream() *TnTransformStream {
1493
+ var ts *TnTransformStream
1494
+ ts = tnGoTransform(func(chunk interface{}) {
1495
+ if s := TnJSString(chunk); s != "" {
1496
+ ts.controller.enqueue([]byte(s))
1497
+ }
1498
+ }, nil)
1499
+ ts.encoding = "utf-8"
1500
+ return ts
1501
+ }
1502
+
1503
+ // new TextDecoderStream(label?, { fatal, ignoreBOM }): bytes in, strings out
1504
+ // (characters split across chunks are kept for the next one)
1505
+ func TnNewTextDecoderStream(args ...interface{}) *TnTransformStream {
1506
+ label := "utf-8"
1507
+ if len(args) > 0 {
1508
+ if l, ok := args[0].(string); ok && l != "" {
1509
+ label = strings.ToLower(l)
1510
+ }
1511
+ }
1512
+ var ts *TnTransformStream
1513
+ dec := TnNewStringDecoder(label)
1514
+ first := true
1515
+ emit := func(s string) {
1516
+ if first && s != "" {
1517
+ first = false
1518
+ if !ts.ignoreBOM {
1519
+ s = strings.TrimPrefix(s, "\\uFEFF")
1520
+ }
1521
+ }
1522
+ if s != "" {
1523
+ ts.controller.enqueue(s)
1524
+ }
1525
+ }
1526
+ ts = tnGoTransform(func(chunk interface{}) {
1527
+ emit(dec.write(tnWebChunkBytes(chunk)))
1528
+ }, func() {
1529
+ emit(dec.end())
1530
+ })
1531
+ ts.encoding = label
1532
+ if label == "utf8" || label == "unicode-1-1-utf-8" {
1533
+ ts.encoding = "utf-8"
1534
+ }
1535
+ if len(args) > 1 && args[1] != nil {
1536
+ ts.fatal, _ = TnGet(args[1], "fatal").(bool)
1537
+ ts.ignoreBOM, _ = TnGet(args[1], "ignoreBOM").(bool)
1538
+ }
1539
+ return ts
1540
+ }
1541
+
1542
+ func tnWebCompressionFormat(format string) {
1543
+ switch format {
1544
+ case "gzip", "deflate", "deflate-raw":
1545
+ return
1546
+ }
1547
+ panic(tnWebTypeError("ERR_INVALID_ARG_VALUE", "The argument 'format' is invalid. Received '"+format+"'"))
1548
+ }
1549
+
1550
+ // new CompressionStream('gzip' | 'deflate' | 'deflate-raw')
1551
+ func TnNewCompressionStream(format string) *TnTransformStream {
1552
+ tnWebCompressionFormat(format)
1553
+ var buf bytes.Buffer
1554
+ var w io.WriteCloser
1555
+ switch format {
1556
+ case "gzip":
1557
+ w = gzip.NewWriter(&buf)
1558
+ case "deflate":
1559
+ w = zlib.NewWriter(&buf)
1560
+ default:
1561
+ w, _ = flate.NewWriter(&buf, flate.DefaultCompression)
1562
+ }
1563
+ var ts *TnTransformStream
1564
+ drain := func() {
1565
+ if buf.Len() > 0 {
1566
+ ts.controller.enqueue(append([]byte{}, buf.Bytes()...))
1567
+ buf.Reset()
1568
+ }
1569
+ }
1570
+ ts = tnGoTransform(func(chunk interface{}) {
1571
+ w.Write(tnWebChunkBytes(chunk))
1572
+ drain()
1573
+ }, func() {
1574
+ w.Close()
1575
+ drain()
1576
+ })
1577
+ return ts
1578
+ }
1579
+
1580
+ // new DecompressionStream(format): decodes once the input ends
1581
+ func TnNewDecompressionStream(format string) *TnTransformStream {
1582
+ tnWebCompressionFormat(format)
1583
+ var input bytes.Buffer
1584
+ var ts *TnTransformStream
1585
+ ts = tnGoTransform(func(chunk interface{}) {
1586
+ input.Write(tnWebChunkBytes(chunk))
1587
+ }, func() {
1588
+ var r io.Reader
1589
+ var err error
1590
+ switch format {
1591
+ case "gzip":
1592
+ r, err = gzip.NewReader(&input)
1593
+ case "deflate":
1594
+ r, err = zlib.NewReader(&input)
1595
+ default:
1596
+ r = flate.NewReader(&input)
1597
+ }
1598
+ var out []byte
1599
+ if err == nil {
1600
+ out, err = io.ReadAll(r)
1601
+ }
1602
+ if err != nil {
1603
+ panic(TnNodeError("TypeError", "ERR_INVALID_STATE", "The compressed data was not valid: "+err.Error()))
1604
+ }
1605
+ if len(out) > 0 {
1606
+ ts.controller.enqueue(out)
1607
+ }
1608
+ })
1609
+ return ts
1610
+ }
1611
+
1612
+ // --- Node stream bridges ---
1613
+
1614
+ // Readable.toWeb(readable, { strategy }): paused while the web queue is full
1615
+ func TnReadableToWeb(src tnStreamLike, options ...interface{}) *TnReadableStream {
1616
+ n := src.tnStream()
1617
+ var strategy []interface{}
1618
+ if len(options) > 0 && options[0] != nil {
1619
+ if st := TnGet(options[0], "strategy"); st != nil {
1620
+ strategy = []interface{}{st}
1621
+ }
1622
+ }
1623
+ ws := tnNewWebReadable(tnWebStrategyOf(strategy, 1))
1624
+ ws.pullFn = func() interface{} {
1625
+ if n.isPaused() {
1626
+ n.resume()
1627
+ }
1628
+ return nil
1629
+ }
1630
+ ws.cancelFn = func(reason interface{}) interface{} {
1631
+ n.destroy()
1632
+ return nil
1633
+ }
1634
+ n.on("data", func(chunk interface{}) {
1635
+ if !ws.open() {
1636
+ return
1637
+ }
1638
+ ws.enqueue(chunk)
1639
+ if ws.backpressured() {
1640
+ n.pause()
1641
+ }
1642
+ })
1643
+ n.TnEventEmitter.once("end", func() {
1644
+ if ws.open() {
1645
+ ws.controller.close()
1646
+ }
1647
+ })
1648
+ n.TnEventEmitter.once("error", func(err interface{}) { ws.fail(err) })
1649
+ ws.startWith(nil)
1650
+ return ws
1651
+ }
1652
+
1653
+ // Readable.fromWeb(readableStream, options?)
1654
+ func TnReadableFromWeb(ws *TnReadableStream, options ...interface{}) *TnStream {
1655
+ n := TnNewReadable(options...)
1656
+ reader := ws.getReader()
1657
+ reading := false
1658
+ n.setHook("_read", func(size float64) {
1659
+ if reading {
1660
+ return
1661
+ }
1662
+ reading = true
1663
+ reader.readInto(tnWebRead{cb: func(res *TnReadResult, reason interface{}, failed bool) {
1664
+ reading = false
1665
+ switch {
1666
+ case failed:
1667
+ n.destroy(reason)
1668
+ case res.done:
1669
+ n.push(nil)
1670
+ default:
1671
+ n.push(res.value)
1672
+ }
1673
+ }})
1674
+ })
1675
+ n.setHook("_destroy", func(err interface{}, cb func(args ...interface{})) {
1676
+ if ws.state == "readable" {
1677
+ reader.cancel(err)
1678
+ }
1679
+ cb(err)
1680
+ })
1681
+ return n
1682
+ }
1683
+
1684
+ // Writable.toWeb(writable)
1685
+ func TnWritableToWeb(dst tnStreamLike) *TnWritableStream {
1686
+ n := dst.tnStream()
1687
+ ws := tnNewWebWritable(tnWebStrategy{hwm: 1})
1688
+ ws.writeFn = func(chunk interface{}) interface{} {
1689
+ ch := make(chan struct{})
1690
+ n.write(chunk, func(err interface{}) {
1691
+ if err != nil && !TnIsNil(err) {
1692
+ TnReject(ch, err)
1693
+ return
1694
+ }
1695
+ close(ch)
1696
+ })
1697
+ return ch
1698
+ }
1699
+ ws.closeFn = func() interface{} {
1700
+ ch := make(chan struct{})
1701
+ n.end(func() { close(ch) })
1702
+ return ch
1703
+ }
1704
+ ws.abortFn = func(reason interface{}) interface{} {
1705
+ n.destroy(reason)
1706
+ return nil
1707
+ }
1708
+ n.TnEventEmitter.once("error", func(err interface{}) { ws.fail(err) })
1709
+ ws.startWith(nil)
1710
+ return ws
1711
+ }
1712
+
1713
+ // Writable.fromWeb(writableStream, options?)
1714
+ func TnWritableFromWeb(ws *TnWritableStream, options ...interface{}) *TnStream {
1715
+ n := TnNewWritable(options...)
1716
+ writer := ws.getWriter()
1717
+ n.sink = func(chunk interface{}, done func(err interface{})) {
1718
+ tnWebWhen(writer.write(chunk), func(_ interface{}, reason interface{}, failed bool) {
1719
+ if failed {
1720
+ done(reason)
1721
+ return
1722
+ }
1723
+ done(nil)
1724
+ })
1725
+ }
1726
+ n.sinkFinal = func(done func(err interface{})) {
1727
+ tnWebWhen(writer.close(), func(_ interface{}, reason interface{}, failed bool) {
1728
+ if failed {
1729
+ done(reason)
1730
+ return
1731
+ }
1732
+ done(nil)
1733
+ })
1734
+ }
1735
+ return n
1736
+ }
1737
+
1738
+ // Duplex.toWeb(duplex): { readable, writable }
1739
+ func TnDuplexToWeb(d tnStreamLike) *TnTransformStream {
1740
+ return &TnTransformStream{readable: TnReadableToWeb(d), writable: TnWritableToWeb(d)}
1741
+ }
1742
+
1743
+ // Duplex.fromWeb({ readable, writable }, options?)
1744
+ func TnDuplexFromWeb(pair interface{}, options ...interface{}) *TnStream {
1745
+ var readable *TnReadableStream
1746
+ var writable *TnWritableStream
1747
+ if t, ok := pair.(*TnTransformStream); ok {
1748
+ readable, writable = t.readable, t.writable
1749
+ } else {
1750
+ readable, _ = TnGet(pair, "readable").(*TnReadableStream)
1751
+ writable, _ = TnGet(pair, "writable").(*TnWritableStream)
1752
+ }
1753
+ r := TnReadableFromWeb(readable, options...)
1754
+ w := TnWritableFromWeb(writable, options...)
1755
+ d := TnNewDuplex(options...)
1756
+ d.sink = w.sink
1757
+ d.sinkFinal = w.sinkFinal
1758
+ r.on("data", func(chunk interface{}) { d.push(chunk) })
1759
+ r.TnEventEmitter.once("end", func() { d.push(nil) })
1760
+ r.TnEventEmitter.once("error", func(err interface{}) { d.destroy(err) })
1761
+ d.hooks["_read"] = func(size float64) {}
1762
+ return d
1763
+ }
1764
+
1765
+ // stream.compose(...streams): one Duplex writing into the first stream and
1766
+ // reading from the last (web streams convert to Node streams)
1767
+ func TnCompose(streams ...interface{}) *TnStream {
1768
+ nodes := []*TnStream{}
1769
+ for _, st := range streams {
1770
+ switch x := st.(type) {
1771
+ case tnStreamLike:
1772
+ nodes = append(nodes, x.tnStream())
1773
+ case *TnReadableStream:
1774
+ nodes = append(nodes, TnReadableFromWeb(x, map[string]interface{}{"objectMode": true}))
1775
+ case *TnWritableStream:
1776
+ nodes = append(nodes, TnWritableFromWeb(x, map[string]interface{}{"objectMode": true}))
1777
+ case *TnTransformStream:
1778
+ nodes = append(nodes, TnDuplexFromWeb(x, map[string]interface{}{"objectMode": true}))
1779
+ default:
1780
+ panic(tnWebTypeError("ERR_INVALID_ARG_VALUE", "The argument 'streams' must be streams"))
1781
+ }
1782
+ }
1783
+ if len(nodes) == 0 {
1784
+ panic(tnWebTypeError("ERR_MISSING_ARGS", "The \\"streams\\" argument must be specified"))
1785
+ }
1786
+ for i := 0; i+1 < len(nodes); i++ {
1787
+ TnPipe[tnStreamLike](nodes[i], nodes[i+1])
1788
+ }
1789
+ first, last := nodes[0], nodes[len(nodes)-1]
1790
+ d := TnNewDuplex(map[string]interface{}{"objectMode": true})
1791
+ d.readableSide = last.readableSide
1792
+ d.writableSide = first.writableSide
1793
+ if first.writableSide {
1794
+ d.sink = func(chunk interface{}, done func(err interface{})) {
1795
+ first.write(chunk, func(err interface{}) { done(err) })
1796
+ }
1797
+ d.sinkFinal = func(done func(err interface{})) {
1798
+ first.end()
1799
+ if last.readableSide {
1800
+ done(nil)
1801
+ return
1802
+ }
1803
+ last.TnEventEmitter.once("finish", func() { done(nil) })
1804
+ }
1805
+ }
1806
+ if last.readableSide {
1807
+ d.hooks["_read"] = func(size float64) {}
1808
+ last.on("data", func(chunk interface{}) { d.push(chunk) })
1809
+ last.TnEventEmitter.once("end", func() { d.push(nil) })
1810
+ }
1811
+ for _, n := range nodes {
1812
+ n.TnEventEmitter.once("error", func(err interface{}) { d.destroy(err) })
1813
+ }
1814
+ return d
1815
+ }
1816
+
1817
+ // --- Blob / File ---
1818
+
1819
+ type TnBlob struct {
1820
+ data []byte
1821
+ type_ string
1822
+ name string
1823
+ lastModified float64
1824
+ isFile bool
1825
+ }
1826
+
1827
+ func tnBlobParts(parts interface{}) []byte {
1828
+ out := []byte{}
1829
+ if parts == nil || TnIsNil(parts) {
1830
+ return out
1831
+ }
1832
+ rv := reflect.ValueOf(parts)
1833
+ if rv.Kind() == reflect.Pointer && !rv.IsNil() && rv.Elem().Kind() == reflect.Slice {
1834
+ rv = rv.Elem()
1835
+ }
1836
+ if rv.Kind() != reflect.Slice && rv.Kind() != reflect.Array {
1837
+ panic(tnWebTypeError("ERR_INVALID_ARG_TYPE", "The \\"sources\\" argument must be a sequence"))
1838
+ }
1839
+ if b, ok := rv.Interface().([]byte); ok {
1840
+ return append(out, b...)
1841
+ }
1842
+ for i := 0; i < rv.Len(); i++ {
1843
+ switch x := rv.Index(i).Interface().(type) {
1844
+ case string:
1845
+ out = append(out, x...)
1846
+ case []byte:
1847
+ out = append(out, x...)
1848
+ case *TnBlob:
1849
+ out = append(out, x.data...)
1850
+ default:
1851
+ out = append(out, TnJSString(x)...)
1852
+ }
1853
+ }
1854
+ return out
1855
+ }
1856
+
1857
+ func tnBlobType(options interface{}) string {
1858
+ t, _ := TnGet(options, "type").(string)
1859
+ for _, c := range t {
1860
+ if c < 0x20 || c > 0x7e {
1861
+ return ""
1862
+ }
1863
+ }
1864
+ return strings.ToLower(t)
1865
+ }
1866
+
1867
+ // new Blob(parts?, { type })
1868
+ func TnNewBlob(args ...interface{}) *TnBlob {
1869
+ b := &TnBlob{data: tnBlobParts(tnWebArg(args))}
1870
+ if len(args) > 1 && args[1] != nil {
1871
+ b.type_ = tnBlobType(args[1])
1872
+ }
1873
+ return b
1874
+ }
1875
+
1876
+ // new File(parts, name, { type, lastModified })
1877
+ func TnNewFile(parts interface{}, name string, options ...interface{}) *TnBlob {
1878
+ f := &TnBlob{data: tnBlobParts(parts), name: name, isFile: true, lastModified: float64(time.Now().UnixMilli())}
1879
+ if len(options) > 0 && options[0] != nil {
1880
+ f.type_ = tnBlobType(options[0])
1881
+ if n, ok := tnWebNumber(TnGet(options[0], "lastModified")); ok {
1882
+ f.lastModified = n
1883
+ }
1884
+ }
1885
+ return f
1886
+ }
1887
+
1888
+ func (b *TnBlob) Get_size() float64 { return float64(len(b.data)) }
1889
+ func (b *TnBlob) Get_type_() string { return b.type_ }
1890
+ func (b *TnBlob) Get_name() string { return b.name }
1891
+ func (b *TnBlob) Get_lastModified() float64 { return b.lastModified }
1892
+
1893
+ func (b *TnBlob) text() chan string {
1894
+ ch := make(chan string, 1)
1895
+ ch <- TnBufferToString(b.data, "utf8")
1896
+ return ch
1897
+ }
1898
+
1899
+ func (b *TnBlob) bytes() chan []byte {
1900
+ ch := make(chan []byte, 1)
1901
+ ch <- append([]byte{}, b.data...)
1902
+ return ch
1903
+ }
1904
+
1905
+ func (b *TnBlob) arrayBuffer() chan []byte { return b.bytes() }
1906
+
1907
+ func (b *TnBlob) stream() *TnReadableStream { return tnWebFromBytes(b.data) }
1908
+
1909
+ // slice(start?, end?, contentType?)
1910
+ func (b *TnBlob) slice(args ...interface{}) *TnBlob {
1911
+ size := len(b.data)
1912
+ clamp := func(v interface{}, def int) int {
1913
+ n, ok := tnWebNumber(v)
1914
+ if !ok {
1915
+ return def
1916
+ }
1917
+ i := int(n)
1918
+ if i < 0 {
1919
+ i += size
1920
+ if i < 0 {
1921
+ i = 0
1922
+ }
1923
+ }
1924
+ if i > size {
1925
+ i = size
1926
+ }
1927
+ return i
1928
+ }
1929
+ start, end := 0, size
1930
+ if len(args) > 0 {
1931
+ start = clamp(args[0], 0)
1932
+ }
1933
+ if len(args) > 1 {
1934
+ end = clamp(args[1], size)
1935
+ }
1936
+ if end < start {
1937
+ end = start
1938
+ }
1939
+ out := &TnBlob{data: append([]byte{}, b.data[start:end]...)}
1940
+ if len(args) > 2 {
1941
+ out.type_ = tnBlobType(map[string]interface{}{"type": args[2]})
1942
+ }
1943
+ return out
1944
+ }
1945
+
1946
+ // --- FormData ---
1947
+
1948
+ type tnFormEntry struct {
1949
+ name string
1950
+ value interface{}
1951
+ }
1952
+
1953
+ type TnFormData struct {
1954
+ entries_ []tnFormEntry
1955
+ }
1956
+
1957
+ func TnNewFormData(args ...interface{}) *TnFormData { return &TnFormData{} }
1958
+
1959
+ // Blobs become Files (named "blob" unless a filename is given); other values strings
1960
+ func tnFormValue(value interface{}, filename []string) interface{} {
1961
+ if b, ok := value.(*TnBlob); ok {
1962
+ name := b.name
1963
+ if !b.isFile {
1964
+ name = "blob"
1965
+ }
1966
+ if len(filename) > 0 {
1967
+ name = filename[0]
1968
+ }
1969
+ if b.isFile && name == b.name {
1970
+ return b
1971
+ }
1972
+ return &TnBlob{data: b.data, type_: b.type_, name: name, isFile: true, lastModified: float64(time.Now().UnixMilli())}
1973
+ }
1974
+ return TnJSString(value)
1975
+ }
1976
+
1977
+ func (f *TnFormData) append(name string, value interface{}, filename ...string) {
1978
+ f.entries_ = append(f.entries_, tnFormEntry{name: name, value: tnFormValue(value, filename)})
1979
+ }
1980
+
1981
+ func (f *TnFormData) set(name string, value interface{}, filename ...string) {
1982
+ entry := tnFormEntry{name: name, value: tnFormValue(value, filename)}
1983
+ out := []tnFormEntry{}
1984
+ replaced := false
1985
+ for _, e := range f.entries_ {
1986
+ if e.name != name {
1987
+ out = append(out, e)
1988
+ } else if !replaced {
1989
+ out = append(out, entry)
1990
+ replaced = true
1991
+ }
1992
+ }
1993
+ if !replaced {
1994
+ out = append(out, entry)
1995
+ }
1996
+ f.entries_ = out
1997
+ }
1998
+
1999
+ func (f *TnFormData) get(name string) interface{} {
2000
+ for _, e := range f.entries_ {
2001
+ if e.name == name {
2002
+ return e.value
2003
+ }
2004
+ }
2005
+ return nil
2006
+ }
2007
+
2008
+ func (f *TnFormData) getAll(name string) []interface{} {
2009
+ out := []interface{}{}
2010
+ for _, e := range f.entries_ {
2011
+ if e.name == name {
2012
+ out = append(out, e.value)
2013
+ }
2014
+ }
2015
+ return out
2016
+ }
2017
+
2018
+ func (f *TnFormData) has(name string) bool {
2019
+ for _, e := range f.entries_ {
2020
+ if e.name == name {
2021
+ return true
2022
+ }
2023
+ }
2024
+ return false
2025
+ }
2026
+
2027
+ func (f *TnFormData) delete(name string) {
2028
+ out := []tnFormEntry{}
2029
+ for _, e := range f.entries_ {
2030
+ if e.name != name {
2031
+ out = append(out, e)
2032
+ }
2033
+ }
2034
+ f.entries_ = out
2035
+ }
2036
+
2037
+ func (f *TnFormData) entries() [][]interface{} {
2038
+ out := [][]interface{}{}
2039
+ for _, e := range f.entries_ {
2040
+ out = append(out, []interface{}{e.name, e.value})
2041
+ }
2042
+ return out
2043
+ }
2044
+
2045
+ func (f *TnFormData) keys() []string {
2046
+ out := []string{}
2047
+ for _, e := range f.entries_ {
2048
+ out = append(out, e.name)
2049
+ }
2050
+ return out
2051
+ }
2052
+
2053
+ func (f *TnFormData) values() []interface{} {
2054
+ out := []interface{}{}
2055
+ for _, e := range f.entries_ {
2056
+ out = append(out, e.value)
2057
+ }
2058
+ return out
2059
+ }
2060
+
2061
+ func (f *TnFormData) forEach(fn interface{}) {
2062
+ for _, e := range f.entries_ {
2063
+ TnInvoke(fn, e.value, e.name, f)
2064
+ }
2065
+ }
2066
+
2067
+ func (f *TnFormData) tnIterator() [][]interface{} { return f.entries() }
2068
+
2069
+ // multipart/form-data encoding; returns the body and its content type
2070
+ func (f *TnFormData) encode() ([]byte, string) {
2071
+ var buf bytes.Buffer
2072
+ w := multipart.NewWriter(&buf)
2073
+ for _, e := range f.entries_ {
2074
+ switch v := e.value.(type) {
2075
+ case *TnBlob:
2076
+ h := textproto.MIMEHeader{}
2077
+ h.Set("Content-Disposition", fmt.Sprintf("form-data; name=%q; filename=%q", e.name, v.name))
2078
+ ct := v.type_
2079
+ if ct == "" {
2080
+ ct = "application/octet-stream"
2081
+ }
2082
+ h.Set("Content-Type", ct)
2083
+ part, _ := w.CreatePart(h)
2084
+ part.Write(v.data)
2085
+ default:
2086
+ w.WriteField(e.name, TnJSString(v))
2087
+ }
2088
+ }
2089
+ w.Close()
2090
+ return buf.Bytes(), "multipart/form-data; boundary=" + w.Boundary()
2091
+ }
2092
+
2093
+ // Parses a multipart/form-data or application/x-www-form-urlencoded body
2094
+ func tnParseFormData(data []byte, contentType string) (*TnFormData, error) {
2095
+ f := &TnFormData{}
2096
+ mediaType, params, err := mime.ParseMediaType(contentType)
2097
+ if err != nil {
2098
+ return nil, err
2099
+ }
2100
+ switch mediaType {
2101
+ case "multipart/form-data":
2102
+ r := multipart.NewReader(bytes.NewReader(data), params["boundary"])
2103
+ for {
2104
+ part, err := r.NextPart()
2105
+ if err == io.EOF {
2106
+ break
2107
+ }
2108
+ if err != nil {
2109
+ return nil, err
2110
+ }
2111
+ content, err := io.ReadAll(part)
2112
+ if err != nil {
2113
+ return nil, err
2114
+ }
2115
+ if part.FileName() != "" {
2116
+ ct := part.Header.Get("Content-Type")
2117
+ f.entries_ = append(f.entries_, tnFormEntry{name: part.FormName(), value: &TnBlob{data: content, type_: ct, name: part.FileName(), isFile: true, lastModified: float64(time.Now().UnixMilli())}})
2118
+ } else {
2119
+ f.entries_ = append(f.entries_, tnFormEntry{name: part.FormName(), value: string(content)})
2120
+ }
2121
+ }
2122
+ case "application/x-www-form-urlencoded":
2123
+ for _, pair := range strings.Split(string(data), "&") {
2124
+ if pair == "" {
2125
+ continue
2126
+ }
2127
+ k, v, _ := strings.Cut(pair, "=")
2128
+ k, _ = tnurl.QueryUnescape(k)
2129
+ v, _ = tnurl.QueryUnescape(v)
2130
+ f.entries_ = append(f.entries_, tnFormEntry{name: k, value: v})
2131
+ }
2132
+ default:
2133
+ return nil, fmt.Errorf("unsupported content type %s", mediaType)
2134
+ }
2135
+ return f, nil
2136
+ }`;
2137
+ // Parameter types of underlying source / sink / transformer methods
2138
+ function sourceTypes(controller) {
2139
+ return { start: [controller], pull: [controller], cancel: ['interface{}'] };
2140
+ }
2141
+ export function registerStreamWeb(r) {
2142
+ defineModule(r, 'stream/web');
2143
+ r.namespaces['stream.web'] = 'stream/web';
2144
+ defineHelper(r, 'nodeStreamWeb', ['bytes', 'compress/flate', 'compress/gzip', 'compress/zlib', 'fmt', 'io', 'mime', 'mime/multipart', 'net/textproto', 'reflect', 'strings', 'time', 'net/url'], ['nodeStream', 'nodeEvents', 'promise', 'eventLoop', 'dynamic', 'error', 'nodeInvoke', 'buffer', 'stringDecoder'], streamWebHelper);
2145
+ const use = () => r.helper('nodeStreamWeb');
2146
+ const web = (name) => `stream/web.${name}`;
2147
+ defineClass(r, web('ReadableStreamReadResult'), '*TnReadResult', 'class', '', 'value=interface{}; done=bool', '', '');
2148
+ defineClass(r, web('ReadableStream'), '*TnReadableStream', 'class', 'getReader=*TnReadableStreamDefaultReader; cancel=chan struct{}; tee=[]*TnReadableStream; pipeTo=chan struct{}; pipeThrough=*TnReadableStream; values=chan interface{}', '', 'locked=bool', '');
2149
+ r.iterators['*TnReadableStream'] = 'tnIterator';
2150
+ r.classes[web('ReadableStream')].methods['tnIterator'] = 'chan interface{}';
2151
+ defineClass(r, web('ReadableStreamDefaultReader'), '*TnReadableStreamDefaultReader', 'class', 'read=chan *TnReadResult; releaseLock=; cancel=chan struct{}', '', 'closed=chan struct{}', '');
2152
+ r.classes[web('ReadableStreamBYOBReader')] = r.classes[web('ReadableStreamDefaultReader')];
2153
+ defineClass(r, web('ReadableStreamDefaultController'), '*TnReadableStreamDefaultController', 'class', 'enqueue=; close=; error=', '', 'desiredSize=float64', '');
2154
+ r.classes[web('ReadableByteStreamController')] = r.classes[web('ReadableStreamDefaultController')];
2155
+ defineClass(r, web('WritableStream'), '*TnWritableStream', 'class', 'getWriter=*TnWritableStreamDefaultWriter; close=chan struct{}; abort=chan struct{}', '', 'locked=bool', '');
2156
+ defineClass(r, web('WritableStreamDefaultWriter'), '*TnWritableStreamDefaultWriter', 'class', 'write=chan struct{}; close=chan struct{}; abort=chan struct{}; releaseLock=', '', 'ready=chan struct{}; closed=chan struct{}; desiredSize=float64', '');
2157
+ defineClass(r, web('WritableStreamDefaultController'), '*TnWritableStreamDefaultController', 'class', 'error=', '', 'signal=*TnAbortSignal', '');
2158
+ defineClass(r, web('TransformStreamDefaultController'), '*TnTransformStreamDefaultController', 'class', 'enqueue=; error=; terminate=', '', 'desiredSize=float64', '');
2159
+ const transformCls = defineClass(r, web('TransformStream'), '*TnTransformStream', 'class', '', 'readable=*TnReadableStream; writable=*TnWritableStream; encoding=string; fatal=bool; ignoreBOM=bool', '', '');
2160
+ for (const name of ['TextEncoderStream', 'TextDecoderStream', 'CompressionStream', 'DecompressionStream'])
2161
+ r.classes[web(name)] = transformCls;
2162
+ r.classByGoType['*TnTransformStream'] = web('TransformStream');
2163
+ const strategyCls = defineClass(r, web('CountQueuingStrategy'), '*TnQueuingStrategy', 'class', 'size=float64', 'highWaterMark=float64', '', '');
2164
+ r.classes[web('ByteLengthQueuingStrategy')] = strategyCls;
2165
+ const globals = [
2166
+ 'ReadableStream',
2167
+ 'ReadableStreamDefaultReader',
2168
+ 'ReadableStreamBYOBReader',
2169
+ 'ReadableStreamDefaultController',
2170
+ 'ReadableByteStreamController',
2171
+ 'WritableStream',
2172
+ 'WritableStreamDefaultWriter',
2173
+ 'WritableStreamDefaultController',
2174
+ 'TransformStream',
2175
+ 'TransformStreamDefaultController',
2176
+ 'TextEncoderStream',
2177
+ 'TextDecoderStream',
2178
+ 'CompressionStream',
2179
+ 'DecompressionStream',
2180
+ 'CountQueuingStrategy',
2181
+ 'ByteLengthQueuingStrategy'
2182
+ ];
2183
+ for (const name of globals)
2184
+ r.globals[name] = web(name);
2185
+ const ctor = (name, emit) => {
2186
+ r.constructors[web(name)] = (c) => {
2187
+ use();
2188
+ return emit(c);
2189
+ };
2190
+ };
2191
+ ctor('ReadableStream', (c) => `TnNewReadableStream(${c.args.join(', ')})`);
2192
+ ctor('WritableStream', (c) => `TnNewWritableStream(${c.args.join(', ')})`);
2193
+ ctor('TransformStream', (c) => `TnNewTransformStream(${c.args.join(', ')})`);
2194
+ ctor('TextEncoderStream', (_c) => 'TnNewTextEncoderStream()');
2195
+ ctor('TextDecoderStream', (c) => `TnNewTextDecoderStream(${c.args.join(', ')})`);
2196
+ ctor('CompressionStream', (c) => `TnNewCompressionStream(${c.args[0]})`);
2197
+ ctor('DecompressionStream', (c) => `TnNewDecompressionStream(${c.args[0]})`);
2198
+ ctor('CountQueuingStrategy', (c) => `TnNewQueuingStrategy(false, ${c.args[0] ?? 'nil'})`);
2199
+ ctor('ByteLengthQueuingStrategy', (c) => `TnNewQueuingStrategy(true, ${c.args[0] ?? 'nil'})`);
2200
+ ctor('ReadableStreamDefaultReader', (c) => `${c.args[0]}.getReader()`);
2201
+ ctor('ReadableStreamBYOBReader', (c) => `${c.args[0]}.getReader()`);
2202
+ ctor('WritableStreamDefaultWriter', (c) => `${c.args[0]}.getWriter()`);
2203
+ r.optionTypers[web('ReadableStream')] = (_n) => sourceTypes('*TnReadableStreamDefaultController');
2204
+ r.optionTypers[web('WritableStream')] = (_n) => ({
2205
+ start: ['*TnWritableStreamDefaultController'],
2206
+ write: ['interface{}', '*TnWritableStreamDefaultController'],
2207
+ close: [],
2208
+ abort: ['interface{}']
2209
+ });
2210
+ r.optionTypers[web('TransformStream')] = (_n) => ({
2211
+ start: ['*TnTransformStreamDefaultController'],
2212
+ transform: ['interface{}', '*TnTransformStreamDefaultController'],
2213
+ flush: ['*TnTransformStreamDefaultController'],
2214
+ cancel: ['interface{}']
2215
+ });
2216
+ r.functions[web('ReadableStream.from')] = (c) => {
2217
+ use();
2218
+ return `TnReadableStreamFrom(${c.args[0]})`;
2219
+ };
2220
+ r.results[web('ReadableStream.from')] = '*TnReadableStream';
2221
+ // Node stream bridges
2222
+ const bridge = (key, goName, result) => {
2223
+ r.functions[key] = (c) => {
2224
+ use();
2225
+ return `${goName}(${c.args.join(', ')})`;
2226
+ };
2227
+ r.results[key] = result;
2228
+ };
2229
+ bridge('stream.Readable.toWeb', 'TnReadableToWeb', '*TnReadableStream');
2230
+ bridge('stream.Readable.fromWeb', 'TnReadableFromWeb', '*TnStream');
2231
+ bridge('stream.Writable.toWeb', 'TnWritableToWeb', '*TnWritableStream');
2232
+ bridge('stream.Writable.fromWeb', 'TnWritableFromWeb', '*TnStream');
2233
+ bridge('stream.Duplex.toWeb', 'TnDuplexToWeb', '*TnTransformStream');
2234
+ bridge('stream.Duplex.fromWeb', 'TnDuplexFromWeb', '*TnStream');
2235
+ bridge('stream.compose', 'TnCompose', '*TnStream');
2236
+ // Blob / File (node:buffer and globals)
2237
+ const blobCls = defineClass(r, 'buffer.Blob', '*TnBlob', 'class', 'text=chan string; bytes=chan []byte; arrayBuffer=chan []byte; slice=*TnBlob; stream=*TnReadableStream', '', 'size=float64; type=string; name=string; lastModified=float64', '');
2238
+ r.classes['buffer.File'] = blobCls;
2239
+ r.globals['Blob'] = 'buffer.Blob';
2240
+ r.globals['File'] = 'buffer.File';
2241
+ r.constructors['buffer.Blob'] = (c) => {
2242
+ use();
2243
+ return `TnNewBlob(${c.args.join(', ')})`;
2244
+ };
2245
+ r.constructors['buffer.File'] = (c) => {
2246
+ use();
2247
+ return `TnNewFile(${c.args.join(', ')})`;
2248
+ };
2249
+ // FormData (global)
2250
+ defineClass(r, 'globals.FormData', '*TnFormData', 'class', 'append=; set=; get=interface{}; getAll=[]interface{}; has=bool; delete=; entries=[][]interface{}; keys=[]string; values=[]interface{}; forEach=', '', '', '');
2251
+ r.iterators['*TnFormData'] = 'tnIterator';
2252
+ r.classes['globals.FormData'].methods['tnIterator'] = '[][]interface{}';
2253
+ r.paramTypers['globals.FormData#forEach'] = (_n) => ['interface{}', 'string', '*TnFormData'];
2254
+ r.globals['FormData'] = 'globals.FormData';
2255
+ r.constructors['globals.FormData'] = (c) => {
2256
+ use();
2257
+ return `TnNewFormData(${c.args.join(', ')})`;
2258
+ };
2259
+ }