goscript 0.1.0 → 0.1.1

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 (327) hide show
  1. package/README.md +267 -255
  2. package/cmd/goscript/cmd-test.go +193 -0
  3. package/cmd/goscript/cmd-test_test.go +76 -0
  4. package/cmd/goscript/main.go +1 -0
  5. package/compiler/build-flags.go +38 -0
  6. package/compiler/compile-request.go +2 -0
  7. package/compiler/compliance_test.go +0 -8
  8. package/compiler/gotest/owner.go +24 -0
  9. package/compiler/gotest/package-result.go +67 -0
  10. package/compiler/gotest/request.go +145 -0
  11. package/compiler/gotest/result.go +28 -0
  12. package/compiler/gotest/runner.go +588 -0
  13. package/compiler/gotest/runner_test.go +627 -0
  14. package/compiler/gotest/test.go +9 -0
  15. package/compiler/index.test.ts +1 -1
  16. package/compiler/lowered-program.go +71 -19
  17. package/compiler/lowering.go +5065 -569
  18. package/compiler/override-facts.go +307 -0
  19. package/compiler/override-registry.go +50 -189
  20. package/compiler/override-registry_test.go +47 -0
  21. package/compiler/package-graph.go +50 -27
  22. package/compiler/package-graph_test.go +37 -2
  23. package/compiler/package-test-function.go +9 -0
  24. package/compiler/package-test-graph-package.go +40 -0
  25. package/compiler/package-test-graph-variant.go +105 -0
  26. package/compiler/package-test-graph.go +117 -0
  27. package/compiler/package-test-graph_test.go +144 -0
  28. package/compiler/runtime-contract.go +189 -29
  29. package/compiler/runtime-contract_test.go +44 -30
  30. package/compiler/semantic-model-types.go +9 -6
  31. package/compiler/semantic-model.go +538 -38
  32. package/compiler/semantic-model_test.go +55 -0
  33. package/compiler/service.go +1 -1
  34. package/compiler/skeleton_test.go +679 -49
  35. package/compiler/tsworkspace/owner.go +334 -0
  36. package/compiler/tsworkspace/owner_test.go +93 -0
  37. package/compiler/tsworkspace/result.go +17 -0
  38. package/compiler/typescript-emitter.go +459 -82
  39. package/compiler/wasm/compile.go +1 -1
  40. package/compiler/wasm/compile_test.go +61 -11
  41. package/compiler/wasm_api.go +172 -7
  42. package/dist/gs/builtin/builtin.d.ts +20 -2
  43. package/dist/gs/builtin/builtin.js +194 -6
  44. package/dist/gs/builtin/builtin.js.map +1 -1
  45. package/dist/gs/builtin/channel.d.ts +8 -0
  46. package/dist/gs/builtin/channel.js +12 -0
  47. package/dist/gs/builtin/channel.js.map +1 -1
  48. package/dist/gs/builtin/slice.d.ts +22 -2
  49. package/dist/gs/builtin/slice.js +216 -44
  50. package/dist/gs/builtin/slice.js.map +1 -1
  51. package/dist/gs/builtin/type.d.ts +5 -2
  52. package/dist/gs/builtin/type.js +83 -24
  53. package/dist/gs/builtin/type.js.map +1 -1
  54. package/dist/gs/builtin/varRef.d.ts +5 -0
  55. package/dist/gs/builtin/varRef.js +23 -0
  56. package/dist/gs/builtin/varRef.js.map +1 -1
  57. package/dist/gs/bytes/buffer.gs.js +48 -44
  58. package/dist/gs/bytes/buffer.gs.js.map +1 -1
  59. package/dist/gs/bytes/reader.gs.js +20 -18
  60. package/dist/gs/bytes/reader.gs.js.map +1 -1
  61. package/dist/gs/context/context.d.ts +5 -4
  62. package/dist/gs/context/context.js +10 -10
  63. package/dist/gs/context/context.js.map +1 -1
  64. package/dist/gs/crypto/internal/fips140deps/byteorder/index.d.ts +1 -0
  65. package/dist/gs/crypto/internal/fips140deps/byteorder/index.js +2 -0
  66. package/dist/gs/crypto/internal/fips140deps/byteorder/index.js.map +1 -0
  67. package/dist/gs/crypto/internal/fips140deps/godebug/index.d.ts +1 -0
  68. package/dist/gs/crypto/internal/fips140deps/godebug/index.js +2 -0
  69. package/dist/gs/crypto/internal/fips140deps/godebug/index.js.map +1 -0
  70. package/dist/gs/embed/index.d.ts +7 -0
  71. package/dist/gs/embed/index.js +16 -0
  72. package/dist/gs/embed/index.js.map +1 -0
  73. package/dist/gs/encoding/json/index.d.ts +1 -0
  74. package/dist/gs/encoding/json/index.js +18 -0
  75. package/dist/gs/encoding/json/index.js.map +1 -1
  76. package/dist/gs/errors/errors.d.ts +4 -0
  77. package/dist/gs/errors/errors.js +81 -0
  78. package/dist/gs/errors/errors.js.map +1 -1
  79. package/dist/gs/fmt/fmt.d.ts +4 -4
  80. package/dist/gs/fmt/fmt.js +42 -11
  81. package/dist/gs/fmt/fmt.js.map +1 -1
  82. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +35 -0
  83. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +211 -1
  84. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  85. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.d.ts +189 -0
  86. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +825 -0
  87. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -0
  88. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +163 -0
  89. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +449 -0
  90. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +1 -0
  91. package/dist/gs/github.com/klauspost/compress/internal/le/index.d.ts +9 -0
  92. package/dist/gs/github.com/klauspost/compress/internal/le/index.js +71 -0
  93. package/dist/gs/github.com/klauspost/compress/internal/le/index.js.map +1 -0
  94. package/dist/gs/go/internal/scannerhooks/index.d.ts +3 -0
  95. package/dist/gs/go/internal/scannerhooks/index.js +5 -0
  96. package/dist/gs/go/internal/scannerhooks/index.js.map +1 -0
  97. package/dist/gs/go/scanner/index.d.ts +13 -0
  98. package/dist/gs/go/scanner/index.js +35 -0
  99. package/dist/gs/go/scanner/index.js.map +1 -1
  100. package/dist/gs/go/token/index.d.ts +156 -0
  101. package/dist/gs/go/token/index.js +500 -4
  102. package/dist/gs/go/token/index.js.map +1 -1
  103. package/dist/gs/internal/abi/index.d.ts +4 -0
  104. package/dist/gs/internal/abi/index.js +10 -0
  105. package/dist/gs/internal/abi/index.js.map +1 -1
  106. package/dist/gs/internal/bytealg/index.d.ts +2 -0
  107. package/dist/gs/internal/bytealg/index.js +14 -0
  108. package/dist/gs/internal/bytealg/index.js.map +1 -1
  109. package/dist/gs/internal/byteorder/index.d.ts +8 -2
  110. package/dist/gs/internal/byteorder/index.js +56 -25
  111. package/dist/gs/internal/byteorder/index.js.map +1 -1
  112. package/dist/gs/internal/godebug/index.d.ts +12 -0
  113. package/dist/gs/internal/godebug/index.js +30 -0
  114. package/dist/gs/internal/godebug/index.js.map +1 -0
  115. package/dist/gs/io/fs/index.d.ts +1 -0
  116. package/dist/gs/io/fs/index.js +1 -0
  117. package/dist/gs/io/fs/index.js.map +1 -1
  118. package/dist/gs/io/fs/readlink.d.ts +8 -0
  119. package/dist/gs/io/fs/readlink.js +64 -0
  120. package/dist/gs/io/fs/readlink.js.map +1 -0
  121. package/dist/gs/io/fs/walk.d.ts +3 -3
  122. package/dist/gs/io/fs/walk.js +7 -7
  123. package/dist/gs/io/fs/walk.js.map +1 -1
  124. package/dist/gs/io/io.d.ts +40 -6
  125. package/dist/gs/io/io.js +151 -26
  126. package/dist/gs/io/io.js.map +1 -1
  127. package/dist/gs/maps/iter.d.ts +3 -3
  128. package/dist/gs/maps/iter.js +3 -3
  129. package/dist/gs/maps/iter.js.map +1 -1
  130. package/dist/gs/maps/maps.d.ts +2 -2
  131. package/dist/gs/maps/maps.js +1 -1
  132. package/dist/gs/maps/maps.js.map +1 -1
  133. package/dist/gs/math/bits/index.d.ts +13 -4
  134. package/dist/gs/math/bits/index.js +66 -34
  135. package/dist/gs/math/bits/index.js.map +1 -1
  136. package/dist/gs/math/const.gs.d.ts +5 -5
  137. package/dist/gs/math/const.gs.js +4 -4
  138. package/dist/gs/math/const.gs.js.map +1 -1
  139. package/dist/gs/mime/index.d.ts +1 -0
  140. package/dist/gs/mime/index.js +50 -0
  141. package/dist/gs/mime/index.js.map +1 -0
  142. package/dist/gs/net/http/httptest/index.d.ts +11 -0
  143. package/dist/gs/net/http/httptest/index.js +21 -0
  144. package/dist/gs/net/http/httptest/index.js.map +1 -0
  145. package/dist/gs/net/http/index.d.ts +27 -0
  146. package/dist/gs/net/http/index.js +61 -0
  147. package/dist/gs/net/http/index.js.map +1 -0
  148. package/dist/gs/os/dir_unix.gs.js +2 -2
  149. package/dist/gs/os/dir_unix.gs.js.map +1 -1
  150. package/dist/gs/os/types_js.gs.js.map +1 -1
  151. package/dist/gs/path/filepath/match.js +165 -3
  152. package/dist/gs/path/filepath/match.js.map +1 -1
  153. package/dist/gs/path/filepath/path.d.ts +3 -1
  154. package/dist/gs/path/filepath/path.js +133 -4
  155. package/dist/gs/path/filepath/path.js.map +1 -1
  156. package/dist/gs/path/path.d.ts +4 -1
  157. package/dist/gs/path/path.js +16 -4
  158. package/dist/gs/path/path.js.map +1 -1
  159. package/dist/gs/reflect/index.d.ts +1 -1
  160. package/dist/gs/reflect/index.js +1 -1
  161. package/dist/gs/reflect/index.js.map +1 -1
  162. package/dist/gs/reflect/map.js +3 -0
  163. package/dist/gs/reflect/map.js.map +1 -1
  164. package/dist/gs/reflect/type.d.ts +7 -4
  165. package/dist/gs/reflect/type.js +148 -7
  166. package/dist/gs/reflect/type.js.map +1 -1
  167. package/dist/gs/runtime/debug/index.d.ts +2 -0
  168. package/dist/gs/runtime/debug/index.js +8 -0
  169. package/dist/gs/runtime/debug/index.js.map +1 -0
  170. package/dist/gs/runtime/runtime.d.ts +35 -3
  171. package/dist/gs/runtime/runtime.js +72 -0
  172. package/dist/gs/runtime/runtime.js.map +1 -1
  173. package/dist/gs/slices/slices.d.ts +24 -5
  174. package/dist/gs/slices/slices.js +214 -5
  175. package/dist/gs/slices/slices.js.map +1 -1
  176. package/dist/gs/sort/slice.gs.d.ts +3 -3
  177. package/dist/gs/sort/slice.gs.js +6 -6
  178. package/dist/gs/sort/slice.gs.js.map +1 -1
  179. package/dist/gs/sort/sort.gs.d.ts +4 -4
  180. package/dist/gs/sort/sort.gs.js +11 -8
  181. package/dist/gs/sort/sort.gs.js.map +1 -1
  182. package/dist/gs/strings/builder.d.ts +1 -1
  183. package/dist/gs/strings/builder.js +3 -2
  184. package/dist/gs/strings/builder.js.map +1 -1
  185. package/dist/gs/sync/atomic/type.gs.d.ts +9 -8
  186. package/dist/gs/sync/atomic/type.gs.js +0 -2
  187. package/dist/gs/sync/atomic/type.gs.js.map +1 -1
  188. package/dist/gs/sync/sync.d.ts +2 -0
  189. package/dist/gs/sync/sync.js +27 -0
  190. package/dist/gs/sync/sync.js.map +1 -1
  191. package/dist/gs/syscall/constants.d.ts +36 -24
  192. package/dist/gs/syscall/constants.js +12 -0
  193. package/dist/gs/syscall/constants.js.map +1 -1
  194. package/dist/gs/syscall/errors.d.ts +2 -0
  195. package/dist/gs/syscall/errors.js +8 -0
  196. package/dist/gs/syscall/errors.js.map +1 -1
  197. package/dist/gs/syscall/fs.d.ts +43 -0
  198. package/dist/gs/syscall/fs.js +102 -0
  199. package/dist/gs/syscall/fs.js.map +1 -1
  200. package/dist/gs/syscall/js/index.d.ts +90 -0
  201. package/dist/gs/syscall/js/index.js +375 -0
  202. package/dist/gs/syscall/js/index.js.map +1 -0
  203. package/dist/gs/syscall/types.d.ts +22 -0
  204. package/dist/gs/syscall/types.js +45 -1
  205. package/dist/gs/syscall/types.js.map +1 -1
  206. package/dist/gs/testing/index.d.ts +1 -0
  207. package/dist/gs/testing/index.js +2 -0
  208. package/dist/gs/testing/index.js.map +1 -0
  209. package/dist/gs/testing/testing.d.ts +77 -0
  210. package/dist/gs/testing/testing.js +301 -0
  211. package/dist/gs/testing/testing.js.map +1 -0
  212. package/dist/gs/time/time.d.ts +41 -4
  213. package/dist/gs/time/time.js +205 -36
  214. package/dist/gs/time/time.js.map +1 -1
  215. package/dist/gs/unicode/unicode.d.ts +23 -1
  216. package/dist/gs/unicode/unicode.js +79 -10
  217. package/dist/gs/unicode/unicode.js.map +1 -1
  218. package/dist/gs/unicode/utf8/utf8.d.ts +4 -4
  219. package/dist/gs/unicode/utf8/utf8.js +24 -11
  220. package/dist/gs/unicode/utf8/utf8.js.map +1 -1
  221. package/dist/gs/unique/index.d.ts +11 -0
  222. package/dist/gs/unique/index.js +71 -0
  223. package/dist/gs/unique/index.js.map +1 -0
  224. package/go.sum +9 -0
  225. package/gs/builtin/builtin.ts +239 -8
  226. package/gs/builtin/channel.ts +22 -0
  227. package/gs/builtin/runtime-contract.test.ts +126 -0
  228. package/gs/builtin/slice.ts +259 -50
  229. package/gs/builtin/type.ts +109 -34
  230. package/gs/builtin/varRef.ts +38 -1
  231. package/gs/bytes/buffer.gs.ts +48 -44
  232. package/gs/bytes/meta.json +8 -3
  233. package/gs/bytes/reader.gs.ts +20 -19
  234. package/gs/context/context.test.ts +41 -0
  235. package/gs/context/context.ts +22 -26
  236. package/gs/crypto/internal/fips140deps/byteorder/index.ts +1 -0
  237. package/gs/crypto/internal/fips140deps/godebug/index.ts +1 -0
  238. package/gs/embed/index.ts +20 -0
  239. package/gs/embed/meta.json +5 -0
  240. package/gs/encoding/json/index.test.ts +15 -1
  241. package/gs/encoding/json/index.ts +24 -0
  242. package/gs/errors/errors.test.ts +82 -0
  243. package/gs/errors/errors.ts +104 -0
  244. package/gs/fmt/fmt.ts +56 -16
  245. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +73 -1
  246. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +297 -1
  247. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +159 -0
  248. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +1005 -0
  249. package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +719 -0
  250. package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +40 -0
  251. package/gs/github.com/klauspost/compress/internal/le/index.test.ts +36 -0
  252. package/gs/github.com/klauspost/compress/internal/le/index.ts +114 -0
  253. package/gs/go/internal/scannerhooks/index.test.ts +14 -0
  254. package/gs/go/internal/scannerhooks/index.ts +9 -0
  255. package/gs/go/scanner/index.test.ts +22 -0
  256. package/gs/go/scanner/index.ts +47 -0
  257. package/gs/go/token/index.test.ts +47 -1
  258. package/gs/go/token/index.ts +570 -4
  259. package/gs/internal/abi/index.test.ts +18 -0
  260. package/gs/internal/abi/index.ts +14 -0
  261. package/gs/internal/bytealg/index.test.ts +18 -0
  262. package/gs/internal/bytealg/index.ts +16 -0
  263. package/gs/internal/byteorder/index.test.ts +39 -0
  264. package/gs/internal/byteorder/index.ts +100 -27
  265. package/gs/internal/godebug/index.test.ts +16 -0
  266. package/gs/internal/godebug/index.ts +35 -0
  267. package/gs/io/fs/index.ts +1 -0
  268. package/gs/io/fs/meta.json +5 -0
  269. package/gs/io/fs/readlink.test.ts +43 -0
  270. package/gs/io/fs/readlink.ts +77 -0
  271. package/gs/io/fs/walk.test.ts +61 -0
  272. package/gs/io/fs/walk.ts +9 -9
  273. package/gs/io/io.ts +174 -31
  274. package/gs/io/meta.json +10 -2
  275. package/gs/maps/iter.ts +12 -6
  276. package/gs/maps/maps.ts +8 -6
  277. package/gs/math/bits/index.ts +103 -47
  278. package/gs/math/const.gs.test.ts +11 -5
  279. package/gs/math/const.gs.ts +5 -6
  280. package/gs/mime/index.ts +54 -0
  281. package/gs/net/http/httptest/index.ts +25 -0
  282. package/gs/net/http/index.test.ts +20 -0
  283. package/gs/net/http/index.ts +81 -0
  284. package/gs/os/dir_unix.gs.ts +2 -3
  285. package/gs/os/types_js.gs.ts +2 -2
  286. package/gs/path/filepath/match.test.ts +31 -12
  287. package/gs/path/filepath/match.ts +178 -3
  288. package/gs/path/filepath/path.test.ts +25 -0
  289. package/gs/path/filepath/path.ts +159 -5
  290. package/gs/path/path.ts +20 -5
  291. package/gs/reflect/index.ts +1 -0
  292. package/gs/reflect/map.test.ts +19 -0
  293. package/gs/reflect/map.ts +4 -0
  294. package/gs/reflect/type.ts +197 -17
  295. package/gs/runtime/debug/index.test.ts +24 -0
  296. package/gs/runtime/debug/index.ts +8 -0
  297. package/gs/runtime/runtime.test.ts +19 -0
  298. package/gs/runtime/runtime.ts +98 -3
  299. package/gs/slices/slices.test.ts +94 -0
  300. package/gs/slices/slices.ts +245 -5
  301. package/gs/sort/meta.json +7 -0
  302. package/gs/sort/slice.gs.ts +16 -7
  303. package/gs/sort/sort.gs.ts +16 -13
  304. package/gs/strings/builder.ts +4 -3
  305. package/gs/sync/atomic/type.gs.ts +13 -14
  306. package/gs/sync/meta.json +3 -1
  307. package/gs/sync/sync.test.ts +13 -1
  308. package/gs/sync/sync.ts +27 -0
  309. package/gs/syscall/constants.ts +39 -24
  310. package/gs/syscall/errors.ts +10 -0
  311. package/gs/syscall/fs.ts +195 -0
  312. package/gs/syscall/js/index.ts +458 -0
  313. package/gs/syscall/js/meta.json +4 -0
  314. package/gs/syscall/net.test.ts +85 -0
  315. package/gs/syscall/types.ts +56 -0
  316. package/gs/testing/index.ts +1 -0
  317. package/gs/testing/meta.json +5 -0
  318. package/gs/testing/testing.test.ts +90 -0
  319. package/gs/testing/testing.ts +382 -0
  320. package/gs/time/time.test.ts +106 -0
  321. package/gs/time/time.ts +278 -57
  322. package/gs/unicode/unicode.test.ts +25 -0
  323. package/gs/unicode/unicode.ts +119 -9
  324. package/gs/unicode/utf8/utf8.test.ts +13 -0
  325. package/gs/unicode/utf8/utf8.ts +28 -16
  326. package/gs/unique/index.ts +91 -0
  327. package/package.json +2 -1
