typenative 0.1.2 → 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 (504) 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 +30 -21
  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 +98 -6
  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/parse-native.js +3 -2
  54. package/bin/parse-node.js +18 -2
  55. package/bin/transpiler.js +3529 -597
  56. package/bin/version.js +2 -0
  57. package/conformance.md +724 -258
  58. package/govendor/github.com/ncruces/go-sqlite3/LICENSE +21 -0
  59. package/govendor/github.com/ncruces/go-sqlite3/README.md +121 -0
  60. package/govendor/github.com/ncruces/go-sqlite3/backup.go +132 -0
  61. package/govendor/github.com/ncruces/go-sqlite3/blob.go +266 -0
  62. package/govendor/github.com/ncruces/go-sqlite3/config.go +397 -0
  63. package/govendor/github.com/ncruces/go-sqlite3/conn.go +540 -0
  64. package/govendor/github.com/ncruces/go-sqlite3/conn_127.go +93 -0
  65. package/govendor/github.com/ncruces/go-sqlite3/const.go +436 -0
  66. package/govendor/github.com/ncruces/go-sqlite3/context.go +222 -0
  67. package/govendor/github.com/ncruces/go-sqlite3/error.go +182 -0
  68. package/govendor/github.com/ncruces/go-sqlite3/ext.go +153 -0
  69. package/govendor/github.com/ncruces/go-sqlite3/func.go +309 -0
  70. package/govendor/github.com/ncruces/go-sqlite3/go.mod +3 -0
  71. package/govendor/github.com/ncruces/go-sqlite3/internal/dotlk/dotlk.go +29 -0
  72. package/govendor/github.com/ncruces/go-sqlite3/internal/dotlk/dotlk_other.go +13 -0
  73. package/govendor/github.com/ncruces/go-sqlite3/internal/dotlk/dotlk_unix.go +57 -0
  74. package/govendor/github.com/ncruces/go-sqlite3/internal/errutil/error.go +41 -0
  75. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/alloc.go +128 -0
  76. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/const.go +122 -0
  77. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/error.go +77 -0
  78. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/mem.go +116 -0
  79. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/mem_other.go +34 -0
  80. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/mem_unix.go +87 -0
  81. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/mem_windows.go +149 -0
  82. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/mmap_unix.go +80 -0
  83. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/mmap_windows.go +129 -0
  84. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/sys_windows.go +60 -0
  85. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/wrap.go +82 -0
  86. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/wrap_sys.go +113 -0
  87. package/govendor/github.com/ncruces/go-sqlite3/internal/sqlite3_wrap/wrap_vfs.go +181 -0
  88. package/govendor/github.com/ncruces/go-sqlite3/internal/testenv/env.go +55 -0
  89. package/govendor/github.com/ncruces/go-sqlite3/internal/util/json.go +54 -0
  90. package/govendor/github.com/ncruces/go-sqlite3/internal/util/json_v2.go +54 -0
  91. package/govendor/github.com/ncruces/go-sqlite3/internal/util/math.go +29 -0
  92. package/govendor/github.com/ncruces/go-sqlite3/internal/util/page.go +5 -0
  93. package/govendor/github.com/ncruces/go-sqlite3/internal/util/parse.go +142 -0
  94. package/govendor/github.com/ncruces/go-sqlite3/internal/util/pointer.go +3 -0
  95. package/govendor/github.com/ncruces/go-sqlite3/internal/util/reflect.go +10 -0
  96. package/govendor/github.com/ncruces/go-sqlite3/json.go +100 -0
  97. package/govendor/github.com/ncruces/go-sqlite3/json_v2.go +116 -0
  98. package/govendor/github.com/ncruces/go-sqlite3/pointer.go +13 -0
  99. package/govendor/github.com/ncruces/go-sqlite3/quote.go +140 -0
  100. package/govendor/github.com/ncruces/go-sqlite3/stmt.go +692 -0
  101. package/govendor/github.com/ncruces/go-sqlite3/time.go +360 -0
  102. package/govendor/github.com/ncruces/go-sqlite3/txn.go +374 -0
  103. package/govendor/github.com/ncruces/go-sqlite3/value.go +212 -0
  104. package/govendor/github.com/ncruces/go-sqlite3/vfs/README.md +133 -0
  105. package/govendor/github.com/ncruces/go-sqlite3/vfs/api.go +239 -0
  106. package/govendor/github.com/ncruces/go-sqlite3/vfs/cksm.go +143 -0
  107. package/govendor/github.com/ncruces/go-sqlite3/vfs/const.go +256 -0
  108. package/govendor/github.com/ncruces/go-sqlite3/vfs/file.go +260 -0
  109. package/govendor/github.com/ncruces/go-sqlite3/vfs/filename.go +187 -0
  110. package/govendor/github.com/ncruces/go-sqlite3/vfs/lock.go +128 -0
  111. package/govendor/github.com/ncruces/go-sqlite3/vfs/lock_other.go +23 -0
  112. package/govendor/github.com/ncruces/go-sqlite3/vfs/map.go +63 -0
  113. package/govendor/github.com/ncruces/go-sqlite3/vfs/map_other.go +13 -0
  114. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_bsd.go +110 -0
  115. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_darwin.go +131 -0
  116. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_dotlk.go +140 -0
  117. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_f2fs_linux.go +56 -0
  118. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_linux.go +117 -0
  119. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_ofd.go +59 -0
  120. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_std.go +50 -0
  121. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_std_alloc.go +19 -0
  122. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_std_atomic.go +9 -0
  123. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_std_rw.go +13 -0
  124. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_std_sync.go +9 -0
  125. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_std_temp.go +16 -0
  126. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_unix.go +108 -0
  127. package/govendor/github.com/ncruces/go-sqlite3/vfs/os_windows.go +180 -0
  128. package/govendor/github.com/ncruces/go-sqlite3/vfs/registry.go +48 -0
  129. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm.go +26 -0
  130. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm_bsd.go +258 -0
  131. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm_copy.go +90 -0
  132. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm_dotlk.go +168 -0
  133. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm_memlk.go +52 -0
  134. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm_ofd.go +185 -0
  135. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm_other.go +21 -0
  136. package/govendor/github.com/ncruces/go-sqlite3/vfs/shm_windows.go +124 -0
  137. package/govendor/github.com/ncruces/go-sqlite3/vfs/vfs.go +455 -0
  138. package/govendor/github.com/ncruces/go-sqlite3/vtab.go +677 -0
  139. package/govendor/github.com/ncruces/go-sqlite3/wrap.go +48 -0
  140. package/govendor/github.com/ncruces/go-sqlite3-wasm/v6/LICENSE +18 -0
  141. package/govendor/github.com/ncruces/go-sqlite3-wasm/v6/README.md +11 -0
  142. package/govendor/github.com/ncruces/go-sqlite3-wasm/v6/go.mod +3 -0
  143. package/govendor/github.com/ncruces/go-sqlite3-wasm/v6/libc.go +215 -0
  144. package/govendor/github.com/ncruces/go-sqlite3-wasm/v6/sqlite3.dat +0 -0
  145. package/govendor/github.com/ncruces/go-sqlite3-wasm/v6/sqlite3.go +157903 -0
  146. package/govendor/github.com/ncruces/go-sqlite3-wasm/v6/tools.sh +38 -0
  147. package/govendor/github.com/ncruces/julianday/LICENSE +21 -0
  148. package/govendor/github.com/ncruces/julianday/README.md +9 -0
  149. package/govendor/github.com/ncruces/julianday/go.mod +3 -0
  150. package/govendor/github.com/ncruces/julianday/julianday.go +124 -0
  151. package/govendor/golang.org/x/sys/LICENSE +27 -0
  152. package/govendor/golang.org/x/sys/PATENTS +22 -0
  153. package/govendor/golang.org/x/sys/go.mod +3 -0
  154. package/govendor/golang.org/x/sys/unix/README.md +184 -0
  155. package/govendor/golang.org/x/sys/unix/affinity_linux.go +189 -0
  156. package/govendor/golang.org/x/sys/unix/aliases.go +13 -0
  157. package/govendor/golang.org/x/sys/unix/asm_aix_ppc64.s +17 -0
  158. package/govendor/golang.org/x/sys/unix/asm_bsd_386.s +27 -0
  159. package/govendor/golang.org/x/sys/unix/asm_bsd_amd64.s +27 -0
  160. package/govendor/golang.org/x/sys/unix/asm_bsd_arm.s +27 -0
  161. package/govendor/golang.org/x/sys/unix/asm_bsd_arm64.s +27 -0
  162. package/govendor/golang.org/x/sys/unix/asm_bsd_ppc64.s +29 -0
  163. package/govendor/golang.org/x/sys/unix/asm_bsd_riscv64.s +27 -0
  164. package/govendor/golang.org/x/sys/unix/asm_linux_386.s +65 -0
  165. package/govendor/golang.org/x/sys/unix/asm_linux_amd64.s +57 -0
  166. package/govendor/golang.org/x/sys/unix/asm_linux_arm.s +56 -0
  167. package/govendor/golang.org/x/sys/unix/asm_linux_arm64.s +50 -0
  168. package/govendor/golang.org/x/sys/unix/asm_linux_loong64.s +51 -0
  169. package/govendor/golang.org/x/sys/unix/asm_linux_mips64x.s +54 -0
  170. package/govendor/golang.org/x/sys/unix/asm_linux_mipsx.s +52 -0
  171. package/govendor/golang.org/x/sys/unix/asm_linux_ppc64x.s +42 -0
  172. package/govendor/golang.org/x/sys/unix/asm_linux_riscv64.s +47 -0
  173. package/govendor/golang.org/x/sys/unix/asm_linux_s390x.s +54 -0
  174. package/govendor/golang.org/x/sys/unix/asm_openbsd_mips64.s +29 -0
  175. package/govendor/golang.org/x/sys/unix/asm_solaris_amd64.s +17 -0
  176. package/govendor/golang.org/x/sys/unix/asm_zos_s390x.s +382 -0
  177. package/govendor/golang.org/x/sys/unix/auxv.go +36 -0
  178. package/govendor/golang.org/x/sys/unix/auxv_unsupported.go +13 -0
  179. package/govendor/golang.org/x/sys/unix/bluetooth_linux.go +36 -0
  180. package/govendor/golang.org/x/sys/unix/bpxsvc_zos.go +657 -0
  181. package/govendor/golang.org/x/sys/unix/bpxsvc_zos.s +192 -0
  182. package/govendor/golang.org/x/sys/unix/cap_freebsd.go +195 -0
  183. package/govendor/golang.org/x/sys/unix/constants.go +13 -0
  184. package/govendor/golang.org/x/sys/unix/dev_aix_ppc.go +26 -0
  185. package/govendor/golang.org/x/sys/unix/dev_aix_ppc64.go +28 -0
  186. package/govendor/golang.org/x/sys/unix/dev_darwin.go +24 -0
  187. package/govendor/golang.org/x/sys/unix/dev_dragonfly.go +30 -0
  188. package/govendor/golang.org/x/sys/unix/dev_freebsd.go +30 -0
  189. package/govendor/golang.org/x/sys/unix/dev_linux.go +42 -0
  190. package/govendor/golang.org/x/sys/unix/dev_netbsd.go +29 -0
  191. package/govendor/golang.org/x/sys/unix/dev_openbsd.go +29 -0
  192. package/govendor/golang.org/x/sys/unix/dev_zos.go +28 -0
  193. package/govendor/golang.org/x/sys/unix/dirent.go +102 -0
  194. package/govendor/golang.org/x/sys/unix/endian_big.go +9 -0
  195. package/govendor/golang.org/x/sys/unix/endian_little.go +9 -0
  196. package/govendor/golang.org/x/sys/unix/env_unix.go +31 -0
  197. package/govendor/golang.org/x/sys/unix/fcntl.go +36 -0
  198. package/govendor/golang.org/x/sys/unix/fcntl_darwin.go +24 -0
  199. package/govendor/golang.org/x/sys/unix/fcntl_linux_32bit.go +13 -0
  200. package/govendor/golang.org/x/sys/unix/fdset.go +27 -0
  201. package/govendor/golang.org/x/sys/unix/gccgo.go +59 -0
  202. package/govendor/golang.org/x/sys/unix/gccgo_c.c +44 -0
  203. package/govendor/golang.org/x/sys/unix/gccgo_linux_amd64.go +20 -0
  204. package/govendor/golang.org/x/sys/unix/ifreq_linux.go +145 -0
  205. package/govendor/golang.org/x/sys/unix/ioctl_linux.go +341 -0
  206. package/govendor/golang.org/x/sys/unix/ioctl_signed.go +74 -0
  207. package/govendor/golang.org/x/sys/unix/ioctl_unsigned.go +74 -0
  208. package/govendor/golang.org/x/sys/unix/ioctl_zos.go +71 -0
  209. package/govendor/golang.org/x/sys/unix/mkall.sh +250 -0
  210. package/govendor/golang.org/x/sys/unix/mkerrors.sh +807 -0
  211. package/govendor/golang.org/x/sys/unix/mmap_nomremap.go +13 -0
  212. package/govendor/golang.org/x/sys/unix/mremap.go +57 -0
  213. package/govendor/golang.org/x/sys/unix/pagesize_unix.go +15 -0
  214. package/govendor/golang.org/x/sys/unix/pledge_openbsd.go +111 -0
  215. package/govendor/golang.org/x/sys/unix/ptrace_darwin.go +11 -0
  216. package/govendor/golang.org/x/sys/unix/ptrace_ios.go +11 -0
  217. package/govendor/golang.org/x/sys/unix/race.go +30 -0
  218. package/govendor/golang.org/x/sys/unix/race0.go +25 -0
  219. package/govendor/golang.org/x/sys/unix/readdirent_getdents.go +12 -0
  220. package/govendor/golang.org/x/sys/unix/readdirent_getdirentries.go +19 -0
  221. package/govendor/golang.org/x/sys/unix/readv_unix.go +103 -0
  222. package/govendor/golang.org/x/sys/unix/sockcmsg_dragonfly.go +16 -0
  223. package/govendor/golang.org/x/sys/unix/sockcmsg_linux.go +85 -0
  224. package/govendor/golang.org/x/sys/unix/sockcmsg_unix.go +106 -0
  225. package/govendor/golang.org/x/sys/unix/sockcmsg_unix_other.go +46 -0
  226. package/govendor/golang.org/x/sys/unix/sockcmsg_zos.go +58 -0
  227. package/govendor/golang.org/x/sys/unix/symaddr_zos_s390x.s +75 -0
  228. package/govendor/golang.org/x/sys/unix/syscall.go +86 -0
  229. package/govendor/golang.org/x/sys/unix/syscall_aix.go +582 -0
  230. package/govendor/golang.org/x/sys/unix/syscall_aix_ppc.go +52 -0
  231. package/govendor/golang.org/x/sys/unix/syscall_aix_ppc64.go +83 -0
  232. package/govendor/golang.org/x/sys/unix/syscall_bsd.go +609 -0
  233. package/govendor/golang.org/x/sys/unix/syscall_darwin.go +711 -0
  234. package/govendor/golang.org/x/sys/unix/syscall_darwin_amd64.go +50 -0
  235. package/govendor/golang.org/x/sys/unix/syscall_darwin_arm64.go +50 -0
  236. package/govendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go +26 -0
  237. package/govendor/golang.org/x/sys/unix/syscall_dragonfly.go +359 -0
  238. package/govendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go +56 -0
  239. package/govendor/golang.org/x/sys/unix/syscall_freebsd.go +455 -0
  240. package/govendor/golang.org/x/sys/unix/syscall_freebsd_386.go +64 -0
  241. package/govendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go +64 -0
  242. package/govendor/golang.org/x/sys/unix/syscall_freebsd_arm.go +60 -0
  243. package/govendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go +60 -0
  244. package/govendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go +60 -0
  245. package/govendor/golang.org/x/sys/unix/syscall_hurd.go +30 -0
  246. package/govendor/golang.org/x/sys/unix/syscall_hurd_386.go +28 -0
  247. package/govendor/golang.org/x/sys/unix/syscall_illumos.go +78 -0
  248. package/govendor/golang.org/x/sys/unix/syscall_linux.go +2574 -0
  249. package/govendor/golang.org/x/sys/unix/syscall_linux_386.go +313 -0
  250. package/govendor/golang.org/x/sys/unix/syscall_linux_alarm.go +12 -0
  251. package/govendor/golang.org/x/sys/unix/syscall_linux_amd64.go +144 -0
  252. package/govendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go +12 -0
  253. package/govendor/golang.org/x/sys/unix/syscall_linux_arm.go +218 -0
  254. package/govendor/golang.org/x/sys/unix/syscall_linux_arm64.go +188 -0
  255. package/govendor/golang.org/x/sys/unix/syscall_linux_gc.go +14 -0
  256. package/govendor/golang.org/x/sys/unix/syscall_linux_gc_386.go +16 -0
  257. package/govendor/golang.org/x/sys/unix/syscall_linux_gc_arm.go +13 -0
  258. package/govendor/golang.org/x/sys/unix/syscall_linux_gccgo_386.go +30 -0
  259. package/govendor/golang.org/x/sys/unix/syscall_linux_gccgo_arm.go +20 -0
  260. package/govendor/golang.org/x/sys/unix/syscall_linux_loong64.go +220 -0
  261. package/govendor/golang.org/x/sys/unix/syscall_linux_mips64x.go +187 -0
  262. package/govendor/golang.org/x/sys/unix/syscall_linux_mipsx.go +173 -0
  263. package/govendor/golang.org/x/sys/unix/syscall_linux_ppc.go +203 -0
  264. package/govendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go +114 -0
  265. package/govendor/golang.org/x/sys/unix/syscall_linux_riscv64.go +193 -0
  266. package/govendor/golang.org/x/sys/unix/syscall_linux_s390x.go +295 -0
  267. package/govendor/golang.org/x/sys/unix/syscall_linux_sparc64.go +111 -0
  268. package/govendor/golang.org/x/sys/unix/syscall_netbsd.go +388 -0
  269. package/govendor/golang.org/x/sys/unix/syscall_netbsd_386.go +37 -0
  270. package/govendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go +37 -0
  271. package/govendor/golang.org/x/sys/unix/syscall_netbsd_arm.go +37 -0
  272. package/govendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go +37 -0
  273. package/govendor/golang.org/x/sys/unix/syscall_openbsd.go +346 -0
  274. package/govendor/golang.org/x/sys/unix/syscall_openbsd_386.go +41 -0
  275. package/govendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go +41 -0
  276. package/govendor/golang.org/x/sys/unix/syscall_openbsd_arm.go +41 -0
  277. package/govendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go +41 -0
  278. package/govendor/golang.org/x/sys/unix/syscall_openbsd_libc.go +26 -0
  279. package/govendor/golang.org/x/sys/unix/syscall_openbsd_mips64.go +39 -0
  280. package/govendor/golang.org/x/sys/unix/syscall_openbsd_ppc64.go +41 -0
  281. package/govendor/golang.org/x/sys/unix/syscall_openbsd_riscv64.go +41 -0
  282. package/govendor/golang.org/x/sys/unix/syscall_solaris.go +1183 -0
  283. package/govendor/golang.org/x/sys/unix/syscall_solaris_amd64.go +27 -0
  284. package/govendor/golang.org/x/sys/unix/syscall_unix.go +619 -0
  285. package/govendor/golang.org/x/sys/unix/syscall_unix_gc.go +14 -0
  286. package/govendor/golang.org/x/sys/unix/syscall_unix_gc_ppc64x.go +22 -0
  287. package/govendor/golang.org/x/sys/unix/syscall_zos_s390x.go +3213 -0
  288. package/govendor/golang.org/x/sys/unix/sysvshm_linux.go +20 -0
  289. package/govendor/golang.org/x/sys/unix/sysvshm_unix.go +51 -0
  290. package/govendor/golang.org/x/sys/unix/sysvshm_unix_other.go +13 -0
  291. package/govendor/golang.org/x/sys/unix/timestruct.go +76 -0
  292. package/govendor/golang.org/x/sys/unix/unveil_openbsd.go +51 -0
  293. package/govendor/golang.org/x/sys/unix/vgetrandom_linux.go +13 -0
  294. package/govendor/golang.org/x/sys/unix/vgetrandom_unsupported.go +11 -0
  295. package/govendor/golang.org/x/sys/unix/xattr_bsd.go +280 -0
  296. package/govendor/golang.org/x/sys/unix/zerrors_aix_ppc.go +1384 -0
  297. package/govendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go +1385 -0
  298. package/govendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go +1922 -0
  299. package/govendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go +1922 -0
  300. package/govendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go +1737 -0
  301. package/govendor/golang.org/x/sys/unix/zerrors_freebsd_386.go +2042 -0
  302. package/govendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go +2039 -0
  303. package/govendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go +2033 -0
  304. package/govendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go +2033 -0
  305. package/govendor/golang.org/x/sys/unix/zerrors_freebsd_riscv64.go +2147 -0
  306. package/govendor/golang.org/x/sys/unix/zerrors_linux.go +4209 -0
  307. package/govendor/golang.org/x/sys/unix/zerrors_linux_386.go +882 -0
  308. package/govendor/golang.org/x/sys/unix/zerrors_linux_amd64.go +882 -0
  309. package/govendor/golang.org/x/sys/unix/zerrors_linux_arm.go +887 -0
  310. package/govendor/golang.org/x/sys/unix/zerrors_linux_arm64.go +884 -0
  311. package/govendor/golang.org/x/sys/unix/zerrors_linux_loong64.go +874 -0
  312. package/govendor/golang.org/x/sys/unix/zerrors_linux_mips.go +888 -0
  313. package/govendor/golang.org/x/sys/unix/zerrors_linux_mips64.go +888 -0
  314. package/govendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go +888 -0
  315. package/govendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go +888 -0
  316. package/govendor/golang.org/x/sys/unix/zerrors_linux_ppc.go +940 -0
  317. package/govendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go +944 -0
  318. package/govendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go +944 -0
  319. package/govendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go +884 -0
  320. package/govendor/golang.org/x/sys/unix/zerrors_linux_s390x.go +943 -0
  321. package/govendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go +992 -0
  322. package/govendor/golang.org/x/sys/unix/zerrors_netbsd_386.go +1779 -0
  323. package/govendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go +1769 -0
  324. package/govendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go +1758 -0
  325. package/govendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go +1769 -0
  326. package/govendor/golang.org/x/sys/unix/zerrors_openbsd_386.go +1905 -0
  327. package/govendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go +1905 -0
  328. package/govendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go +1905 -0
  329. package/govendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go +1905 -0
  330. package/govendor/golang.org/x/sys/unix/zerrors_openbsd_mips64.go +1905 -0
  331. package/govendor/golang.org/x/sys/unix/zerrors_openbsd_ppc64.go +1904 -0
  332. package/govendor/golang.org/x/sys/unix/zerrors_openbsd_riscv64.go +1903 -0
  333. package/govendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go +1556 -0
  334. package/govendor/golang.org/x/sys/unix/zerrors_zos_s390x.go +990 -0
  335. package/govendor/golang.org/x/sys/unix/zptrace_armnn_linux.go +40 -0
  336. package/govendor/golang.org/x/sys/unix/zptrace_linux_arm64.go +17 -0
  337. package/govendor/golang.org/x/sys/unix/zptrace_mipsnn_linux.go +49 -0
  338. package/govendor/golang.org/x/sys/unix/zptrace_mipsnnle_linux.go +49 -0
  339. package/govendor/golang.org/x/sys/unix/zptrace_x86_linux.go +79 -0
  340. package/govendor/golang.org/x/sys/unix/zsymaddr_zos_s390x.s +364 -0
  341. package/govendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go +1461 -0
  342. package/govendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go +1420 -0
  343. package/govendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go +1188 -0
  344. package/govendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go +1069 -0
  345. package/govendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go +2728 -0
  346. package/govendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s +799 -0
  347. package/govendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go +2728 -0
  348. package/govendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s +799 -0
  349. package/govendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go +1666 -0
  350. package/govendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go +1886 -0
  351. package/govendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go +1886 -0
  352. package/govendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go +1886 -0
  353. package/govendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go +1886 -0
  354. package/govendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go +1886 -0
  355. package/govendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go +101 -0
  356. package/govendor/golang.org/x/sys/unix/zsyscall_linux.go +2267 -0
  357. package/govendor/golang.org/x/sys/unix/zsyscall_linux_386.go +469 -0
  358. package/govendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go +636 -0
  359. package/govendor/golang.org/x/sys/unix/zsyscall_linux_arm.go +584 -0
  360. package/govendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go +535 -0
  361. package/govendor/golang.org/x/sys/unix/zsyscall_linux_loong64.go +469 -0
  362. package/govendor/golang.org/x/sys/unix/zsyscall_linux_mips.go +636 -0
  363. package/govendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go +630 -0
  364. package/govendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go +619 -0
  365. package/govendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go +636 -0
  366. package/govendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go +641 -0
  367. package/govendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go +687 -0
  368. package/govendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go +687 -0
  369. package/govendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go +531 -0
  370. package/govendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go +478 -0
  371. package/govendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go +631 -0
  372. package/govendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go +1848 -0
  373. package/govendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go +1848 -0
  374. package/govendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go +1848 -0
  375. package/govendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go +1848 -0
  376. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go +2407 -0
  377. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s +719 -0
  378. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go +2407 -0
  379. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s +719 -0
  380. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go +2407 -0
  381. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s +719 -0
  382. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go +2407 -0
  383. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s +719 -0
  384. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go +2407 -0
  385. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s +719 -0
  386. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go +2407 -0
  387. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s +862 -0
  388. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go +2407 -0
  389. package/govendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s +719 -0
  390. package/govendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go +2217 -0
  391. package/govendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go +3458 -0
  392. package/govendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go +280 -0
  393. package/govendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go +280 -0
  394. package/govendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go +280 -0
  395. package/govendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go +280 -0
  396. package/govendor/golang.org/x/sys/unix/zsysctl_openbsd_mips64.go +280 -0
  397. package/govendor/golang.org/x/sys/unix/zsysctl_openbsd_ppc64.go +280 -0
  398. package/govendor/golang.org/x/sys/unix/zsysctl_openbsd_riscv64.go +281 -0
  399. package/govendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go +439 -0
  400. package/govendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go +437 -0
  401. package/govendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go +316 -0
  402. package/govendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go +393 -0
  403. package/govendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go +393 -0
  404. package/govendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go +393 -0
  405. package/govendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go +393 -0
  406. package/govendor/golang.org/x/sys/unix/zsysnum_freebsd_riscv64.go +393 -0
  407. package/govendor/golang.org/x/sys/unix/zsysnum_linux_386.go +470 -0
  408. package/govendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go +394 -0
  409. package/govendor/golang.org/x/sys/unix/zsysnum_linux_arm.go +434 -0
  410. package/govendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go +337 -0
  411. package/govendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go +334 -0
  412. package/govendor/golang.org/x/sys/unix/zsysnum_linux_mips.go +454 -0
  413. package/govendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go +384 -0
  414. package/govendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go +384 -0
  415. package/govendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go +454 -0
  416. package/govendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go +461 -0
  417. package/govendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go +433 -0
  418. package/govendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go +433 -0
  419. package/govendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go +338 -0
  420. package/govendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go +399 -0
  421. package/govendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go +413 -0
  422. package/govendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go +274 -0
  423. package/govendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go +274 -0
  424. package/govendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go +274 -0
  425. package/govendor/golang.org/x/sys/unix/zsysnum_netbsd_arm64.go +274 -0
  426. package/govendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go +219 -0
  427. package/govendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go +219 -0
  428. package/govendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go +219 -0
  429. package/govendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go +218 -0
  430. package/govendor/golang.org/x/sys/unix/zsysnum_openbsd_mips64.go +221 -0
  431. package/govendor/golang.org/x/sys/unix/zsysnum_openbsd_ppc64.go +217 -0
  432. package/govendor/golang.org/x/sys/unix/zsysnum_openbsd_riscv64.go +218 -0
  433. package/govendor/golang.org/x/sys/unix/zsysnum_zos_s390x.go +2852 -0
  434. package/govendor/golang.org/x/sys/unix/ztypes_aix_ppc.go +353 -0
  435. package/govendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go +357 -0
  436. package/govendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go +878 -0
  437. package/govendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go +878 -0
  438. package/govendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go +473 -0
  439. package/govendor/golang.org/x/sys/unix/ztypes_freebsd_386.go +651 -0
  440. package/govendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go +656 -0
  441. package/govendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go +642 -0
  442. package/govendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go +636 -0
  443. package/govendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go +638 -0
  444. package/govendor/golang.org/x/sys/unix/ztypes_linux.go +6547 -0
  445. package/govendor/golang.org/x/sys/unix/ztypes_linux_386.go +747 -0
  446. package/govendor/golang.org/x/sys/unix/ztypes_linux_amd64.go +761 -0
  447. package/govendor/golang.org/x/sys/unix/ztypes_linux_arm.go +741 -0
  448. package/govendor/golang.org/x/sys/unix/ztypes_linux_arm64.go +740 -0
  449. package/govendor/golang.org/x/sys/unix/ztypes_linux_loong64.go +741 -0
  450. package/govendor/golang.org/x/sys/unix/ztypes_linux_mips.go +746 -0
  451. package/govendor/golang.org/x/sys/unix/ztypes_linux_mips64.go +743 -0
  452. package/govendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go +743 -0
  453. package/govendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go +746 -0
  454. package/govendor/golang.org/x/sys/unix/ztypes_linux_ppc.go +754 -0
  455. package/govendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go +749 -0
  456. package/govendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go +749 -0
  457. package/govendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go +828 -0
  458. package/govendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +763 -0
  459. package/govendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go +744 -0
  460. package/govendor/golang.org/x/sys/unix/ztypes_netbsd_386.go +585 -0
  461. package/govendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go +593 -0
  462. package/govendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go +590 -0
  463. package/govendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go +593 -0
  464. package/govendor/golang.org/x/sys/unix/ztypes_openbsd_386.go +568 -0
  465. package/govendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go +568 -0
  466. package/govendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go +575 -0
  467. package/govendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go +568 -0
  468. package/govendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go +568 -0
  469. package/govendor/golang.org/x/sys/unix/ztypes_openbsd_ppc64.go +570 -0
  470. package/govendor/golang.org/x/sys/unix/ztypes_openbsd_riscv64.go +570 -0
  471. package/govendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go +516 -0
  472. package/govendor/golang.org/x/sys/unix/ztypes_zos_s390x.go +552 -0
  473. package/govendor/golang.org/x/sys/windows/aliases.go +13 -0
  474. package/govendor/golang.org/x/sys/windows/dll_windows.go +380 -0
  475. package/govendor/golang.org/x/sys/windows/env_windows.go +57 -0
  476. package/govendor/golang.org/x/sys/windows/eventlog.go +20 -0
  477. package/govendor/golang.org/x/sys/windows/exec_windows.go +248 -0
  478. package/govendor/golang.org/x/sys/windows/memory_windows.go +48 -0
  479. package/govendor/golang.org/x/sys/windows/mkerrors.bash +70 -0
  480. package/govendor/golang.org/x/sys/windows/mkknownfolderids.bash +27 -0
  481. package/govendor/golang.org/x/sys/windows/mksyscall.go +9 -0
  482. package/govendor/golang.org/x/sys/windows/race.go +30 -0
  483. package/govendor/golang.org/x/sys/windows/race0.go +25 -0
  484. package/govendor/golang.org/x/sys/windows/security_windows.go +1537 -0
  485. package/govendor/golang.org/x/sys/windows/service.go +257 -0
  486. package/govendor/golang.org/x/sys/windows/setupapi_windows.go +1425 -0
  487. package/govendor/golang.org/x/sys/windows/str.go +22 -0
  488. package/govendor/golang.org/x/sys/windows/syscall.go +104 -0
  489. package/govendor/golang.org/x/sys/windows/syscall_windows.go +1952 -0
  490. package/govendor/golang.org/x/sys/windows/types_windows.go +4058 -0
  491. package/govendor/golang.org/x/sys/windows/types_windows_386.go +35 -0
  492. package/govendor/golang.org/x/sys/windows/types_windows_amd64.go +34 -0
  493. package/govendor/golang.org/x/sys/windows/types_windows_arm.go +35 -0
  494. package/govendor/golang.org/x/sys/windows/types_windows_arm64.go +34 -0
  495. package/govendor/golang.org/x/sys/windows/zerrors_windows.go +9468 -0
  496. package/govendor/golang.org/x/sys/windows/zknownfolderids_windows.go +149 -0
  497. package/govendor/golang.org/x/sys/windows/zsyscall_windows.go +4828 -0
  498. package/govendor/manifest.txt +7 -0
  499. package/package.json +6 -1
  500. package/tsparser/main.go +37 -3
  501. package/tsparser/tsparser.exe +2 -2
  502. package/types/typenative-go.d.ts +15159 -5
  503. package/types/typenative-npm.d.ts +2637 -30
  504. package/types/typenative.d.ts +1092 -56
