goscript 0.1.1 → 0.1.2
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.
- package/cmd/goscript/cmd-test.go +104 -11
- package/cmd/goscript/cmd-test_test.go +1 -1
- package/cmd/goscript/cmd_compile.go +9 -0
- package/compiler/compile-request.go +31 -0
- package/compiler/compiler.go +1 -1
- package/compiler/compliance_test.go +0 -2
- package/compiler/config.go +2 -0
- package/compiler/gotest/package-result.go +2 -0
- package/compiler/gotest/request.go +85 -20
- package/compiler/gotest/runner.go +733 -96
- package/compiler/gotest/runner_test.go +647 -3
- package/compiler/lowered-program.go +9 -2
- package/compiler/lowering.go +2001 -345
- package/compiler/override-facts.go +77 -27
- package/compiler/override-registry.go +5 -4
- package/compiler/override-registry_test.go +135 -0
- package/compiler/package-graph_test.go +62 -7
- package/compiler/package-test-graph-variant.go +40 -16
- package/compiler/package-test-graph.go +0 -5
- package/compiler/package-test-graph_test.go +61 -3
- package/compiler/runtime-contract.go +40 -0
- package/compiler/semantic-model-types.go +16 -0
- package/compiler/semantic-model.go +336 -91
- package/compiler/semantic-model_test.go +50 -1
- package/compiler/service.go +9 -3
- package/compiler/skeleton_test.go +1921 -298
- package/compiler/tsworkspace/owner-process-unix_test.go +72 -0
- package/compiler/tsworkspace/owner.go +8 -0
- package/compiler/tsworkspace/tool-process-other.go +14 -0
- package/compiler/tsworkspace/tool-process-unix.go +19 -0
- package/compiler/typescript-emitter.go +122 -9
- package/dist/gs/builtin/builtin.d.ts +20 -1
- package/dist/gs/builtin/builtin.js +246 -26
- package/dist/gs/builtin/builtin.js.map +1 -1
- package/dist/gs/builtin/channel.d.ts +24 -10
- package/dist/gs/builtin/channel.js +107 -25
- package/dist/gs/builtin/channel.js.map +1 -1
- package/dist/gs/builtin/defer.d.ts +1 -0
- package/dist/gs/builtin/defer.js +12 -2
- package/dist/gs/builtin/defer.js.map +1 -1
- package/dist/gs/builtin/hostio.d.ts +9 -0
- package/dist/gs/builtin/hostio.js +25 -0
- package/dist/gs/builtin/hostio.js.map +1 -1
- package/dist/gs/builtin/map.js +40 -6
- package/dist/gs/builtin/map.js.map +1 -1
- package/dist/gs/builtin/print.js.map +1 -1
- package/dist/gs/builtin/slice.d.ts +43 -9
- package/dist/gs/builtin/slice.js +437 -234
- package/dist/gs/builtin/slice.js.map +1 -1
- package/dist/gs/builtin/type.d.ts +2 -0
- package/dist/gs/builtin/type.js +47 -7
- package/dist/gs/builtin/type.js.map +1 -1
- package/dist/gs/builtin/varRef.d.ts +2 -0
- package/dist/gs/builtin/varRef.js.map +1 -1
- package/dist/gs/bytes/buffer.gs.js +28 -28
- package/dist/gs/bytes/buffer.gs.js.map +1 -1
- package/dist/gs/bytes/iter.gs.js +13 -13
- package/dist/gs/bytes/iter.gs.js.map +1 -1
- package/dist/gs/compress/zlib/index.d.ts +26 -0
- package/dist/gs/compress/zlib/index.js +168 -0
- package/dist/gs/compress/zlib/index.js.map +1 -0
- package/dist/gs/context/context.d.ts +1 -1
- package/dist/gs/context/context.js +8 -3
- package/dist/gs/context/context.js.map +1 -1
- package/dist/gs/crypto/ecdh/index.d.ts +52 -0
- package/dist/gs/crypto/ecdh/index.js +226 -0
- package/dist/gs/crypto/ecdh/index.js.map +1 -0
- package/dist/gs/crypto/ed25519/index.d.ts +34 -0
- package/dist/gs/crypto/ed25519/index.js +160 -0
- package/dist/gs/crypto/ed25519/index.js.map +1 -0
- package/dist/gs/crypto/internal/constanttime/index.d.ts +4 -0
- package/dist/gs/crypto/internal/constanttime/index.js +18 -0
- package/dist/gs/crypto/internal/constanttime/index.js.map +1 -0
- package/dist/gs/crypto/rand/index.d.ts +2 -0
- package/dist/gs/crypto/rand/index.js +85 -0
- package/dist/gs/crypto/rand/index.js.map +1 -1
- package/dist/gs/crypto/sha256/index.d.ts +8 -0
- package/dist/gs/crypto/sha256/index.js +118 -0
- package/dist/gs/crypto/sha256/index.js.map +1 -0
- package/dist/gs/crypto/sha512/index.d.ts +14 -0
- package/dist/gs/crypto/sha512/index.js +129 -0
- package/dist/gs/crypto/sha512/index.js.map +1 -0
- package/dist/gs/encoding/json/index.d.ts +3 -0
- package/dist/gs/encoding/json/index.js +15 -0
- package/dist/gs/encoding/json/index.js.map +1 -1
- package/dist/gs/errors/errors.js +29 -6
- package/dist/gs/errors/errors.js.map +1 -1
- package/dist/gs/fmt/fmt.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +7 -7
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +52 -18
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +56 -20
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +57 -3
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +366 -1
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/util/conc/index.d.ts +20 -0
- package/dist/gs/github.com/aperturerobotics/util/conc/index.js +134 -0
- package/dist/gs/github.com/aperturerobotics/util/conc/index.js.map +1 -0
- package/dist/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.js.map +1 -1
- package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.d.ts +3 -0
- package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js +50 -0
- package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js.map +1 -0
- package/dist/gs/github.com/klauspost/compress/internal/le/index.js +3 -2
- package/dist/gs/github.com/klauspost/compress/internal/le/index.js.map +1 -1
- package/dist/gs/github.com/mr-tron/base58/base58/index.d.ts +27 -0
- package/dist/gs/github.com/mr-tron/base58/base58/index.js +172 -0
- package/dist/gs/github.com/mr-tron/base58/base58/index.js.map +1 -0
- package/dist/gs/github.com/zeebo/blake3/internal/consts/index.d.ts +21 -0
- package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js +22 -0
- package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js.map +1 -0
- package/dist/gs/go/token/index.js +11 -4
- package/dist/gs/go/token/index.js.map +1 -1
- package/dist/gs/hash/fnv/index.d.ts +57 -0
- package/dist/gs/hash/fnv/index.js +299 -0
- package/dist/gs/hash/fnv/index.js.map +1 -0
- package/dist/gs/hash/index.d.ts +17 -0
- package/dist/gs/hash/index.js +94 -0
- package/dist/gs/hash/index.js.map +1 -0
- package/dist/gs/io/fs/readlink.js +2 -6
- package/dist/gs/io/fs/readlink.js.map +1 -1
- package/dist/gs/io/fs/walk.js.map +1 -1
- package/dist/gs/io/io.js.map +1 -1
- package/dist/gs/iter/iter.d.ts +3 -2
- package/dist/gs/iter/iter.js.map +1 -1
- package/dist/gs/maps/iter.d.ts +5 -5
- package/dist/gs/maps/iter.js +48 -21
- package/dist/gs/maps/iter.js.map +1 -1
- package/dist/gs/maps/maps.d.ts +6 -6
- package/dist/gs/math/bits/index.js +14 -24
- package/dist/gs/math/bits/index.js.map +1 -1
- package/dist/gs/mime/index.js +3 -1
- package/dist/gs/mime/index.js.map +1 -1
- package/dist/gs/net/http/httptest/index.d.ts +20 -1
- package/dist/gs/net/http/httptest/index.js +83 -3
- package/dist/gs/net/http/httptest/index.js.map +1 -1
- package/dist/gs/net/http/index.d.ts +110 -6
- package/dist/gs/net/http/index.js +262 -16
- package/dist/gs/net/http/index.js.map +1 -1
- package/dist/gs/net/http/pprof/index.d.ts +8 -0
- package/dist/gs/net/http/pprof/index.js +59 -0
- package/dist/gs/net/http/pprof/index.js.map +1 -0
- package/dist/gs/os/error.gs.js +9 -7
- package/dist/gs/os/error.gs.js.map +1 -1
- package/dist/gs/os/types_js.gs.js +95 -15
- package/dist/gs/os/types_js.gs.js.map +1 -1
- package/dist/gs/path/filepath/match.js.map +1 -1
- package/dist/gs/path/filepath/path.d.ts +5 -3
- package/dist/gs/path/filepath/path.js +65 -10
- package/dist/gs/path/filepath/path.js.map +1 -1
- package/dist/gs/reflect/index.d.ts +3 -2
- package/dist/gs/reflect/index.js +2 -1
- package/dist/gs/reflect/index.js.map +1 -1
- package/dist/gs/reflect/iter.js +2 -2
- package/dist/gs/reflect/iter.js.map +1 -1
- package/dist/gs/reflect/map.js +26 -0
- package/dist/gs/reflect/map.js.map +1 -1
- package/dist/gs/reflect/type.d.ts +24 -5
- package/dist/gs/reflect/type.js +390 -38
- package/dist/gs/reflect/type.js.map +1 -1
- package/dist/gs/reflect/types.d.ts +1 -0
- package/dist/gs/reflect/types.js +3 -1
- package/dist/gs/reflect/types.js.map +1 -1
- package/dist/gs/reflect/value.d.ts +4 -1
- package/dist/gs/reflect/value.js +39 -1
- package/dist/gs/reflect/value.js.map +1 -1
- package/dist/gs/reflect/visiblefields.js +1 -1
- package/dist/gs/reflect/visiblefields.js.map +1 -1
- package/dist/gs/runtime/debug/index.d.ts +39 -0
- package/dist/gs/runtime/debug/index.js +58 -0
- package/dist/gs/runtime/debug/index.js.map +1 -1
- package/dist/gs/runtime/pprof/index.d.ts +20 -0
- package/dist/gs/runtime/pprof/index.js +85 -0
- package/dist/gs/runtime/pprof/index.js.map +1 -0
- package/dist/gs/runtime/trace/index.d.ts +19 -0
- package/dist/gs/runtime/trace/index.js +64 -0
- package/dist/gs/runtime/trace/index.js.map +1 -0
- package/dist/gs/slices/slices.d.ts +24 -9
- package/dist/gs/slices/slices.js +229 -24
- package/dist/gs/slices/slices.js.map +1 -1
- package/dist/gs/sort/slice.gs.d.ts +5 -3
- package/dist/gs/sort/slice.gs.js +55 -17
- package/dist/gs/sort/slice.gs.js.map +1 -1
- package/dist/gs/strings/builder.js +26 -17
- package/dist/gs/strings/builder.js.map +1 -1
- package/dist/gs/strings/iter.js +140 -75
- package/dist/gs/strings/iter.js.map +1 -1
- package/dist/gs/strings/replace.js +2 -2
- package/dist/gs/strings/replace.js.map +1 -1
- package/dist/gs/strings/strings.js +52 -6
- package/dist/gs/strings/strings.js.map +1 -1
- package/dist/gs/sync/sync.d.ts +6 -3
- package/dist/gs/sync/sync.js +39 -11
- package/dist/gs/sync/sync.js.map +1 -1
- package/dist/gs/syscall/errors.d.ts +116 -112
- package/dist/gs/syscall/errors.js +38 -1
- package/dist/gs/syscall/errors.js.map +1 -1
- package/dist/gs/syscall/fs.d.ts +2 -8
- package/dist/gs/syscall/fs.js.map +1 -1
- package/dist/gs/syscall/js/index.js +20 -12
- package/dist/gs/syscall/js/index.js.map +1 -1
- package/dist/gs/syscall/types.d.ts +4 -1
- package/dist/gs/syscall/types.js.map +1 -1
- package/dist/gs/testing/testing.d.ts +4 -3
- package/dist/gs/testing/testing.js +21 -4
- package/dist/gs/testing/testing.js.map +1 -1
- package/dist/gs/time/time.js +22 -0
- package/dist/gs/time/time.js.map +1 -1
- package/dist/gs/unicode/unicode.js.map +1 -1
- package/dist/gs/unique/index.js +7 -2
- package/dist/gs/unique/index.js.map +1 -1
- package/go.mod +8 -8
- package/go.sum +14 -23
- package/gs/builtin/builtin.ts +364 -37
- package/gs/builtin/channel.ts +161 -29
- package/gs/builtin/defer.ts +13 -2
- package/gs/builtin/hostio.test.ts +1 -0
- package/gs/builtin/hostio.ts +38 -0
- package/gs/builtin/map.ts +46 -6
- package/gs/builtin/print.ts +12 -3
- package/gs/builtin/runtime-contract.test.ts +257 -10
- package/gs/builtin/slice.test.ts +70 -0
- package/gs/builtin/slice.ts +566 -255
- package/gs/builtin/type.ts +53 -9
- package/gs/builtin/varRef.ts +2 -0
- package/gs/bytes/buffer.gs.ts +28 -28
- package/gs/bytes/iter.gs.ts +13 -14
- package/gs/compress/zlib/index.test.ts +28 -0
- package/gs/compress/zlib/index.ts +200 -0
- package/gs/compress/zlib/meta.json +3 -0
- package/gs/context/context.test.ts +31 -1
- package/gs/context/context.ts +9 -4
- package/gs/crypto/ecdh/index.test.ts +43 -0
- package/gs/crypto/ecdh/index.ts +274 -0
- package/gs/crypto/ed25519/index.test.ts +41 -0
- package/gs/crypto/ed25519/index.ts +238 -0
- package/gs/crypto/ed25519/meta.json +13 -0
- package/gs/crypto/internal/constanttime/index.test.ts +25 -0
- package/gs/crypto/internal/constanttime/index.ts +22 -0
- package/gs/crypto/rand/index.test.ts +89 -1
- package/gs/crypto/rand/index.ts +103 -1
- package/gs/crypto/rand/meta.json +4 -1
- package/gs/crypto/sha256/index.test.ts +78 -0
- package/gs/crypto/sha256/index.ts +150 -0
- package/gs/crypto/sha256/meta.json +9 -0
- package/gs/crypto/sha512/index.test.ts +31 -0
- package/gs/crypto/sha512/index.ts +161 -0
- package/gs/crypto/sha512/meta.json +11 -0
- package/gs/encoding/json/index.test.ts +25 -3
- package/gs/encoding/json/index.ts +21 -3
- package/gs/errors/errors.test.ts +4 -1
- package/gs/errors/errors.ts +32 -8
- package/gs/fmt/fmt.test.ts +3 -1
- package/gs/fmt/fmt.ts +1 -5
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +62 -7
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +78 -36
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +32 -11
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +122 -43
- package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +31 -0
- package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +518 -4
- package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +6 -0
- package/gs/github.com/aperturerobotics/util/conc/index.test.ts +30 -0
- package/gs/github.com/aperturerobotics/util/conc/index.ts +172 -0
- package/gs/github.com/aperturerobotics/util/conc/meta.json +9 -0
- package/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.ts +1 -4
- package/gs/github.com/hack-pad/safejs/internal/catch/index.test.ts +35 -0
- package/gs/github.com/hack-pad/safejs/internal/catch/index.ts +65 -0
- package/gs/github.com/hack-pad/safejs/internal/catch/meta.json +9 -0
- package/gs/github.com/klauspost/compress/internal/le/index.test.ts +2 -1
- package/gs/github.com/klauspost/compress/internal/le/index.ts +6 -5
- package/gs/github.com/mr-tron/base58/base58/index.test.ts +70 -0
- package/gs/github.com/mr-tron/base58/base58/index.ts +231 -0
- package/gs/github.com/mr-tron/base58/base58/meta.json +3 -0
- package/gs/github.com/zeebo/blake3/internal/consts/index.test.ts +46 -0
- package/gs/github.com/zeebo/blake3/internal/consts/index.ts +26 -0
- package/gs/go/token/index.ts +17 -4
- package/gs/hash/fnv/index.test.ts +67 -0
- package/gs/hash/fnv/index.ts +351 -0
- package/gs/hash/fnv/meta.json +3 -0
- package/gs/hash/index.test.ts +37 -0
- package/gs/hash/index.ts +118 -0
- package/gs/hash/meta.json +5 -0
- package/gs/internal/byteorder/index.test.ts +6 -6
- package/gs/io/fs/readlink.ts +40 -48
- package/gs/io/fs/walk.ts +10 -2
- package/gs/io/io.ts +4 -1
- package/gs/iter/iter.ts +8 -2
- package/gs/maps/iter.ts +69 -26
- package/gs/maps/maps.test.ts +23 -0
- package/gs/maps/maps.ts +6 -6
- package/gs/math/bits/index.test.ts +20 -0
- package/gs/math/bits/index.ts +15 -28
- package/gs/mime/index.ts +8 -2
- package/gs/net/http/httptest/index.test.ts +53 -0
- package/gs/net/http/httptest/index.ts +98 -3
- package/gs/net/http/index.test.ts +129 -1
- package/gs/net/http/index.ts +370 -19
- package/gs/net/http/meta.json +6 -0
- package/gs/net/http/pprof/index.test.ts +47 -0
- package/gs/net/http/pprof/index.ts +65 -0
- package/gs/os/error.gs.ts +9 -10
- package/gs/os/error.test.ts +41 -0
- package/gs/os/file_unix_js.test.ts +55 -0
- package/gs/os/tempfile.gs.test.ts +37 -10
- package/gs/os/types_js.gs.ts +94 -15
- package/gs/path/filepath/match.ts +4 -1
- package/gs/path/filepath/meta.json +6 -0
- package/gs/path/filepath/path.test.ts +57 -2
- package/gs/path/filepath/path.ts +91 -12
- package/gs/reflect/field.test.ts +63 -0
- package/gs/reflect/index.ts +4 -1
- package/gs/reflect/iter.ts +2 -2
- package/gs/reflect/map.test.ts +24 -2
- package/gs/reflect/map.ts +35 -0
- package/gs/reflect/type.ts +543 -60
- package/gs/reflect/typefor.test.ts +100 -0
- package/gs/reflect/types.ts +3 -1
- package/gs/reflect/value.ts +50 -1
- package/gs/reflect/visiblefields.ts +1 -1
- package/gs/runtime/debug/index.test.ts +22 -1
- package/gs/runtime/debug/index.ts +88 -0
- package/gs/runtime/pprof/index.test.ts +36 -0
- package/gs/runtime/pprof/index.ts +104 -0
- package/gs/runtime/pprof/meta.json +6 -0
- package/gs/runtime/trace/index.test.ts +45 -0
- package/gs/runtime/trace/index.ts +97 -0
- package/gs/runtime/trace/meta.json +7 -0
- package/gs/slices/meta.json +2 -1
- package/gs/slices/slices.test.ts +86 -0
- package/gs/slices/slices.ts +284 -37
- package/gs/sort/slice.gs.ts +73 -23
- package/gs/sort/slice.test.ts +40 -0
- package/gs/strings/builder.test.ts +8 -0
- package/gs/strings/builder.ts +29 -17
- package/gs/strings/iter.test.ts +5 -7
- package/gs/strings/iter.ts +146 -71
- package/gs/strings/replace.test.ts +1 -4
- package/gs/strings/replace.ts +6 -6
- package/gs/strings/strings.test.ts +4 -0
- package/gs/strings/strings.ts +54 -6
- package/gs/sync/sync.test.ts +57 -1
- package/gs/sync/sync.ts +45 -13
- package/gs/syscall/errors.ts +158 -115
- package/gs/syscall/fs.ts +8 -8
- package/gs/syscall/js/index.ts +49 -22
- package/gs/syscall/net.test.ts +26 -0
- package/gs/syscall/types.ts +7 -2
- package/gs/testing/testing.test.ts +56 -0
- package/gs/testing/testing.ts +27 -10
- package/gs/time/meta.json +2 -2
- package/gs/time/time.test.ts +4 -0
- package/gs/time/time.ts +33 -2
- package/gs/unicode/unicode.test.ts +14 -3
- package/gs/unicode/unicode.ts +1 -5
- package/gs/unique/index.ts +9 -2
- package/package.json +3 -3
|
@@ -316,6 +316,85 @@ class emptyStream implements Stream {
|
|
|
316
316
|
}
|
|
317
317
|
}
|
|
318
318
|
|
|
319
|
+
class memoryStream implements Stream {
|
|
320
|
+
private sent: Message | null = null
|
|
321
|
+
private sentQueue: (Message | null)[] = []
|
|
322
|
+
private waiters: ((msg: Message | null) => void)[] = []
|
|
323
|
+
private closed = false
|
|
324
|
+
private recvConsumed = false
|
|
325
|
+
|
|
326
|
+
constructor(
|
|
327
|
+
private ctx: context.Context,
|
|
328
|
+
private recv: Message | null,
|
|
329
|
+
) {}
|
|
330
|
+
|
|
331
|
+
public Context(): context.Context {
|
|
332
|
+
return this.ctx
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
public MsgSend(msg: Message | null): $.GoError {
|
|
336
|
+
this.sent = msg
|
|
337
|
+
const waiter = this.waiters.shift()
|
|
338
|
+
if (waiter != null) {
|
|
339
|
+
waiter(msg)
|
|
340
|
+
return null
|
|
341
|
+
}
|
|
342
|
+
this.sentQueue.push(msg)
|
|
343
|
+
return null
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
public MsgRecv(msg: Message | null): MaybePromise<$.GoError> {
|
|
347
|
+
if (!this.recvConsumed) {
|
|
348
|
+
this.recvConsumed = true
|
|
349
|
+
if (msg != null && this.recv != null) {
|
|
350
|
+
Object.assign(msg, this.recv)
|
|
351
|
+
}
|
|
352
|
+
return null
|
|
353
|
+
}
|
|
354
|
+
const next = this.sentQueue.shift()
|
|
355
|
+
if (next !== undefined) {
|
|
356
|
+
if (msg != null && next != null) {
|
|
357
|
+
Object.assign(msg, next)
|
|
358
|
+
}
|
|
359
|
+
return null
|
|
360
|
+
}
|
|
361
|
+
if (this.closed) {
|
|
362
|
+
return io.EOF
|
|
363
|
+
}
|
|
364
|
+
return new Promise<$.GoError>((resolve) => {
|
|
365
|
+
this.waiters.push((sent) => {
|
|
366
|
+
if (msg != null && sent != null) {
|
|
367
|
+
Object.assign(msg, sent)
|
|
368
|
+
}
|
|
369
|
+
resolve(null)
|
|
370
|
+
})
|
|
371
|
+
})
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
public CloseSend(): $.GoError {
|
|
375
|
+
return null
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
public Close(): $.GoError {
|
|
379
|
+
this.closed = true
|
|
380
|
+
for (const waiter of this.waiters.splice(0)) {
|
|
381
|
+
waiter(null)
|
|
382
|
+
}
|
|
383
|
+
return null
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
public CopySentTo(output: Message | null): void {
|
|
387
|
+
if (output != null && this.sent != null) {
|
|
388
|
+
Object.assign(output, this.sent)
|
|
389
|
+
return
|
|
390
|
+
}
|
|
391
|
+
const next = this.sentQueue.shift()
|
|
392
|
+
if (output != null && next != null) {
|
|
393
|
+
Object.assign(output, next)
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
|
|
319
398
|
class streamWithClose implements Stream {
|
|
320
399
|
constructor(
|
|
321
400
|
private stream: Stream,
|
|
@@ -592,15 +671,418 @@ export class Server {
|
|
|
592
671
|
_ctx: context.Context,
|
|
593
672
|
_rwc: io.ReadWriteCloser | null,
|
|
594
673
|
): void {}
|
|
674
|
+
|
|
675
|
+
public AcceptMuxedConn(
|
|
676
|
+
_ctx: context.Context,
|
|
677
|
+
_conn: MuxedConn | null,
|
|
678
|
+
): $.GoError {
|
|
679
|
+
return null
|
|
680
|
+
}
|
|
595
681
|
}
|
|
596
682
|
|
|
597
683
|
export function NewServer(invoker: Invoker | null): Server {
|
|
598
684
|
return new Server({ invoker })
|
|
599
685
|
}
|
|
600
686
|
|
|
601
|
-
export
|
|
602
|
-
|
|
603
|
-
|
|
687
|
+
export interface PacketWriter {
|
|
688
|
+
WritePacket(packet: Packet | null): MaybePromise<$.GoError>
|
|
689
|
+
Close(): MaybePromise<$.GoError>
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
export type OpenStreamFunc = ((
|
|
693
|
+
ctx: context.Context,
|
|
694
|
+
msgHandler: PacketDataHandler,
|
|
695
|
+
closeHandler: CloseHandler,
|
|
696
|
+
) => MaybePromise<[PacketWriter | null, $.GoError]>) & {
|
|
697
|
+
__server?: Server
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
class transportClient implements Client {
|
|
701
|
+
constructor(private openStream: OpenStreamFunc | null) {}
|
|
702
|
+
|
|
703
|
+
public async ExecCall(
|
|
704
|
+
ctx: context.Context,
|
|
705
|
+
service: string,
|
|
706
|
+
method: string,
|
|
707
|
+
input: Message | null,
|
|
708
|
+
output: Message | null,
|
|
709
|
+
): Promise<$.GoError> {
|
|
710
|
+
if (this.openStream == null) {
|
|
711
|
+
return ErrNoAvailableClients
|
|
712
|
+
}
|
|
713
|
+
const writerResult = await this.openStream(
|
|
714
|
+
ctx,
|
|
715
|
+
() => null,
|
|
716
|
+
() => undefined,
|
|
717
|
+
)
|
|
718
|
+
if (writerResult == null) {
|
|
719
|
+
return ErrNoAvailableClients
|
|
720
|
+
}
|
|
721
|
+
const writer = writerResult[0]
|
|
722
|
+
const err = writerResult[1]
|
|
723
|
+
if (err != null) {
|
|
724
|
+
return err
|
|
725
|
+
}
|
|
726
|
+
if (input != null) {
|
|
727
|
+
const [data, marshalErr] = input.MarshalVT()
|
|
728
|
+
if (marshalErr != null) {
|
|
729
|
+
return marshalErr
|
|
730
|
+
}
|
|
731
|
+
const writeErr = await writer?.WritePacket(
|
|
732
|
+
NewCallStartPacket(service, method, data, $.len(data) === 0),
|
|
733
|
+
)
|
|
734
|
+
if (writeErr != null) {
|
|
735
|
+
return writeErr
|
|
736
|
+
}
|
|
737
|
+
}
|
|
738
|
+
if (output != null) {
|
|
739
|
+
output.Reset()
|
|
740
|
+
}
|
|
741
|
+
return await writer?.Close() ?? null
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
public async NewStream(
|
|
745
|
+
ctx: context.Context,
|
|
746
|
+
service: string,
|
|
747
|
+
method: string,
|
|
748
|
+
firstMsg: Message | null,
|
|
749
|
+
): Promise<[Stream | null, $.GoError]> {
|
|
750
|
+
if (this.openStream == null) {
|
|
751
|
+
return [null, ErrNoAvailableClients]
|
|
752
|
+
}
|
|
753
|
+
const writerResult = await this.openStream(
|
|
754
|
+
ctx,
|
|
755
|
+
() => null,
|
|
756
|
+
() => undefined,
|
|
757
|
+
)
|
|
758
|
+
if (writerResult == null) {
|
|
759
|
+
return [null, ErrNoAvailableClients]
|
|
760
|
+
}
|
|
761
|
+
const writer = writerResult[0]
|
|
762
|
+
const err = writerResult[1]
|
|
763
|
+
if (err != null) {
|
|
764
|
+
return [null, err]
|
|
765
|
+
}
|
|
766
|
+
if (firstMsg != null) {
|
|
767
|
+
const [data, marshalErr] = firstMsg.MarshalVT()
|
|
768
|
+
if (marshalErr != null) {
|
|
769
|
+
return [null, marshalErr]
|
|
770
|
+
}
|
|
771
|
+
const writeErr = await writer?.WritePacket(
|
|
772
|
+
NewCallStartPacket(service, method, data, $.len(data) === 0),
|
|
773
|
+
)
|
|
774
|
+
if (writeErr != null) {
|
|
775
|
+
return [null, writeErr]
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
return [
|
|
779
|
+
NewStreamWithClose(new emptyStream(ctx), () => writer?.Close() ?? null),
|
|
780
|
+
null,
|
|
781
|
+
]
|
|
782
|
+
}
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
export function NewClient(openStream: OpenStreamFunc | null): Client {
|
|
786
|
+
if (openStream?.__server != null) {
|
|
787
|
+
return NewClientWithInvoker(openStream.__server.GetInvoker())
|
|
788
|
+
}
|
|
789
|
+
return new transportClient(openStream)
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
class invokerClient implements Client {
|
|
793
|
+
constructor(
|
|
794
|
+
private invoker: Invoker | null,
|
|
795
|
+
private contextFn: ((ctx: context.Context) => context.Context) | null = null,
|
|
796
|
+
) {}
|
|
797
|
+
|
|
798
|
+
public async ExecCall(
|
|
799
|
+
ctx: context.Context,
|
|
800
|
+
service: string,
|
|
801
|
+
method: string,
|
|
802
|
+
input: Message | null,
|
|
803
|
+
output: Message | null,
|
|
804
|
+
): Promise<$.GoError> {
|
|
805
|
+
if (this.invoker == null) {
|
|
806
|
+
return ErrNoAvailableClients
|
|
807
|
+
}
|
|
808
|
+
const stream = new memoryStream(
|
|
809
|
+
this.contextFn == null ? ctx : this.contextFn(ctx),
|
|
810
|
+
input,
|
|
811
|
+
)
|
|
812
|
+
const [handled, err] = await this.invoker.InvokeMethod(
|
|
813
|
+
service,
|
|
814
|
+
method,
|
|
815
|
+
stream,
|
|
816
|
+
)
|
|
817
|
+
if (err != null) {
|
|
818
|
+
return err
|
|
819
|
+
}
|
|
820
|
+
if (!handled) {
|
|
821
|
+
return ErrUnimplemented
|
|
822
|
+
}
|
|
823
|
+
stream.CopySentTo(output)
|
|
824
|
+
return null
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
public async NewStream(
|
|
828
|
+
ctx: context.Context,
|
|
829
|
+
service: string,
|
|
830
|
+
method: string,
|
|
831
|
+
firstMsg: Message | null,
|
|
832
|
+
): Promise<[Stream | null, $.GoError]> {
|
|
833
|
+
if (this.invoker == null) {
|
|
834
|
+
return [null, ErrNoAvailableClients]
|
|
835
|
+
}
|
|
836
|
+
const stream = new memoryStream(
|
|
837
|
+
this.contextFn == null ? ctx : this.contextFn(ctx),
|
|
838
|
+
firstMsg,
|
|
839
|
+
)
|
|
840
|
+
const pending = Promise.resolve(
|
|
841
|
+
this.invoker.InvokeMethod(service, method, stream),
|
|
842
|
+
)
|
|
843
|
+
pending.then(([handled, err]) => {
|
|
844
|
+
if (!handled || err != null) {
|
|
845
|
+
stream.Close()
|
|
846
|
+
}
|
|
847
|
+
})
|
|
848
|
+
return [stream, null]
|
|
849
|
+
}
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
export function NewClientWithInvoker(
|
|
853
|
+
invoker: Invoker | null,
|
|
854
|
+
contextFn: ((ctx: context.Context) => context.Context) | null = null,
|
|
855
|
+
): Client {
|
|
856
|
+
return new invokerClient(invoker, contextFn)
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
export type PacketHandler =
|
|
860
|
+
| ((pkt: Packet | null) => MaybePromise<$.GoError>)
|
|
861
|
+
| null
|
|
862
|
+
export type PacketDataHandler =
|
|
863
|
+
| ((data: $.Slice<number>) => MaybePromise<$.GoError>)
|
|
864
|
+
| null
|
|
865
|
+
export type CloseHandler = ((closeErr: $.GoError) => void) | null
|
|
866
|
+
|
|
867
|
+
class streamWithContext implements Stream {
|
|
868
|
+
constructor(
|
|
869
|
+
private stream: Stream,
|
|
870
|
+
private ctx: context.Context,
|
|
871
|
+
) {}
|
|
872
|
+
|
|
873
|
+
public Context(): context.Context {
|
|
874
|
+
return this.ctx
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
public MsgSend(msg: Message | null): MaybePromise<$.GoError> {
|
|
878
|
+
return this.stream.MsgSend(msg)
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
public MsgRecv(msg: Message | null): MaybePromise<$.GoError> {
|
|
882
|
+
return this.stream.MsgRecv(msg)
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
public CloseSend(): MaybePromise<$.GoError> {
|
|
886
|
+
return this.stream.CloseSend()
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
public Close(): MaybePromise<$.GoError> {
|
|
890
|
+
return this.stream.Close()
|
|
891
|
+
}
|
|
892
|
+
}
|
|
893
|
+
|
|
894
|
+
export function NewStreamWithContext(
|
|
895
|
+
stream: Stream | null,
|
|
896
|
+
ctx: context.Context,
|
|
897
|
+
): Stream {
|
|
898
|
+
return new streamWithContext(stream ?? new emptyStream(ctx), ctx)
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
export class ServerRPC {
|
|
902
|
+
constructor(
|
|
903
|
+
private ctx: context.Context,
|
|
904
|
+
private invoker: Invoker | null,
|
|
905
|
+
private writer: PacketWriter | null,
|
|
906
|
+
) {}
|
|
907
|
+
|
|
908
|
+
public async HandlePacketData(data: $.Slice<number>): Promise<$.GoError> {
|
|
909
|
+
const pkt = new Packet()
|
|
910
|
+
const err = pkt.UnmarshalVT(data)
|
|
911
|
+
if (err != null) {
|
|
912
|
+
return err
|
|
913
|
+
}
|
|
914
|
+
return this.HandlePacket(pkt)
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
public async HandlePacket(pkt: Packet | null): Promise<$.GoError> {
|
|
918
|
+
if (pkt == null) {
|
|
919
|
+
return null
|
|
920
|
+
}
|
|
921
|
+
const body = pkt.GetBody()
|
|
922
|
+
if (body instanceof Packet_CallStart) {
|
|
923
|
+
return this.HandleCallStart(body.CallStart)
|
|
924
|
+
}
|
|
925
|
+
return null
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
public async HandleCallStart(pkt: CallStart | null): Promise<$.GoError> {
|
|
929
|
+
if (pkt == null || this.invoker == null) {
|
|
930
|
+
return ErrUnimplemented
|
|
931
|
+
}
|
|
932
|
+
const stream = new emptyStream(this.ctx)
|
|
933
|
+
const [handled, err] = await this.invoker.InvokeMethod(
|
|
934
|
+
pkt.GetRpcService(),
|
|
935
|
+
pkt.GetRpcMethod(),
|
|
936
|
+
stream,
|
|
937
|
+
)
|
|
938
|
+
const callErr = err ?? (handled ? null : ErrUnimplemented)
|
|
939
|
+
await this.writer?.WritePacket(NewCallDataPacket(null, false, true, callErr))
|
|
940
|
+
return callErr
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
public HandleStreamClose(_closeErr: $.GoError): void {}
|
|
944
|
+
|
|
945
|
+
public Wait(_ctx: context.Context): $.GoError {
|
|
946
|
+
return null
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
|
|
950
|
+
export function NewServerRPC(
|
|
951
|
+
ctx: context.Context,
|
|
952
|
+
invoker: Invoker | null,
|
|
953
|
+
writer: PacketWriter | null,
|
|
954
|
+
): ServerRPC {
|
|
955
|
+
return new ServerRPC(ctx, invoker, writer)
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
export class PacketReadWriter implements PacketWriter {
|
|
959
|
+
constructor(private rw: io.ReadWriteCloser | null) {}
|
|
960
|
+
|
|
961
|
+
public Write(data: $.Slice<number>): [number, $.GoError] {
|
|
962
|
+
if (this.rw == null) {
|
|
963
|
+
return [0, ErrNilWriter]
|
|
964
|
+
}
|
|
965
|
+
return this.rw.Write(data)
|
|
966
|
+
}
|
|
967
|
+
|
|
968
|
+
public WritePacket(_packet: Packet | null): $.GoError {
|
|
969
|
+
return this.rw == null ? ErrNilWriter : null
|
|
970
|
+
}
|
|
971
|
+
|
|
972
|
+
public ReadPump(_cb: PacketDataHandler, closed: CloseHandler): void {
|
|
973
|
+
if (closed != null) {
|
|
974
|
+
closed(null)
|
|
975
|
+
}
|
|
976
|
+
}
|
|
977
|
+
|
|
978
|
+
public ReadToHandler(_cb: PacketDataHandler): $.GoError {
|
|
979
|
+
return null
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
public Close(): $.GoError {
|
|
983
|
+
return this.rw?.Close() ?? null
|
|
984
|
+
}
|
|
985
|
+
}
|
|
986
|
+
|
|
987
|
+
export function NewPacketReadWriter(
|
|
988
|
+
rw: io.ReadWriteCloser | null,
|
|
989
|
+
): PacketReadWriter {
|
|
990
|
+
return new PacketReadWriter(rw)
|
|
991
|
+
}
|
|
992
|
+
|
|
993
|
+
export function NewServerPipe(server: Server | null): OpenStreamFunc {
|
|
994
|
+
const openStream = ((
|
|
995
|
+
_ctx: context.Context,
|
|
996
|
+
_msgHandler: PacketDataHandler,
|
|
997
|
+
_closeHandler: CloseHandler,
|
|
998
|
+
): [PacketWriter | null, $.GoError] => [new closedPacketWriter(), null]) as
|
|
999
|
+
OpenStreamFunc
|
|
1000
|
+
if (server != null) {
|
|
1001
|
+
openStream.__server = server
|
|
1002
|
+
}
|
|
1003
|
+
return openStream
|
|
1004
|
+
}
|
|
1005
|
+
|
|
1006
|
+
export class MuxedConn {
|
|
1007
|
+
constructor(
|
|
1008
|
+
public rwc: any = null,
|
|
1009
|
+
public outbound = false,
|
|
1010
|
+
) {}
|
|
1011
|
+
|
|
1012
|
+
public Close(): $.GoError {
|
|
1013
|
+
return this.rwc?.Close() ?? null
|
|
1014
|
+
}
|
|
1015
|
+
}
|
|
1016
|
+
|
|
1017
|
+
class closedPacketWriter implements PacketWriter {
|
|
1018
|
+
public WritePacket(_packet: Packet | null): $.GoError {
|
|
1019
|
+
return ErrUnimplemented
|
|
1020
|
+
}
|
|
1021
|
+
|
|
1022
|
+
public Close(): $.GoError {
|
|
1023
|
+
return null
|
|
1024
|
+
}
|
|
1025
|
+
}
|
|
1026
|
+
|
|
1027
|
+
export function NewOpenStreamWithMuxedConn(_conn: MuxedConn): OpenStreamFunc {
|
|
1028
|
+
return () => [new closedPacketWriter(), null]
|
|
1029
|
+
}
|
|
1030
|
+
|
|
1031
|
+
export function NewMuxedConn(
|
|
1032
|
+
rwc: any,
|
|
1033
|
+
outbound: boolean,
|
|
1034
|
+
_yamuxConf: unknown,
|
|
1035
|
+
): [MuxedConn | null, $.GoError] {
|
|
1036
|
+
return [new MuxedConn(rwc, outbound), null]
|
|
1037
|
+
}
|
|
1038
|
+
|
|
1039
|
+
export function NewWebSocketConn(
|
|
1040
|
+
_ctx: context.Context,
|
|
1041
|
+
conn: unknown,
|
|
1042
|
+
isServer: boolean,
|
|
1043
|
+
yamuxConf: unknown,
|
|
1044
|
+
): [MuxedConn | null, $.GoError] {
|
|
1045
|
+
return NewMuxedConn(conn, !isServer, yamuxConf)
|
|
1046
|
+
}
|
|
1047
|
+
|
|
1048
|
+
export function NewClientWithMuxedConn(_conn: MuxedConn | null): Client {
|
|
1049
|
+
return NewClientWithInvoker(null)
|
|
1050
|
+
}
|
|
1051
|
+
|
|
1052
|
+
export function NewMuxedConnWithRwc(
|
|
1053
|
+
_ctx: context.Context,
|
|
1054
|
+
_rwc: io.ReadWriteCloser | null,
|
|
1055
|
+
_outbound: boolean,
|
|
1056
|
+
_yamuxConf: unknown,
|
|
1057
|
+
): [MuxedConn | null, $.GoError] {
|
|
1058
|
+
return [new MuxedConn(_rwc, _outbound), null]
|
|
1059
|
+
}
|
|
1060
|
+
|
|
1061
|
+
class clientInvoker implements Invoker {
|
|
1062
|
+
constructor(private client: Client | null) {}
|
|
1063
|
+
|
|
1064
|
+
public async InvokeMethod(
|
|
1065
|
+
serviceID: string,
|
|
1066
|
+
methodID: string,
|
|
1067
|
+
stream: Stream | null,
|
|
1068
|
+
): Promise<[boolean, $.GoError]> {
|
|
1069
|
+
if (this.client == null || stream == null) {
|
|
1070
|
+
return [false, null]
|
|
1071
|
+
}
|
|
1072
|
+
const [remote, err] = await this.client.NewStream(
|
|
1073
|
+
stream.Context(),
|
|
1074
|
+
serviceID,
|
|
1075
|
+
methodID,
|
|
1076
|
+
null,
|
|
1077
|
+
)
|
|
1078
|
+
await remote?.Close()
|
|
1079
|
+
return [true, err]
|
|
1080
|
+
}
|
|
1081
|
+
}
|
|
1082
|
+
|
|
1083
|
+
export function NewClientInvoker(client: Client | null): Invoker {
|
|
1084
|
+
return new clientInvoker(client)
|
|
1085
|
+
}
|
|
604
1086
|
|
|
605
1087
|
export class Packet {
|
|
606
1088
|
public Body: unknown = null
|
|
@@ -635,6 +1117,22 @@ export class CallStart {
|
|
|
635
1117
|
public RpcMethod = ''
|
|
636
1118
|
public Data: $.Slice<number> = null
|
|
637
1119
|
public DataIsZero = false
|
|
1120
|
+
|
|
1121
|
+
public GetRpcService(): string {
|
|
1122
|
+
return this.RpcService
|
|
1123
|
+
}
|
|
1124
|
+
|
|
1125
|
+
public GetRpcMethod(): string {
|
|
1126
|
+
return this.RpcMethod
|
|
1127
|
+
}
|
|
1128
|
+
|
|
1129
|
+
public GetData(): $.Slice<number> {
|
|
1130
|
+
return this.Data
|
|
1131
|
+
}
|
|
1132
|
+
|
|
1133
|
+
public GetDataIsZero(): boolean {
|
|
1134
|
+
return this.DataIsZero
|
|
1135
|
+
}
|
|
638
1136
|
}
|
|
639
1137
|
|
|
640
1138
|
export class CallData {
|
|
@@ -642,6 +1140,22 @@ export class CallData {
|
|
|
642
1140
|
public DataIsZero = false
|
|
643
1141
|
public Complete = false
|
|
644
1142
|
public Error = ''
|
|
1143
|
+
|
|
1144
|
+
public GetData(): $.Slice<number> {
|
|
1145
|
+
return this.Data
|
|
1146
|
+
}
|
|
1147
|
+
|
|
1148
|
+
public GetDataIsZero(): boolean {
|
|
1149
|
+
return this.DataIsZero
|
|
1150
|
+
}
|
|
1151
|
+
|
|
1152
|
+
public GetComplete(): boolean {
|
|
1153
|
+
return this.Complete
|
|
1154
|
+
}
|
|
1155
|
+
|
|
1156
|
+
public GetError(): string {
|
|
1157
|
+
return this.Error
|
|
1158
|
+
}
|
|
645
1159
|
}
|
|
646
1160
|
|
|
647
1161
|
export class Packet_CallStart {
|
|
@@ -665,7 +1179,7 @@ export function NewPacketDataHandler(
|
|
|
665
1179
|
if (err != null) {
|
|
666
1180
|
return err
|
|
667
1181
|
}
|
|
668
|
-
return handler(pkt)
|
|
1182
|
+
return handler?.(pkt) ?? null
|
|
669
1183
|
}
|
|
670
1184
|
}
|
|
671
1185
|
|
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
"Client.NewStream": true,
|
|
11
11
|
"ClientSet.ExecCall": true,
|
|
12
12
|
"ClientSet.NewStream": true,
|
|
13
|
+
"PacketWriter.WritePacket": true,
|
|
14
|
+
"PacketWriter.Close": true,
|
|
13
15
|
"PrefixClient.ExecCall": true,
|
|
14
16
|
"PrefixClient.NewStream": true,
|
|
15
17
|
"Stream.MsgSend": true,
|
|
@@ -30,6 +32,10 @@
|
|
|
30
32
|
"StreamSendAndClose.Close": true,
|
|
31
33
|
"StreamSendAndClose.Send": true,
|
|
32
34
|
"StreamSendAndClose.SendAndClose": true,
|
|
35
|
+
"ServerRPC.HandlePacketData": true,
|
|
36
|
+
"ServerRPC.HandlePacket": true,
|
|
37
|
+
"ServerRPC.HandleCallStart": true,
|
|
38
|
+
"clientInvoker.InvokeMethod": true,
|
|
33
39
|
"InvokerFunc.InvokeMethod": true,
|
|
34
40
|
"InvokerSlice.InvokeMethod": true,
|
|
35
41
|
"Invoker.InvokeMethod": true,
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { describe, expect, test } from 'vitest'
|
|
2
|
+
import { makeChannel } from '../../../../builtin/index.js'
|
|
3
|
+
import { Background } from '../../../../context/index.js'
|
|
4
|
+
import { NewConcurrentQueue } from './index.js'
|
|
5
|
+
|
|
6
|
+
const tick = () => new Promise<void>((resolve) => queueMicrotask(resolve))
|
|
7
|
+
|
|
8
|
+
describe('util/conc override', () => {
|
|
9
|
+
test('runs queued jobs within the concurrency limit', async () => {
|
|
10
|
+
const release = makeChannel<{}>(0, {}, 'both')
|
|
11
|
+
const started: number[] = []
|
|
12
|
+
const done: number[] = []
|
|
13
|
+
const job = (idx: number) => async () => {
|
|
14
|
+
started.push(idx)
|
|
15
|
+
await release.receive()
|
|
16
|
+
done.push(idx)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const q = NewConcurrentQueue(2, job(0), job(1))
|
|
20
|
+
const [queued, running] = q.Enqueue([job(2), job(3), job(4)])
|
|
21
|
+
expect([queued, running]).toEqual([3, 2])
|
|
22
|
+
|
|
23
|
+
await tick()
|
|
24
|
+
expect(started).toEqual([0, 1])
|
|
25
|
+
|
|
26
|
+
release.close()
|
|
27
|
+
expect(await q.WaitIdle(Background(), null)).toBeNull()
|
|
28
|
+
expect(done).toEqual([0, 1, 2, 3, 4])
|
|
29
|
+
})
|
|
30
|
+
})
|