@@ -0,0 +1,719 @@
1
+ import * as $ from '@goscript/builtin/index.js'
2
+ import * as context from '@goscript/context/index.js'
3
+ import * as io from '@goscript/io/index.js'
4
+ import * as protobuf_go_lite from '@goscript/github.com/aperturerobotics/protobuf-go-lite/index.js'
5
+ import type {
6
+ Client as StarpcClient,
7
+ Mux as StarpcMux,
8
+ Server as StarpcServer,
9
+ } from 'starpc'
10
+
11
+ export type Message = protobuf_go_lite.Message
12
+ export type TypeScriptClient = StarpcClient
13
+ export type TypeScriptMux = StarpcMux
14
+ export type TypeScriptServer = StarpcServer
15
+
16
+ type MaybePromise<T> = T | Promise<T>
17
+
18
+ export const ErrReset = $.newError('stream reset')
19
+ export const ErrUnimplemented = $.newError('unimplemented')
20
+ export const ErrCompleted = $.newError(
21
+ 'unexpected packet after rpc was completed',
22
+ )
23
+ export const ErrUnrecognizedPacket = $.newError('unrecognized packet type')
24
+ export const ErrEmptyPacket = $.newError('invalid empty packet')
25
+ export const ErrInvalidMessage = $.newError('invalid message')
26
+ export const ErrEmptyMethodID = $.newError('method id empty')
27
+ export const ErrEmptyServiceID = $.newError('service id empty')
28
+ export const ErrNoAvailableClients = $.newError('no available rpc clients')
29
+ export const ErrNilWriter = $.newError('writer cannot be nil')
30
+
31
+ export class RawMessage implements Message {
32
+ private data: $.Slice<number>
33
+ private copyData: boolean
34
+
35
+ constructor(init?: Partial<{ data?: $.Slice<number>; copy?: boolean }>) {
36
+ this.data = init?.data ?? null
37
+ this.copyData = init?.copy ?? false
38
+ }
39
+
40
+ public GetData(): $.Slice<number> {
41
+ return this.data
42
+ }
43
+
44
+ public SetData(data: $.Slice<number>): void {
45
+ if (!this.copyData) {
46
+ this.data = data
47
+ return
48
+ }
49
+ const next = new Uint8Array($.len(data))
50
+ $.copy(next, data)
51
+ this.data = next
52
+ }
53
+
54
+ public Clear(): void {
55
+ this.data = $.goSlice(this.data, 0, 0)
56
+ }
57
+
58
+ public Reset(): void {
59
+ this.data = null
60
+ }
61
+
62
+ public MarshalVT(): [$.Slice<number>, $.GoError] {
63
+ if (!this.copyData) {
64
+ return [this.data, null]
65
+ }
66
+ const next = new Uint8Array($.len(this.data))
67
+ $.copy(next, this.data)
68
+ return [next, null]
69
+ }
70
+
71
+ public UnmarshalVT(data: $.Slice<number>): $.GoError {
72
+ this.SetData(data)
73
+ return null
74
+ }
75
+
76
+ public SizeVT(): number {
77
+ return $.len(this.data)
78
+ }
79
+
80
+ public MarshalToSizedBufferVT(dAtA: $.Slice<number>): [number, $.GoError] {
81
+ if ($.len(dAtA) !== $.len(this.data)) {
82
+ return [0, $.newError('invalid buffer length')]
83
+ }
84
+ $.copy(dAtA, this.data)
85
+ return [$.len(dAtA), null]
86
+ }
87
+
88
+ public clone(): RawMessage {
89
+ const cloned = new RawMessage({ copy: this.copyData })
90
+ cloned.SetData(this.data)
91
+ return $.markAsStructValue(cloned)
92
+ }
93
+ }
94
+
95
+ export function NewRawMessage(
96
+ data: $.Slice<number>,
97
+ copy: boolean,
98
+ ): RawMessage {
99
+ return new RawMessage({ data, copy })
100
+ }
101
+
102
+ export interface Client {
103
+ ExecCall(
104
+ ctx: context.Context,
105
+ service: string,
106
+ method: string,
107
+ input: Message | null,
108
+ output: Message | null,
109
+ ): Promise<$.GoError>
110
+ NewStream(
111
+ ctx: context.Context,
112
+ service: string,
113
+ method: string,
114
+ firstMsg: Message | null,
115
+ ): Promise<[Stream | null, $.GoError]>
116
+ }
117
+
118
+ export class ClientSet implements Client {
119
+ private clients: $.Slice<Client | null>
120
+
121
+ constructor(init?: Partial<{ clients?: $.Slice<Client | null> }>) {
122
+ this.clients = init?.clients ?? null
123
+ }
124
+
125
+ public async ExecCall(
126
+ ctx: context.Context,
127
+ service: string,
128
+ method: string,
129
+ input: Message | null,
130
+ output: Message | null,
131
+ ): Promise<$.GoError> {
132
+ return this.execCall(ctx, (client) =>
133
+ client.ExecCall(ctx, service, method, input, output),
134
+ )
135
+ }
136
+
137
+ public async NewStream(
138
+ ctx: context.Context,
139
+ service: string,
140
+ method: string,
141
+ firstMsg: Message | null,
142
+ ): Promise<[Stream | null, $.GoError]> {
143
+ let stream: Stream | null = null
144
+ const err = await this.execCall(ctx, async (client) => {
145
+ const [next, callErr] = await client.NewStream(
146
+ ctx,
147
+ service,
148
+ method,
149
+ firstMsg,
150
+ )
151
+ stream = next
152
+ return callErr
153
+ })
154
+ return [stream, err]
155
+ }
156
+
157
+ private async execCall(
158
+ ctx: context.Context,
159
+ call: (client: Client) => MaybePromise<$.GoError>,
160
+ ): Promise<$.GoError> {
161
+ let anyClient = false
162
+ for (let i = 0; i < $.len(this.clients); i++) {
163
+ const client = this.clients![i]
164
+ if (client == null) {
165
+ continue
166
+ }
167
+ anyClient = true
168
+ const err = await call(client)
169
+ if (err == null) {
170
+ return null
171
+ }
172
+ if (err === context.Canceled && contextErr(ctx) === context.Canceled) {
173
+ return context.Canceled
174
+ }
175
+ if (err.Error() === ErrUnimplemented!.Error()) {
176
+ continue
177
+ }
178
+ return err
179
+ }
180
+ return anyClient ? ErrUnimplemented : ErrNoAvailableClients
181
+ }
182
+ }
183
+
184
+ export function NewClientSet(clients: $.Slice<Client | null>): ClientSet {
185
+ return new ClientSet({ clients })
186
+ }
187
+
188
+ export class PrefixClient implements Client {
189
+ private client: Client | null
190
+ private serviceIDPrefixes: $.Slice<string>
191
+
192
+ constructor(
193
+ clientOrInit?:
194
+ | Client
195
+ | Partial<{ client?: Client | null; serviceIDPrefixes?: $.Slice<string> }>
196
+ | null,
197
+ serviceIDPrefixes?: $.Slice<string>,
198
+ ) {
199
+ if (
200
+ clientOrInit != null &&
201
+ typeof clientOrInit === 'object' &&
202
+ 'client' in clientOrInit
203
+ ) {
204
+ this.client = clientOrInit.client ?? null
205
+ this.serviceIDPrefixes = clientOrInit.serviceIDPrefixes ?? null
206
+ return
207
+ }
208
+ this.client = clientOrInit as Client | null
209
+ this.serviceIDPrefixes = serviceIDPrefixes ?? null
210
+ }
211
+
212
+ public async ExecCall(
213
+ ctx: context.Context,
214
+ service: string,
215
+ method: string,
216
+ input: Message | null,
217
+ output: Message | null,
218
+ ): Promise<$.GoError> {
219
+ const [stripped, err] = this.stripCheckServiceIDPrefix(service)
220
+ if (err != null) {
221
+ return err
222
+ }
223
+ if (this.client == null) {
224
+ return ErrNoAvailableClients
225
+ }
226
+ return this.client.ExecCall(ctx, stripped, method, input, output)
227
+ }
228
+
229
+ public async NewStream(
230
+ ctx: context.Context,
231
+ service: string,
232
+ method: string,
233
+ firstMsg: Message | null,
234
+ ): Promise<[Stream | null, $.GoError]> {
235
+ const [stripped, err] = this.stripCheckServiceIDPrefix(service)
236
+ if (err != null) {
237
+ return [null, err]
238
+ }
239
+ if (this.client == null) {
240
+ return [null, ErrNoAvailableClients]
241
+ }
242
+ return this.client.NewStream(ctx, stripped, method, firstMsg)
243
+ }
244
+
245
+ private stripCheckServiceIDPrefix(service: string): [string, $.GoError] {
246
+ if ($.len(this.serviceIDPrefixes) === 0) {
247
+ return [service, null]
248
+ }
249
+ const [stripped, matched] = CheckStripPrefix(
250
+ service,
251
+ this.serviceIDPrefixes,
252
+ )
253
+ if (matched === '') {
254
+ return [service, ErrUnimplemented]
255
+ }
256
+ return [stripped, null]
257
+ }
258
+ }
259
+
260
+ export function NewPrefixClient(
261
+ client: Client | null,
262
+ serviceIDPrefixes: $.Slice<string>,
263
+ ): PrefixClient {
264
+ return new PrefixClient(client, serviceIDPrefixes)
265
+ }
266
+
267
+ export interface Stream {
268
+ Context(): context.Context
269
+ MsgSend(msg: Message | null): MaybePromise<$.GoError>
270
+ MsgRecv(msg: Message | null): MaybePromise<$.GoError>
271
+ CloseSend(): MaybePromise<$.GoError>
272
+ Close(): MaybePromise<$.GoError>
273
+ }
274
+
275
+ export interface StreamRecv<T> extends Stream {
276
+ Recv(): MaybePromise<[T, $.GoError]>
277
+ RecvTo(value: T): MaybePromise<$.GoError>
278
+ }
279
+
280
+ export interface StreamSend<T> extends Stream {
281
+ Send(value: T): MaybePromise<$.GoError>
282
+ }
283
+
284
+ export interface StreamSendAndClose<T> extends StreamSend<T> {
285
+ SendAndClose(value: T): MaybePromise<$.GoError>
286
+ }
287
+
288
+ class emptyStream implements Stream {
289
+ private ctx: context.Context
290
+ private closed = false
291
+
292
+ constructor(ctx: context.Context = context.Background()) {
293
+ this.ctx = ctx
294
+ }
295
+
296
+ public Context(): context.Context {
297
+ return this.ctx
298
+ }
299
+
300
+ public MsgSend(_msg: Message | null): $.GoError {
301
+ return this.closed ? ErrCompleted : null
302
+ }
303
+
304
+ public MsgRecv(_msg: Message | null): $.GoError {
305
+ return this.closed ? io.EOF : io.EOF
306
+ }
307
+
308
+ public CloseSend(): $.GoError {
309
+ this.closed = true
310
+ return null
311
+ }
312
+
313
+ public Close(): $.GoError {
314
+ this.closed = true
315
+ return null
316
+ }
317
+ }
318
+
319
+ class streamWithClose implements Stream {
320
+ constructor(
321
+ private stream: Stream,
322
+ private closeFn: () => MaybePromise<$.GoError>,
323
+ ) {}
324
+
325
+ public Context(): context.Context {
326
+ return this.stream.Context()
327
+ }
328
+
329
+ public MsgSend(msg: Message | null): MaybePromise<$.GoError> {
330
+ return this.stream.MsgSend(msg)
331
+ }
332
+
333
+ public MsgRecv(msg: Message | null): MaybePromise<$.GoError> {
334
+ return this.stream.MsgRecv(msg)
335
+ }
336
+
337
+ public CloseSend(): MaybePromise<$.GoError> {
338
+ return this.stream.CloseSend()
339
+ }
340
+
341
+ public async Close(): Promise<$.GoError> {
342
+ const err = await this.stream.Close()
343
+ const closeErr = await this.closeFn()
344
+ return err ?? closeErr
345
+ }
346
+ }
347
+
348
+ export function NewStreamWithClose(
349
+ stream: Stream | null,
350
+ close: () => MaybePromise<$.GoError>,
351
+ ): Stream {
352
+ return new streamWithClose(stream ?? new emptyStream(), close)
353
+ }
354
+
355
+ export interface Invoker {
356
+ InvokeMethod(
357
+ serviceID: string,
358
+ methodID: string,
359
+ stream: Stream | null,
360
+ ): MaybePromise<[boolean, $.GoError]>
361
+ }
362
+
363
+ export interface QueryableInvoker {
364
+ HasService(serviceID: string): boolean
365
+ HasServiceMethod(serviceID: string, methodID: string): boolean
366
+ }
367
+
368
+ export type InvokerFunc = (
369
+ serviceID: string,
370
+ methodID: string,
371
+ stream: Stream | null,
372
+ ) => [boolean, $.GoError] | Promise<[boolean, $.GoError]>
373
+
374
+ export async function InvokeMethod(
375
+ fn: InvokerFunc,
376
+ serviceID: string,
377
+ methodID: string,
378
+ stream: Stream | null,
379
+ ): Promise<[boolean, $.GoError]> {
380
+ if (fn == null) {
381
+ return [false, null]
382
+ }
383
+ return fn(serviceID, methodID, stream)
384
+ }
385
+
386
+ export async function InvokerFunc_InvokeMethod(
387
+ fn: InvokerFunc,
388
+ serviceID: string,
389
+ methodID: string,
390
+ stream: Stream | null,
391
+ ): Promise<[boolean, $.GoError]> {
392
+ return InvokeMethod(fn, serviceID, methodID, stream)
393
+ }
394
+
395
+ export type InvokerSlice = $.Slice<Invoker | null>
396
+
397
+ export async function InvokerSlice_InvokeMethod(
398
+ s: InvokerSlice,
399
+ serviceID: string,
400
+ methodID: string,
401
+ stream: Stream | null,
402
+ ): Promise<[boolean, $.GoError]> {
403
+ for (let i = 0; i < $.len(s); i++) {
404
+ const invoker = s![i]
405
+ if (invoker == null) {
406
+ continue
407
+ }
408
+ const [handled, err] = await invoker.InvokeMethod(
409
+ serviceID,
410
+ methodID,
411
+ stream,
412
+ )
413
+ if (handled || err != null) {
414
+ return [true, err]
415
+ }
416
+ }
417
+ return [false, null]
418
+ }
419
+
420
+ export interface Handler extends Invoker {
421
+ GetServiceID(): string
422
+ GetMethodIDs(): $.Slice<string>
423
+ }
424
+
425
+ type HandlerMap = Map<string, Handler>
426
+
427
+ export interface Mux extends Invoker, QueryableInvoker {
428
+ Register(handler: Handler | null): $.GoError
429
+ }
430
+
431
+ class defaultMux implements Mux {
432
+ private fallback: $.Slice<Invoker | null>
433
+ private services = new Map<string, HandlerMap>()
434
+
435
+ constructor(fallback: $.Slice<Invoker | null>) {
436
+ this.fallback = fallback
437
+ }
438
+
439
+ public Register(handler: Handler | null): $.GoError {
440
+ if (handler == null) {
441
+ return ErrUnimplemented
442
+ }
443
+ const serviceID = handler.GetServiceID()
444
+ if (serviceID === '') {
445
+ return ErrEmptyServiceID
446
+ }
447
+ let methods = this.services.get(serviceID)
448
+ if (methods === undefined) {
449
+ methods = new Map()
450
+ this.services.set(serviceID, methods)
451
+ }
452
+ const methodIDs = handler.GetMethodIDs()
453
+ for (let i = 0; i < $.len(methodIDs); i++) {
454
+ const methodID = methodIDs![i]
455
+ if (methodID !== '') {
456
+ methods.set(methodID, handler)
457
+ }
458
+ }
459
+ return null
460
+ }
461
+
462
+ public HasService(serviceID: string): boolean {
463
+ return serviceID !== '' && (this.services.get(serviceID)?.size ?? 0) !== 0
464
+ }
465
+
466
+ public HasServiceMethod(serviceID: string, methodID: string): boolean {
467
+ if (serviceID === '' || methodID === '') {
468
+ return false
469
+ }
470
+ return this.services.get(serviceID)?.has(methodID) ?? false
471
+ }
472
+
473
+ public async InvokeMethod(
474
+ serviceID: string,
475
+ methodID: string,
476
+ stream: Stream | null,
477
+ ): Promise<[boolean, $.GoError]> {
478
+ let handler: Handler | undefined
479
+ if (serviceID === '') {
480
+ for (const methods of this.services.values()) {
481
+ handler = methods.get(methodID)
482
+ if (handler !== undefined) {
483
+ break
484
+ }
485
+ }
486
+ } else {
487
+ handler = this.services.get(serviceID)?.get(methodID)
488
+ }
489
+ if (handler !== undefined) {
490
+ return handler.InvokeMethod(serviceID, methodID, stream)
491
+ }
492
+ for (let i = 0; i < $.len(this.fallback); i++) {
493
+ const invoker = this.fallback![i]
494
+ if (invoker == null) {
495
+ continue
496
+ }
497
+ const [handled, err] = await invoker.InvokeMethod(
498
+ serviceID,
499
+ methodID,
500
+ stream,
501
+ )
502
+ if (handled || err != null) {
503
+ return [handled, err]
504
+ }
505
+ }
506
+ return [false, null]
507
+ }
508
+ }
509
+
510
+ export function NewMux(...fallbackInvokers: (Invoker | null)[]): Mux {
511
+ return new defaultMux(fallbackInvokers)
512
+ }
513
+
514
+ export class PrefixInvoker implements Invoker {
515
+ private inv: Invoker | null
516
+ private serviceIDPrefixes: $.Slice<string>
517
+
518
+ constructor(
519
+ invOrInit?:
520
+ | Invoker
521
+ | Partial<{ inv?: Invoker | null; serviceIDPrefixes?: $.Slice<string> }>
522
+ | null,
523
+ serviceIDPrefixes?: $.Slice<string>,
524
+ ) {
525
+ if (
526
+ invOrInit != null &&
527
+ typeof invOrInit === 'object' &&
528
+ 'inv' in invOrInit
529
+ ) {
530
+ this.inv = invOrInit.inv ?? null
531
+ this.serviceIDPrefixes = invOrInit.serviceIDPrefixes ?? null
532
+ return
533
+ }
534
+ this.inv = invOrInit as Invoker | null
535
+ this.serviceIDPrefixes = serviceIDPrefixes ?? null
536
+ }
537
+
538
+ public async InvokeMethod(
539
+ serviceID: string,
540
+ methodID: string,
541
+ stream: Stream | null,
542
+ ): Promise<[boolean, $.GoError]> {
543
+ if ($.len(this.serviceIDPrefixes) !== 0) {
544
+ const [strippedID, matchedPrefix] = CheckStripPrefix(
545
+ serviceID,
546
+ this.serviceIDPrefixes,
547
+ )
548
+ if (matchedPrefix === '') {
549
+ return [false, null]
550
+ }
551
+ serviceID = strippedID
552
+ }
553
+ if (this.inv == null) {
554
+ return [false, null]
555
+ }
556
+ return this.inv.InvokeMethod(serviceID, methodID, stream)
557
+ }
558
+ }
559
+
560
+ export function NewPrefixInvoker(
561
+ inv: Invoker | null,
562
+ serviceIDPrefixes: $.Slice<string>,
563
+ ): PrefixInvoker {
564
+ return new PrefixInvoker(inv, serviceIDPrefixes)
565
+ }
566
+
567
+ export function CheckStripPrefix(
568
+ serviceID: string,
569
+ serviceIDPrefixes: $.Slice<string>,
570
+ ): [string, string] {
571
+ for (let i = 0; i < $.len(serviceIDPrefixes); i++) {
572
+ const prefix = serviceIDPrefixes![i]
573
+ if (prefix !== '' && serviceID.startsWith(prefix)) {
574
+ return [serviceID.slice(prefix.length), prefix]
575
+ }
576
+ }
577
+ return [serviceID, '']
578
+ }
579
+
580
+ export class Server {
581
+ private invoker: Invoker | null
582
+
583
+ constructor(init?: Partial<{ invoker?: Invoker | null }>) {
584
+ this.invoker = init?.invoker ?? null
585
+ }
586
+
587
+ public GetInvoker(): Invoker | null {
588
+ return this.invoker
589
+ }
590
+
591
+ public HandleStream(
592
+ _ctx: context.Context,
593
+ _rwc: io.ReadWriteCloser | null,
594
+ ): void {}
595
+ }
596
+
597
+ export function NewServer(invoker: Invoker | null): Server {
598
+ return new Server({ invoker })
599
+ }
600
+
601
+ export type PacketHandler = (pkt: Packet | null) => $.GoError
602
+ export type PacketDataHandler = (data: $.Slice<number>) => $.GoError
603
+ export type CloseHandler = (closeErr: $.GoError) => void
604
+
605
+ export class Packet {
606
+ public Body: unknown = null
607
+
608
+ public GetBody(): unknown {
609
+ return this.Body
610
+ }
611
+
612
+ public MarshalVT(): [$.Slice<number>, $.GoError] {
613
+ return [new Uint8Array(), null]
614
+ }
615
+
616
+ public UnmarshalVT(_data: $.Slice<number>): $.GoError {
617
+ return null
618
+ }
619
+
620
+ public SizeVT(): number {
621
+ return 0
622
+ }
623
+
624
+ public MarshalToSizedBufferVT(_data: $.Slice<number>): [number, $.GoError] {
625
+ return [0, null]
626
+ }
627
+
628
+ public Reset(): void {
629
+ this.Body = null
630
+ }
631
+ }
632
+
633
+ export class CallStart {
634
+ public RpcService = ''
635
+ public RpcMethod = ''
636
+ public Data: $.Slice<number> = null
637
+ public DataIsZero = false
638
+ }
639
+
640
+ export class CallData {
641
+ public Data: $.Slice<number> = null
642
+ public DataIsZero = false
643
+ public Complete = false
644
+ public Error = ''
645
+ }
646
+
647
+ export class Packet_CallStart {
648
+ constructor(public CallStart: CallStart | null = null) {}
649
+ }
650
+
651
+ export class Packet_CallData {
652
+ constructor(public CallData: CallData | null = null) {}
653
+ }
654
+
655
+ export class Packet_CallCancel {
656
+ constructor(public CallCancel = true) {}
657
+ }
658
+
659
+ export function NewPacketDataHandler(
660
+ handler: PacketHandler,
661
+ ): PacketDataHandler {
662
+ return (data) => {
663
+ const pkt = new Packet()
664
+ const err = pkt.UnmarshalVT(data)
665
+ if (err != null) {
666
+ return err
667
+ }
668
+ return handler(pkt)
669
+ }
670
+ }
671
+
672
+ export function NewCallStartPacket(
673
+ service: string,
674
+ method: string,
675
+ data: $.Slice<number>,
676
+ dataIsZero: boolean,
677
+ ): Packet {
678
+ const pkt = new Packet()
679
+ pkt.Body = new Packet_CallStart(
680
+ Object.assign(new CallStart(), {
681
+ RpcService: service,
682
+ RpcMethod: method,
683
+ Data: data,
684
+ DataIsZero: dataIsZero,
685
+ }),
686
+ )
687
+ return pkt
688
+ }
689
+
690
+ export function NewCallDataPacket(
691
+ data: $.Slice<number>,
692
+ dataIsZero: boolean,
693
+ complete: boolean,
694
+ err: $.GoError,
695
+ ): Packet {
696
+ const pkt = new Packet()
697
+ pkt.Body = new Packet_CallData(
698
+ Object.assign(new CallData(), {
699
+ Data: data,
700
+ DataIsZero: dataIsZero,
701
+ Complete: complete || err != null,
702
+ Error: err?.Error() ?? '',
703
+ }),
704
+ )
705
+ return pkt
706
+ }
707
+
708
+ export function NewCallCancelPacket(): Packet {
709
+ const pkt = new Packet()
710
+ pkt.Body = new Packet_CallCancel(true)
711
+ return pkt
712
+ }
713
+
714
+ function contextErr(ctx: context.Context): $.GoError {
715
+ if (ctx == null) {
716
+ return null
717
+ }
718
+ return ctx.Err()
719
+ }