@@ -0,0 +1,1002 @@
1
+ // IPC between a program and the copies of itself it forks, child_process.fork
2
+ // and node:cluster. A forked child is this program run again with an IPC link
3
+ // back to its parent: a loopback TCP connection (authenticated by a token)
4
+ // carrying length-prefixed frames — structured-clone messages ('m') and
5
+ // cluster control messages ('c').
6
+ //
7
+ // Cluster workers share listening ports without passing handles (which is not
8
+ // portable): a worker's server.listen() asks the primary, which owns the real
9
+ // listener and hands each accepted connection to a worker in turn by dialing
10
+ // the worker's private loopback listener, sending the client's address on one
11
+ // line, then relaying the bytes. Workers see the real remote address.
12
+ import { defineClass, defineHelper, defineModule, setResults } from './registry.js';
13
+ const ipcHelper = `// IPC frames: 4-byte big-endian length, 1 kind byte, JSON payload
14
+ func tnWriteFrame(w io.Writer, kind byte, payload []byte) error {
15
+ header := make([]byte, 5)
16
+ binary.BigEndian.PutUint32(header, uint32(len(payload)+1))
17
+ header[4] = kind
18
+ if _, err := w.Write(append(header, payload...)); err != nil {
19
+ return err
20
+ }
21
+ return nil
22
+ }
23
+
24
+ func tnReadFrame(r io.Reader) (byte, []byte, error) {
25
+ header := make([]byte, 4)
26
+ if _, err := io.ReadFull(r, header); err != nil {
27
+ return 0, nil, err
28
+ }
29
+ size := binary.BigEndian.Uint32(header)
30
+ body := make([]byte, size)
31
+ if _, err := io.ReadFull(r, body); err != nil {
32
+ return 0, nil, err
33
+ }
34
+ return body[0], body[1:], nil
35
+ }
36
+
37
+ func tnEncodeMessage(v interface{}) []byte {
38
+ data, err := json.Marshal(tnCloneEncode(v))
39
+ if err != nil {
40
+ panic(TnNodeError("DataCloneError", "", err.Error()))
41
+ }
42
+ return data
43
+ }
44
+
45
+ func tnDecodeMessage(data []byte) interface{} {
46
+ var v interface{}
47
+ json.Unmarshal(data, &v)
48
+ return tnCloneDecode(v)
49
+ }
50
+
51
+ // One end of an IPC link. Handlers run on the loop; direct control handlers
52
+ // run on the reading goroutine (replies a blocked caller waits for)
53
+ type tnIpcLink struct {
54
+ conn net.Conn
55
+ mu sync.Mutex
56
+ closed bool
57
+ onMessage func(msg interface{})
58
+ onControl func(ctl map[string]interface{})
59
+ directControl func(ctl map[string]interface{}) bool
60
+ onClose func()
61
+ }
62
+
63
+ func (l *tnIpcLink) write(kind byte, data []byte) bool {
64
+ l.mu.Lock()
65
+ defer l.mu.Unlock()
66
+ if l.closed {
67
+ return false
68
+ }
69
+ return tnWriteFrame(l.conn, kind, data) == nil
70
+ }
71
+
72
+ func (l *tnIpcLink) control(ctl map[string]interface{}) bool {
73
+ data, _ := json.Marshal(ctl)
74
+ return l.write('c', data)
75
+ }
76
+
77
+ func (l *tnIpcLink) close() {
78
+ l.mu.Lock()
79
+ if l.closed {
80
+ l.mu.Unlock()
81
+ return
82
+ }
83
+ l.closed = true
84
+ l.mu.Unlock()
85
+ l.conn.Close()
86
+ }
87
+
88
+ func (l *tnIpcLink) start() {
89
+ go func() {
90
+ for {
91
+ kind, payload, err := tnReadFrame(l.conn)
92
+ if err != nil {
93
+ TnLoopPost(func() {
94
+ if l.onClose != nil {
95
+ l.onClose()
96
+ }
97
+ })
98
+ return
99
+ }
100
+ switch kind {
101
+ case 'm':
102
+ msg := tnDecodeMessage(payload)
103
+ TnLoopPost(func() {
104
+ if l.onMessage != nil {
105
+ l.onMessage(msg)
106
+ }
107
+ })
108
+ case 'c':
109
+ var ctl map[string]interface{}
110
+ json.Unmarshal(payload, &ctl)
111
+ if l.directControl != nil && l.directControl(ctl) {
112
+ continue
113
+ }
114
+ TnLoopPost(func() {
115
+ if l.onControl != nil {
116
+ l.onControl(ctl)
117
+ }
118
+ })
119
+ }
120
+ }
121
+ }()
122
+ }
123
+
124
+ func tnIpcCallback(args []interface{}) interface{} {
125
+ for _, a := range args {
126
+ if a != nil && reflect.ValueOf(a).Kind() == reflect.Func {
127
+ return a
128
+ }
129
+ }
130
+ return nil
131
+ }
132
+
133
+ // --- the parent side: child_process.fork ---
134
+
135
+ type tnChildIpc struct {
136
+ link *tnIpcLink
137
+ pending [][]byte
138
+ connected bool
139
+ onConnect func()
140
+ onControl func(ctl map[string]interface{})
141
+ }
142
+
143
+ func tnCPIpc(cp *TnChildProcess) *tnChildIpc {
144
+ st, _ := cp.ipc.(*tnChildIpc)
145
+ return st
146
+ }
147
+
148
+ func tnIpcClosedError() *TnError {
149
+ return TnNodeError("Error", "ERR_IPC_CHANNEL_CLOSED", "Channel closed")
150
+ }
151
+
152
+ // child.send(message, callback?)
153
+ func (cp *TnChildProcess) send(message interface{}, args ...interface{}) bool {
154
+ st := tnCPIpc(cp)
155
+ cb := tnIpcCallback(args)
156
+ if st == nil || !st.connected {
157
+ err := tnIpcClosedError()
158
+ if cb != nil {
159
+ TnLoopPost(func() { TnInvoke(cb, err) })
160
+ } else {
161
+ TnLoopPost(func() { cp.emit("error", err) })
162
+ }
163
+ return false
164
+ }
165
+ data := tnEncodeMessage(message)
166
+ if st.link == nil {
167
+ st.pending = append(st.pending, data)
168
+ } else {
169
+ st.link.write('m', data)
170
+ }
171
+ if cb != nil {
172
+ TnLoopPost(func() { TnInvoke(cb, nil) })
173
+ }
174
+ return true
175
+ }
176
+
177
+ func (cp *TnChildProcess) disconnect() {
178
+ st := tnCPIpc(cp)
179
+ if st == nil || !st.connected {
180
+ return
181
+ }
182
+ st.connected = false
183
+ if st.link != nil {
184
+ st.link.close()
185
+ }
186
+ TnLoopPost(func() { cp.emit("disconnect") })
187
+ }
188
+
189
+ func (cp *TnChildProcess) Get_connected() bool {
190
+ st := tnCPIpc(cp)
191
+ return st != nil && st.connected
192
+ }
193
+
194
+ // Runs this program again with an IPC link; extraEnv adds environment entries
195
+ func tnForkWith(argv []string, opts interface{}, extraEnv []string) *TnChildProcess {
196
+ ln, err := net.Listen("tcp", "127.0.0.1:0")
197
+ if err != nil {
198
+ panic(TnNodeError("Error", "ERR_IPC_CHANNEL_CLOSED", err.Error()))
199
+ }
200
+ tokenBytes := make([]byte, 16)
201
+ cryptorand.Read(tokenBytes)
202
+ token := hex.EncodeToString(tokenBytes)
203
+ exe, err := os.Executable()
204
+ if err != nil {
205
+ exe = os.Args[0]
206
+ }
207
+ env := os.Environ()
208
+ if custom := TnGet(opts, "env"); custom != nil && !TnIsNil(custom) {
209
+ env = tnEnvList(custom)
210
+ }
211
+ env = append(env, extraEnv...)
212
+ env = append(env, "TN_IPC_ADDR="+ln.Addr().String(), "TN_IPC_TOKEN="+token)
213
+ envMap := map[string]interface{}{}
214
+ for _, kv := range env {
215
+ if k, v, ok := strings.Cut(kv, "="); ok {
216
+ envMap[k] = v
217
+ }
218
+ }
219
+ stdio := "inherit"
220
+ if silent, _ := TnGet(opts, "silent").(bool); silent {
221
+ stdio = "pipe"
222
+ }
223
+ spawnOpts := map[string]interface{}{"env": envMap, "stdio": stdio}
224
+ if cwd, ok := TnGet(opts, "cwd").(string); ok && cwd != "" {
225
+ spawnOpts["cwd"] = cwd
226
+ }
227
+ cp := TnSpawn(exe, argv, spawnOpts)
228
+ st := &tnChildIpc{connected: true}
229
+ cp.ipc = st
230
+ go func() {
231
+ ln.(*net.TCPListener).SetDeadline(time.Now().Add(30 * time.Second))
232
+ for {
233
+ conn, err := ln.Accept()
234
+ if err != nil {
235
+ ln.Close()
236
+ return
237
+ }
238
+ kind, payload, err := tnReadFrame(conn)
239
+ if err != nil || kind != 't' || string(payload) != token {
240
+ conn.Close()
241
+ continue
242
+ }
243
+ ln.Close()
244
+ link := &tnIpcLink{conn: conn}
245
+ TnLoopPost(func() {
246
+ st.link = link
247
+ if !st.connected {
248
+ link.close()
249
+ return
250
+ }
251
+ for _, data := range st.pending {
252
+ link.write('m', data)
253
+ }
254
+ st.pending = nil
255
+ link.onMessage = func(msg interface{}) { cp.emit("message", msg) }
256
+ link.onControl = func(ctl map[string]interface{}) {
257
+ if st.onControl != nil {
258
+ st.onControl(ctl)
259
+ }
260
+ }
261
+ link.onClose = func() {
262
+ if st.connected {
263
+ st.connected = false
264
+ cp.emit("disconnect")
265
+ }
266
+ }
267
+ link.start()
268
+ if st.onConnect != nil {
269
+ st.onConnect()
270
+ }
271
+ })
272
+ return
273
+ }
274
+ }()
275
+ return cp
276
+ }
277
+
278
+ // fork(modulePath, args?, options?): this program, run again (a native binary
279
+ // holds one program; branch on process.send / cluster.isPrimary)
280
+ func TnFork(modulePath interface{}, rest ...interface{}) *TnChildProcess {
281
+ argv := []string{}
282
+ var opts interface{}
283
+ for _, a := range rest {
284
+ if a == nil || TnIsNil(a) {
285
+ continue
286
+ }
287
+ rv := reflect.ValueOf(a)
288
+ if rv.Kind() == reflect.Pointer && rv.Elem().Kind() == reflect.Slice {
289
+ rv = rv.Elem()
290
+ }
291
+ if rv.Kind() == reflect.Slice {
292
+ for i := 0; i < rv.Len(); i++ {
293
+ argv = append(argv, TnJSString(rv.Index(i).Interface()))
294
+ }
295
+ continue
296
+ }
297
+ opts = a
298
+ }
299
+ return tnForkWith(argv, opts, nil)
300
+ }
301
+
302
+ // --- the child side: process.send / process.on('message') ---
303
+
304
+ var tnIpcParent *tnIpcLink
305
+ var tnIpcConnected bool
306
+ var tnIpcRefd bool
307
+
308
+ func init() {
309
+ addr := os.Getenv("TN_IPC_ADDR")
310
+ if addr == "" {
311
+ return
312
+ }
313
+ token := os.Getenv("TN_IPC_TOKEN")
314
+ os.Unsetenv("TN_IPC_ADDR")
315
+ os.Unsetenv("TN_IPC_TOKEN")
316
+ conn, err := net.Dial("tcp", addr)
317
+ if err != nil {
318
+ return
319
+ }
320
+ if tnWriteFrame(conn, 't', []byte(token)) != nil {
321
+ conn.Close()
322
+ return
323
+ }
324
+ link := &tnIpcLink{conn: conn}
325
+ tnIpcParent = link
326
+ tnIpcConnected = true
327
+ link.onMessage = func(msg interface{}) { tnProcessEmitter.emit("message", msg) }
328
+ link.onClose = func() {
329
+ if tnIpcConnected {
330
+ tnIpcConnected = false
331
+ tnIpcUnref()
332
+ tnProcessEmitter.emit("disconnect")
333
+ }
334
+ }
335
+ link.start()
336
+ // A 'message' listener keeps the child alive while the channel is open
337
+ tnProcessMessageHook = tnIpcRef
338
+ }
339
+
340
+ func tnIpcRef() {
341
+ if tnIpcConnected && !tnIpcRefd {
342
+ tnIpcRefd = true
343
+ TnLoopRef()
344
+ }
345
+ }
346
+
347
+ func tnIpcUnref() {
348
+ if tnIpcRefd {
349
+ tnIpcRefd = false
350
+ TnLoopUnref()
351
+ }
352
+ }
353
+
354
+ // process.send(message, callback?)
355
+ func TnProcessSend(message interface{}, args ...interface{}) bool {
356
+ cb := tnIpcCallback(args)
357
+ if !tnIpcConnected {
358
+ err := tnIpcClosedError()
359
+ if cb != nil {
360
+ TnLoopPost(func() { TnInvoke(cb, err) })
361
+ return false
362
+ }
363
+ panic(err)
364
+ }
365
+ ok := tnIpcParent.write('m', tnEncodeMessage(message))
366
+ if cb != nil {
367
+ TnLoopPost(func() { TnInvoke(cb, nil) })
368
+ }
369
+ return ok
370
+ }
371
+
372
+ func TnProcessDisconnect() {
373
+ if !tnIpcConnected {
374
+ return
375
+ }
376
+ tnIpcConnected = false
377
+ tnIpcUnref()
378
+ tnIpcParent.close()
379
+ TnLoopPost(func() { tnProcessEmitter.emit("disconnect") })
380
+ }
381
+
382
+ func TnProcessConnected() bool { return tnIpcConnected }`;
383
+ const clusterHelper = `// node:cluster
384
+ type TnClusterAddress struct {
385
+ address string
386
+ port float64
387
+ addressType float64
388
+ }
389
+
390
+ func tnClusterAddress(a net.Addr) *TnClusterAddress {
391
+ info := &TnClusterAddress{addressType: 4}
392
+ if tcp, ok := a.(*net.TCPAddr); ok {
393
+ info.address = tcp.IP.String()
394
+ info.port = float64(tcp.Port)
395
+ if tcp.IP.To4() == nil {
396
+ info.addressType = 6
397
+ }
398
+ }
399
+ return info
400
+ }
401
+
402
+ type TnClusterWorker struct {
403
+ TnEventEmitter
404
+ id float64
405
+ process *TnChildProcess
406
+ state string
407
+ exitedAfterDisconnect bool
408
+ }
409
+
410
+ func (w *TnClusterWorker) Get_id() float64 { return w.id }
411
+ func (w *TnClusterWorker) Get_process() *TnChildProcess { return w.process }
412
+ func (w *TnClusterWorker) Get_exitedAfterDisconnect() bool { return w.exitedAfterDisconnect }
413
+
414
+ func (w *TnClusterWorker) send(message interface{}, args ...interface{}) bool {
415
+ if w.process == nil {
416
+ return TnProcessSend(message, args...)
417
+ }
418
+ return w.process.send(message, args...)
419
+ }
420
+
421
+ func (w *TnClusterWorker) isConnected() bool {
422
+ if w.process == nil {
423
+ return tnIpcConnected
424
+ }
425
+ return w.process.Get_connected()
426
+ }
427
+
428
+ func (w *TnClusterWorker) isDead() bool {
429
+ if w.process == nil {
430
+ return false
431
+ }
432
+ return w.state == "dead"
433
+ }
434
+
435
+ // disconnect(): the worker closes its servers, then its IPC channel (it exits
436
+ // once nothing else keeps it alive)
437
+ func (w *TnClusterWorker) disconnect() *TnClusterWorker {
438
+ if w.process == nil {
439
+ tnClusterWorkerDisconnect()
440
+ return w
441
+ }
442
+ w.exitedAfterDisconnect = true
443
+ if st := tnCPIpc(w.process); st != nil && st.link != nil {
444
+ st.link.control(map[string]interface{}{"act": "disconnect"})
445
+ }
446
+ return w
447
+ }
448
+
449
+ func (w *TnClusterWorker) kill(signal ...interface{}) {
450
+ if w.process == nil {
451
+ os.Exit(0)
452
+ }
453
+ w.exitedAfterDisconnect = true
454
+ w.process.kill(signal...)
455
+ }
456
+
457
+ func (w *TnClusterWorker) destroy(signal ...interface{}) { w.kill(signal...) }
458
+
459
+ type TnCluster struct {
460
+ TnEventEmitter
461
+ isPrimary bool
462
+ workers *TnMap[string, *TnClusterWorker]
463
+ worker *TnClusterWorker
464
+ settings map[string]interface{}
465
+ nextID float64
466
+ args []string
467
+ silent bool
468
+ }
469
+
470
+ var tnCluster = tnNewCluster()
471
+
472
+ func tnNewCluster() *TnCluster {
473
+ id := os.Getenv("NODE_UNIQUE_ID")
474
+ c := &TnCluster{isPrimary: id == "", workers: TnNewMap[string, *TnClusterWorker](), settings: map[string]interface{}{}}
475
+ if !c.isPrimary {
476
+ n, _ := strconv.ParseFloat(id, 64)
477
+ c.worker = &TnClusterWorker{id: n, state: "online"}
478
+ tnListenHook = tnClusterListen
479
+ }
480
+ return c
481
+ }
482
+
483
+ func (c *TnCluster) Get_workers() *TnMap[string, *TnClusterWorker] {
484
+ if !c.isPrimary {
485
+ return nil
486
+ }
487
+ return c.workers
488
+ }
489
+
490
+ // setupPrimary({ args, silent, exec, execArgv })
491
+ func (c *TnCluster) setupPrimary(settings ...interface{}) {
492
+ if len(settings) == 0 || settings[0] == nil {
493
+ return
494
+ }
495
+ s := settings[0]
496
+ if args := TnGet(s, "args"); args != nil {
497
+ rv := reflect.ValueOf(args)
498
+ if rv.Kind() == reflect.Pointer {
499
+ rv = rv.Elem()
500
+ }
501
+ if rv.Kind() == reflect.Slice {
502
+ c.args = nil
503
+ for i := 0; i < rv.Len(); i++ {
504
+ c.args = append(c.args, TnJSString(rv.Index(i).Interface()))
505
+ }
506
+ }
507
+ }
508
+ if b, ok := TnGet(s, "silent").(bool); ok {
509
+ c.silent = b
510
+ }
511
+ for _, key := range []string{"args", "silent", "exec", "execArgv", "cwd"} {
512
+ if v := TnGet(s, key); v != nil {
513
+ c.settings[key] = v
514
+ }
515
+ }
516
+ }
517
+
518
+ // fork(env?): a worker running this program
519
+ func (c *TnCluster) fork(env ...interface{}) *TnClusterWorker {
520
+ if !c.isPrimary {
521
+ panic(TnNodeError("Error", "ERR_CLUSTER_FORK_IN_WORKER", "cluster.fork() can only be called from the primary"))
522
+ }
523
+ c.nextID++
524
+ id := c.nextID
525
+ key := strconv.FormatFloat(id, 'f', -1, 64)
526
+ w := &TnClusterWorker{id: id, state: "none"}
527
+ extra := []string{"NODE_UNIQUE_ID=" + key}
528
+ if len(env) > 0 && env[0] != nil {
529
+ extra = append(extra, tnEnvList(env[0])...)
530
+ }
531
+ opts := map[string]interface{}{"silent": c.silent}
532
+ if cwd, ok := c.settings["cwd"].(string); ok {
533
+ opts["cwd"] = cwd
534
+ }
535
+ cp := tnForkWith(c.args, opts, extra)
536
+ w.process = cp
537
+ c.workers.Set(key, w)
538
+ st := tnCPIpc(cp)
539
+ st.onConnect = func() {
540
+ w.state = "online"
541
+ w.emit("online")
542
+ c.emit("online", w)
543
+ }
544
+ st.onControl = func(ctl map[string]interface{}) { c.control(w, st.link, ctl) }
545
+ cp.TnEventEmitter.on("message", func(msg interface{}) {
546
+ w.emit("message", msg)
547
+ c.emit("message", w, msg)
548
+ })
549
+ cp.TnEventEmitter.on("disconnect", func() {
550
+ if w.state != "dead" {
551
+ w.state = "disconnected"
552
+ }
553
+ tnClusterDropWorker(w)
554
+ w.emit("disconnect")
555
+ c.emit("disconnect", w)
556
+ })
557
+ cp.TnEventEmitter.on("exit", func(code interface{}, signal interface{}) {
558
+ w.state = "dead"
559
+ c.workers.Delete(key)
560
+ tnClusterDropWorker(w)
561
+ w.emit("exit", code, signal)
562
+ c.emit("exit", w, code, signal)
563
+ })
564
+ cp.TnEventEmitter.on("error", func(err interface{}) { w.emit("error", err) })
565
+ TnLoopPost(func() { c.emit("fork", w) })
566
+ return w
567
+ }
568
+
569
+ // disconnect(callback?): every worker
570
+ func (c *TnCluster) disconnect(cb ...interface{}) {
571
+ remaining := 0
572
+ done := func() {
573
+ if len(cb) > 0 && cb[0] != nil {
574
+ TnInvoke(cb[0])
575
+ }
576
+ }
577
+ for _, w := range c.workers.Values() {
578
+ if !w.isConnected() {
579
+ continue
580
+ }
581
+ remaining++
582
+ w.TnEventEmitter.once("disconnect", func() {
583
+ remaining--
584
+ if remaining == 0 {
585
+ done()
586
+ }
587
+ })
588
+ w.disconnect()
589
+ }
590
+ if remaining == 0 {
591
+ TnLoopPost(done)
592
+ }
593
+ }
594
+
595
+ // --- shared listeners (primary) ---
596
+
597
+ type tnClusterHandler struct {
598
+ worker *TnClusterWorker
599
+ private string
600
+ }
601
+
602
+ type tnSharedServer struct {
603
+ key string
604
+ ln net.Listener
605
+ mu sync.Mutex
606
+ handlers []tnClusterHandler
607
+ next int
608
+ }
609
+
610
+ var tnSharedServers = map[string]*tnSharedServer{}
611
+
612
+ func (s *tnSharedServer) pick() string {
613
+ s.mu.Lock()
614
+ defer s.mu.Unlock()
615
+ if len(s.handlers) == 0 {
616
+ return ""
617
+ }
618
+ h := s.handlers[s.next%len(s.handlers)]
619
+ s.next++
620
+ return h.private
621
+ }
622
+
623
+ func (s *tnSharedServer) remove(match func(h tnClusterHandler) bool) int {
624
+ s.mu.Lock()
625
+ defer s.mu.Unlock()
626
+ kept := []tnClusterHandler{}
627
+ for _, h := range s.handlers {
628
+ if !match(h) {
629
+ kept = append(kept, h)
630
+ }
631
+ }
632
+ s.handlers = kept
633
+ return len(kept)
634
+ }
635
+
636
+ // Relays one client connection to a worker's private listener
637
+ func tnClusterRelay(client net.Conn, target string) {
638
+ back, err := net.Dial("tcp", target)
639
+ if err != nil {
640
+ client.Close()
641
+ return
642
+ }
643
+ if _, err := io.WriteString(back, client.RemoteAddr().String()+"\\n"); err != nil {
644
+ client.Close()
645
+ back.Close()
646
+ return
647
+ }
648
+ var wg sync.WaitGroup
649
+ pipe := func(dst net.Conn, src net.Conn) {
650
+ defer wg.Done()
651
+ io.Copy(dst, src)
652
+ if cw, ok := dst.(interface{ CloseWrite() error }); ok {
653
+ cw.CloseWrite()
654
+ } else {
655
+ dst.Close()
656
+ }
657
+ }
658
+ wg.Add(2)
659
+ go pipe(back, client)
660
+ go pipe(client, back)
661
+ wg.Wait()
662
+ client.Close()
663
+ back.Close()
664
+ }
665
+
666
+ func (s *tnSharedServer) acceptLoop() {
667
+ for {
668
+ conn, err := s.ln.Accept()
669
+ if err != nil {
670
+ return
671
+ }
672
+ target := s.pick()
673
+ if target == "" {
674
+ conn.Close()
675
+ continue
676
+ }
677
+ go tnClusterRelay(conn, target)
678
+ }
679
+ }
680
+
681
+ func tnClusterDropWorker(w *TnClusterWorker) {
682
+ for key, s := range tnSharedServers {
683
+ if s.remove(func(h tnClusterHandler) bool { return h.worker == w }) == 0 {
684
+ s.ln.Close()
685
+ delete(tnSharedServers, key)
686
+ }
687
+ }
688
+ }
689
+
690
+ func tnCtlString(ctl map[string]interface{}, key string) string {
691
+ s, _ := ctl[key].(string)
692
+ return s
693
+ }
694
+
695
+ func tnClusterErrno(err error) string {
696
+ code := ""
697
+ var errno syscall.Errno
698
+ if errors.As(err, &errno) {
699
+ switch errno {
700
+ case syscall.EADDRINUSE:
701
+ code = "EADDRINUSE"
702
+ case syscall.EACCES:
703
+ code = "EACCES"
704
+ case syscall.EADDRNOTAVAIL:
705
+ code = "EADDRNOTAVAIL"
706
+ }
707
+ }
708
+ return code
709
+ }
710
+
711
+ func (c *TnCluster) control(w *TnClusterWorker, link *tnIpcLink, ctl map[string]interface{}) {
712
+ switch tnCtlString(ctl, "act") {
713
+ case "listen":
714
+ network, address, private := tnCtlString(ctl, "network"), tnCtlString(ctl, "address"), tnCtlString(ctl, "private")
715
+ reply := map[string]interface{}{"act": "listenResult", "seq": ctl["seq"]}
716
+ key := network + "|" + address
717
+ srv := tnSharedServers[key]
718
+ if srv == nil {
719
+ ln, err := net.Listen(network, address)
720
+ if err != nil {
721
+ reply["error"] = err.Error()
722
+ reply["code"] = tnClusterErrno(err)
723
+ link.control(reply)
724
+ return
725
+ }
726
+ srv = &tnSharedServer{key: key, ln: ln}
727
+ tnSharedServers[key] = srv
728
+ go srv.acceptLoop()
729
+ }
730
+ srv.mu.Lock()
731
+ srv.handlers = append(srv.handlers, tnClusterHandler{worker: w, private: private})
732
+ srv.mu.Unlock()
733
+ reply["address"] = srv.ln.Addr().String()
734
+ link.control(reply)
735
+ case "listening":
736
+ w.state = "listening"
737
+ addr, _ := net.ResolveTCPAddr("tcp", tnCtlString(ctl, "address"))
738
+ info := tnClusterAddress(addr)
739
+ w.emit("listening", info)
740
+ c.emit("listening", w, info)
741
+ case "close":
742
+ key, private := tnCtlString(ctl, "key"), tnCtlString(ctl, "private")
743
+ if srv := tnSharedServers[key]; srv != nil {
744
+ if srv.remove(func(h tnClusterHandler) bool { return h.private == private }) == 0 {
745
+ srv.ln.Close()
746
+ delete(tnSharedServers, key)
747
+ }
748
+ }
749
+ }
750
+ }
751
+
752
+ // --- worker side: servers listen through the primary ---
753
+
754
+ type tnClusterListener struct {
755
+ private net.Listener
756
+ addr net.Addr
757
+ key string
758
+ closeOnce sync.Once
759
+ }
760
+
761
+ type tnClusterConn struct {
762
+ net.Conn
763
+ r *bufio.Reader
764
+ remote net.Addr
765
+ local net.Addr
766
+ }
767
+
768
+ func (c *tnClusterConn) Read(p []byte) (int, error) { return c.r.Read(p) }
769
+ func (c *tnClusterConn) RemoteAddr() net.Addr { return c.remote }
770
+ func (c *tnClusterConn) LocalAddr() net.Addr { return c.local }
771
+ func (c *tnClusterConn) CloseWrite() error {
772
+ if cw, ok := c.Conn.(interface{ CloseWrite() error }); ok {
773
+ return cw.CloseWrite()
774
+ }
775
+ return nil
776
+ }
777
+
778
+ func (l *tnClusterListener) Accept() (net.Conn, error) {
779
+ for {
780
+ conn, err := l.private.Accept()
781
+ if err != nil {
782
+ return nil, err
783
+ }
784
+ r := bufio.NewReader(conn)
785
+ line, err := r.ReadString('\\n')
786
+ if err != nil {
787
+ conn.Close()
788
+ continue
789
+ }
790
+ remote, _ := net.ResolveTCPAddr("tcp", strings.TrimSpace(line))
791
+ return &tnClusterConn{Conn: conn, r: r, remote: remote, local: l.addr}, nil
792
+ }
793
+ }
794
+
795
+ func (l *tnClusterListener) Close() error {
796
+ l.closeOnce.Do(func() {
797
+ if tnIpcConnected {
798
+ tnIpcParent.control(map[string]interface{}{"act": "close", "key": l.key, "private": l.private.Addr().String()})
799
+ }
800
+ })
801
+ return l.private.Close()
802
+ }
803
+
804
+ func (l *tnClusterListener) Addr() net.Addr { return l.addr }
805
+
806
+ var tnClusterSeq float64
807
+ var tnClusterPending = map[float64]chan map[string]interface{}{}
808
+ var tnClusterPendingMu sync.Mutex
809
+ var tnClusterServers []*TnNetServer
810
+
811
+ func tnClusterControlHandlers() {
812
+ if tnIpcParent.directControl != nil {
813
+ return
814
+ }
815
+ tnIpcParent.directControl = func(ctl map[string]interface{}) bool {
816
+ if tnCtlString(ctl, "act") != "listenResult" {
817
+ return false
818
+ }
819
+ seq, _ := ctl["seq"].(float64)
820
+ tnClusterPendingMu.Lock()
821
+ ch := tnClusterPending[seq]
822
+ delete(tnClusterPending, seq)
823
+ tnClusterPendingMu.Unlock()
824
+ if ch != nil {
825
+ ch <- ctl
826
+ }
827
+ return true
828
+ }
829
+ tnIpcParent.onControl = func(ctl map[string]interface{}) {
830
+ if tnCtlString(ctl, "act") == "disconnect" {
831
+ tnClusterWorkerDisconnect()
832
+ }
833
+ }
834
+ }
835
+
836
+ // The worker's servers close, then its channel
837
+ func tnClusterWorkerDisconnect() {
838
+ servers := tnClusterServers
839
+ tnClusterServers = nil
840
+ remaining := 0
841
+ for _, srv := range servers {
842
+ if srv.listening {
843
+ remaining++
844
+ srv.TnEventEmitter.once("close", func() {
845
+ remaining--
846
+ if remaining == 0 {
847
+ TnProcessDisconnect()
848
+ }
849
+ })
850
+ srv.close()
851
+ }
852
+ }
853
+ if remaining == 0 {
854
+ TnProcessDisconnect()
855
+ }
856
+ }
857
+
858
+ func tnClusterListen(srv *TnNetServer, network string, address string) (net.Listener, error) {
859
+ if tnIpcParent == nil || !tnIpcConnected {
860
+ return net.Listen(network, address)
861
+ }
862
+ tnClusterControlHandlers()
863
+ private, err := net.Listen("tcp", "127.0.0.1:0")
864
+ if err != nil {
865
+ return nil, err
866
+ }
867
+ tnClusterPendingMu.Lock()
868
+ tnClusterSeq++
869
+ seq := tnClusterSeq
870
+ ch := make(chan map[string]interface{}, 1)
871
+ tnClusterPending[seq] = ch
872
+ tnClusterPendingMu.Unlock()
873
+ tnIpcParent.control(map[string]interface{}{"act": "listen", "seq": seq, "network": network, "address": address, "private": private.Addr().String()})
874
+ var reply map[string]interface{}
875
+ select {
876
+ case reply = <-ch:
877
+ case <-time.After(10 * time.Second):
878
+ private.Close()
879
+ return nil, &net.OpError{Op: "listen", Net: network, Err: os.ErrDeadlineExceeded}
880
+ }
881
+ if msg := tnCtlString(reply, "error"); msg != "" {
882
+ private.Close()
883
+ var errno error = errors.New(msg)
884
+ switch tnCtlString(reply, "code") {
885
+ case "EADDRINUSE":
886
+ errno = syscall.EADDRINUSE
887
+ case "EACCES":
888
+ errno = syscall.EACCES
889
+ case "EADDRNOTAVAIL":
890
+ errno = syscall.EADDRNOTAVAIL
891
+ }
892
+ return nil, &net.OpError{Op: "listen", Net: network, Err: &os.SyscallError{Syscall: "listen", Err: errno}}
893
+ }
894
+ shared, _ := net.ResolveTCPAddr("tcp", tnCtlString(reply, "address"))
895
+ tnClusterServers = append(tnClusterServers, srv)
896
+ tnIpcParent.control(map[string]interface{}{"act": "listening", "address": shared.String()})
897
+ return &tnClusterListener{private: private, addr: shared, key: network + "|" + address}, nil
898
+ }`;
899
+ const CLUSTER_EMITTER = 'on=*TnEventEmitter; once=*TnEventEmitter; addListener=*TnEventEmitter; off=*TnEventEmitter; removeListener=*TnEventEmitter; removeAllListeners=*TnEventEmitter; emit=bool; listenerCount=float64';
900
+ export function registerCluster(r) {
901
+ defineHelper(r, 'nodeIpc', ['crypto/rand', 'encoding/binary', 'encoding/hex', 'encoding/json', 'io', 'net', 'os', 'reflect', 'strings', 'sync', 'time'], ['nodeClone', 'nodeChild', 'nodeEvents', 'eventLoop', 'nodeInvoke', 'dynamic'], ipcHelper);
902
+ const useIpc = () => r.helper('nodeIpc');
903
+ // child_process.fork and the child's process.send / connected / disconnect
904
+ r.functions['child_process.fork'] = (c) => {
905
+ useIpc();
906
+ return `TnFork(${c.args.join(', ')})`;
907
+ };
908
+ r.results['child_process.fork'] = '*TnChildProcess';
909
+ const cp = r.classes['child_process.ChildProcess'];
910
+ cp.methods['send'] = 'bool';
911
+ cp.methods['disconnect'] = '';
912
+ cp.getters['connected'] = 'bool';
913
+ r.methods['child_process.ChildProcess#send'] = (c) => {
914
+ useIpc();
915
+ return `${c.recv}.send(${c.args.join(', ')})`;
916
+ };
917
+ r.methods['child_process.ChildProcess#disconnect'] = (c) => {
918
+ useIpc();
919
+ return `${c.recv}.disconnect()`;
920
+ };
921
+ r.functions['process.send'] = (c) => {
922
+ useIpc();
923
+ return `TnProcessSend(${c.args.join(', ')})`;
924
+ };
925
+ r.results['process.send'] = 'bool';
926
+ r.functions['process.disconnect'] = (_c) => {
927
+ useIpc();
928
+ return 'TnProcessDisconnect()';
929
+ };
930
+ r.values['process.connected'] = (_c) => {
931
+ useIpc();
932
+ return 'TnProcessConnected()';
933
+ };
934
+ r.valueTypes['process.connected'] = 'bool';
935
+ // node:cluster
936
+ defineModule(r, 'cluster');
937
+ r.namespaces['cluster.default'] = 'cluster';
938
+ defineHelper(r, 'nodeCluster', ['bufio', 'errors', 'io', 'net', 'os', 'reflect', 'strconv', 'strings', 'sync', 'syscall', 'time'], ['nodeIpc', 'nodeNet', 'orderedMap'], clusterHelper);
939
+ const use = () => r.helper('nodeCluster');
940
+ defineClass(r, 'cluster.Worker', '*TnClusterWorker', 'class', `${CLUSTER_EMITTER}; send=bool; kill=; destroy=; disconnect=*TnClusterWorker; isDead=bool; isConnected=bool`, '', 'id=float64; process=*TnChildProcess; exitedAfterDisconnect=bool', '');
941
+ defineClass(r, 'cluster.Address', '*TnClusterAddress', 'class', '', 'address=string; port=float64; addressType=float64', '', '');
942
+ const value = (name, goType, expr) => {
943
+ r.values[`cluster.${name}`] = (_c) => {
944
+ use();
945
+ return expr;
946
+ };
947
+ r.valueTypes[`cluster.${name}`] = goType;
948
+ };
949
+ value('isPrimary', 'bool', 'tnCluster.isPrimary');
950
+ value('isMaster', 'bool', 'tnCluster.isPrimary');
951
+ value('isWorker', 'bool', '!tnCluster.isPrimary');
952
+ value('workers', '*TnMap[string, *TnClusterWorker]', 'tnCluster.Get_workers()');
953
+ value('worker', '*TnClusterWorker', 'tnCluster.worker');
954
+ value('settings', 'map[string]interface{}', 'tnCluster.settings');
955
+ value('SCHED_NONE', 'float64', 'float64(1)');
956
+ value('SCHED_RR', 'float64', 'float64(2)');
957
+ value('schedulingPolicy', 'float64', 'float64(2)');
958
+ const method = (name, goName, result) => {
959
+ r.functions[`cluster.${name}`] = (c) => {
960
+ use();
961
+ return `tnCluster.${goName}(${c.args.join(', ')})`;
962
+ };
963
+ if (result)
964
+ r.results[`cluster.${name}`] = result;
965
+ };
966
+ method('fork', 'fork', '*TnClusterWorker');
967
+ method('setupPrimary', 'setupPrimary', '');
968
+ method('setupMaster', 'setupPrimary', '');
969
+ method('disconnect', 'disconnect', '');
970
+ for (const name of ['on', 'once', 'addListener', 'off', 'removeListener', 'removeAllListeners', 'prependListener']) {
971
+ method(name, name, '*TnEventEmitter');
972
+ }
973
+ method('emit', 'emit', 'bool');
974
+ method('listenerCount', 'listenerCount', 'float64');
975
+ setResults(r, 'cluster', '');
976
+ const clusterListeners = (nodes) => {
977
+ const event = nodes[0];
978
+ const name = event && event.kind === 'StringLiteral' ? String(event.text) : '';
979
+ if (name === 'listening')
980
+ return ['*TnClusterWorker', '*TnClusterAddress'];
981
+ if (name === 'message')
982
+ return ['*TnClusterWorker', 'interface{}'];
983
+ if (name === 'exit')
984
+ return ['*TnClusterWorker', 'interface{}', 'interface{}'];
985
+ return ['*TnClusterWorker'];
986
+ };
987
+ r.paramTypers['cluster.on'] = clusterListeners;
988
+ r.paramTypers['cluster.once'] = clusterListeners;
989
+ const workerListeners = (nodes) => {
990
+ const event = nodes[0];
991
+ const name = event && event.kind === 'StringLiteral' ? String(event.text) : '';
992
+ if (name === 'listening')
993
+ return ['*TnClusterAddress'];
994
+ if (name === 'message' || name === 'error')
995
+ return ['interface{}'];
996
+ if (name === 'exit')
997
+ return ['interface{}', 'interface{}'];
998
+ return [];
999
+ };
1000
+ r.paramTypers['cluster.Worker#on'] = workerListeners;
1001
+ r.paramTypers['cluster.Worker#once'] = workerListeners;
1002
+ }