typenative 0.1.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (500) hide show
  1. package/.gitattributes +1 -0
  2. package/.github/workflows/ci.yml +1 -1
  3. package/.github/workflows/npm-publish-github-packages.yml +1 -1
  4. package/CHANGELOG.md +247 -0
  5. package/CONTRIBUTION.md +1 -1
  6. package/README.md +4 -4
  7. package/bin/cli.js +3 -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 +294 -240
  14. package/bin/main.js +4 -1
  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 +661 -0
  45. package/bin/node/test.js +1068 -0
  46. package/bin/node/timers.js +250 -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/transpiler.js +2650 -575
  54. package/bin/version.js +2 -0
  55. package/conformance.md +707 -241
  56. package/govendor/github.com/ncruces/go-sqlite3/LICENSE +21 -0
  57. package/govendor/github.com/ncruces/go-sqlite3/README.md +121 -0
  58. package/govendor/github.com/ncruces/go-sqlite3/backup.go +132 -0
  59. package/govendor/github.com/ncruces/go-sqlite3/blob.go +266 -0
  60. package/govendor/github.com/ncruces/go-sqlite3/config.go +397 -0
  61. package/govendor/github.com/ncruces/go-sqlite3/conn.go +540 -0
  62. package/govendor/github.com/ncruces/go-sqlite3/conn_127.go +93 -0
  63. package/govendor/github.com/ncruces/go-sqlite3/const.go +436 -0
  64. package/govendor/github.com/ncruces/go-sqlite3/context.go +222 -0
  65. package/govendor/github.com/ncruces/go-sqlite3/error.go +182 -0
  66. package/govendor/github.com/ncruces/go-sqlite3/ext.go +153 -0
  67. package/govendor/github.com/ncruces/go-sqlite3/func.go +309 -0
  68. package/govendor/github.com/ncruces/go-sqlite3/go.mod +3 -0
  69. package/govendor/github.com/ncruces/go-sqlite3/internal/dotlk/dotlk.go +29 -0
  70. package/govendor/github.com/ncruces/go-sqlite3/internal/dotlk/dotlk_other.go +13 -0
  71. package/govendor/github.com/ncruces/go-sqlite3/internal/dotlk/dotlk_unix.go +57 -0
  72. package/govendor/github.com/ncruces/go-sqlite3/internal/errutil/error.go +41 -0
  73. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/alloc.go +128 -0
  74. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/const.go +122 -0
  75. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/error.go +77 -0
  76. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/mem.go +116 -0
  77. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/mem_other.go +34 -0
  78. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/mem_unix.go +87 -0
  79. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/mem_windows.go +149 -0
  80. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/mmap_unix.go +80 -0
  81. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/mmap_windows.go +129 -0
  82. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/sys_windows.go +60 -0
  83. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/wrap.go +82 -0
  84. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/wrap_sys.go +113 -0
  85. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/wrap_vfs.go +181 -0
  86. package/govendor/github.com/ncruces/go-sqlite3/internal/testenv/env.go +55 -0
  87. package/govendor/github.com/ncruces/go-sqlite3/internal/util/json.go +54 -0
  88. package/govendor/github.com/ncruces/go-sqlite3/internal/util/json_v2.go +54 -0
  89. package/govendor/github.com/ncruces/go-sqlite3/internal/util/math.go +29 -0
  90. package/govendor/github.com/ncruces/go-sqlite3/internal/util/page.go +5 -0
  91. package/govendor/github.com/ncruces/go-sqlite3/internal/util/parse.go +142 -0
  92. package/govendor/github.com/ncruces/go-sqlite3/internal/util/pointer.go +3 -0
  93. package/govendor/github.com/ncruces/go-sqlite3/internal/util/reflect.go +10 -0
  94. package/govendor/github.com/ncruces/go-sqlite3/json.go +100 -0
  95. package/govendor/github.com/ncruces/go-sqlite3/json_v2.go +116 -0
  96. package/govendor/github.com/ncruces/go-sqlite3/pointer.go +13 -0
  97. package/govendor/github.com/ncruces/go-sqlite3/quote.go +140 -0
  98. package/govendor/github.com/ncruces/go-sqlite3/stmt.go +692 -0
  99. package/govendor/github.com/ncruces/go-sqlite3/time.go +360 -0
  100. package/govendor/github.com/ncruces/go-sqlite3/txn.go +374 -0
  101. package/govendor/github.com/ncruces/go-sqlite3/value.go +212 -0
  102. package/govendor/github.com/ncruces/go-sqlite3/vfs/README.md +133 -0
  103. package/govendor/github.com/ncruces/go-sqlite3/vfs/api.go +239 -0
  104. package/govendor/github.com/ncruces/go-sqlite3/vfs/cksm.go +143 -0
  105. package/govendor/github.com/ncruces/go-sqlite3/vfs/const.go +256 -0
  106. package/govendor/github.com/ncruces/go-sqlite3/vfs/file.go +260 -0
  107. package/govendor/github.com/ncruces/go-sqlite3/vfs/filename.go +187 -0
  108. package/govendor/github.com/ncruces/go-sqlite3/vfs/lock.go +128 -0
  109. package/govendor/github.com/ncruces/go-sqlite3/vfs/lock_other.go +23 -0
  110. package/govendor/github.com/ncruces/go-sqlite3/vfs/map.go +63 -0
  111. package/govendor/github.com/ncruces/go-sqlite3/vfs/map_other.go +13 -0
  112. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_bsd.go +110 -0
  113. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_darwin.go +131 -0
  114. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_dotlk.go +140 -0
  115. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_f2fs_linux.go +56 -0
  116. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_linux.go +117 -0
  117. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_ofd.go +59 -0
  118. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_std.go +50 -0
  119. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_std_alloc.go +19 -0
  120. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_std_atomic.go +9 -0
  121. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_std_rw.go +13 -0
  122. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_std_sync.go +9 -0
  123. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_std_temp.go +16 -0
  124. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_unix.go +108 -0
  125. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_windows.go +180 -0
  126. package/govendor/github.com/ncruces/go-sqlite3/vfs/registry.go +48 -0
  127. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm.go +26 -0
  128. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm_bsd.go +258 -0
  129. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm_copy.go +90 -0
  130. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm_dotlk.go +168 -0
  131. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm_memlk.go +52 -0
  132. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm_ofd.go +185 -0
  133. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm_other.go +21 -0
  134. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm_windows.go +124 -0
  135. package/govendor/github.com/ncruces/go-sqlite3/vfs/vfs.go +455 -0
  136. package/govendor/github.com/ncruces/go-sqlite3/vtab.go +677 -0
  137. package/govendor/github.com/ncruces/go-sqlite3/wrap.go +48 -0
  138. package/govendor/github.com/ncruces/go-sqlite3-wasm/v6/LICENSE +18 -0
  139. package/govendor/github.com/ncruces/go-sqlite3-wasm/v6/README.md +11 -0
  140. package/govendor/github.com/ncruces/go-sqlite3-wasm/v6/go.mod +3 -0
  141. package/govendor/github.com/ncruces/go-sqlite3-wasm/v6/libc.go +215 -0
  142. package/govendor/github.com/ncruces/go-sqlite3-wasm/v6/sqlite3.dat +0 -0
  143. package/govendor/github.com/ncruces/go-sqlite3-wasm/v6/sqlite3.go +157903 -0
  144. package/govendor/github.com/ncruces/go-sqlite3-wasm/v6/tools.sh +38 -0
  145. package/govendor/github.com/ncruces/julianday/LICENSE +21 -0
  146. package/govendor/github.com/ncruces/julianday/README.md +9 -0
  147. package/govendor/github.com/ncruces/julianday/go.mod +3 -0
  148. package/govendor/github.com/ncruces/julianday/julianday.go +124 -0
  149. package/govendor/golang.org/x/sys/LICENSE +27 -0
  150. package/govendor/golang.org/x/sys/PATENTS +22 -0
  151. package/govendor/golang.org/x/sys/go.mod +3 -0
  152. package/govendor/golang.org/x/sys/unix/README.md +184 -0
  153. package/govendor/golang.org/x/sys/unix/affinity_linux.go +189 -0
  154. package/govendor/golang.org/x/sys/unix/aliases.go +13 -0
  155. package/govendor/golang.org/x/sys/unix/asm_aix_ppc64.s +17 -0
  156. package/govendor/golang.org/x/sys/unix/asm_bsd_386.s +27 -0
  157. package/govendor/golang.org/x/sys/unix/asm_bsd_amd64.s +27 -0
  158. package/govendor/golang.org/x/sys/unix/asm_bsd_arm.s +27 -0
  159. package/govendor/golang.org/x/sys/unix/asm_bsd_arm64.s +27 -0
  160. package/govendor/golang.org/x/sys/unix/asm_bsd_ppc64.s +29 -0
  161. package/govendor/golang.org/x/sys/unix/asm_bsd_riscv64.s +27 -0
  162. package/govendor/golang.org/x/sys/unix/asm_linux_386.s +65 -0
  163. package/govendor/golang.org/x/sys/unix/asm_linux_amd64.s +57 -0
  164. package/govendor/golang.org/x/sys/unix/asm_linux_arm.s +56 -0
  165. package/govendor/golang.org/x/sys/unix/asm_linux_arm64.s +50 -0
  166. package/govendor/golang.org/x/sys/unix/asm_linux_loong64.s +51 -0
  167. package/govendor/golang.org/x/sys/unix/asm_linux_mips64x.s +54 -0
  168. package/govendor/golang.org/x/sys/unix/asm_linux_mipsx.s +52 -0
  169. package/govendor/golang.org/x/sys/unix/asm_linux_ppc64x.s +42 -0
  170. package/govendor/golang.org/x/sys/unix/asm_linux_riscv64.s +47 -0
  171. package/govendor/golang.org/x/sys/unix/asm_linux_s390x.s +54 -0
  172. package/govendor/golang.org/x/sys/unix/asm_openbsd_mips64.s +29 -0
  173. package/govendor/golang.org/x/sys/unix/asm_solaris_amd64.s +17 -0
  174. package/govendor/golang.org/x/sys/unix/asm_zos_s390x.s +382 -0
  175. package/govendor/golang.org/x/sys/unix/auxv.go +36 -0
  176. package/govendor/golang.org/x/sys/unix/auxv_unsupported.go +13 -0
  177. package/govendor/golang.org/x/sys/unix/bluetooth_linux.go +36 -0
  178. package/govendor/golang.org/x/sys/unix/bpxsvc_zos.go +657 -0
  179. package/govendor/golang.org/x/sys/unix/bpxsvc_zos.s +192 -0
  180. package/govendor/golang.org/x/sys/unix/cap_freebsd.go +195 -0
  181. package/govendor/golang.org/x/sys/unix/constants.go +13 -0
  182. package/govendor/golang.org/x/sys/unix/dev_aix_ppc.go +26 -0
  183. package/govendor/golang.org/x/sys/unix/dev_aix_ppc64.go +28 -0
  184. package/govendor/golang.org/x/sys/unix/dev_darwin.go +24 -0
  185. package/govendor/golang.org/x/sys/unix/dev_dragonfly.go +30 -0
  186. package/govendor/golang.org/x/sys/unix/dev_freebsd.go +30 -0
  187. package/govendor/golang.org/x/sys/unix/dev_linux.go +42 -0
  188. package/govendor/golang.org/x/sys/unix/dev_netbsd.go +29 -0
  189. package/govendor/golang.org/x/sys/unix/dev_openbsd.go +29 -0
  190. package/govendor/golang.org/x/sys/unix/dev_zos.go +28 -0
  191. package/govendor/golang.org/x/sys/unix/dirent.go +102 -0
  192. package/govendor/golang.org/x/sys/unix/endian_big.go +9 -0
  193. package/govendor/golang.org/x/sys/unix/endian_little.go +9 -0
  194. package/govendor/golang.org/x/sys/unix/env_unix.go +31 -0
  195. package/govendor/golang.org/x/sys/unix/fcntl.go +36 -0
  196. package/govendor/golang.org/x/sys/unix/fcntl_darwin.go +24 -0
  197. package/govendor/golang.org/x/sys/unix/fcntl_linux_32bit.go +13 -0
  198. package/govendor/golang.org/x/sys/unix/fdset.go +27 -0
  199. package/govendor/golang.org/x/sys/unix/gccgo.go +59 -0
  200. package/govendor/golang.org/x/sys/unix/gccgo_c.c +44 -0
  201. package/govendor/golang.org/x/sys/unix/gccgo_linux_amd64.go +20 -0
  202. package/govendor/golang.org/x/sys/unix/ifreq_linux.go +145 -0
  203. package/govendor/golang.org/x/sys/unix/ioctl_linux.go +341 -0
  204. package/govendor/golang.org/x/sys/unix/ioctl_signed.go +74 -0
  205. package/govendor/golang.org/x/sys/unix/ioctl_unsigned.go +74 -0
  206. package/govendor/golang.org/x/sys/unix/ioctl_zos.go +71 -0
  207. package/govendor/golang.org/x/sys/unix/mkall.sh +250 -0
  208. package/govendor/golang.org/x/sys/unix/mkerrors.sh +807 -0
  209. package/govendor/golang.org/x/sys/unix/mmap_nomremap.go +13 -0
  210. package/govendor/golang.org/x/sys/unix/mremap.go +57 -0
  211. package/govendor/golang.org/x/sys/unix/pagesize_unix.go +15 -0
  212. package/govendor/golang.org/x/sys/unix/pledge_openbsd.go +111 -0
  213. package/govendor/golang.org/x/sys/unix/ptrace_darwin.go +11 -0
  214. package/govendor/golang.org/x/sys/unix/ptrace_ios.go +11 -0
  215. package/govendor/golang.org/x/sys/unix/race.go +30 -0
  216. package/govendor/golang.org/x/sys/unix/race0.go +25 -0
  217. package/govendor/golang.org/x/sys/unix/readdirent_getdents.go +12 -0
  218. package/govendor/golang.org/x/sys/unix/readdirent_getdirentries.go +19 -0
  219. package/govendor/golang.org/x/sys/unix/readv_unix.go +103 -0
  220. package/govendor/golang.org/x/sys/unix/sockcmsg_dragonfly.go +16 -0
  221. package/govendor/golang.org/x/sys/unix/sockcmsg_linux.go +85 -0
  222. package/govendor/golang.org/x/sys/unix/sockcmsg_unix.go +106 -0
  223. package/govendor/golang.org/x/sys/unix/sockcmsg_unix_other.go +46 -0
  224. package/govendor/golang.org/x/sys/unix/sockcmsg_zos.go +58 -0
  225. package/govendor/golang.org/x/sys/unix/symaddr_zos_s390x.s +75 -0
  226. package/govendor/golang.org/x/sys/unix/syscall.go +86 -0
  227. package/govendor/golang.org/x/sys/unix/syscall_aix.go +582 -0
  228. package/govendor/golang.org/x/sys/unix/syscall_aix_ppc.go +52 -0
  229. package/govendor/golang.org/x/sys/unix/syscall_aix_ppc64.go +83 -0
  230. package/govendor/golang.org/x/sys/unix/syscall_bsd.go +609 -0
  231. package/govendor/golang.org/x/sys/unix/syscall_darwin.go +711 -0
  232. package/govendor/golang.org/x/sys/unix/syscall_darwin_amd64.go +50 -0
  233. package/govendor/golang.org/x/sys/unix/syscall_darwin_arm64.go +50 -0
  234. package/govendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go +26 -0
  235. package/govendor/golang.org/x/sys/unix/syscall_dragonfly.go +359 -0
  236. package/govendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go +56 -0
  237. package/govendor/golang.org/x/sys/unix/syscall_freebsd.go +455 -0
  238. package/govendor/golang.org/x/sys/unix/syscall_freebsd_386.go +64 -0
  239. package/govendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go +64 -0
  240. package/govendor/golang.org/x/sys/unix/syscall_freebsd_arm.go +60 -0
  241. package/govendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go +60 -0
  242. package/govendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go +60 -0
  243. package/govendor/golang.org/x/sys/unix/syscall_hurd.go +30 -0
  244. package/govendor/golang.org/x/sys/unix/syscall_hurd_386.go +28 -0
  245. package/govendor/golang.org/x/sys/unix/syscall_illumos.go +78 -0
  246. package/govendor/golang.org/x/sys/unix/syscall_linux.go +2574 -0
  247. package/govendor/golang.org/x/sys/unix/syscall_linux_386.go +313 -0
  248. package/govendor/golang.org/x/sys/unix/syscall_linux_alarm.go +12 -0
  249. package/govendor/golang.org/x/sys/unix/syscall_linux_amd64.go +144 -0
  250. package/govendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go +12 -0
  251. package/govendor/golang.org/x/sys/unix/syscall_linux_arm.go +218 -0
  252. package/govendor/golang.org/x/sys/unix/syscall_linux_arm64.go +188 -0
  253. package/govendor/golang.org/x/sys/unix/syscall_linux_gc.go +14 -0
  254. package/govendor/golang.org/x/sys/unix/syscall_linux_gc_386.go +16 -0
  255. package/govendor/golang.org/x/sys/unix/syscall_linux_gc_arm.go +13 -0
  256. package/govendor/golang.org/x/sys/unix/syscall_linux_gccgo_386.go +30 -0
  257. package/govendor/golang.org/x/sys/unix/syscall_linux_gccgo_arm.go +20 -0
  258. package/govendor/golang.org/x/sys/unix/syscall_linux_loong64.go +220 -0
  259. package/govendor/golang.org/x/sys/unix/syscall_linux_mips64x.go +187 -0
  260. package/govendor/golang.org/x/sys/unix/syscall_linux_mipsx.go +173 -0
  261. package/govendor/golang.org/x/sys/unix/syscall_linux_ppc.go +203 -0
  262. package/govendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go +114 -0
  263. package/govendor/golang.org/x/sys/unix/syscall_linux_riscv64.go +193 -0
  264. package/govendor/golang.org/x/sys/unix/syscall_linux_s390x.go +295 -0
  265. package/govendor/golang.org/x/sys/unix/syscall_linux_sparc64.go +111 -0
  266. package/govendor/golang.org/x/sys/unix/syscall_netbsd.go +388 -0
  267. package/govendor/golang.org/x/sys/unix/syscall_netbsd_386.go +37 -0
  268. package/govendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go +37 -0
  269. package/govendor/golang.org/x/sys/unix/syscall_netbsd_arm.go +37 -0
  270. package/govendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go +37 -0
  271. package/govendor/golang.org/x/sys/unix/syscall_openbsd.go +346 -0
  272. package/govendor/golang.org/x/sys/unix/syscall_openbsd_386.go +41 -0
  273. package/govendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go +41 -0
  274. package/govendor/golang.org/x/sys/unix/syscall_openbsd_arm.go +41 -0
  275. package/govendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go +41 -0
  276. package/govendor/golang.org/x/sys/unix/syscall_openbsd_libc.go +26 -0
  277. package/govendor/golang.org/x/sys/unix/syscall_openbsd_mips64.go +39 -0
  278. package/govendor/golang.org/x/sys/unix/syscall_openbsd_ppc64.go +41 -0
  279. package/govendor/golang.org/x/sys/unix/syscall_openbsd_riscv64.go +41 -0
  280. package/govendor/golang.org/x/sys/unix/syscall_solaris.go +1183 -0
  281. package/govendor/golang.org/x/sys/unix/syscall_solaris_amd64.go +27 -0
  282. package/govendor/golang.org/x/sys/unix/syscall_unix.go +619 -0
  283. package/govendor/golang.org/x/sys/unix/syscall_unix_gc.go +14 -0
  284. package/govendor/golang.org/x/sys/unix/syscall_unix_gc_ppc64x.go +22 -0
  285. package/govendor/golang.org/x/sys/unix/syscall_zos_s390x.go +3213 -0
  286. package/govendor/golang.org/x/sys/unix/sysvshm_linux.go +20 -0
  287. package/govendor/golang.org/x/sys/unix/sysvshm_unix.go +51 -0
  288. package/govendor/golang.org/x/sys/unix/sysvshm_unix_other.go +13 -0
  289. package/govendor/golang.org/x/sys/unix/timestruct.go +76 -0
  290. package/govendor/golang.org/x/sys/unix/unveil_openbsd.go +51 -0
  291. package/govendor/golang.org/x/sys/unix/vgetrandom_linux.go +13 -0
  292. package/govendor/golang.org/x/sys/unix/vgetrandom_unsupported.go +11 -0
  293. package/govendor/golang.org/x/sys/unix/xattr_bsd.go +280 -0
  294. package/govendor/golang.org/x/sys/unix/zerrors_aix_ppc.go +1384 -0
  295. package/govendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go +1385 -0
  296. package/govendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go +1922 -0
  297. package/govendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go +1922 -0
  298. package/govendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go +1737 -0
  299. package/govendor/golang.org/x/sys/unix/zerrors_freebsd_386.go +2042 -0
  300. package/govendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go +2039 -0
  301. package/govendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go +2033 -0
  302. package/govendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go +2033 -0
  303. package/govendor/golang.org/x/sys/unix/zerrors_freebsd_riscv64.go +2147 -0
  304. package/govendor/golang.org/x/sys/unix/zerrors_linux.go +4209 -0
  305. package/govendor/golang.org/x/sys/unix/zerrors_linux_386.go +882 -0
  306. package/govendor/golang.org/x/sys/unix/zerrors_linux_amd64.go +882 -0
  307. package/govendor/golang.org/x/sys/unix/zerrors_linux_arm.go +887 -0
  308. package/govendor/golang.org/x/sys/unix/zerrors_linux_arm64.go +884 -0
  309. package/govendor/golang.org/x/sys/unix/zerrors_linux_loong64.go +874 -0
  310. package/govendor/golang.org/x/sys/unix/zerrors_linux_mips.go +888 -0
  311. package/govendor/golang.org/x/sys/unix/zerrors_linux_mips64.go +888 -0
  312. package/govendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go +888 -0
  313. package/govendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go +888 -0
  314. package/govendor/golang.org/x/sys/unix/zerrors_linux_ppc.go +940 -0
  315. package/govendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go +944 -0
  316. package/govendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go +944 -0
  317. package/govendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go +884 -0
  318. package/govendor/golang.org/x/sys/unix/zerrors_linux_s390x.go +943 -0
  319. package/govendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go +992 -0
  320. package/govendor/golang.org/x/sys/unix/zerrors_netbsd_386.go +1779 -0
  321. package/govendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go +1769 -0
  322. package/govendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go +1758 -0
  323. package/govendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go +1769 -0
  324. package/govendor/golang.org/x/sys/unix/zerrors_openbsd_386.go +1905 -0
  325. package/govendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go +1905 -0
  326. package/govendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go +1905 -0
  327. package/govendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go +1905 -0
  328. package/govendor/golang.org/x/sys/unix/zerrors_openbsd_mips64.go +1905 -0
  329. package/govendor/golang.org/x/sys/unix/zerrors_openbsd_ppc64.go +1904 -0
  330. package/govendor/golang.org/x/sys/unix/zerrors_openbsd_riscv64.go +1903 -0
  331. package/govendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go +1556 -0
  332. package/govendor/golang.org/x/sys/unix/zerrors_zos_s390x.go +990 -0
  333. package/govendor/golang.org/x/sys/unix/zptrace_armnn_linux.go +40 -0
  334. package/govendor/golang.org/x/sys/unix/zptrace_linux_arm64.go +17 -0
  335. package/govendor/golang.org/x/sys/unix/zptrace_mipsnn_linux.go +49 -0
  336. package/govendor/golang.org/x/sys/unix/zptrace_mipsnnle_linux.go +49 -0
  337. package/govendor/golang.org/x/sys/unix/zptrace_x86_linux.go +79 -0
  338. package/govendor/golang.org/x/sys/unix/zsymaddr_zos_s390x.s +364 -0
  339. package/govendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go +1461 -0
  340. package/govendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go +1420 -0
  341. package/govendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go +1188 -0
  342. package/govendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go +1069 -0
  343. package/govendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go +2728 -0
  344. package/govendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s +799 -0
  345. package/govendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go +2728 -0
  346. package/govendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s +799 -0
  347. package/govendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go +1666 -0
  348. package/govendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go +1886 -0
  349. package/govendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go +1886 -0
  350. package/govendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go +1886 -0
  351. package/govendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go +1886 -0
  352. package/govendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go +1886 -0
  353. package/govendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go +101 -0
  354. package/govendor/golang.org/x/sys/unix/zsyscall_linux.go +2267 -0
  355. package/govendor/golang.org/x/sys/unix/zsyscall_linux_386.go +469 -0
  356. package/govendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go +636 -0
  357. package/govendor/golang.org/x/sys/unix/zsyscall_linux_arm.go +584 -0
  358. package/govendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go +535 -0
  359. package/govendor/golang.org/x/sys/unix/zsyscall_linux_loong64.go +469 -0
  360. package/govendor/golang.org/x/sys/unix/zsyscall_linux_mips.go +636 -0
  361. package/govendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go +630 -0
  362. package/govendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go +619 -0
  363. package/govendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go +636 -0
  364. package/govendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go +641 -0
  365. package/govendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go +687 -0
  366. package/govendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go +687 -0
  367. package/govendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go +531 -0
  368. package/govendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go +478 -0
  369. package/govendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go +631 -0
  370. package/govendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go +1848 -0
  371. package/govendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go +1848 -0
  372. package/govendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go +1848 -0
  373. package/govendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go +1848 -0
  374. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go +2407 -0
  375. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s +719 -0
  376. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go +2407 -0
  377. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s +719 -0
  378. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go +2407 -0
  379. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s +719 -0
  380. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go +2407 -0
  381. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s +719 -0
  382. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go +2407 -0
  383. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s +719 -0
  384. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go +2407 -0
  385. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s +862 -0
  386. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go +2407 -0
  387. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s +719 -0
  388. package/govendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go +2217 -0
  389. package/govendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go +3458 -0
  390. package/govendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go +280 -0
  391. package/govendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go +280 -0
  392. package/govendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go +280 -0
  393. package/govendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go +280 -0
  394. package/govendor/golang.org/x/sys/unix/zsysctl_openbsd_mips64.go +280 -0
  395. package/govendor/golang.org/x/sys/unix/zsysctl_openbsd_ppc64.go +280 -0
  396. package/govendor/golang.org/x/sys/unix/zsysctl_openbsd_riscv64.go +281 -0
  397. package/govendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go +439 -0
  398. package/govendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go +437 -0
  399. package/govendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go +316 -0
  400. package/govendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go +393 -0
  401. package/govendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go +393 -0
  402. package/govendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go +393 -0
  403. package/govendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go +393 -0
  404. package/govendor/golang.org/x/sys/unix/zsysnum_freebsd_riscv64.go +393 -0
  405. package/govendor/golang.org/x/sys/unix/zsysnum_linux_386.go +470 -0
  406. package/govendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go +394 -0
  407. package/govendor/golang.org/x/sys/unix/zsysnum_linux_arm.go +434 -0
  408. package/govendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go +337 -0
  409. package/govendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go +334 -0
  410. package/govendor/golang.org/x/sys/unix/zsysnum_linux_mips.go +454 -0
  411. package/govendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go +384 -0
  412. package/govendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go +384 -0
  413. package/govendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go +454 -0
  414. package/govendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go +461 -0
  415. package/govendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go +433 -0
  416. package/govendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go +433 -0
  417. package/govendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go +338 -0
  418. package/govendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go +399 -0
  419. package/govendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go +413 -0
  420. package/govendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go +274 -0
  421. package/govendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go +274 -0
  422. package/govendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go +274 -0
  423. package/govendor/golang.org/x/sys/unix/zsysnum_netbsd_arm64.go +274 -0
  424. package/govendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go +219 -0
  425. package/govendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go +219 -0
  426. package/govendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go +219 -0
  427. package/govendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go +218 -0
  428. package/govendor/golang.org/x/sys/unix/zsysnum_openbsd_mips64.go +221 -0
  429. package/govendor/golang.org/x/sys/unix/zsysnum_openbsd_ppc64.go +217 -0
  430. package/govendor/golang.org/x/sys/unix/zsysnum_openbsd_riscv64.go +218 -0
  431. package/govendor/golang.org/x/sys/unix/zsysnum_zos_s390x.go +2852 -0
  432. package/govendor/golang.org/x/sys/unix/ztypes_aix_ppc.go +353 -0
  433. package/govendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go +357 -0
  434. package/govendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go +878 -0
  435. package/govendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go +878 -0
  436. package/govendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go +473 -0
  437. package/govendor/golang.org/x/sys/unix/ztypes_freebsd_386.go +651 -0
  438. package/govendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go +656 -0
  439. package/govendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go +642 -0
  440. package/govendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go +636 -0
  441. package/govendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go +638 -0
  442. package/govendor/golang.org/x/sys/unix/ztypes_linux.go +6547 -0
  443. package/govendor/golang.org/x/sys/unix/ztypes_linux_386.go +747 -0
  444. package/govendor/golang.org/x/sys/unix/ztypes_linux_amd64.go +761 -0
  445. package/govendor/golang.org/x/sys/unix/ztypes_linux_arm.go +741 -0
  446. package/govendor/golang.org/x/sys/unix/ztypes_linux_arm64.go +740 -0
  447. package/govendor/golang.org/x/sys/unix/ztypes_linux_loong64.go +741 -0
  448. package/govendor/golang.org/x/sys/unix/ztypes_linux_mips.go +746 -0
  449. package/govendor/golang.org/x/sys/unix/ztypes_linux_mips64.go +743 -0
  450. package/govendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go +743 -0
  451. package/govendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go +746 -0
  452. package/govendor/golang.org/x/sys/unix/ztypes_linux_ppc.go +754 -0
  453. package/govendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go +749 -0
  454. package/govendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go +749 -0
  455. package/govendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go +828 -0
  456. package/govendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +763 -0
  457. package/govendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go +744 -0
  458. package/govendor/golang.org/x/sys/unix/ztypes_netbsd_386.go +585 -0
  459. package/govendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go +593 -0
  460. package/govendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go +590 -0
  461. package/govendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go +593 -0
  462. package/govendor/golang.org/x/sys/unix/ztypes_openbsd_386.go +568 -0
  463. package/govendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go +568 -0
  464. package/govendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go +575 -0
  465. package/govendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go +568 -0
  466. package/govendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go +568 -0
  467. package/govendor/golang.org/x/sys/unix/ztypes_openbsd_ppc64.go +570 -0
  468. package/govendor/golang.org/x/sys/unix/ztypes_openbsd_riscv64.go +570 -0
  469. package/govendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go +516 -0
  470. package/govendor/golang.org/x/sys/unix/ztypes_zos_s390x.go +552 -0
  471. package/govendor/golang.org/x/sys/windows/aliases.go +13 -0
  472. package/govendor/golang.org/x/sys/windows/dll_windows.go +380 -0
  473. package/govendor/golang.org/x/sys/windows/env_windows.go +57 -0
  474. package/govendor/golang.org/x/sys/windows/eventlog.go +20 -0
  475. package/govendor/golang.org/x/sys/windows/exec_windows.go +248 -0
  476. package/govendor/golang.org/x/sys/windows/memory_windows.go +48 -0
  477. package/govendor/golang.org/x/sys/windows/mkerrors.bash +70 -0
  478. package/govendor/golang.org/x/sys/windows/mkknownfolderids.bash +27 -0
  479. package/govendor/golang.org/x/sys/windows/mksyscall.go +9 -0
  480. package/govendor/golang.org/x/sys/windows/race.go +30 -0
  481. package/govendor/golang.org/x/sys/windows/race0.go +25 -0
  482. package/govendor/golang.org/x/sys/windows/security_windows.go +1537 -0
  483. package/govendor/golang.org/x/sys/windows/service.go +257 -0
  484. package/govendor/golang.org/x/sys/windows/setupapi_windows.go +1425 -0
  485. package/govendor/golang.org/x/sys/windows/str.go +22 -0
  486. package/govendor/golang.org/x/sys/windows/syscall.go +104 -0
  487. package/govendor/golang.org/x/sys/windows/syscall_windows.go +1952 -0
  488. package/govendor/golang.org/x/sys/windows/types_windows.go +4058 -0
  489. package/govendor/golang.org/x/sys/windows/types_windows_386.go +35 -0
  490. package/govendor/golang.org/x/sys/windows/types_windows_amd64.go +34 -0
  491. package/govendor/golang.org/x/sys/windows/types_windows_arm.go +35 -0
  492. package/govendor/golang.org/x/sys/windows/types_windows_arm64.go +34 -0
  493. package/govendor/golang.org/x/sys/windows/zerrors_windows.go +9468 -0
  494. package/govendor/golang.org/x/sys/windows/zknownfolderids_windows.go +149 -0
  495. package/govendor/golang.org/x/sys/windows/zsyscall_windows.go +4828 -0
  496. package/govendor/manifest.txt +7 -0
  497. package/package.json +6 -1
  498. package/types/typenative-go.d.ts +15159 -5
  499. package/types/typenative-npm.d.ts +2637 -34
  500. package/types/typenative.d.ts +651 -8
