goscript 0.1.4 → 0.2.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 (295) hide show
  1. package/README.md +5 -2
  2. package/cmd/go_js_wasm_exec/main.go +201 -0
  3. package/cmd/go_js_wasm_exec/main_test.go +83 -0
  4. package/cmd/goscript/{cmd_compile.go → cmd-compile.go} +7 -0
  5. package/cmd/goscript/cmd-test.go +14 -0
  6. package/cmd/goscript/cmd-test_test.go +1 -1
  7. package/cmd/goscript-wasm/main.go +38 -6
  8. package/compiler/compile-request.go +12 -9
  9. package/compiler/compliance_test.go +0 -1
  10. package/compiler/config.go +2 -0
  11. package/compiler/diagnostic.go +104 -12
  12. package/compiler/diagnostic_test.go +106 -0
  13. package/compiler/gotest/request.go +28 -0
  14. package/compiler/gotest/runner.go +354 -44
  15. package/compiler/gotest/runner_test.go +293 -1
  16. package/compiler/gotest/testdata/browserapi/browserapi_test.go +20 -0
  17. package/compiler/gotest/testdata/browserapi/go.mod +3 -0
  18. package/compiler/index.test.ts +23 -0
  19. package/compiler/lowered-program.go +33 -24
  20. package/compiler/lowering.go +746 -194
  21. package/compiler/lowering_bench_test.go +42 -27
  22. package/compiler/lowering_internal_test.go +18 -0
  23. package/compiler/override-facts.go +15 -0
  24. package/compiler/override-parity-verifier.go +450 -0
  25. package/compiler/override-parity.go +122 -0
  26. package/compiler/override-registry_test.go +559 -0
  27. package/compiler/protobuf-ts-binding.go +567 -0
  28. package/compiler/protobuf-ts-binding_test.go +402 -0
  29. package/compiler/runtime-contract.go +4 -0
  30. package/compiler/runtime-contract_test.go +2 -0
  31. package/compiler/semantic-model-types.go +9 -4
  32. package/compiler/semantic-model.go +282 -70
  33. package/compiler/semantic-model_test.go +82 -1
  34. package/compiler/service.go +21 -1
  35. package/compiler/skeleton_test.go +118 -10
  36. package/compiler/typescript-emitter.go +128 -13
  37. package/compiler/wasm/compile_test.go +37 -4
  38. package/compiler/{wasm_api.go → wasm-api.go} +57 -7
  39. package/dist/gs/builtin/hostio.js +5 -0
  40. package/dist/gs/builtin/hostio.js.map +1 -1
  41. package/dist/gs/builtin/slice.d.ts +13 -2
  42. package/dist/gs/builtin/slice.js +187 -6
  43. package/dist/gs/builtin/slice.js.map +1 -1
  44. package/dist/gs/builtin/type.d.ts +13 -5
  45. package/dist/gs/builtin/type.js +153 -60
  46. package/dist/gs/builtin/type.js.map +1 -1
  47. package/dist/gs/builtin/varRef.d.ts +11 -0
  48. package/dist/gs/builtin/varRef.js +57 -2
  49. package/dist/gs/builtin/varRef.js.map +1 -1
  50. package/dist/gs/bytes/buffer.gs.js +1 -1
  51. package/dist/gs/bytes/buffer.gs.js.map +1 -1
  52. package/dist/gs/bytes/reader.gs.js +1 -1
  53. package/dist/gs/bytes/reader.gs.js.map +1 -1
  54. package/dist/gs/compress/zlib/index.d.ts +10 -3
  55. package/dist/gs/compress/zlib/index.js +50 -16
  56. package/dist/gs/compress/zlib/index.js.map +1 -1
  57. package/dist/gs/encoding/json/index.d.ts +114 -0
  58. package/dist/gs/encoding/json/index.js +544 -36
  59. package/dist/gs/encoding/json/index.js.map +1 -1
  60. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +101 -0
  61. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +589 -0
  62. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  63. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.d.ts +1 -0
  64. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +17 -11
  65. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -1
  66. package/dist/gs/github.com/pkg/errors/errors.js +54 -30
  67. package/dist/gs/github.com/pkg/errors/errors.js.map +1 -1
  68. package/dist/gs/go/scanner/index.d.ts +2 -0
  69. package/dist/gs/go/scanner/index.js +29 -5
  70. package/dist/gs/go/scanner/index.js.map +1 -1
  71. package/dist/gs/go/token/index.js +22 -6
  72. package/dist/gs/go/token/index.js.map +1 -1
  73. package/dist/gs/hash/index.d.ts +6 -0
  74. package/dist/gs/hash/index.js +20 -0
  75. package/dist/gs/hash/index.js.map +1 -1
  76. package/dist/gs/internal/byteorder/index.js +2 -2
  77. package/dist/gs/internal/byteorder/index.js.map +1 -1
  78. package/dist/gs/internal/goarch/index.d.ts +43 -3
  79. package/dist/gs/internal/goarch/index.js +42 -10
  80. package/dist/gs/internal/goarch/index.js.map +1 -1
  81. package/dist/gs/io/fs/fs.js +26 -14
  82. package/dist/gs/io/fs/fs.js.map +1 -1
  83. package/dist/gs/io/fs/readdir.js +4 -2
  84. package/dist/gs/io/fs/readdir.js.map +1 -1
  85. package/dist/gs/io/fs/sub.js +8 -1
  86. package/dist/gs/io/fs/sub.js.map +1 -1
  87. package/dist/gs/io/io.d.ts +2 -0
  88. package/dist/gs/io/io.js.map +1 -1
  89. package/dist/gs/math/bits/index.d.ts +5 -0
  90. package/dist/gs/math/bits/index.js +16 -4
  91. package/dist/gs/math/bits/index.js.map +1 -1
  92. package/dist/gs/mime/index.d.ts +16 -0
  93. package/dist/gs/mime/index.js +315 -6
  94. package/dist/gs/mime/index.js.map +1 -1
  95. package/dist/gs/net/http/httptest/index.d.ts +12 -0
  96. package/dist/gs/net/http/httptest/index.js +85 -6
  97. package/dist/gs/net/http/httptest/index.js.map +1 -1
  98. package/dist/gs/net/http/index.d.ts +300 -5
  99. package/dist/gs/net/http/index.js +1598 -58
  100. package/dist/gs/net/http/index.js.map +1 -1
  101. package/dist/gs/os/dir_unix.gs.js +1 -1
  102. package/dist/gs/os/dir_unix.gs.js.map +1 -1
  103. package/dist/gs/os/error.gs.js +1 -1
  104. package/dist/gs/os/error.gs.js.map +1 -1
  105. package/dist/gs/os/exec.gs.d.ts +1 -0
  106. package/dist/gs/os/exec.gs.js +4 -8
  107. package/dist/gs/os/exec.gs.js.map +1 -1
  108. package/dist/gs/os/exec_posix.gs.js +1 -1
  109. package/dist/gs/os/exec_posix.gs.js.map +1 -1
  110. package/dist/gs/os/index.d.ts +1 -1
  111. package/dist/gs/os/index.js +1 -1
  112. package/dist/gs/os/index.js.map +1 -1
  113. package/dist/gs/os/proc.gs.d.ts +4 -0
  114. package/dist/gs/os/proc.gs.js +12 -6
  115. package/dist/gs/os/proc.gs.js.map +1 -1
  116. package/dist/gs/os/root_js.gs.js +1 -1
  117. package/dist/gs/os/root_js.gs.js.map +1 -1
  118. package/dist/gs/os/types.gs.js +1 -1
  119. package/dist/gs/os/types.gs.js.map +1 -1
  120. package/dist/gs/os/types_js.gs.js +1 -1
  121. package/dist/gs/os/types_js.gs.js.map +1 -1
  122. package/dist/gs/os/types_unix.gs.js +1 -1
  123. package/dist/gs/os/types_unix.gs.js.map +1 -1
  124. package/dist/gs/path/path.js +11 -7
  125. package/dist/gs/path/path.js.map +1 -1
  126. package/dist/gs/reflect/index.d.ts +5 -4
  127. package/dist/gs/reflect/index.js +4 -3
  128. package/dist/gs/reflect/index.js.map +1 -1
  129. package/dist/gs/reflect/map.js +15 -0
  130. package/dist/gs/reflect/map.js.map +1 -1
  131. package/dist/gs/reflect/type.d.ts +25 -6
  132. package/dist/gs/reflect/type.js +1475 -228
  133. package/dist/gs/reflect/type.js.map +1 -1
  134. package/dist/gs/reflect/types.d.ts +14 -6
  135. package/dist/gs/reflect/types.js +35 -1
  136. package/dist/gs/reflect/types.js.map +1 -1
  137. package/dist/gs/reflect/value.d.ts +1 -0
  138. package/dist/gs/reflect/value.js +83 -41
  139. package/dist/gs/reflect/value.js.map +1 -1
  140. package/dist/gs/reflect/visiblefields.js +4 -140
  141. package/dist/gs/reflect/visiblefields.js.map +1 -1
  142. package/dist/gs/runtime/pprof/index.d.ts +8 -2
  143. package/dist/gs/runtime/pprof/index.js +50 -30
  144. package/dist/gs/runtime/pprof/index.js.map +1 -1
  145. package/dist/gs/runtime/runtime.js +5 -4
  146. package/dist/gs/runtime/runtime.js.map +1 -1
  147. package/dist/gs/runtime/trace/index.js +5 -19
  148. package/dist/gs/runtime/trace/index.js.map +1 -1
  149. package/dist/gs/strconv/atoi.gs.js +1 -1
  150. package/dist/gs/strconv/atoi.gs.js.map +1 -1
  151. package/dist/gs/strconv/complex.gs.d.ts +3 -0
  152. package/dist/gs/strconv/complex.gs.js +148 -0
  153. package/dist/gs/strconv/complex.gs.js.map +1 -0
  154. package/dist/gs/strconv/index.d.ts +1 -0
  155. package/dist/gs/strconv/index.js +1 -0
  156. package/dist/gs/strconv/index.js.map +1 -1
  157. package/dist/gs/strings/builder.js +1 -1
  158. package/dist/gs/strings/reader.js +9 -5
  159. package/dist/gs/strings/reader.js.map +1 -1
  160. package/dist/gs/strings/replace.js +15 -7
  161. package/dist/gs/strings/replace.js.map +1 -1
  162. package/dist/gs/strings/strings.d.ts +5 -0
  163. package/dist/gs/strings/strings.js +57 -5
  164. package/dist/gs/strings/strings.js.map +1 -1
  165. package/dist/gs/sync/atomic/doc_64.gs.js +7 -6
  166. package/dist/gs/sync/atomic/doc_64.gs.js.map +1 -1
  167. package/dist/gs/sync/atomic/type.gs.js +9 -9
  168. package/dist/gs/sync/atomic/type.gs.js.map +1 -1
  169. package/dist/gs/sync/atomic/value.gs.js +2 -2
  170. package/dist/gs/sync/atomic/value.gs.js.map +1 -1
  171. package/dist/gs/syscall/env.js +22 -14
  172. package/dist/gs/syscall/env.js.map +1 -1
  173. package/dist/gs/testing/testing.js +55 -13
  174. package/dist/gs/testing/testing.js.map +1 -1
  175. package/dist/gs/time/time.d.ts +24 -1
  176. package/dist/gs/time/time.js +43 -3
  177. package/dist/gs/time/time.js.map +1 -1
  178. package/dist/gs/unique/index.js +7 -1
  179. package/dist/gs/unique/index.js.map +1 -1
  180. package/go.mod +3 -3
  181. package/go.sum +16 -0
  182. package/gs/builtin/hostio.test.ts +16 -0
  183. package/gs/builtin/hostio.ts +7 -0
  184. package/gs/builtin/runtime-contract.test.ts +246 -21
  185. package/gs/builtin/slice.ts +269 -24
  186. package/gs/builtin/type.ts +226 -59
  187. package/gs/builtin/varRef.ts +85 -2
  188. package/gs/bytes/buffer.gs.ts +1 -1
  189. package/gs/bytes/reader.gs.ts +1 -1
  190. package/gs/compress/zlib/index.test.ts +62 -1
  191. package/gs/compress/zlib/index.ts +53 -16
  192. package/gs/compress/zlib/parity.json +51 -0
  193. package/gs/encoding/json/index.test.ts +360 -6
  194. package/gs/encoding/json/index.ts +679 -38
  195. package/gs/encoding/json/parity.json +81 -0
  196. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +373 -3
  197. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +893 -1
  198. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +18 -0
  199. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +17 -11
  200. package/gs/github.com/pkg/errors/errors.ts +54 -30
  201. package/gs/go/scanner/index.test.ts +39 -56
  202. package/gs/go/scanner/index.ts +33 -5
  203. package/gs/go/scanner/parity.json +27 -0
  204. package/gs/go/token/index.ts +22 -6
  205. package/gs/hash/index.test.ts +20 -33
  206. package/gs/hash/index.ts +28 -0
  207. package/gs/hash/parity.json +21 -0
  208. package/gs/internal/byteorder/index.test.ts +2 -2
  209. package/gs/internal/byteorder/index.ts +2 -2
  210. package/gs/internal/goarch/index.test.ts +32 -0
  211. package/gs/internal/goarch/index.ts +45 -13
  212. package/gs/internal/goarch/parity.json +144 -0
  213. package/gs/io/fs/fs.ts +26 -14
  214. package/gs/io/fs/readdir.ts +4 -4
  215. package/gs/io/fs/sub.ts +8 -1
  216. package/gs/io/io.ts +1 -0
  217. package/gs/io/parity.json +162 -0
  218. package/gs/math/bits/index.test.ts +14 -1
  219. package/gs/math/bits/index.ts +23 -4
  220. package/gs/math/bits/parity.json +156 -0
  221. package/gs/mime/index.test.ts +90 -0
  222. package/gs/mime/index.ts +369 -6
  223. package/gs/mime/parity.json +36 -0
  224. package/gs/net/http/httptest/index.test.ts +98 -2
  225. package/gs/net/http/httptest/index.ts +101 -6
  226. package/gs/net/http/httptest/parity.json +15 -0
  227. package/gs/net/http/index.test.ts +781 -12
  228. package/gs/net/http/index.ts +1860 -139
  229. package/gs/net/http/meta.json +16 -1
  230. package/gs/net/http/parity.json +193 -0
  231. package/gs/os/dir_unix.gs.ts +1 -1
  232. package/gs/os/error.gs.ts +1 -1
  233. package/gs/os/exec.gs.ts +4 -8
  234. package/gs/os/exec_posix.gs.ts +1 -1
  235. package/gs/os/index.test.ts +9 -0
  236. package/gs/os/index.ts +1 -0
  237. package/gs/os/parity.json +9 -0
  238. package/gs/os/proc.gs.ts +18 -5
  239. package/gs/os/proc.test.ts +26 -0
  240. package/gs/os/root_js.gs.ts +1 -1
  241. package/gs/os/types.gs.ts +1 -1
  242. package/gs/os/types_js.gs.ts +1 -1
  243. package/gs/os/types_unix.gs.ts +1 -1
  244. package/gs/path/path.ts +11 -7
  245. package/gs/reflect/field.test.ts +37 -15
  246. package/gs/reflect/function-types.test.ts +518 -22
  247. package/gs/reflect/index.ts +8 -6
  248. package/gs/reflect/map.ts +20 -0
  249. package/gs/reflect/meta.json +6 -4
  250. package/gs/reflect/parity.json +234 -0
  251. package/gs/reflect/sliceat.test.ts +156 -0
  252. package/gs/reflect/structof.test.ts +401 -0
  253. package/gs/reflect/type.ts +1961 -317
  254. package/gs/reflect/typefor.test.ts +530 -10
  255. package/gs/reflect/types.ts +43 -18
  256. package/gs/reflect/value.ts +105 -45
  257. package/gs/reflect/visiblefields.ts +5 -168
  258. package/gs/runtime/parity.json +24 -0
  259. package/gs/runtime/pprof/index.test.ts +29 -7
  260. package/gs/runtime/pprof/index.ts +56 -30
  261. package/gs/runtime/pprof/parity.json +27 -0
  262. package/gs/runtime/runtime.test.ts +3 -1
  263. package/gs/runtime/runtime.ts +4 -3
  264. package/gs/runtime/trace/index.test.ts +5 -3
  265. package/gs/runtime/trace/index.ts +8 -20
  266. package/gs/runtime/trace/parity.json +36 -0
  267. package/gs/strconv/atoi.gs.ts +1 -1
  268. package/gs/strconv/complex.gs.ts +174 -0
  269. package/gs/strconv/complex.test.ts +65 -0
  270. package/gs/strconv/index.ts +1 -0
  271. package/gs/strconv/parity.json +120 -0
  272. package/gs/strings/builder.ts +1 -1
  273. package/gs/strings/parity.json +186 -0
  274. package/gs/strings/reader.ts +9 -5
  275. package/gs/strings/replace.ts +15 -7
  276. package/gs/strings/strings.test.ts +22 -2
  277. package/gs/strings/strings.ts +64 -6
  278. package/gs/sync/atomic/doc_64.gs.ts +6 -7
  279. package/gs/sync/atomic/doc_64.test.ts +43 -0
  280. package/gs/sync/atomic/type.gs.ts +9 -9
  281. package/gs/sync/atomic/value.gs.ts +2 -2
  282. package/gs/syscall/env.ts +29 -14
  283. package/gs/testing/testing.test.ts +67 -0
  284. package/gs/testing/testing.ts +87 -19
  285. package/gs/time/parity.json +225 -0
  286. package/gs/time/time.test.ts +20 -2
  287. package/gs/time/time.ts +49 -7
  288. package/gs/unique/index.ts +7 -1
  289. package/package.json +4 -2
  290. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +0 -217
  291. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +0 -926
  292. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +0 -1
  293. package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +0 -38
  294. package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +0 -1361
  295. package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +0 -46
@@ -1,926 +0,0 @@
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
- export const ErrReset = $.newError('stream reset');
5
- export const ErrUnimplemented = $.newError('unimplemented');
6
- export const ErrCompleted = $.newError('unexpected packet after rpc was completed');
7
- export const ErrUnrecognizedPacket = $.newError('unrecognized packet type');
8
- export const ErrEmptyPacket = $.newError('invalid empty packet');
9
- export const ErrInvalidMessage = $.newError('invalid message');
10
- export const ErrEmptyMethodID = $.newError('method id empty');
11
- export const ErrEmptyServiceID = $.newError('service id empty');
12
- export const ErrNoAvailableClients = $.newError('no available rpc clients');
13
- export const ErrNilWriter = $.newError('writer cannot be nil');
14
- export class RawMessage {
15
- data;
16
- copyData;
17
- constructor(init) {
18
- this.data = init?.data ?? null;
19
- this.copyData = init?.copy ?? false;
20
- }
21
- GetData() {
22
- return this.data;
23
- }
24
- SetData(data) {
25
- if (!this.copyData) {
26
- this.data = data;
27
- return;
28
- }
29
- const next = new Uint8Array($.len(data));
30
- $.copy(next, data);
31
- this.data = next;
32
- }
33
- Clear() {
34
- this.data = $.goSlice(this.data, 0, 0);
35
- }
36
- Reset() {
37
- this.data = null;
38
- }
39
- MarshalVT() {
40
- if (!this.copyData) {
41
- return [this.data, null];
42
- }
43
- const next = new Uint8Array($.len(this.data));
44
- $.copy(next, this.data);
45
- return [next, null];
46
- }
47
- UnmarshalVT(data) {
48
- this.SetData(data);
49
- return null;
50
- }
51
- SizeVT() {
52
- return $.len(this.data);
53
- }
54
- MarshalToSizedBufferVT(dAtA) {
55
- if ($.len(dAtA) !== $.len(this.data)) {
56
- return [0, $.newError('invalid buffer length')];
57
- }
58
- $.copy(dAtA, this.data);
59
- return [$.len(dAtA), null];
60
- }
61
- clone() {
62
- const cloned = new RawMessage({ copy: this.copyData });
63
- cloned.SetData(this.data);
64
- return $.markAsStructValue(cloned);
65
- }
66
- }
67
- export function NewRawMessage(data, copy) {
68
- return new RawMessage({ data, copy });
69
- }
70
- $.registerInterfaceType('srpc.Client', null, [
71
- {
72
- name: 'ExecCall',
73
- args: [
74
- { name: 'ctx', type: 'context.Context' },
75
- { name: 'service', type: { kind: $.TypeKind.Basic, name: 'string' } },
76
- { name: 'method', type: { kind: $.TypeKind.Basic, name: 'string' } },
77
- { name: 'in', type: 'srpc.Message' },
78
- { name: 'out', type: 'srpc.Message' },
79
- ],
80
- returns: [{ name: '_r0', type: 'error' }],
81
- },
82
- {
83
- name: 'NewStream',
84
- args: [
85
- { name: 'ctx', type: 'context.Context' },
86
- { name: 'service', type: { kind: $.TypeKind.Basic, name: 'string' } },
87
- { name: 'method', type: { kind: $.TypeKind.Basic, name: 'string' } },
88
- { name: 'firstMsg', type: 'srpc.Message' },
89
- ],
90
- returns: [
91
- { name: '_r0', type: 'srpc.Stream' },
92
- { name: '_r1', type: 'error' },
93
- ],
94
- },
95
- ]);
96
- export class ClientSet {
97
- clients;
98
- constructor(init) {
99
- this.clients = init?.clients ?? null;
100
- }
101
- async ExecCall(ctx, service, method, input, output) {
102
- return this.execCall(ctx, (client) => client.ExecCall(ctx, service, method, input, output));
103
- }
104
- async NewStream(ctx, service, method, firstMsg) {
105
- let stream = null;
106
- const err = await this.execCall(ctx, async (client) => {
107
- const [next, callErr] = await client.NewStream(ctx, service, method, firstMsg);
108
- stream = next;
109
- return callErr;
110
- });
111
- return [stream, err];
112
- }
113
- async execCall(ctx, call) {
114
- let anyClient = false;
115
- for (let i = 0; i < $.len(this.clients); i++) {
116
- const client = this.clients[i];
117
- if (client == null) {
118
- continue;
119
- }
120
- anyClient = true;
121
- const err = await call(client);
122
- if (err == null) {
123
- return null;
124
- }
125
- if (err === context.Canceled && contextErr(ctx) === context.Canceled) {
126
- return context.Canceled;
127
- }
128
- if (err.Error() === ErrUnimplemented.Error()) {
129
- continue;
130
- }
131
- return err;
132
- }
133
- return anyClient ? ErrUnimplemented : ErrNoAvailableClients;
134
- }
135
- }
136
- export function NewClientSet(clients) {
137
- return new ClientSet({ clients });
138
- }
139
- export class PrefixClient {
140
- client;
141
- serviceIDPrefixes;
142
- constructor(clientOrInit, serviceIDPrefixes) {
143
- if (clientOrInit != null &&
144
- typeof clientOrInit === 'object' &&
145
- 'client' in clientOrInit) {
146
- this.client = clientOrInit.client ?? null;
147
- this.serviceIDPrefixes = clientOrInit.serviceIDPrefixes ?? null;
148
- return;
149
- }
150
- this.client = clientOrInit;
151
- this.serviceIDPrefixes = serviceIDPrefixes ?? null;
152
- }
153
- async ExecCall(ctx, service, method, input, output) {
154
- const [stripped, err] = this.stripCheckServiceIDPrefix(service);
155
- if (err != null) {
156
- return err;
157
- }
158
- if (this.client == null) {
159
- return ErrNoAvailableClients;
160
- }
161
- return this.client.ExecCall(ctx, stripped, method, input, output);
162
- }
163
- async NewStream(ctx, service, method, firstMsg) {
164
- const [stripped, err] = this.stripCheckServiceIDPrefix(service);
165
- if (err != null) {
166
- return [null, err];
167
- }
168
- if (this.client == null) {
169
- return [null, ErrNoAvailableClients];
170
- }
171
- return this.client.NewStream(ctx, stripped, method, firstMsg);
172
- }
173
- stripCheckServiceIDPrefix(service) {
174
- if ($.len(this.serviceIDPrefixes) === 0) {
175
- return [service, null];
176
- }
177
- const [stripped, matched] = CheckStripPrefix(service, this.serviceIDPrefixes);
178
- if (matched === '') {
179
- return [service, ErrUnimplemented];
180
- }
181
- return [stripped, null];
182
- }
183
- }
184
- export function NewPrefixClient(client, serviceIDPrefixes) {
185
- return new PrefixClient(client, serviceIDPrefixes);
186
- }
187
- class emptyStream {
188
- ctx;
189
- closed = false;
190
- constructor(ctx = context.Background()) {
191
- this.ctx = ctx;
192
- }
193
- Context() {
194
- return this.ctx;
195
- }
196
- MsgSend(_msg) {
197
- return this.closed ? ErrCompleted : null;
198
- }
199
- MsgRecv(_msg) {
200
- return this.closed ? io.EOF : io.EOF;
201
- }
202
- CloseSend() {
203
- this.closed = true;
204
- return null;
205
- }
206
- Close() {
207
- this.closed = true;
208
- return null;
209
- }
210
- }
211
- class memoryStream {
212
- ctx;
213
- recv;
214
- sent = null;
215
- sentQueue = [];
216
- waiters = [];
217
- closed = false;
218
- recvConsumed = false;
219
- constructor(ctx, recv) {
220
- this.ctx = ctx;
221
- this.recv = recv;
222
- }
223
- Context() {
224
- return this.ctx;
225
- }
226
- MsgSend(msg) {
227
- this.sent = msg;
228
- const waiter = this.waiters.shift();
229
- if (waiter != null) {
230
- waiter(msg);
231
- return null;
232
- }
233
- this.sentQueue.push(msg);
234
- return null;
235
- }
236
- MsgRecv(msg) {
237
- if (!this.recvConsumed) {
238
- this.recvConsumed = true;
239
- if (msg != null && this.recv != null) {
240
- Object.assign(msg, this.recv);
241
- }
242
- return null;
243
- }
244
- const next = this.sentQueue.shift();
245
- if (next !== undefined) {
246
- if (msg != null && next != null) {
247
- Object.assign(msg, next);
248
- }
249
- return null;
250
- }
251
- if (this.closed) {
252
- return io.EOF;
253
- }
254
- return new Promise((resolve) => {
255
- this.waiters.push((sent) => {
256
- if (msg != null && sent != null) {
257
- Object.assign(msg, sent);
258
- }
259
- resolve(null);
260
- });
261
- });
262
- }
263
- CloseSend() {
264
- return null;
265
- }
266
- Close() {
267
- this.closed = true;
268
- for (const waiter of this.waiters.splice(0)) {
269
- waiter(null);
270
- }
271
- return null;
272
- }
273
- CopySentTo(output) {
274
- if (output != null && this.sent != null) {
275
- Object.assign(output, this.sent);
276
- return;
277
- }
278
- const next = this.sentQueue.shift();
279
- if (output != null && next != null) {
280
- Object.assign(output, next);
281
- }
282
- }
283
- }
284
- class streamQueue {
285
- queue = [];
286
- waiters = [];
287
- closed = false;
288
- send(msg) {
289
- if (this.closed) {
290
- return ErrCompleted;
291
- }
292
- const waiter = this.waiters.shift();
293
- if (waiter != null) {
294
- waiter(msg, null);
295
- return null;
296
- }
297
- this.queue.push(msg);
298
- return null;
299
- }
300
- recv(msg) {
301
- const next = this.queue.shift();
302
- if (next !== undefined) {
303
- if (msg != null && next != null) {
304
- Object.assign(msg, next);
305
- }
306
- return null;
307
- }
308
- if (this.closed) {
309
- return io.EOF;
310
- }
311
- return new Promise((resolve) => {
312
- this.waiters.push((sent, err) => {
313
- if (msg != null && sent != null) {
314
- Object.assign(msg, sent);
315
- }
316
- resolve(err);
317
- });
318
- });
319
- }
320
- close() {
321
- this.closed = true;
322
- for (const waiter of this.waiters.splice(0)) {
323
- waiter(null, io.EOF);
324
- }
325
- return null;
326
- }
327
- }
328
- class pairedMemoryStream {
329
- ctx;
330
- incoming;
331
- outgoing;
332
- constructor(ctx, incoming, outgoing) {
333
- this.ctx = ctx;
334
- this.incoming = incoming;
335
- this.outgoing = outgoing;
336
- }
337
- Context() {
338
- return this.ctx;
339
- }
340
- MsgSend(msg) {
341
- return this.outgoing.send(msg);
342
- }
343
- MsgRecv(msg) {
344
- return this.incoming.recv(msg);
345
- }
346
- CloseSend() {
347
- return this.outgoing.close();
348
- }
349
- Close() {
350
- const incomingErr = this.incoming.close();
351
- const outgoingErr = this.outgoing.close();
352
- return incomingErr ?? outgoingErr;
353
- }
354
- }
355
- class streamWithClose {
356
- stream;
357
- closeFn;
358
- constructor(stream, closeFn) {
359
- this.stream = stream;
360
- this.closeFn = closeFn;
361
- }
362
- Context() {
363
- return this.stream.Context();
364
- }
365
- MsgSend(msg) {
366
- return this.stream.MsgSend(msg);
367
- }
368
- MsgRecv(msg) {
369
- return this.stream.MsgRecv(msg);
370
- }
371
- CloseSend() {
372
- return this.stream.CloseSend();
373
- }
374
- async Close() {
375
- const err = await this.stream.Close();
376
- const closeErr = await this.closeFn();
377
- return err ?? closeErr;
378
- }
379
- }
380
- export function NewStreamWithClose(stream, close) {
381
- return new streamWithClose(stream ?? new emptyStream(), close);
382
- }
383
- export async function InvokeMethod(fn, serviceID, methodID, stream) {
384
- if (fn == null) {
385
- return [false, null];
386
- }
387
- return fn(serviceID, methodID, stream);
388
- }
389
- export async function InvokerFunc_InvokeMethod(fn, serviceID, methodID, stream) {
390
- return InvokeMethod(fn, serviceID, methodID, stream);
391
- }
392
- export async function InvokerSlice_InvokeMethod(s, serviceID, methodID, stream) {
393
- for (let i = 0; i < $.len(s); i++) {
394
- const invoker = s[i];
395
- if (invoker == null) {
396
- continue;
397
- }
398
- const [handled, err] = await invoker.InvokeMethod(serviceID, methodID, stream);
399
- if (handled || err != null) {
400
- return [true, err];
401
- }
402
- }
403
- return [false, null];
404
- }
405
- class defaultMux {
406
- fallback;
407
- services = new Map();
408
- constructor(fallback) {
409
- this.fallback = fallback;
410
- }
411
- Register(handler) {
412
- if (handler == null) {
413
- return ErrUnimplemented;
414
- }
415
- const serviceID = handler.GetServiceID();
416
- if (serviceID === '') {
417
- return ErrEmptyServiceID;
418
- }
419
- let methods = this.services.get(serviceID);
420
- if (methods === undefined) {
421
- methods = new Map();
422
- this.services.set(serviceID, methods);
423
- }
424
- const methodIDs = handler.GetMethodIDs();
425
- for (let i = 0; i < $.len(methodIDs); i++) {
426
- const methodID = methodIDs[i];
427
- if (methodID !== '') {
428
- methods.set(methodID, handler);
429
- }
430
- }
431
- return null;
432
- }
433
- HasService(serviceID) {
434
- return serviceID !== '' && (this.services.get(serviceID)?.size ?? 0) !== 0;
435
- }
436
- HasServiceMethod(serviceID, methodID) {
437
- if (serviceID === '' || methodID === '') {
438
- return false;
439
- }
440
- return this.services.get(serviceID)?.has(methodID) ?? false;
441
- }
442
- async InvokeMethod(serviceID, methodID, stream) {
443
- let handler;
444
- if (serviceID === '') {
445
- for (const methods of this.services.values()) {
446
- handler = methods.get(methodID);
447
- if (handler !== undefined) {
448
- break;
449
- }
450
- }
451
- }
452
- else {
453
- handler = this.services.get(serviceID)?.get(methodID);
454
- }
455
- if (handler !== undefined) {
456
- return handler.InvokeMethod(serviceID, methodID, stream);
457
- }
458
- for (let i = 0; i < $.len(this.fallback); i++) {
459
- const invoker = this.fallback[i];
460
- if (invoker == null) {
461
- continue;
462
- }
463
- const [handled, err] = await invoker.InvokeMethod(serviceID, methodID, stream);
464
- if (handled || err != null) {
465
- return [handled, err];
466
- }
467
- }
468
- return [false, null];
469
- }
470
- }
471
- export function NewMux(...fallbackInvokers) {
472
- return new defaultMux(fallbackInvokers);
473
- }
474
- export class PrefixInvoker {
475
- inv;
476
- serviceIDPrefixes;
477
- constructor(invOrInit, serviceIDPrefixes) {
478
- if (invOrInit != null &&
479
- typeof invOrInit === 'object' &&
480
- 'inv' in invOrInit) {
481
- this.inv = invOrInit.inv ?? null;
482
- this.serviceIDPrefixes = invOrInit.serviceIDPrefixes ?? null;
483
- return;
484
- }
485
- this.inv = invOrInit;
486
- this.serviceIDPrefixes = serviceIDPrefixes ?? null;
487
- }
488
- async InvokeMethod(serviceID, methodID, stream) {
489
- if ($.len(this.serviceIDPrefixes) !== 0) {
490
- const [strippedID, matchedPrefix] = CheckStripPrefix(serviceID, this.serviceIDPrefixes);
491
- if (matchedPrefix === '') {
492
- return [false, null];
493
- }
494
- serviceID = strippedID;
495
- }
496
- if (this.inv == null) {
497
- return [false, null];
498
- }
499
- return this.inv.InvokeMethod(serviceID, methodID, stream);
500
- }
501
- }
502
- export function NewPrefixInvoker(inv, serviceIDPrefixes) {
503
- return new PrefixInvoker(inv, serviceIDPrefixes);
504
- }
505
- export function CheckStripPrefix(serviceID, serviceIDPrefixes) {
506
- for (let i = 0; i < $.len(serviceIDPrefixes); i++) {
507
- const prefix = serviceIDPrefixes[i];
508
- if (prefix !== '' && serviceID.startsWith(prefix)) {
509
- return [serviceID.slice(prefix.length), prefix];
510
- }
511
- }
512
- return [serviceID, ''];
513
- }
514
- export class Server {
515
- invoker;
516
- constructor(init) {
517
- this.invoker = init?.invoker ?? null;
518
- }
519
- GetInvoker() {
520
- return this.invoker;
521
- }
522
- HandleStream(_ctx, _rwc) { }
523
- AcceptMuxedConn(_ctx, _conn) {
524
- return null;
525
- }
526
- }
527
- export function NewServer(invoker) {
528
- return new Server({ invoker });
529
- }
530
- class transportClient {
531
- openStream;
532
- constructor(openStream) {
533
- this.openStream = openStream;
534
- }
535
- async ExecCall(ctx, service, method, input, output) {
536
- if (this.openStream == null) {
537
- return ErrNoAvailableClients;
538
- }
539
- const writerResult = await this.openStream(ctx, () => null, () => undefined);
540
- if (writerResult == null) {
541
- return ErrNoAvailableClients;
542
- }
543
- const writer = writerResult[0];
544
- const err = writerResult[1];
545
- if (err != null) {
546
- return err;
547
- }
548
- if (input != null) {
549
- const [data, marshalErr] = input.MarshalVT();
550
- if (marshalErr != null) {
551
- return marshalErr;
552
- }
553
- const writeErr = await writer?.WritePacket(NewCallStartPacket(service, method, data, $.len(data) === 0));
554
- if (writeErr != null) {
555
- return writeErr;
556
- }
557
- }
558
- if (output != null) {
559
- output.Reset();
560
- }
561
- return (await writer?.Close()) ?? null;
562
- }
563
- async NewStream(ctx, service, method, firstMsg) {
564
- if (this.openStream == null) {
565
- return [null, ErrNoAvailableClients];
566
- }
567
- const writerResult = await this.openStream(ctx, () => null, () => undefined);
568
- if (writerResult == null) {
569
- return [null, ErrNoAvailableClients];
570
- }
571
- const writer = writerResult[0];
572
- const err = writerResult[1];
573
- if (err != null) {
574
- return [null, err];
575
- }
576
- if (firstMsg != null) {
577
- const [data, marshalErr] = firstMsg.MarshalVT();
578
- if (marshalErr != null) {
579
- return [null, marshalErr];
580
- }
581
- const writeErr = await writer?.WritePacket(NewCallStartPacket(service, method, data, $.len(data) === 0));
582
- if (writeErr != null) {
583
- return [null, writeErr];
584
- }
585
- }
586
- return [
587
- NewStreamWithClose(new emptyStream(ctx), () => writer?.Close() ?? null),
588
- null,
589
- ];
590
- }
591
- }
592
- export function NewClient(openStream) {
593
- if (openStream?.__server != null) {
594
- return NewClientWithInvoker(openStream.__server.GetInvoker());
595
- }
596
- return new transportClient(openStream);
597
- }
598
- class invokerClient {
599
- invoker;
600
- contextFn;
601
- constructor(invoker, contextFn = null) {
602
- this.invoker = invoker;
603
- this.contextFn = contextFn;
604
- }
605
- async ExecCall(ctx, service, method, input, output) {
606
- if (this.invoker == null) {
607
- return ErrNoAvailableClients;
608
- }
609
- const stream = new memoryStream(this.contextFn == null ? ctx : this.contextFn(ctx), input);
610
- const [handled, err] = await this.invoker.InvokeMethod(service, method, stream);
611
- if (err != null) {
612
- return err;
613
- }
614
- if (!handled) {
615
- return ErrUnimplemented;
616
- }
617
- stream.CopySentTo(output);
618
- return null;
619
- }
620
- async NewStream(ctx, service, method, firstMsg) {
621
- if (this.invoker == null) {
622
- return [null, ErrNoAvailableClients];
623
- }
624
- const streamCtx = this.contextFn == null ? ctx : this.contextFn(ctx);
625
- const clientInput = new streamQueue();
626
- const serverInput = new streamQueue();
627
- const clientStream = new pairedMemoryStream(streamCtx, clientInput, serverInput);
628
- const serverStream = new pairedMemoryStream(streamCtx, serverInput, clientInput);
629
- if (firstMsg != null) {
630
- const err = serverInput.send(firstMsg);
631
- if (err != null) {
632
- return [null, err];
633
- }
634
- }
635
- const pending = Promise.resolve(this.invoker.InvokeMethod(service, method, serverStream));
636
- pending.then(([handled, err]) => {
637
- if (!handled || err != null) {
638
- clientStream.Close();
639
- return;
640
- }
641
- serverStream.CloseSend();
642
- });
643
- return [clientStream, null];
644
- }
645
- }
646
- export function NewClientWithInvoker(invoker, contextFn = null) {
647
- return new invokerClient(invoker, contextFn);
648
- }
649
- class streamWithContext {
650
- stream;
651
- ctx;
652
- constructor(stream, ctx) {
653
- this.stream = stream;
654
- this.ctx = ctx;
655
- }
656
- Context() {
657
- return this.ctx;
658
- }
659
- MsgSend(msg) {
660
- return this.stream.MsgSend(msg);
661
- }
662
- MsgRecv(msg) {
663
- return this.stream.MsgRecv(msg);
664
- }
665
- CloseSend() {
666
- return this.stream.CloseSend();
667
- }
668
- Close() {
669
- return this.stream.Close();
670
- }
671
- }
672
- export function NewStreamWithContext(stream, ctx) {
673
- return new streamWithContext(stream ?? new emptyStream(ctx), ctx);
674
- }
675
- export class ServerRPC {
676
- ctx;
677
- invoker;
678
- writer;
679
- constructor(ctx, invoker, writer) {
680
- this.ctx = ctx;
681
- this.invoker = invoker;
682
- this.writer = writer;
683
- }
684
- async HandlePacketData(data) {
685
- const pkt = new Packet();
686
- const err = pkt.UnmarshalVT(data);
687
- if (err != null) {
688
- return err;
689
- }
690
- return this.HandlePacket(pkt);
691
- }
692
- async HandlePacket(pkt) {
693
- if (pkt == null) {
694
- return null;
695
- }
696
- const body = pkt.GetBody();
697
- if (body instanceof Packet_CallStart) {
698
- return this.HandleCallStart(body.CallStart);
699
- }
700
- return null;
701
- }
702
- async HandleCallStart(pkt) {
703
- if (pkt == null || this.invoker == null) {
704
- return ErrUnimplemented;
705
- }
706
- const stream = new emptyStream(this.ctx);
707
- const [handled, err] = await this.invoker.InvokeMethod(pkt.GetRpcService(), pkt.GetRpcMethod(), stream);
708
- const callErr = err ?? (handled ? null : ErrUnimplemented);
709
- await this.writer?.WritePacket(NewCallDataPacket(null, false, true, callErr));
710
- return callErr;
711
- }
712
- HandleStreamClose(_closeErr) { }
713
- Wait(_ctx) {
714
- return null;
715
- }
716
- }
717
- export function NewServerRPC(ctx, invoker, writer) {
718
- return new ServerRPC(ctx, invoker, writer);
719
- }
720
- export class PacketReadWriter {
721
- rw;
722
- constructor(rw) {
723
- this.rw = rw;
724
- }
725
- Write(data) {
726
- if (this.rw == null) {
727
- return [0, ErrNilWriter];
728
- }
729
- return this.rw.Write(data);
730
- }
731
- WritePacket(_packet) {
732
- return this.rw == null ? ErrNilWriter : null;
733
- }
734
- ReadPump(_cb, closed) {
735
- if (closed != null) {
736
- closed(null);
737
- }
738
- }
739
- ReadToHandler(_cb) {
740
- return null;
741
- }
742
- Close() {
743
- return this.rw?.Close() ?? null;
744
- }
745
- }
746
- export function NewPacketReadWriter(rw) {
747
- return new PacketReadWriter(rw);
748
- }
749
- export function NewServerPipe(server) {
750
- const openStream = ((_ctx, _msgHandler, _closeHandler) => [
751
- new closedPacketWriter(),
752
- null,
753
- ]);
754
- if (server != null) {
755
- openStream.__server = server;
756
- }
757
- return openStream;
758
- }
759
- export class MuxedConn {
760
- rwc;
761
- outbound;
762
- constructor(rwc = null, outbound = false) {
763
- this.rwc = rwc;
764
- this.outbound = outbound;
765
- }
766
- Close() {
767
- return this.rwc?.Close() ?? null;
768
- }
769
- }
770
- class closedPacketWriter {
771
- WritePacket(_packet) {
772
- return ErrUnimplemented;
773
- }
774
- Close() {
775
- return null;
776
- }
777
- }
778
- export function NewOpenStreamWithMuxedConn(_conn) {
779
- return () => [new closedPacketWriter(), null];
780
- }
781
- export function NewMuxedConn(rwc, outbound, _yamuxConf) {
782
- return [new MuxedConn(rwc, outbound), null];
783
- }
784
- export function NewWebSocketConn(_ctx, conn, isServer, yamuxConf) {
785
- return NewMuxedConn(conn, !isServer, yamuxConf);
786
- }
787
- export function NewClientWithMuxedConn(_conn) {
788
- return NewClientWithInvoker(null);
789
- }
790
- export function NewMuxedConnWithRwc(_ctx, _rwc, _outbound, _yamuxConf) {
791
- return [new MuxedConn(_rwc, _outbound), null];
792
- }
793
- class clientInvoker {
794
- client;
795
- constructor(client) {
796
- this.client = client;
797
- }
798
- async InvokeMethod(serviceID, methodID, stream) {
799
- if (this.client == null || stream == null) {
800
- return [false, null];
801
- }
802
- const [remote, err] = await this.client.NewStream(stream.Context(), serviceID, methodID, null);
803
- await remote?.Close();
804
- return [true, err];
805
- }
806
- }
807
- export function NewClientInvoker(client) {
808
- return new clientInvoker(client);
809
- }
810
- export class Packet {
811
- Body = null;
812
- GetBody() {
813
- return this.Body;
814
- }
815
- MarshalVT() {
816
- return [new Uint8Array(), null];
817
- }
818
- UnmarshalVT(_data) {
819
- return null;
820
- }
821
- SizeVT() {
822
- return 0;
823
- }
824
- MarshalToSizedBufferVT(_data) {
825
- return [0, null];
826
- }
827
- Reset() {
828
- this.Body = null;
829
- }
830
- }
831
- export class CallStart {
832
- RpcService = '';
833
- RpcMethod = '';
834
- Data = null;
835
- DataIsZero = false;
836
- GetRpcService() {
837
- return this.RpcService;
838
- }
839
- GetRpcMethod() {
840
- return this.RpcMethod;
841
- }
842
- GetData() {
843
- return this.Data;
844
- }
845
- GetDataIsZero() {
846
- return this.DataIsZero;
847
- }
848
- }
849
- export class CallData {
850
- Data = null;
851
- DataIsZero = false;
852
- Complete = false;
853
- Error = '';
854
- GetData() {
855
- return this.Data;
856
- }
857
- GetDataIsZero() {
858
- return this.DataIsZero;
859
- }
860
- GetComplete() {
861
- return this.Complete;
862
- }
863
- GetError() {
864
- return this.Error;
865
- }
866
- }
867
- export class Packet_CallStart {
868
- CallStart;
869
- constructor(CallStart = null) {
870
- this.CallStart = CallStart;
871
- }
872
- }
873
- export class Packet_CallData {
874
- CallData;
875
- constructor(CallData = null) {
876
- this.CallData = CallData;
877
- }
878
- }
879
- export class Packet_CallCancel {
880
- CallCancel;
881
- constructor(CallCancel = true) {
882
- this.CallCancel = CallCancel;
883
- }
884
- }
885
- export function NewPacketDataHandler(handler) {
886
- return (data) => {
887
- const pkt = new Packet();
888
- const err = pkt.UnmarshalVT(data);
889
- if (err != null) {
890
- return err;
891
- }
892
- return handler?.(pkt) ?? null;
893
- };
894
- }
895
- export function NewCallStartPacket(service, method, data, dataIsZero) {
896
- const pkt = new Packet();
897
- pkt.Body = new Packet_CallStart(Object.assign(new CallStart(), {
898
- RpcService: service,
899
- RpcMethod: method,
900
- Data: data,
901
- DataIsZero: dataIsZero,
902
- }));
903
- return pkt;
904
- }
905
- export function NewCallDataPacket(data, dataIsZero, complete, err) {
906
- const pkt = new Packet();
907
- pkt.Body = new Packet_CallData(Object.assign(new CallData(), {
908
- Data: data,
909
- DataIsZero: dataIsZero,
910
- Complete: complete || err != null,
911
- Error: err?.Error() ?? '',
912
- }));
913
- return pkt;
914
- }
915
- export function NewCallCancelPacket() {
916
- const pkt = new Packet();
917
- pkt.Body = new Packet_CallCancel(true);
918
- return pkt;
919
- }
920
- function contextErr(ctx) {
921
- if (ctx == null) {
922
- return null;
923
- }
924
- return ctx.Err();
925
- }
926
- //# sourceMappingURL=index.js.map