@@ -0,0 +1,1500 @@
1
+ // node:http / node:https — servers and clients on Go's net/http.
2
+ //
3
+ // Server: a net/http handler goroutine per request streams the body into an
4
+ // IncomingMessage (a Readable) and posts 'request' to the loop; the
5
+ // ServerResponse (a Writable) queues header / body / end operations that the
6
+ // handler goroutine applies, so the ResponseWriter is only touched there.
7
+ // Client: http.request returns a ClientRequest (a Writable); the request goes
8
+ // out on the first write or on end(), the response is an IncomingMessage.
9
+ // Like Node: no redirects are followed and bodies are not decompressed.
10
+ import { defineClass, defineHelper, defineModule, setResults } from './registry.js';
11
+ import { STREAM_METHODS, STREAM_GETTERS, streamListenerTypes } from './stream.js';
12
+ import { SERVER_METHODS } from './net.js';
13
+ const httpHelper = `// node:http
14
+ var TnHttpMethods = []string{"ACL", "BIND", "CHECKOUT", "CONNECT", "COPY", "DELETE", "GET", "HEAD", "LINK", "LOCK", "M-SEARCH", "MERGE", "MKACTIVITY", "MKCALENDAR", "MKCOL", "MOVE", "NOTIFY", "OPTIONS", "PATCH", "POST", "PROPFIND", "PROPPATCH", "PURGE", "PUT", "QUERY", "REBIND", "REPORT", "SEARCH", "SOURCE", "SUBSCRIBE", "TRACE", "UNBIND", "UNLINK", "UNLOCK", "UNSUBSCRIBE"}
15
+
16
+ // http.STATUS_CODES
17
+ func TnHttpStatusCodes() *TnMap[float64, string] {
18
+ m := TnNewMap[float64, string]()
19
+ for code := 100; code < 600; code++ {
20
+ if text := tnStatusText(code); text != "" {
21
+ m.Set(float64(code), text)
22
+ }
23
+ }
24
+ return m
25
+ }
26
+
27
+ // Node's reason phrases where they differ from Go's
28
+ func tnStatusText(code int) string {
29
+ switch code {
30
+ case 302:
31
+ return "Found"
32
+ case 413:
33
+ return "Payload Too Large"
34
+ case 414:
35
+ return "URI Too Long"
36
+ case 416:
37
+ return "Range Not Satisfiable"
38
+ case 418:
39
+ return "I'm a Teapot"
40
+ case 509:
41
+ return "Bandwidth Limit Exceeded"
42
+ }
43
+ return http.StatusText(code)
44
+ }
45
+
46
+ // Name / value pairs of a dynamic object (records, object literals, maps)
47
+ func tnEntries(v interface{}) [][2]interface{} {
48
+ out := [][2]interface{}{}
49
+ if v == nil || TnIsNil(v) {
50
+ return out
51
+ }
52
+ if withEntries, ok := v.(interface{ Entries() [][]interface{} }); ok {
53
+ for _, e := range withEntries.Entries() {
54
+ out = append(out, [2]interface{}{fmt.Sprint(e[0]), e[1]})
55
+ }
56
+ return out
57
+ }
58
+ switch m := v.(type) {
59
+ case map[string]interface{}:
60
+ keys := make([]string, 0, len(m))
61
+ for k := range m {
62
+ keys = append(keys, k)
63
+ }
64
+ sort.Strings(keys)
65
+ for _, k := range keys {
66
+ out = append(out, [2]interface{}{k, m[k]})
67
+ }
68
+ return out
69
+ case map[string]string:
70
+ keys := make([]string, 0, len(m))
71
+ for k := range m {
72
+ keys = append(keys, k)
73
+ }
74
+ sort.Strings(keys)
75
+ for _, k := range keys {
76
+ out = append(out, [2]interface{}{k, m[k]})
77
+ }
78
+ return out
79
+ case [][]string:
80
+ for _, pair := range m {
81
+ if len(pair) == 2 {
82
+ out = append(out, [2]interface{}{pair[0], pair[1]})
83
+ }
84
+ }
85
+ return out
86
+ case []string:
87
+ for i := 0; i+1 < len(m); i += 2 {
88
+ out = append(out, [2]interface{}{m[i], m[i+1]})
89
+ }
90
+ return out
91
+ }
92
+ rv := reflect.ValueOf(v)
93
+ if rv.Kind() == reflect.Pointer && !rv.IsNil() && rv.Elem().Kind() == reflect.Struct {
94
+ sv := rv.Elem()
95
+ for i := 0; i < sv.NumField(); i++ {
96
+ f := sv.Field(i)
97
+ name := sv.Type().Field(i).Name
98
+ if tag := sv.Type().Field(i).Tag.Get("json"); tag != "" && tag != "-" {
99
+ name = strings.Split(tag, ",")[0]
100
+ }
101
+ value := reflect.NewAt(f.Type(), unsafe.Pointer(f.UnsafeAddr())).Elem().Interface()
102
+ out = append(out, [2]interface{}{strings.TrimSuffix(name, "_"), value})
103
+ }
104
+ }
105
+ return out
106
+ }
107
+
108
+ // Header values as strings: arrays become several values
109
+ func tnHeaderStrings(v interface{}) []string {
110
+ switch x := v.(type) {
111
+ case nil:
112
+ return nil
113
+ case string:
114
+ return []string{x}
115
+ case []string:
116
+ return x
117
+ case []interface{}:
118
+ out := []string{}
119
+ for _, item := range x {
120
+ out = append(out, TnJSString(item))
121
+ }
122
+ return out
123
+ }
124
+ if n, ok := tnNetNumber(v); ok {
125
+ return []string{strconv.FormatFloat(n, 'f', -1, 64)}
126
+ }
127
+ return []string{TnJSString(v)}
128
+ }
129
+
130
+ // Outgoing headers: case-insensitive, keeping the first spelling and the order
131
+ type tnHeaderStore struct {
132
+ names map[string]string
133
+ values map[string]interface{}
134
+ order []string
135
+ }
136
+
137
+ func newTnHeaderStore() *tnHeaderStore {
138
+ return &tnHeaderStore{names: map[string]string{}, values: map[string]interface{}{}}
139
+ }
140
+
141
+ func (h *tnHeaderStore) set(name string, value interface{}) {
142
+ key := strings.ToLower(name)
143
+ if _, ok := h.values[key]; !ok {
144
+ h.order = append(h.order, key)
145
+ h.names[key] = name
146
+ }
147
+ h.values[key] = value
148
+ }
149
+
150
+ func (h *tnHeaderStore) get(name string) interface{} { return h.values[strings.ToLower(name)] }
151
+
152
+ func (h *tnHeaderStore) has(name string) bool {
153
+ _, ok := h.values[strings.ToLower(name)]
154
+ return ok
155
+ }
156
+
157
+ func (h *tnHeaderStore) remove(name string) {
158
+ key := strings.ToLower(name)
159
+ if _, ok := h.values[key]; !ok {
160
+ return
161
+ }
162
+ delete(h.values, key)
163
+ delete(h.names, key)
164
+ for i, k := range h.order {
165
+ if k == key {
166
+ h.order = append(h.order[:i], h.order[i+1:]...)
167
+ break
168
+ }
169
+ }
170
+ }
171
+
172
+ func (h *tnHeaderStore) record() *TnMap[string, interface{}] {
173
+ m := TnNewMap[string, interface{}]()
174
+ for _, k := range h.order {
175
+ m.Set(k, h.values[k])
176
+ }
177
+ return m
178
+ }
179
+
180
+ func (h *tnHeaderStore) keys() []string {
181
+ return append([]string{}, h.order...)
182
+ }
183
+
184
+ func (h *tnHeaderStore) rawNames() []string {
185
+ out := []string{}
186
+ for _, k := range h.order {
187
+ out = append(out, h.names[k])
188
+ }
189
+ return out
190
+ }
191
+
192
+ func (h *tnHeaderStore) toGo(dst http.Header) {
193
+ for _, k := range h.order {
194
+ name := h.names[k]
195
+ dst.Del(name)
196
+ for _, v := range tnHeaderStrings(h.values[k]) {
197
+ dst[http.CanonicalHeaderKey(name)] = append(dst[http.CanonicalHeaderKey(name)], v)
198
+ }
199
+ }
200
+ }
201
+
202
+ func (h *tnHeaderStore) setAll(headers interface{}) {
203
+ for _, e := range tnEntries(headers) {
204
+ h.set(fmt.Sprint(e[0]), e[1])
205
+ }
206
+ }
207
+
208
+ // http.IncomingMessage: a request on the server, a response on the client
209
+ type TnIncomingMessage struct {
210
+ TnStream
211
+ method string
212
+ url string
213
+ httpVersion string
214
+ httpVersionMajor float64
215
+ httpVersionMinor float64
216
+ headers *TnMap[string, string]
217
+ headersDistinct *TnMap[string, []string]
218
+ rawHeaders []string
219
+ trailers *TnMap[string, string]
220
+ statusCode float64
221
+ statusMessage string
222
+ complete bool
223
+ aborted bool
224
+ socket *TnSocket
225
+ }
226
+
227
+ func (m *TnIncomingMessage) Get_socket() *TnSocket { return m.socket }
228
+ func (m *TnIncomingMessage) Get_connection() *TnSocket { return m.socket }
229
+ func (m *TnIncomingMessage) setTimeout(ms float64, cb ...interface{}) *TnIncomingMessage {
230
+ if m.socket != nil {
231
+ m.socket.setTimeout(ms, cb...)
232
+ }
233
+ return m
234
+ }
235
+
236
+ // Headers as Node shows them: lower-case names, repeated values joined
237
+ func tnIncomingHeaders(m *TnIncomingMessage, h http.Header, host string, chunked bool) {
238
+ m.headers = TnNewMap[string, string]()
239
+ m.headersDistinct = TnNewMap[string, []string]()
240
+ m.rawHeaders = []string{}
241
+ add := func(name string, values []string) {
242
+ key := strings.ToLower(name)
243
+ for _, v := range values {
244
+ m.rawHeaders = append(m.rawHeaders, name, v)
245
+ }
246
+ m.headersDistinct.Set(key, append([]string{}, values...))
247
+ sep := ", "
248
+ if key == "cookie" {
249
+ sep = "; "
250
+ }
251
+ m.headers.Set(key, strings.Join(values, sep))
252
+ }
253
+ if host != "" {
254
+ add("Host", []string{host})
255
+ }
256
+ names := make([]string, 0, len(h))
257
+ for name := range h {
258
+ names = append(names, name)
259
+ }
260
+ sort.Strings(names)
261
+ for _, name := range names {
262
+ add(name, h[name])
263
+ }
264
+ if chunked && !m.headers.Has("transfer-encoding") {
265
+ add("Transfer-Encoding", []string{"chunked"})
266
+ }
267
+ }
268
+
269
+ func tnNewIncoming() *TnIncomingMessage {
270
+ m := &TnIncomingMessage{}
271
+ m.TnStream = *TnNewReadable()
272
+ m.tnSelf = m
273
+ m.trailers = TnNewMap[string, string]()
274
+ return m
275
+ }
276
+
277
+ // Streams a body into the message on a goroutine; done runs (off the loop) at the end
278
+ func tnPumpBody(body io.ReadCloser, m *TnIncomingMessage, done func()) {
279
+ go func() {
280
+ defer done()
281
+ defer body.Close()
282
+ buf := make([]byte, 32768)
283
+ for {
284
+ n, err := body.Read(buf)
285
+ if n > 0 {
286
+ chunk := append([]byte{}, buf[:n]...)
287
+ TnLoopPost(func() {
288
+ if !m.destroyed {
289
+ m.push(chunk)
290
+ }
291
+ })
292
+ }
293
+ if err != nil {
294
+ TnLoopPost(func() {
295
+ if m.destroyed {
296
+ return
297
+ }
298
+ if err == io.EOF {
299
+ m.complete = true
300
+ m.push(nil)
301
+ return
302
+ }
303
+ m.aborted = true
304
+ m.destroy(TnNodeError("Error", "ECONNRESET", "aborted"))
305
+ })
306
+ return
307
+ }
308
+ }
309
+ }()
310
+ }
311
+
312
+ // A socket that only reports addresses (requests and responses)
313
+ func tnInfoSocket(local net.Addr, remote string) *TnSocket {
314
+ s := TnNewSocket()
315
+ if host, port, err := net.SplitHostPort(remote); err == nil {
316
+ s.remoteAddress, s.remoteFamily = host, tnFamily(host)
317
+ if p, err := strconv.ParseFloat(port, 64); err == nil {
318
+ s.remotePort = p
319
+ }
320
+ }
321
+ if a := tnAddrInfo(local); a != nil && a.port >= 0 {
322
+ s.localAddress, s.localPort = a.address, a.port
323
+ }
324
+ return s
325
+ }
326
+
327
+ // One operation of a response, applied by the handler goroutine
328
+ type tnResOp struct {
329
+ status int
330
+ header http.Header
331
+ data []byte
332
+ end bool
333
+ done func(err error)
334
+ }
335
+
336
+ // http.ServerResponse
337
+ type TnServerResponse struct {
338
+ TnStream
339
+ statusCode float64
340
+ statusMessage string
341
+ sendDate bool
342
+ headersSent bool
343
+ wroteData bool
344
+ store *tnHeaderStore
345
+ req *TnIncomingMessage
346
+ mu sync.Mutex
347
+ ops []tnResOp
348
+ signal chan struct{}
349
+ }
350
+
351
+ func (res *TnServerResponse) Get_headersSent() bool { return res.headersSent }
352
+ func (res *TnServerResponse) Get_req() *TnIncomingMessage { return res.req }
353
+ func (res *TnServerResponse) Get_socket() *TnSocket { return res.req.socket }
354
+
355
+ func (res *TnServerResponse) post(op tnResOp) {
356
+ res.mu.Lock()
357
+ res.ops = append(res.ops, op)
358
+ res.mu.Unlock()
359
+ select {
360
+ case res.signal <- struct{}{}:
361
+ default:
362
+ }
363
+ }
364
+
365
+ func (res *TnServerResponse) take() []tnResOp {
366
+ res.mu.Lock()
367
+ defer res.mu.Unlock()
368
+ ops := res.ops
369
+ res.ops = nil
370
+ return ops
371
+ }
372
+
373
+ func (res *TnServerResponse) headerOp() tnResOp {
374
+ h := http.Header{}
375
+ res.store.toGo(h)
376
+ if !res.sendDate {
377
+ h["Date"] = nil
378
+ }
379
+ res.headersSent = true
380
+ return tnResOp{status: int(res.statusCode), header: h}
381
+ }
382
+
383
+ func (res *TnServerResponse) setHeader(name string, value interface{}) *TnServerResponse {
384
+ if res.headersSent {
385
+ panic(TnNodeError("Error", "ERR_HTTP_HEADERS_SENT", "Cannot set headers after they are sent to the client"))
386
+ }
387
+ res.store.set(name, value)
388
+ return res
389
+ }
390
+
391
+ func (res *TnServerResponse) setHeaders(headers interface{}) *TnServerResponse {
392
+ for _, e := range tnEntries(headers) {
393
+ res.setHeader(fmt.Sprint(e[0]), e[1])
394
+ }
395
+ return res
396
+ }
397
+
398
+ func (res *TnServerResponse) appendHeader(name string, value interface{}) *TnServerResponse {
399
+ current := tnHeaderStrings(res.store.get(name))
400
+ res.store.set(name, append(current, tnHeaderStrings(value)...))
401
+ return res
402
+ }
403
+
404
+ func (res *TnServerResponse) getHeader(name string) interface{} { return res.store.get(name) }
405
+ func (res *TnServerResponse) getHeaders() *TnMap[string, interface{}] { return res.store.record() }
406
+ func (res *TnServerResponse) getHeaderNames() []string { return res.store.keys() }
407
+ func (res *TnServerResponse) hasHeader(name string) bool { return res.store.has(name) }
408
+ func (res *TnServerResponse) removeHeader(name string) { res.store.remove(name) }
409
+
410
+ // writeHead(status, [statusMessage], [headers])
411
+ func (res *TnServerResponse) writeHead(status float64, args ...interface{}) *TnServerResponse {
412
+ if res.headersSent {
413
+ panic(TnNodeError("Error", "ERR_HTTP_HEADERS_SENT", "Cannot write headers after they are sent to the client"))
414
+ }
415
+ res.statusCode = status
416
+ for _, a := range args {
417
+ if s, ok := a.(string); ok {
418
+ res.statusMessage = s
419
+ } else if a != nil {
420
+ for _, e := range tnEntries(a) {
421
+ res.store.set(fmt.Sprint(e[0]), e[1])
422
+ }
423
+ }
424
+ }
425
+ res.post(res.headerOp())
426
+ return res
427
+ }
428
+
429
+ func (res *TnServerResponse) flushHeaders() {
430
+ if !res.headersSent {
431
+ res.post(res.headerOp())
432
+ }
433
+ }
434
+
435
+ func (res *TnServerResponse) writeContinue() {}
436
+
437
+ // end(data?): a body written in one piece gets a Content-Length, as in Node
438
+ func (res *TnServerResponse) end(args ...interface{}) *TnServerResponse {
439
+ if !res.headersSent && !res.wroteData && !res.store.has("content-length") && !res.store.has("transfer-encoding") {
440
+ size := 0
441
+ if len(args) > 0 {
442
+ switch d := args[0].(type) {
443
+ case string:
444
+ enc := ""
445
+ if len(args) > 1 {
446
+ enc, _ = args[1].(string)
447
+ }
448
+ size = len(TnBufferFromString(d, enc))
449
+ case []byte:
450
+ size = len(d)
451
+ }
452
+ }
453
+ if res.req == nil || res.req.method != "HEAD" {
454
+ res.store.set("Content-Length", strconv.Itoa(size))
455
+ }
456
+ }
457
+ res.TnStream.end(args...)
458
+ return res
459
+ }
460
+
461
+ func (res *TnServerResponse) setTimeout(ms float64, cb ...interface{}) *TnServerResponse {
462
+ res.req.setTimeout(ms, cb...)
463
+ return res
464
+ }
465
+
466
+ func tnNewServerResponse(req *TnIncomingMessage) *TnServerResponse {
467
+ res := &TnServerResponse{statusCode: 200, sendDate: true, store: newTnHeaderStore(), req: req, signal: make(chan struct{}, 1)}
468
+ res.TnStream = *TnNewWritable()
469
+ res.tnSelf = res
470
+ res.sink = func(chunk interface{}, done func(err interface{})) {
471
+ if !res.headersSent {
472
+ res.post(res.headerOp())
473
+ }
474
+ var data []byte
475
+ switch c := chunk.(type) {
476
+ case []byte:
477
+ data = c
478
+ case string:
479
+ data = []byte(c)
480
+ }
481
+ res.wroteData = true
482
+ res.post(tnResOp{data: data, done: func(err error) {
483
+ TnLoopPost(func() {
484
+ if err != nil {
485
+ done(TnNetError(err, "write", "", -1))
486
+ } else {
487
+ done(nil)
488
+ }
489
+ })
490
+ }})
491
+ }
492
+ res.sinkFinal = func(done func(err interface{})) {
493
+ if !res.headersSent {
494
+ res.post(res.headerOp())
495
+ }
496
+ res.post(tnResOp{end: true, done: func(err error) {
497
+ TnLoopPost(func() { done(nil) })
498
+ }})
499
+ }
500
+ return res
501
+ }
502
+
503
+ // http.Server: a net.Server whose connections are served by net/http
504
+ type TnHttpServer struct {
505
+ TnNetServer
506
+ httpServer *http.Server
507
+ tlsConfig *tls.Config
508
+ inFlight sync.WaitGroup
509
+ timeout float64
510
+ keepAliveTimeout float64
511
+ headersTimeout float64
512
+ requestTimeout float64
513
+ maxHeadersCount interface{}
514
+ // node:http2 servers (pseudo-headers, the 'stream' API)
515
+ h2 bool
516
+ }
517
+
518
+ // Set by node:http2: serves an HTTP/2 request through the 'stream' API (false when not handled)
519
+ var tnHttp2StreamHook func(hs *TnHttpServer, w http.ResponseWriter, r *http.Request) bool
520
+
521
+ func (hs *TnHttpServer) Get_timeout() float64 { return hs.timeout }
522
+ func (hs *TnHttpServer) Set_timeout(v float64) { hs.timeout = v }
523
+ func (hs *TnHttpServer) Get_keepAliveTimeout() float64 { return hs.keepAliveTimeout }
524
+ func (hs *TnHttpServer) Set_keepAliveTimeout(v float64) { hs.keepAliveTimeout = v }
525
+ func (hs *TnHttpServer) Get_headersTimeout() float64 { return hs.headersTimeout }
526
+ func (hs *TnHttpServer) Set_headersTimeout(v float64) { hs.headersTimeout = v }
527
+ func (hs *TnHttpServer) Get_requestTimeout() float64 { return hs.requestTimeout }
528
+ func (hs *TnHttpServer) Set_requestTimeout(v float64) { hs.requestTimeout = v }
529
+
530
+ func (hs *TnHttpServer) setTimeout(ms float64, cb ...interface{}) *TnHttpServer {
531
+ hs.timeout = ms
532
+ return hs
533
+ }
534
+
535
+ func (hs *TnHttpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
536
+ if hs.h2 && tnHttp2StreamHook != nil && tnHttp2StreamHook(hs, w, r) {
537
+ return
538
+ }
539
+ TnLoopRef()
540
+ defer TnLoopUnref()
541
+ var local net.Addr
542
+ if a, ok := r.Context().Value(http.LocalAddrContextKey).(net.Addr); ok {
543
+ local = a
544
+ }
545
+ if r.ProtoMajor == 1 && hs.serveUpgrade(w, r, local) {
546
+ return
547
+ }
548
+ http.NewResponseController(w).EnableFullDuplex()
549
+ // The messages are created on the loop (streams capture its async context)
550
+ created := make(chan *TnServerResponse, 1)
551
+ bodyDone := make(chan struct{})
552
+ TnLoopPost(func() {
553
+ TnAsyncRun(hs.asyncCtx, func() {
554
+ req := hs.incoming(r, local)
555
+ req.socket = tnInfoSocket(local, r.RemoteAddr)
556
+ if r.TLS != nil {
557
+ req.socket.encrypted = true
558
+ }
559
+ res := tnNewServerResponse(req)
560
+ created <- res
561
+ hs.emit("request", req, res)
562
+ tnPumpBody(r.Body, req, func() { close(bodyDone) })
563
+ })
564
+ })
565
+ res := <-created
566
+ req := res.req
567
+ tnServeOps(w, r, res, func() {
568
+ if !res.finished {
569
+ req.aborted = true
570
+ res.destroy()
571
+ }
572
+ }, bodyDone)
573
+ }
574
+
575
+ // The IncomingMessage of a request (on the loop)
576
+ func (hs *TnHttpServer) incoming(r *http.Request, local net.Addr) *TnIncomingMessage {
577
+ req := tnNewIncoming()
578
+ req.method = r.Method
579
+ req.url = r.RequestURI
580
+ req.httpVersion = strconv.Itoa(r.ProtoMajor) + "." + strconv.Itoa(r.ProtoMinor)
581
+ req.httpVersionMajor, req.httpVersionMinor = float64(r.ProtoMajor), float64(r.ProtoMinor)
582
+ tnIncomingHeaders(req, r.Header, r.Host, len(r.TransferEncoding) > 0 && r.TransferEncoding[0] == "chunked")
583
+ if hs.h2 && r.ProtoMajor == 2 {
584
+ tnPseudoHeaders(req, r)
585
+ }
586
+ return req
587
+ }
588
+
589
+ func tnHeaderHasToken(h http.Header, name string, token string) bool {
590
+ for _, v := range h.Values(name) {
591
+ for _, part := range strings.Split(v, ",") {
592
+ if strings.EqualFold(strings.TrimSpace(part), token) {
593
+ return true
594
+ }
595
+ }
596
+ }
597
+ return false
598
+ }
599
+
600
+ // 'connect' (CONNECT requests) and 'upgrade' (Connection: Upgrade) take over the
601
+ // connection: (req, socket, head). An upgrade nobody listens for is a normal request;
602
+ // a CONNECT nobody listens for closes the connection.
603
+ func (hs *TnHttpServer) serveUpgrade(w http.ResponseWriter, r *http.Request, local net.Addr) bool {
604
+ event := ""
605
+ if r.Method == http.MethodConnect {
606
+ event = "connect"
607
+ } else if r.Header.Get("Upgrade") != "" && tnHeaderHasToken(r.Header, "Connection", "upgrade") {
608
+ event = "upgrade"
609
+ }
610
+ if event == "" {
611
+ return false
612
+ }
613
+ listening := false
614
+ TnLoopCall(func() { listening = hs.listenerCount(event) > 0 })
615
+ if !listening {
616
+ if event == "upgrade" {
617
+ return false
618
+ }
619
+ if conn, _, err := http.NewResponseController(w).Hijack(); err == nil {
620
+ conn.Close()
621
+ }
622
+ return true
623
+ }
624
+ conn, rw, err := http.NewResponseController(w).Hijack()
625
+ if err != nil {
626
+ return false
627
+ }
628
+ head := []byte{}
629
+ if n := rw.Reader.Buffered(); n > 0 {
630
+ peeked, _ := rw.Reader.Peek(n)
631
+ head = append(head, peeked...)
632
+ }
633
+ TnLoopCall(func() {
634
+ TnAsyncRun(hs.asyncCtx, func() {
635
+ req := hs.incoming(r, local)
636
+ req.complete = true
637
+ req.push(nil)
638
+ socket := TnNewSocket()
639
+ socket.attach(conn)
640
+ if r.TLS != nil {
641
+ socket.encrypted = true
642
+ }
643
+ req.socket = socket
644
+ hs.emit(event, req, socket, head)
645
+ })
646
+ })
647
+ return true
648
+ }
649
+
650
+ // HTTP/2 requests carry :method / :scheme / :authority / :path first, as in Node
651
+ func tnPseudoHeaders(req *TnIncomingMessage, r *http.Request) {
652
+ scheme := "http"
653
+ if r.TLS != nil {
654
+ scheme = "https"
655
+ }
656
+ headers := TnNewMap[string, string]()
657
+ headers.Set(":method", r.Method)
658
+ headers.Set(":scheme", scheme)
659
+ headers.Set(":authority", r.Host)
660
+ headers.Set(":path", r.RequestURI)
661
+ for k, v := range req.headers.All() {
662
+ if k != "host" {
663
+ headers.Set(k, v)
664
+ }
665
+ }
666
+ req.headers = headers
667
+ }
668
+
669
+ // Applies a response's queued operations on the handler goroutine until it ends
670
+ // (or the client goes away: abort runs on the loop)
671
+ func tnServeOps(w http.ResponseWriter, r *http.Request, res *TnServerResponse, abort func(), bodyDone chan struct{}) {
672
+ rc := http.NewResponseController(w)
673
+ for {
674
+ ended := false
675
+ for _, op := range res.take() {
676
+ switch {
677
+ case op.header != nil:
678
+ for k, v := range op.header {
679
+ if v == nil {
680
+ w.Header()[k] = nil
681
+ } else {
682
+ w.Header()[k] = v
683
+ }
684
+ }
685
+ w.WriteHeader(op.status)
686
+ rc.Flush()
687
+ case op.end:
688
+ ended = true
689
+ op.done(nil)
690
+ default:
691
+ _, err := w.Write(op.data)
692
+ if err == nil {
693
+ err = rc.Flush()
694
+ }
695
+ op.done(err)
696
+ }
697
+ }
698
+ if ended {
699
+ break
700
+ }
701
+ select {
702
+ case <-res.signal:
703
+ case <-r.Context().Done():
704
+ TnLoopPost(abort)
705
+ <-bodyDone
706
+ return
707
+ }
708
+ }
709
+ <-bodyDone
710
+ }
711
+
712
+ func TnNewHttpServer(secure bool, args ...interface{}) *TnHttpServer {
713
+ hs := &TnHttpServer{keepAliveTimeout: 5000, headersTimeout: 60000, requestTimeout: 300000}
714
+ hs.TnNetServer = *TnNewNetServer()
715
+ hs.connectionEvent = "connection"
716
+ for _, a := range args {
717
+ if tnIsFunc(a) {
718
+ hs.on("request", a)
719
+ } else if a != nil && secure {
720
+ cfg, err := tnTLSServerConfig(a)
721
+ if err != nil {
722
+ panic(err)
723
+ }
724
+ hs.tlsConfig = cfg
725
+ }
726
+ }
727
+ hs.httpServer = &http.Server{Handler: hs, ErrorLog: log.New(io.Discard, "", 0)}
728
+ hs.serve = func(ln net.Listener) {
729
+ if hs.tlsConfig != nil {
730
+ ln = tls.NewListener(ln, hs.tlsConfig)
731
+ }
732
+ hs.httpServer.IdleTimeout = time.Duration(hs.keepAliveTimeout * float64(time.Millisecond))
733
+ hs.httpServer.Serve(ln)
734
+ }
735
+ return hs
736
+ }
737
+
738
+ // close(cb?): stops listening, closes idle connections, 'close' once requests finish
739
+ func (hs *TnHttpServer) close(cb ...interface{}) *TnHttpServer {
740
+ if len(cb) > 0 && tnIsFunc(cb[0]) {
741
+ fn := cb[0]
742
+ if hs.ln == nil {
743
+ err := TnNodeError("Error", "ERR_SERVER_NOT_RUNNING", "Server is not running.")
744
+ TnLoopPost(func() { TnInvoke(fn, err) })
745
+ } else {
746
+ hs.TnEventEmitter.once("close", func() { TnInvoke(fn, nil) })
747
+ }
748
+ }
749
+ if hs.ln == nil {
750
+ return hs
751
+ }
752
+ // Closing the listener first also covers a Serve that has not started yet
753
+ hs.ln.Close()
754
+ hs.ln = nil
755
+ hs.listening = false
756
+ TnLoopRef()
757
+ go func() {
758
+ hs.httpServer.Shutdown(context.Background())
759
+ TnLoopPost(func() {
760
+ defer TnLoopUnref()
761
+ if hs.refd {
762
+ hs.refd = false
763
+ TnLoopUnref()
764
+ }
765
+ hs.emit("close")
766
+ })
767
+ }()
768
+ return hs
769
+ }
770
+
771
+ func (hs *TnHttpServer) closeAllConnections() {
772
+ if hs.httpServer != nil {
773
+ hs.httpServer.Close()
774
+ }
775
+ }
776
+
777
+ func (hs *TnHttpServer) closeIdleConnections() {
778
+ if hs.httpServer != nil {
779
+ hs.httpServer.SetKeepAlivesEnabled(false)
780
+ hs.httpServer.SetKeepAlivesEnabled(true)
781
+ }
782
+ }
783
+
784
+ func (hs *TnHttpServer) listen(args ...interface{}) *TnHttpServer {
785
+ hs.TnNetServer.listen(args...)
786
+ return hs
787
+ }
788
+
789
+ // --- client ---
790
+
791
+ // http.Agent: accepted for compatibility (Go's transport pools connections)
792
+ type TnHttpAgent struct {
793
+ keepAlive bool
794
+ maxSockets float64
795
+ options interface{}
796
+ }
797
+
798
+ func TnNewHttpAgent(options ...interface{}) *TnHttpAgent {
799
+ a := &TnHttpAgent{maxSockets: math.Inf(1)}
800
+ if len(options) > 0 && options[0] != nil {
801
+ a.options = options[0]
802
+ a.keepAlive, _ = TnGet(options[0], "keepAlive").(bool)
803
+ if n, ok := tnNetNumber(TnGet(options[0], "maxSockets")); ok {
804
+ a.maxSockets = n
805
+ }
806
+ }
807
+ return a
808
+ }
809
+
810
+ func (a *TnHttpAgent) destroy() {}
811
+
812
+ var tnHttpTransports sync.Map
813
+
814
+ func tnHttpTransport(cfg *tls.Config, key string) *http.Transport {
815
+ if t, ok := tnHttpTransports.Load(key); ok {
816
+ return t.(*http.Transport)
817
+ }
818
+ t := &http.Transport{
819
+ Proxy: nil,
820
+ DisableCompression: true,
821
+ TLSClientConfig: cfg,
822
+ ForceAttemptHTTP2: false,
823
+ IdleConnTimeout: 5 * time.Second,
824
+ }
825
+ tnHttpTransports.Store(key, t)
826
+ return t
827
+ }
828
+
829
+ type TnClientRequest struct {
830
+ TnStream
831
+ method string
832
+ path string
833
+ host string
834
+ protocol string
835
+ port string
836
+ store *tnHeaderStore
837
+ started bool
838
+ aborted bool
839
+ gotResponse bool
840
+ reusedSocket bool
841
+ maxHeadersCount interface{}
842
+ bodyWriter *io.PipeWriter
843
+ cancel context.CancelFunc
844
+ tlsConfig *tls.Config
845
+ tlsKey string
846
+ timeoutMs float64
847
+ timer *time.Timer
848
+ auth string
849
+ setHost bool
850
+ socketPath string
851
+ signal *TnAbortSignal
852
+ res *TnIncomingMessage
853
+ }
854
+
855
+ func (cr *TnClientRequest) Get_headersSent() bool { return cr.started }
856
+ func (cr *TnClientRequest) Get_socket() *TnSocket { return TnNewSocket() }
857
+
858
+ func (cr *TnClientRequest) setHeader(name string, value interface{}) *TnClientRequest {
859
+ if cr.started {
860
+ panic(TnNodeError("Error", "ERR_HTTP_HEADERS_SENT", "Cannot set headers after they are sent to the client"))
861
+ }
862
+ cr.store.set(name, value)
863
+ return cr
864
+ }
865
+ func (cr *TnClientRequest) getHeader(name string) interface{} { return cr.store.get(name) }
866
+ func (cr *TnClientRequest) getHeaders() *TnMap[string, interface{}] { return cr.store.record() }
867
+ func (cr *TnClientRequest) getHeaderNames() []string { return cr.store.keys() }
868
+ func (cr *TnClientRequest) getRawHeaderNames() []string { return cr.store.rawNames() }
869
+ func (cr *TnClientRequest) hasHeader(name string) bool { return cr.store.has(name) }
870
+ func (cr *TnClientRequest) removeHeader(name string) { cr.store.remove(name) }
871
+ func (cr *TnClientRequest) flushHeaders() {}
872
+ func (cr *TnClientRequest) setNoDelay(args ...interface{}) {}
873
+ func (cr *TnClientRequest) setSocketKeepAlive(args ...interface{}) {}
874
+
875
+ func (cr *TnClientRequest) setTimeout(ms float64, cb ...interface{}) *TnClientRequest {
876
+ cr.timeoutMs = ms
877
+ if len(cb) > 0 && tnIsFunc(cb[0]) {
878
+ cr.TnEventEmitter.once("timeout", cb[0])
879
+ }
880
+ if cr.started {
881
+ cr.armTimer()
882
+ }
883
+ return cr
884
+ }
885
+
886
+ func (cr *TnClientRequest) armTimer() {
887
+ if cr.timer != nil {
888
+ cr.timer.Stop()
889
+ }
890
+ if cr.timeoutMs <= 0 {
891
+ return
892
+ }
893
+ cr.timer = time.AfterFunc(time.Duration(cr.timeoutMs*float64(time.Millisecond)), func() {
894
+ TnLoopPost(func() {
895
+ if !cr.destroyed && !cr.gotResponse {
896
+ cr.emit("timeout")
897
+ }
898
+ })
899
+ })
900
+ }
901
+
902
+ // destroy(err?): a request without a response fails with 'socket hang up', as in Node
903
+ func (cr *TnClientRequest) destroy(err ...interface{}) *TnClientRequest {
904
+ if cr.destroyed {
905
+ return cr
906
+ }
907
+ var e interface{}
908
+ if len(err) > 0 && err[0] != nil && !TnIsNil(err[0]) {
909
+ e = err[0]
910
+ } else if !cr.gotResponse && !cr.aborted {
911
+ e = TnNodeError("Error", "ECONNRESET", "socket hang up")
912
+ }
913
+ if e != nil {
914
+ cr.TnStream.destroy(e)
915
+ } else {
916
+ cr.TnStream.destroy()
917
+ }
918
+ return cr
919
+ }
920
+
921
+ func (cr *TnClientRequest) abort() {
922
+ cr.aborted = true
923
+ cr.destroy()
924
+ }
925
+
926
+ // end(data?): a body sent in one piece gets a Content-Length, as in Node
927
+ func (cr *TnClientRequest) end(args ...interface{}) *TnClientRequest {
928
+ if !cr.started && !cr.writeEnded {
929
+ var body []byte
930
+ var cb interface{}
931
+ for i, a := range args {
932
+ switch d := a.(type) {
933
+ case string:
934
+ if i == 0 {
935
+ enc := ""
936
+ if len(args) > 1 {
937
+ enc, _ = args[1].(string)
938
+ }
939
+ body = TnBufferFromString(d, enc)
940
+ }
941
+ case []byte:
942
+ if i == 0 {
943
+ body = d
944
+ }
945
+ default:
946
+ if tnIsFunc(a) {
947
+ cb = a
948
+ }
949
+ }
950
+ }
951
+ if cb != nil {
952
+ cr.TnEventEmitter.once("finish", cb)
953
+ }
954
+ cr.writeEnded = true
955
+ cr.start(body, true)
956
+ TnLoopPost(func() {
957
+ cr.finished = true
958
+ cr.emit("finish")
959
+ })
960
+ return cr
961
+ }
962
+ cr.TnStream.end(args...)
963
+ return cr
964
+ }
965
+
966
+ // Sends the request: a complete body (end before any write) or a streamed one
967
+ // The body of a 101 response as a net.Conn (it reads and writes the connection)
968
+ type tnRWConn struct {
969
+ io.ReadWriteCloser
970
+ remote net.Addr
971
+ }
972
+
973
+ func (c *tnRWConn) LocalAddr() net.Addr { return &net.TCPAddr{} }
974
+ func (c *tnRWConn) RemoteAddr() net.Addr { return c.remote }
975
+ func (c *tnRWConn) SetDeadline(t time.Time) error { return nil }
976
+ func (c *tnRWConn) SetReadDeadline(t time.Time) error { return nil }
977
+ func (c *tnRWConn) SetWriteDeadline(t time.Time) error { return nil }
978
+
979
+ func tnUpgradedConn(rwc io.ReadWriteCloser, remote string) net.Conn {
980
+ if conn, ok := rwc.(net.Conn); ok {
981
+ return conn
982
+ }
983
+ addr, err := net.ResolveTCPAddr("tcp", remote)
984
+ if err != nil {
985
+ addr = &net.TCPAddr{}
986
+ }
987
+ return &tnRWConn{ReadWriteCloser: rwc, remote: addr}
988
+ }
989
+
990
+ // CONNECT requests: dialed and written by hand; any response is 'connect' (res, socket, head)
991
+ func (cr *TnClientRequest) startConnect() {
992
+ address := net.JoinHostPort(cr.host, cr.port)
993
+ header := http.Header{}
994
+ cr.store.toGo(header)
995
+ host := header.Get("Host")
996
+ if host == "" {
997
+ host = address
998
+ }
999
+ header.Del("Host")
1000
+ cfg := cr.tlsConfig
1001
+ TnLoopRef()
1002
+ cr.armTimer()
1003
+ go func() {
1004
+ var conn net.Conn
1005
+ var err error
1006
+ if cfg != nil {
1007
+ conn, err = tls.Dial("tcp", address, cfg)
1008
+ } else {
1009
+ conn, err = net.Dial("tcp", address)
1010
+ }
1011
+ var resp *http.Response
1012
+ var br *bufio.Reader
1013
+ if err == nil {
1014
+ var buf bytes.Buffer
1015
+ buf.WriteString("CONNECT " + cr.path + " HTTP/1.1\\r\\nHost: " + host + "\\r\\n")
1016
+ header.Write(&buf)
1017
+ buf.WriteString("\\r\\n")
1018
+ if _, err = conn.Write(buf.Bytes()); err == nil {
1019
+ br = bufio.NewReader(conn)
1020
+ resp, err = http.ReadResponse(br, &http.Request{Method: http.MethodConnect})
1021
+ }
1022
+ }
1023
+ TnLoopPost(func() {
1024
+ defer TnLoopUnref()
1025
+ if cr.timer != nil {
1026
+ cr.timer.Stop()
1027
+ }
1028
+ if err != nil {
1029
+ if conn != nil {
1030
+ conn.Close()
1031
+ }
1032
+ if !cr.destroyed {
1033
+ p, _ := strconv.ParseFloat(cr.port, 64)
1034
+ if _, ok := err.(*net.OpError); ok {
1035
+ cr.destroy(TnNetError(err, "connect", cr.host, p))
1036
+ } else {
1037
+ cr.destroy(TnNodeError("Error", "ECONNRESET", "socket hang up"))
1038
+ }
1039
+ }
1040
+ return
1041
+ }
1042
+ cr.gotResponse = true
1043
+ res := tnNewIncoming()
1044
+ cr.res = res
1045
+ res.statusCode = float64(resp.StatusCode)
1046
+ res.statusMessage = strings.TrimSpace(strings.TrimPrefix(resp.Status, strconv.Itoa(resp.StatusCode)))
1047
+ res.httpVersion = strconv.Itoa(resp.ProtoMajor) + "." + strconv.Itoa(resp.ProtoMinor)
1048
+ res.httpVersionMajor, res.httpVersionMinor = float64(resp.ProtoMajor), float64(resp.ProtoMinor)
1049
+ tnIncomingHeaders(res, resp.Header, "", false)
1050
+ res.complete = true
1051
+ res.push(nil)
1052
+ head := []byte{}
1053
+ if n := br.Buffered(); n > 0 {
1054
+ peeked, _ := br.Peek(n)
1055
+ head = append(head, peeked...)
1056
+ }
1057
+ if cr.listenerCount("connect") == 0 {
1058
+ conn.Close()
1059
+ } else {
1060
+ socket := TnNewSocket()
1061
+ socket.attach(conn)
1062
+ res.socket = socket
1063
+ cr.emit("connect", res, socket, head)
1064
+ }
1065
+ cr.closeHeld = false
1066
+ cr.emitClose()
1067
+ })
1068
+ }()
1069
+ }
1070
+
1071
+ func (cr *TnClientRequest) start(body []byte, complete bool) {
1072
+ if cr.started {
1073
+ return
1074
+ }
1075
+ cr.started = true
1076
+ if cr.method == http.MethodConnect {
1077
+ cr.startConnect()
1078
+ return
1079
+ }
1080
+ scheme := strings.TrimSuffix(cr.protocol, ":")
1081
+ target := scheme + "://" + net.JoinHostPort(cr.host, cr.port) + cr.path
1082
+ ctx, cancel := context.WithCancel(context.Background())
1083
+ cr.cancel = cancel
1084
+ var reader io.Reader
1085
+ if complete {
1086
+ if len(body) > 0 || (cr.method != "GET" && cr.method != "HEAD" && cr.method != "DELETE" && cr.method != "OPTIONS") {
1087
+ reader = bytes.NewReader(body)
1088
+ }
1089
+ } else {
1090
+ pr, pw := io.Pipe()
1091
+ cr.bodyWriter = pw
1092
+ reader = pr
1093
+ }
1094
+ req, err := http.NewRequestWithContext(ctx, cr.method, target, reader)
1095
+ if err != nil {
1096
+ e := TnNodeError("TypeError", "ERR_INVALID_URL", "Invalid URL")
1097
+ TnLoopPost(func() { cr.destroy(e) })
1098
+ return
1099
+ }
1100
+ if reader == nil {
1101
+ req.Body = nil
1102
+ req.ContentLength = 0
1103
+ }
1104
+ cr.store.toGo(req.Header)
1105
+ if h := req.Header.Get("Host"); h != "" {
1106
+ req.Host = h
1107
+ req.Header.Del("Host")
1108
+ }
1109
+ if cl := req.Header.Get("Content-Length"); cl != "" {
1110
+ if n, err := strconv.ParseInt(cl, 10, 64); err == nil {
1111
+ req.ContentLength = n
1112
+ }
1113
+ } else if !complete {
1114
+ req.ContentLength = -1
1115
+ }
1116
+ if cr.auth != "" {
1117
+ parts := strings.SplitN(cr.auth, ":", 2)
1118
+ if len(parts) == 2 {
1119
+ req.SetBasicAuth(parts[0], parts[1])
1120
+ } else {
1121
+ req.SetBasicAuth(parts[0], "")
1122
+ }
1123
+ }
1124
+ if _, ok := req.Header["User-Agent"]; !ok {
1125
+ req.Header["User-Agent"] = nil
1126
+ }
1127
+ transport := tnHttpTransport(cr.tlsConfig, cr.tlsKey)
1128
+ if cr.socketPath != "" {
1129
+ path := cr.socketPath
1130
+ transport = &http.Transport{DisableCompression: true, DialContext: func(ctx context.Context, _, _ string) (net.Conn, error) {
1131
+ var d net.Dialer
1132
+ return d.DialContext(ctx, "unix", path)
1133
+ }}
1134
+ }
1135
+ client := &http.Client{Transport: transport, CheckRedirect: func(*http.Request, []*http.Request) error { return http.ErrUseLastResponse }}
1136
+ TnLoopRef()
1137
+ cr.armTimer()
1138
+ host, port := cr.host, cr.port
1139
+ go func() {
1140
+ resp, err := client.Do(req)
1141
+ TnLoopPost(func() {
1142
+ if cr.timer != nil {
1143
+ cr.timer.Stop()
1144
+ }
1145
+ if err != nil {
1146
+ defer TnLoopUnref()
1147
+ if cr.bodyWriter != nil {
1148
+ cr.bodyWriter.CloseWithError(err)
1149
+ }
1150
+ var e *TnError
1151
+ if te := tnUnwrapTnError(err); te != nil {
1152
+ e = te
1153
+ } else if cr.destroyed || errors.Is(err, context.Canceled) {
1154
+ if cr.signal != nil && cr.signal.aborted {
1155
+ e = tnAbortError("The operation was aborted", "AbortError")
1156
+ } else {
1157
+ e = TnNodeError("Error", "ECONNRESET", "socket hang up")
1158
+ }
1159
+ } else {
1160
+ var opErr *net.OpError
1161
+ if errors.As(err, &opErr) && opErr.Op == "dial" {
1162
+ target := host
1163
+ if ip := tnDialedIP(err); ip != "" {
1164
+ target = ip
1165
+ }
1166
+ p, _ := strconv.ParseFloat(port, 64)
1167
+ e = TnNetError(err, "connect", target, p)
1168
+ } else if code := tnNetCode(err); code == "ENOTFOUND" || code == "EAI_AGAIN" {
1169
+ e = tnDnsLookupError(err, host)
1170
+ } else {
1171
+ e = TnNodeError("Error", code, err.Error())
1172
+ }
1173
+ }
1174
+ if cr.destroyed {
1175
+ return
1176
+ }
1177
+ cr.destroy(e)
1178
+ return
1179
+ }
1180
+ cr.gotResponse = true
1181
+ res := tnNewIncoming()
1182
+ cr.res = res
1183
+ res.statusCode = float64(resp.StatusCode)
1184
+ res.statusMessage = strings.TrimSpace(strings.TrimPrefix(resp.Status, strconv.Itoa(resp.StatusCode)))
1185
+ res.httpVersion = strconv.Itoa(resp.ProtoMajor) + "." + strconv.Itoa(resp.ProtoMinor)
1186
+ res.httpVersionMajor, res.httpVersionMinor = float64(resp.ProtoMajor), float64(resp.ProtoMinor)
1187
+ chunked := len(resp.TransferEncoding) > 0 && resp.TransferEncoding[0] == "chunked"
1188
+ tnIncomingHeaders(res, resp.Header, "", chunked)
1189
+ if resp.ContentLength >= 0 && !res.headers.Has("content-length") && cr.method != "HEAD" {
1190
+ res.headers.Set("content-length", strconv.FormatInt(resp.ContentLength, 10))
1191
+ }
1192
+ res.socket = tnInfoSocket(nil, net.JoinHostPort(host, port))
1193
+ if resp.TLS != nil {
1194
+ res.socket.encrypted = true
1195
+ res.socket.authorized = true
1196
+ }
1197
+ if rwc, ok := resp.Body.(io.ReadWriteCloser); ok && resp.StatusCode == http.StatusSwitchingProtocols {
1198
+ // 'upgrade' (res, socket, head): the connection belongs to the listener
1199
+ defer TnLoopUnref()
1200
+ res.complete = true
1201
+ res.push(nil)
1202
+ if cr.listenerCount("upgrade") == 0 {
1203
+ rwc.Close()
1204
+ } else {
1205
+ socket := TnNewSocket()
1206
+ socket.attach(tnUpgradedConn(rwc, net.JoinHostPort(host, port)))
1207
+ cr.emit("upgrade", res, socket, []byte{})
1208
+ }
1209
+ cr.closeHeld = false
1210
+ cr.emitClose()
1211
+ return
1212
+ }
1213
+ if cr.listenerCount("response") > 0 {
1214
+ cr.emit("response", res)
1215
+ } else {
1216
+ res.resume()
1217
+ }
1218
+ tnPumpBody(resp.Body, res, func() {
1219
+ TnLoopPost(func() {
1220
+ defer TnLoopUnref()
1221
+ for k, v := range resp.Trailer {
1222
+ res.trailers.Set(strings.ToLower(k), strings.Join(v, ", "))
1223
+ }
1224
+ cr.closeHeld = false
1225
+ cr.emitClose()
1226
+ })
1227
+ })
1228
+ })
1229
+ }()
1230
+ }
1231
+
1232
+ func tnDnsLookupError(err error, hostname string) *TnError {
1233
+ code := tnNetCode(err)
1234
+ e := TnNodeError("Error", code, "getaddrinfo "+code+" "+hostname)
1235
+ e.props["errno"] = tnNetErrnos[code]
1236
+ e.props["syscall"] = "getaddrinfo"
1237
+ e.props["hostname"] = hostname
1238
+ return e
1239
+ }
1240
+
1241
+ func tnClientURL(cr *TnClientRequest, raw string) {
1242
+ u, err := tnurl.Parse(raw)
1243
+ if err != nil || u.Host == "" {
1244
+ panic(TnNodeError("TypeError", "ERR_INVALID_URL", "Invalid URL"))
1245
+ }
1246
+ cr.protocol = u.Scheme + ":"
1247
+ cr.host = u.Hostname()
1248
+ cr.port = u.Port()
1249
+ cr.path = u.RequestURI()
1250
+ if u.User != nil {
1251
+ cr.auth = u.User.String()
1252
+ if decoded, err := tnurl.PathUnescape(cr.auth); err == nil {
1253
+ cr.auth = decoded
1254
+ }
1255
+ }
1256
+ }
1257
+
1258
+ // http.request(url | options, [options], [callback]) / https.request
1259
+ func TnHttpRequest(secure bool, args ...interface{}) *TnClientRequest {
1260
+ cr := &TnClientRequest{method: "GET", path: "/", host: "localhost", protocol: "http:", store: newTnHeaderStore(), setHost: true}
1261
+ if secure {
1262
+ cr.protocol = "https:"
1263
+ }
1264
+ cr.TnStream = *TnNewWritable()
1265
+ cr.tnSelf = cr
1266
+ cr.closeHeld = true
1267
+ var options interface{}
1268
+ for _, a := range args {
1269
+ switch x := a.(type) {
1270
+ case string:
1271
+ tnClientURL(cr, x)
1272
+ case interface{ Get_href() string }:
1273
+ tnClientURL(cr, x.Get_href())
1274
+ default:
1275
+ if tnIsFunc(a) {
1276
+ cr.TnEventEmitter.once("response", a)
1277
+ } else if a != nil {
1278
+ options = a
1279
+ }
1280
+ }
1281
+ }
1282
+ insecure := false
1283
+ var ca []string
1284
+ if options != nil {
1285
+ if p := tnNetString(TnGet(options, "protocol")); p != "" {
1286
+ cr.protocol = p
1287
+ }
1288
+ if h := tnNetString(TnGet(options, "hostname")); h != "" {
1289
+ cr.host = h
1290
+ } else if h := tnNetString(TnGet(options, "host")); h != "" {
1291
+ cr.host = h
1292
+ }
1293
+ if n, ok := tnNetNumber(TnGet(options, "port")); ok {
1294
+ cr.port = strconv.FormatFloat(n, 'f', -1, 64)
1295
+ } else if s := tnNetString(TnGet(options, "port")); s != "" {
1296
+ cr.port = s
1297
+ }
1298
+ if p := tnNetString(TnGet(options, "path")); p != "" {
1299
+ cr.path = p
1300
+ }
1301
+ if m := tnNetString(TnGet(options, "method")); m != "" {
1302
+ cr.method = strings.ToUpper(m)
1303
+ }
1304
+ if a := tnNetString(TnGet(options, "auth")); a != "" {
1305
+ cr.auth = a
1306
+ }
1307
+ if sp := tnNetString(TnGet(options, "socketPath")); sp != "" {
1308
+ cr.socketPath = sp
1309
+ }
1310
+ if n, ok := tnNetNumber(TnGet(options, "timeout")); ok {
1311
+ cr.timeoutMs = n
1312
+ }
1313
+ cr.store.setAll(TnGet(options, "headers"))
1314
+ if b, ok := TnGet(options, "rejectUnauthorized").(bool); ok && !b {
1315
+ insecure = true
1316
+ }
1317
+ ca = tnPemStrings(TnGet(options, "ca"))
1318
+ if sig, ok := TnGet(options, "signal").(*TnAbortSignal); ok && sig != nil {
1319
+ cr.signal = sig
1320
+ }
1321
+ }
1322
+ if cr.port == "" {
1323
+ if cr.protocol == "https:" {
1324
+ cr.port = "443"
1325
+ } else {
1326
+ cr.port = "80"
1327
+ }
1328
+ }
1329
+ if cr.protocol == "https:" {
1330
+ cfg, err := tnTLSClientConfig(options, cr.host, nil)
1331
+ if err != nil {
1332
+ panic(err)
1333
+ }
1334
+ cr.tlsConfig = cfg
1335
+ servername := ""
1336
+ clientCert := ""
1337
+ if options != nil {
1338
+ servername = tnNetString(TnGet(options, "servername"))
1339
+ clientCert = tnPemString(TnGet(options, "cert"))
1340
+ }
1341
+ cr.tlsKey = fmt.Sprint("tls:", insecure, ":", cr.host, ":", servername, ":", strings.Join(ca, ""), ":", clientCert)
1342
+ }
1343
+ cr.sink = func(chunk interface{}, done func(err interface{})) {
1344
+ cr.start(nil, false)
1345
+ var data []byte
1346
+ switch c := chunk.(type) {
1347
+ case []byte:
1348
+ data = c
1349
+ case string:
1350
+ data = []byte(c)
1351
+ }
1352
+ w := cr.bodyWriter
1353
+ go func() {
1354
+ _, err := w.Write(data)
1355
+ TnLoopPost(func() {
1356
+ if err != nil {
1357
+ done(nil)
1358
+ return
1359
+ }
1360
+ done(nil)
1361
+ })
1362
+ }()
1363
+ }
1364
+ cr.sinkFinal = func(done func(err interface{})) {
1365
+ cr.start(nil, true)
1366
+ if cr.bodyWriter != nil {
1367
+ cr.bodyWriter.Close()
1368
+ }
1369
+ done(nil)
1370
+ }
1371
+ cr.onClose = func() {
1372
+ if cr.destroyed && !cr.gotResponse && cr.cancel != nil {
1373
+ cr.cancel()
1374
+ }
1375
+ if !cr.started {
1376
+ cr.started = true
1377
+ }
1378
+ }
1379
+ if cr.signal != nil {
1380
+ if cr.signal.aborted {
1381
+ reason := cr.signal.reason
1382
+ TnLoopPost(func() { cr.destroy(reason) })
1383
+ } else {
1384
+ cr.signal.addEventListener("abort", func(ev *TnEvent) {
1385
+ cr.destroy(tnAbortError("The operation was aborted", "AbortError"))
1386
+ })
1387
+ }
1388
+ }
1389
+ return cr
1390
+ }
1391
+
1392
+ func TnHttpGet(secure bool, args ...interface{}) *TnClientRequest {
1393
+ cr := TnHttpRequest(secure, args...)
1394
+ cr.end()
1395
+ return cr
1396
+ }`;
1397
+ const CLIENT_REQUEST_METHODS = STREAM_METHODS.replace('end=*TnStream', 'end=*TnClientRequest').replace('destroy=*TnStream', 'destroy=*TnClientRequest') +
1398
+ '; setHeader=*TnClientRequest; getHeader=interface{}; getHeaders=*TnMap[string, interface{}]; getHeaderNames=[]string; getRawHeaderNames=[]string; hasHeader=bool; removeHeader=; flushHeaders=; setTimeout=*TnClientRequest; setNoDelay=; setSocketKeepAlive=; abort=';
1399
+ const SERVER_RESPONSE_METHODS = STREAM_METHODS.replace('end=*TnStream', 'end=*TnServerResponse') +
1400
+ '; setHeader=*TnServerResponse; setHeaders=*TnServerResponse; appendHeader=*TnServerResponse; getHeader=interface{}; getHeaders=*TnMap[string, interface{}]; getHeaderNames=[]string; hasHeader=bool; removeHeader=; writeHead=*TnServerResponse; flushHeaders=; writeContinue=; setTimeout=*TnServerResponse';
1401
+ function eventName(nodes) {
1402
+ const event = nodes[0];
1403
+ return event && event.kind === 'StringLiteral' ? String(event.text) : '';
1404
+ }
1405
+ export function registerHttp(r) {
1406
+ defineModule(r, 'http');
1407
+ defineModule(r, 'https');
1408
+ defineHelper(r, 'nodeHttp', ['bufio', 'bytes', 'context', 'crypto/tls', 'errors', 'fmt', 'io', 'log', 'math', 'net', 'net/http', 'net/url', 'reflect', 'sort', 'strconv', 'strings', 'sync', 'time', 'unsafe'], ['nodeNet', 'netErrors', 'nodeStream', 'nodeEvents', 'eventLoop', 'nodeInvoke', 'dynamic', 'orderedMap', 'buffer', 'tlsConfig'], httpHelper);
1409
+ const use = () => r.helper('nodeHttp');
1410
+ defineClass(r, 'http.IncomingMessage', '*TnIncomingMessage', 'class', STREAM_METHODS + '; setTimeout=*TnIncomingMessage', 'method=string; url=string; httpVersion=string; httpVersionMajor=float64; httpVersionMinor=float64; headers=*TnMap[string, string]; headersDistinct=*TnMap[string, []string]; rawHeaders=[]string; trailers=*TnMap[string, string]; statusCode=float64; statusMessage=string; complete=bool; aborted=bool', STREAM_GETTERS + '; socket=*TnSocket; connection=*TnSocket', '');
1411
+ defineClass(r, 'http.ServerResponse', '*TnServerResponse', 'class', SERVER_RESPONSE_METHODS, 'statusCode=float64; statusMessage=string; sendDate=bool', STREAM_GETTERS + '; headersSent=bool; req=*TnIncomingMessage; socket=*TnSocket', '');
1412
+ defineClass(r, 'http.ClientRequest', '*TnClientRequest', 'class', CLIENT_REQUEST_METHODS, 'method=string; path=string; host=string; protocol=string; aborted=bool; reusedSocket=bool; maxHeadersCount=interface{}', STREAM_GETTERS + '; headersSent=bool; socket=*TnSocket', '');
1413
+ defineClass(r, 'http.Server', '*TnHttpServer', 'class', SERVER_METHODS.replace('listen=*TnNetServer', 'listen=*TnHttpServer').replace('close=*TnNetServer', 'close=*TnHttpServer') +
1414
+ '; setTimeout=*TnHttpServer; closeAllConnections=; closeIdleConnections=', 'maxHeadersCount=interface{}', 'listening=bool; maxConnections=float64; timeout=float64; keepAliveTimeout=float64; headersTimeout=float64; requestTimeout=float64', 'maxConnections; timeout; keepAliveTimeout; headersTimeout; requestTimeout');
1415
+ defineClass(r, 'http.Agent', '*TnHttpAgent', 'class', 'destroy=', 'keepAlive=bool; maxSockets=float64; options=interface{}', '', '');
1416
+ for (const name of ['IncomingMessage', 'ServerResponse', 'ClientRequest', 'Server', 'Agent']) {
1417
+ r.classes[`https.${name}`] = r.classes[`http.${name}`];
1418
+ }
1419
+ for (const cls of ['IncomingMessage', 'ServerResponse', 'ClientRequest']) {
1420
+ r.methods[`http.${cls}#pipe`] = (c) => {
1421
+ r.helper('nodeStream');
1422
+ return `TnPipe(${c.recv}, ${c.args.join(', ')})`;
1423
+ };
1424
+ r.typers[`http.${cls}#pipe`] = (c) => c.types[0] || '*TnStream';
1425
+ }
1426
+ r.paramTypers['http.IncomingMessage#on'] = streamListenerTypes;
1427
+ r.paramTypers['http.IncomingMessage#once'] = streamListenerTypes;
1428
+ r.paramTypers['http.ServerResponse#on'] = streamListenerTypes;
1429
+ r.paramTypers['http.ServerResponse#once'] = streamListenerTypes;
1430
+ const requestListeners = (nodes) => {
1431
+ const name = eventName(nodes);
1432
+ if (name === 'response')
1433
+ return ['*TnIncomingMessage'];
1434
+ if (name === 'socket')
1435
+ return ['*TnSocket'];
1436
+ if (name === 'upgrade' || name === 'connect')
1437
+ return ['*TnIncomingMessage', '*TnSocket', '[]byte'];
1438
+ return streamListenerTypes(nodes);
1439
+ };
1440
+ r.paramTypers['http.ClientRequest#on'] = requestListeners;
1441
+ r.paramTypers['http.ClientRequest#once'] = requestListeners;
1442
+ const serverListeners = (nodes) => {
1443
+ const name = eventName(nodes);
1444
+ if (name === 'request')
1445
+ return ['*TnIncomingMessage', '*TnServerResponse'];
1446
+ if (name === 'stream')
1447
+ return ['*TnHttp2Stream', '*TnMap[string, interface{}]', 'float64'];
1448
+ if (name === 'connection')
1449
+ return ['*TnSocket'];
1450
+ if (name === 'upgrade' || name === 'connect')
1451
+ return ['*TnIncomingMessage', '*TnSocket', '[]byte'];
1452
+ if (name === 'error' || name === 'clientError')
1453
+ return ['interface{}'];
1454
+ return [];
1455
+ };
1456
+ r.paramTypers['http.Server#on'] = serverListeners;
1457
+ r.paramTypers['http.Server#once'] = serverListeners;
1458
+ r.paramTypers['http.Server#close'] = (_n) => ['*TnError'];
1459
+ for (const mod of ['http', 'https']) {
1460
+ const secure = mod === 'https';
1461
+ r.functions[`${mod}.createServer`] = (c) => {
1462
+ use();
1463
+ return `TnNewHttpServer(${secure}${c.args.length > 0 ? ', ' : ''}${c.args.join(', ')})`;
1464
+ };
1465
+ r.constructors[`${mod}.Server`] = r.functions[`${mod}.createServer`];
1466
+ r.paramTypers[`${mod}.createServer`] = (_n) => ['*TnIncomingMessage', '*TnServerResponse'];
1467
+ r.functions[`${mod}.request`] = (c) => {
1468
+ use();
1469
+ return `TnHttpRequest(${secure}, ${c.args.join(', ')})`;
1470
+ };
1471
+ r.functions[`${mod}.get`] = (c) => {
1472
+ use();
1473
+ return `TnHttpGet(${secure}, ${c.args.join(', ')})`;
1474
+ };
1475
+ r.paramTypers[`${mod}.request`] = (_n) => ['*TnIncomingMessage'];
1476
+ r.paramTypers[`${mod}.get`] = (_n) => ['*TnIncomingMessage'];
1477
+ r.constructors[`${mod}.Agent`] = (c) => {
1478
+ use();
1479
+ return `TnNewHttpAgent(${c.args.join(', ')})`;
1480
+ };
1481
+ r.values[`${mod}.globalAgent`] = (_c) => {
1482
+ use();
1483
+ return 'TnNewHttpAgent()';
1484
+ };
1485
+ r.valueTypes[`${mod}.globalAgent`] = '*TnHttpAgent';
1486
+ setResults(r, mod, 'createServer=*TnHttpServer; request=*TnClientRequest; get=*TnClientRequest');
1487
+ }
1488
+ r.values['http.METHODS'] = (_c) => {
1489
+ use();
1490
+ return 'TnHttpMethods';
1491
+ };
1492
+ r.valueTypes['http.METHODS'] = '[]string';
1493
+ r.values['http.STATUS_CODES'] = (_c) => {
1494
+ use();
1495
+ return 'TnHttpStatusCodes()';
1496
+ };
1497
+ r.valueTypes['http.STATUS_CODES'] = '*TnMap[float64, string]';
1498
+ r.values['http.maxHeaderSize'] = (_c) => '16384.0';
1499
+ r.valueTypes['http.maxHeaderSize'] = 'float64';
1500
+ }