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
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import * as $ from '@goscript/builtin/index.js'
|
|
2
|
+
import {
|
|
3
|
+
getHostRuntime,
|
|
4
|
+
type NodeCryptoHash,
|
|
5
|
+
} from '@goscript/builtin/hostio.js'
|
|
6
|
+
|
|
7
|
+
export const Size = 32
|
|
8
|
+
export const Size224 = 28
|
|
9
|
+
export const BlockSize = 64
|
|
10
|
+
|
|
11
|
+
type ShaAlgorithm = 'sha224' | 'sha256'
|
|
12
|
+
|
|
13
|
+
class Sha256Error {
|
|
14
|
+
constructor(private readonly message: string) {}
|
|
15
|
+
|
|
16
|
+
Error(): string {
|
|
17
|
+
return this.message
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
class Digest {
|
|
22
|
+
private chunks: Uint8Array[] = []
|
|
23
|
+
private dataLength = 0
|
|
24
|
+
private hash: NodeCryptoHash | null
|
|
25
|
+
private canCopyHash: boolean
|
|
26
|
+
|
|
27
|
+
constructor(private readonly algorithm: ShaAlgorithm) {
|
|
28
|
+
this.hash = createNodeHash(algorithm)
|
|
29
|
+
this.canCopyHash = typeof this.hash?.copy === 'function'
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
Write(p: $.Bytes): [number, $.GoError] {
|
|
33
|
+
const bytes = $.bytesToUint8Array(p)
|
|
34
|
+
this.hash?.update(bytes)
|
|
35
|
+
if (!this.canCopyHash) {
|
|
36
|
+
this.chunks.push(bytes.slice())
|
|
37
|
+
this.dataLength += bytes.length
|
|
38
|
+
}
|
|
39
|
+
return [bytes.length, null]
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
async Sum(b: $.Bytes): Promise<$.Bytes> {
|
|
43
|
+
const digest =
|
|
44
|
+
this.canCopyHash ?
|
|
45
|
+
new Uint8Array(this.hash!.copy!().digest())
|
|
46
|
+
: await sum(this.algorithm, this.snapshotBytes())
|
|
47
|
+
return appendDigest($.bytesToUint8Array(b), digest)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
Reset(): void {
|
|
51
|
+
this.chunks = []
|
|
52
|
+
this.dataLength = 0
|
|
53
|
+
this.hash = createNodeHash(this.algorithm)
|
|
54
|
+
this.canCopyHash = typeof this.hash?.copy === 'function'
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
Size(): number {
|
|
58
|
+
return this.algorithm === 'sha224' ? Size224 : Size
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
BlockSize(): number {
|
|
62
|
+
return BlockSize
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
private snapshotBytes(): Uint8Array {
|
|
66
|
+
return concatChunks(this.chunks, this.dataLength)
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function New(): any {
|
|
71
|
+
return new Digest('sha256')
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export function New224(): any {
|
|
75
|
+
return new Digest('sha224')
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export async function Sum224(data: $.Bytes): Promise<Uint8Array> {
|
|
79
|
+
return sum('sha224', data)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export async function Sum256(data: $.Bytes): Promise<Uint8Array> {
|
|
83
|
+
return sum('sha256', data)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
async function sum(
|
|
87
|
+
algorithm: ShaAlgorithm,
|
|
88
|
+
data: $.Bytes,
|
|
89
|
+
): Promise<Uint8Array> {
|
|
90
|
+
const hash = createNodeHash(algorithm)
|
|
91
|
+
if (hash != null) {
|
|
92
|
+
return new Uint8Array(hash.update($.bytesToUint8Array(data)).digest())
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (algorithm === 'sha224') {
|
|
96
|
+
throw new Error(
|
|
97
|
+
new Sha256Error('crypto/sha256: SHA-224 digest is unavailable').Error(),
|
|
98
|
+
)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const subtle = subtleCrypto()
|
|
102
|
+
if (subtle == null) {
|
|
103
|
+
throw new Error(
|
|
104
|
+
new Sha256Error('crypto/sha256: WebCrypto digest is unavailable').Error(),
|
|
105
|
+
)
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const digest = await subtle.digest(
|
|
109
|
+
'SHA-256',
|
|
110
|
+
$.bytesToUint8Array(data) as unknown as BufferSource,
|
|
111
|
+
)
|
|
112
|
+
return new Uint8Array(digest)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function appendDigest(prefix: Uint8Array, digest: Uint8Array): Uint8Array {
|
|
116
|
+
const out = new Uint8Array(prefix.length + digest.length)
|
|
117
|
+
out.set(prefix)
|
|
118
|
+
out.set(digest, prefix.length)
|
|
119
|
+
return out
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function createNodeHash(algorithm: ShaAlgorithm): NodeCryptoHash | null {
|
|
123
|
+
const nodeCrypto = getHostRuntime().nodeCrypto
|
|
124
|
+
if (!nodeCrypto?.createHash) {
|
|
125
|
+
return null
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
return nodeCrypto.createHash(algorithm)
|
|
129
|
+
} catch {
|
|
130
|
+
return null
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function concatChunks(chunks: Uint8Array[], length: number): Uint8Array {
|
|
135
|
+
const out = new Uint8Array(length)
|
|
136
|
+
let offset = 0
|
|
137
|
+
for (const chunk of chunks) {
|
|
138
|
+
out.set(chunk, offset)
|
|
139
|
+
offset += chunk.length
|
|
140
|
+
}
|
|
141
|
+
return out
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function subtleCrypto(): SubtleCrypto | null {
|
|
145
|
+
const crypto = globalThis.crypto
|
|
146
|
+
if (crypto?.subtle && typeof crypto.subtle.digest === 'function') {
|
|
147
|
+
return crypto.subtle
|
|
148
|
+
}
|
|
149
|
+
return null
|
|
150
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto'
|
|
2
|
+
import { describe, expect, it } from 'vitest'
|
|
3
|
+
|
|
4
|
+
import { New, Sum384, Sum512, Sum512_224, Sum512_256 } from './index.js'
|
|
5
|
+
|
|
6
|
+
describe('crypto/sha512 override', () => {
|
|
7
|
+
it('matches Node digests', async () => {
|
|
8
|
+
const data = new TextEncoder().encode('goscript sha512')
|
|
9
|
+
|
|
10
|
+
expect(toHex(await Sum512(data))).toBe(nodeHash('sha512', data))
|
|
11
|
+
expect(toHex(await Sum384(data))).toBe(nodeHash('sha384', data))
|
|
12
|
+
expect(toHex(await Sum512_224(data))).toBe(nodeHash('sha512-224', data))
|
|
13
|
+
expect(toHex(await Sum512_256(data))).toBe(nodeHash('sha512-256', data))
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
it('supports incremental hash.Hash use', async () => {
|
|
17
|
+
const h = New()
|
|
18
|
+
h.Write(new TextEncoder().encode('go'))
|
|
19
|
+
h.Write(new TextEncoder().encode('script'))
|
|
20
|
+
|
|
21
|
+
expect(toHex(await h.Sum(null))).toBe(nodeHash('sha512', new TextEncoder().encode('goscript')))
|
|
22
|
+
})
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
function nodeHash(algorithm: string, data: Uint8Array): string {
|
|
26
|
+
return createHash(algorithm).update(data).digest('hex')
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function toHex(value: Uint8Array): string {
|
|
30
|
+
return Buffer.from(value).toString('hex')
|
|
31
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import * as $ from '@goscript/builtin/index.js'
|
|
2
|
+
import {
|
|
3
|
+
getHostRuntime,
|
|
4
|
+
type NodeCryptoHash,
|
|
5
|
+
} from '@goscript/builtin/hostio.js'
|
|
6
|
+
|
|
7
|
+
export const Size = 64
|
|
8
|
+
export const Size224 = 28
|
|
9
|
+
export const Size256 = 32
|
|
10
|
+
export const Size384 = 48
|
|
11
|
+
export const BlockSize = 128
|
|
12
|
+
|
|
13
|
+
type ShaAlgorithm = 'sha384' | 'sha512' | 'sha512-224' | 'sha512-256'
|
|
14
|
+
|
|
15
|
+
class Digest {
|
|
16
|
+
private chunks: Uint8Array[] = []
|
|
17
|
+
private dataLength = 0
|
|
18
|
+
private hash: NodeCryptoHash | null
|
|
19
|
+
private canCopyHash: boolean
|
|
20
|
+
|
|
21
|
+
constructor(private readonly algorithm: ShaAlgorithm) {
|
|
22
|
+
this.hash = createNodeHash(algorithm)
|
|
23
|
+
this.canCopyHash = typeof this.hash?.copy === 'function'
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
Write(p: $.Bytes): [number, $.GoError] {
|
|
27
|
+
const bytes = $.bytesToUint8Array(p)
|
|
28
|
+
this.hash?.update(bytes)
|
|
29
|
+
if (!this.canCopyHash) {
|
|
30
|
+
this.chunks.push(bytes.slice())
|
|
31
|
+
this.dataLength += bytes.length
|
|
32
|
+
}
|
|
33
|
+
return [bytes.length, null]
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async Sum(b: $.Bytes): Promise<$.Bytes> {
|
|
37
|
+
const digest =
|
|
38
|
+
this.canCopyHash ?
|
|
39
|
+
new Uint8Array(this.hash!.copy!().digest())
|
|
40
|
+
: await sum(this.algorithm, this.snapshotBytes())
|
|
41
|
+
return appendDigest($.bytesToUint8Array(b), digest)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
Reset(): void {
|
|
45
|
+
this.chunks = []
|
|
46
|
+
this.dataLength = 0
|
|
47
|
+
this.hash = createNodeHash(this.algorithm)
|
|
48
|
+
this.canCopyHash = typeof this.hash?.copy === 'function'
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
Size(): number {
|
|
52
|
+
switch (this.algorithm) {
|
|
53
|
+
case 'sha384':
|
|
54
|
+
return Size384
|
|
55
|
+
case 'sha512-224':
|
|
56
|
+
return Size224
|
|
57
|
+
case 'sha512-256':
|
|
58
|
+
return Size256
|
|
59
|
+
default:
|
|
60
|
+
return Size
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
BlockSize(): number {
|
|
65
|
+
return BlockSize
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
private snapshotBytes(): Uint8Array {
|
|
69
|
+
return concatChunks(this.chunks, this.dataLength)
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function New(): any {
|
|
74
|
+
return new Digest('sha512')
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export function New384(): any {
|
|
78
|
+
return new Digest('sha384')
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function New512_224(): any {
|
|
82
|
+
return new Digest('sha512-224')
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function New512_256(): any {
|
|
86
|
+
return new Digest('sha512-256')
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export async function Sum384(data: $.Bytes): Promise<Uint8Array> {
|
|
90
|
+
return sum('sha384', data)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export async function Sum512(data: $.Bytes): Promise<Uint8Array> {
|
|
94
|
+
return sum('sha512', data)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export async function Sum512_224(data: $.Bytes): Promise<Uint8Array> {
|
|
98
|
+
return sum('sha512-224', data)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export async function Sum512_256(data: $.Bytes): Promise<Uint8Array> {
|
|
102
|
+
return sum('sha512-256', data)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
async function sum(
|
|
106
|
+
algorithm: ShaAlgorithm,
|
|
107
|
+
data: $.Bytes,
|
|
108
|
+
): Promise<Uint8Array> {
|
|
109
|
+
const hash = createNodeHash(algorithm)
|
|
110
|
+
if (hash != null) {
|
|
111
|
+
return new Uint8Array(hash.update($.bytesToUint8Array(data)).digest())
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const subtle = subtleCrypto()
|
|
115
|
+
if (subtle == null || (algorithm !== 'sha384' && algorithm !== 'sha512')) {
|
|
116
|
+
throw new Error(`crypto/sha512: ${algorithm} digest is unavailable`)
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const digest = await subtle.digest(
|
|
120
|
+
algorithm === 'sha384' ? 'SHA-384' : 'SHA-512',
|
|
121
|
+
$.bytesToUint8Array(data) as unknown as BufferSource,
|
|
122
|
+
)
|
|
123
|
+
return new Uint8Array(digest)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function appendDigest(prefix: Uint8Array, digest: Uint8Array): Uint8Array {
|
|
127
|
+
const out = new Uint8Array(prefix.length + digest.length)
|
|
128
|
+
out.set(prefix)
|
|
129
|
+
out.set(digest, prefix.length)
|
|
130
|
+
return out
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function createNodeHash(algorithm: ShaAlgorithm): NodeCryptoHash | null {
|
|
134
|
+
const nodeCrypto = getHostRuntime().nodeCrypto
|
|
135
|
+
if (!nodeCrypto?.createHash) {
|
|
136
|
+
return null
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
return nodeCrypto.createHash(algorithm)
|
|
140
|
+
} catch {
|
|
141
|
+
return null
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function concatChunks(chunks: Uint8Array[], length: number): Uint8Array {
|
|
146
|
+
const out = new Uint8Array(length)
|
|
147
|
+
let offset = 0
|
|
148
|
+
for (const chunk of chunks) {
|
|
149
|
+
out.set(chunk, offset)
|
|
150
|
+
offset += chunk.length
|
|
151
|
+
}
|
|
152
|
+
return out
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function subtleCrypto(): SubtleCrypto | null {
|
|
156
|
+
const crypto = globalThis.crypto
|
|
157
|
+
if (crypto?.subtle && typeof crypto.subtle.digest === 'function') {
|
|
158
|
+
return crypto.subtle
|
|
159
|
+
}
|
|
160
|
+
return null
|
|
161
|
+
}
|
|
@@ -2,7 +2,7 @@ import { describe, expect, it } from 'vitest'
|
|
|
2
2
|
|
|
3
3
|
import * as $ from '@goscript/builtin/index.js'
|
|
4
4
|
|
|
5
|
-
import { Marshal, MarshalIndent, Unmarshal } from './index.js'
|
|
5
|
+
import { Marshal, MarshalIndent, Unmarshal, type Unmarshaler } from './index.js'
|
|
6
6
|
|
|
7
7
|
class Person {
|
|
8
8
|
public _fields = {
|
|
@@ -17,14 +17,36 @@ class Person {
|
|
|
17
17
|
[],
|
|
18
18
|
Person,
|
|
19
19
|
{
|
|
20
|
-
Name: {
|
|
20
|
+
Name: {
|
|
21
|
+
type: { kind: $.TypeKind.Basic, name: 'string' },
|
|
22
|
+
tag: 'json:"name"',
|
|
23
|
+
},
|
|
21
24
|
Age: { type: { kind: $.TypeKind.Basic, name: 'int' }, tag: 'json:"age"' },
|
|
22
|
-
Active: {
|
|
25
|
+
Active: {
|
|
26
|
+
type: { kind: $.TypeKind.Basic, name: 'bool' },
|
|
27
|
+
tag: 'json:"active"',
|
|
28
|
+
},
|
|
23
29
|
},
|
|
24
30
|
)
|
|
25
31
|
}
|
|
26
32
|
|
|
27
33
|
describe('encoding/json override', () => {
|
|
34
|
+
it('registers the Unmarshaler interface shape', () => {
|
|
35
|
+
class CustomUnmarshaler implements Unmarshaler {
|
|
36
|
+
UnmarshalJSON(_data: $.Slice<number>): $.GoError {
|
|
37
|
+
return null
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const [value, ok] = $.typeAssertTuple<Unmarshaler>(
|
|
42
|
+
new CustomUnmarshaler(),
|
|
43
|
+
'json.Unmarshaler',
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
expect(ok).toBe(true)
|
|
47
|
+
expect(value.UnmarshalJSON($.stringToBytes('{}'))).toBeNull()
|
|
48
|
+
})
|
|
49
|
+
|
|
28
50
|
it('marshals struct fields through json tags', () => {
|
|
29
51
|
const person = new Person()
|
|
30
52
|
person._fields.Name.value = 'Alice'
|
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
import * as $ from '@goscript/builtin/index.js'
|
|
2
2
|
|
|
3
|
+
export interface Unmarshaler {
|
|
4
|
+
UnmarshalJSON(data: $.Slice<number>): $.GoError
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
$.registerInterfaceType('json.Unmarshaler', null, [
|
|
8
|
+
{
|
|
9
|
+
name: 'UnmarshalJSON',
|
|
10
|
+
args: [
|
|
11
|
+
{
|
|
12
|
+
name: 'data',
|
|
13
|
+
type: {
|
|
14
|
+
kind: $.TypeKind.Slice,
|
|
15
|
+
elemType: { kind: $.TypeKind.Basic, name: 'uint8' },
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
],
|
|
19
|
+
returns: [{ type: 'GoError' }],
|
|
20
|
+
},
|
|
21
|
+
])
|
|
22
|
+
|
|
3
23
|
export function Marshal(v: unknown): [$.Slice<number>, $.GoError] {
|
|
4
24
|
try {
|
|
5
25
|
return [$.stringToBytes(JSON.stringify(marshalValue(v))), null]
|
|
@@ -147,9 +167,7 @@ function isPlainObject(value: unknown): value is Record<string, unknown> {
|
|
|
147
167
|
)
|
|
148
168
|
}
|
|
149
169
|
|
|
150
|
-
function structFieldMetadata(
|
|
151
|
-
value: unknown,
|
|
152
|
-
): Record<string, { tag?: string }> {
|
|
170
|
+
function structFieldMetadata(value: unknown): Record<string, { tag?: string }> {
|
|
153
171
|
if (value === null || typeof value !== 'object') {
|
|
154
172
|
return {}
|
|
155
173
|
}
|
package/gs/errors/errors.test.ts
CHANGED
|
@@ -43,7 +43,10 @@ describe('errors.AsType', () => {
|
|
|
43
43
|
|
|
44
44
|
it('walks wrapped errors depth first', () => {
|
|
45
45
|
const dns = $.interfaceValue<$.GoError>(new DNSError(), '*net.DNSError')
|
|
46
|
-
const wrapped = $.interfaceValue<$.GoError>(
|
|
46
|
+
const wrapped = $.interfaceValue<$.GoError>(
|
|
47
|
+
new Wrapper(dns),
|
|
48
|
+
'*main.Wrapper',
|
|
49
|
+
)
|
|
47
50
|
|
|
48
51
|
const [matched, ok] = AsType(dnsTypeArgs, Join(null, wrapped))
|
|
49
52
|
|
package/gs/errors/errors.ts
CHANGED
|
@@ -191,10 +191,7 @@ export function As(err: $.GoError, target: any): boolean {
|
|
|
191
191
|
throw new Error('errors: target cannot be nil')
|
|
192
192
|
}
|
|
193
193
|
|
|
194
|
-
|
|
195
|
-
if (err.constructor === target.constructor) {
|
|
196
|
-
// Copy properties from err to target
|
|
197
|
-
Object.assign(target, err)
|
|
194
|
+
if (assignAsTarget(err, target)) {
|
|
198
195
|
return true
|
|
199
196
|
}
|
|
200
197
|
|
|
@@ -230,6 +227,36 @@ export function As(err: $.GoError, target: any): boolean {
|
|
|
230
227
|
return false
|
|
231
228
|
}
|
|
232
229
|
|
|
230
|
+
function assignAsTarget(err: Exclude<$.GoError, null>, target: any): boolean {
|
|
231
|
+
const targetType = asTargetType(target)
|
|
232
|
+
if (targetType !== undefined) {
|
|
233
|
+
const [matched, ok] = $.typeAssertTuple<any>(err, targetType)
|
|
234
|
+
if (!ok) {
|
|
235
|
+
return false
|
|
236
|
+
}
|
|
237
|
+
if ($.isVarRef(target)) {
|
|
238
|
+
target.value = matched
|
|
239
|
+
return true
|
|
240
|
+
}
|
|
241
|
+
Object.assign(target, matched)
|
|
242
|
+
return true
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
if (err.constructor === target.constructor) {
|
|
246
|
+
Object.assign(target, err)
|
|
247
|
+
return true
|
|
248
|
+
}
|
|
249
|
+
return false
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
function asTargetType(target: any): string | undefined {
|
|
253
|
+
const goType = target?.__goType
|
|
254
|
+
if (typeof goType !== 'string' || !goType.startsWith('*')) {
|
|
255
|
+
return undefined
|
|
256
|
+
}
|
|
257
|
+
return goType.slice(1)
|
|
258
|
+
}
|
|
259
|
+
|
|
233
260
|
// AsType finds the first error in err's tree that matches the generic error
|
|
234
261
|
// type E, returning the matching error and true. Otherwise it returns E's zero
|
|
235
262
|
// value and false.
|
|
@@ -263,10 +290,7 @@ function asType(
|
|
|
263
290
|
const result = (err as any).Unwrap()
|
|
264
291
|
if (Array.isArray(result)) {
|
|
265
292
|
for (const wrappedErr of result) {
|
|
266
|
-
if (
|
|
267
|
-
wrappedErr &&
|
|
268
|
-
typeof wrappedErr.Error === 'function'
|
|
269
|
-
) {
|
|
293
|
+
if (wrappedErr && typeof wrappedErr.Error === 'function') {
|
|
270
294
|
const [matched, matchedOK] = asType(wrappedErr, typeInfo, zero)
|
|
271
295
|
if (matchedOK) {
|
|
272
296
|
return [matched, true]
|
package/gs/fmt/fmt.test.ts
CHANGED
|
@@ -36,7 +36,9 @@ function captureStdout(run: () => void): string {
|
|
|
36
36
|
length?: number,
|
|
37
37
|
_position?: number | null,
|
|
38
38
|
) => {
|
|
39
|
-
buf += new TextDecoder().decode(
|
|
39
|
+
buf += new TextDecoder().decode(
|
|
40
|
+
chunk.subarray(0, length ?? chunk.length),
|
|
41
|
+
)
|
|
40
42
|
return length ?? chunk.length
|
|
41
43
|
},
|
|
42
44
|
),
|
package/gs/fmt/fmt.ts
CHANGED
|
@@ -408,11 +408,7 @@ export function Append(b: $.Bytes, ...a: any[]): $.Bytes {
|
|
|
408
408
|
return newArray
|
|
409
409
|
}
|
|
410
410
|
|
|
411
|
-
export function Appendf(
|
|
412
|
-
b: $.Bytes,
|
|
413
|
-
format: string,
|
|
414
|
-
...a: any[]
|
|
415
|
-
): $.Bytes {
|
|
411
|
+
export function Appendf(b: $.Bytes, format: string, ...a: any[]): $.Bytes {
|
|
416
412
|
const result = parseFormat(format, a)
|
|
417
413
|
const encoded = new TextEncoder().encode(result)
|
|
418
414
|
const base = $.bytesToUint8Array(b)
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest'
|
|
2
2
|
|
|
3
|
+
import * as $ from '../../../builtin/index.js'
|
|
3
4
|
import {
|
|
4
5
|
AppendVarint,
|
|
6
|
+
type CloneMessage,
|
|
5
7
|
CompareEqualVT,
|
|
8
|
+
ConsumeVarint,
|
|
6
9
|
DecodeFixed32,
|
|
7
10
|
DecodeFixed64,
|
|
8
11
|
DecodeVarint,
|
|
@@ -13,6 +16,7 @@ import {
|
|
|
13
16
|
ErrIntOverflow,
|
|
14
17
|
ErrInvalidLength,
|
|
15
18
|
ErrUnexpectedEndOfGroup,
|
|
19
|
+
IsEqualVTSlice,
|
|
16
20
|
SizeOfVarint,
|
|
17
21
|
Skip,
|
|
18
22
|
} from './index.js'
|
|
@@ -25,6 +29,30 @@ class TestValue {
|
|
|
25
29
|
}
|
|
26
30
|
}
|
|
27
31
|
|
|
32
|
+
class TestCloneMessage implements CloneMessage {
|
|
33
|
+
SizeVT(): number {
|
|
34
|
+
return 0
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
MarshalToSizedBufferVT(): [$.Slice<number>, $.GoError] {
|
|
38
|
+
return [null, null]
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
MarshalVT(): [$.Slice<number>, $.GoError] {
|
|
42
|
+
return [null, null]
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
UnmarshalVT(): $.GoError {
|
|
46
|
+
return null
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
Reset(): void {}
|
|
50
|
+
|
|
51
|
+
CloneMessageVT(): CloneMessage | null {
|
|
52
|
+
return new TestCloneMessage()
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
28
56
|
describe('protobuf-go-lite EqualVT helpers', () => {
|
|
29
57
|
it('accepts compiler-emitted runtime type arguments', () => {
|
|
30
58
|
const equal = CompareEqualVT<TestValue>({
|
|
@@ -35,6 +63,31 @@ describe('protobuf-go-lite EqualVT helpers', () => {
|
|
|
35
63
|
expect(equal(new TestValue('a'), new TestValue('b'))).toBe(false)
|
|
36
64
|
expect(equal(null, null)).toBe(true)
|
|
37
65
|
})
|
|
66
|
+
|
|
67
|
+
it('accepts nullable generated message slices', () => {
|
|
68
|
+
const left: $.Slice<TestValue | $.VarRef<TestValue> | null> = [
|
|
69
|
+
$.varRef(new TestValue('x')),
|
|
70
|
+
null,
|
|
71
|
+
]
|
|
72
|
+
const right: $.Slice<TestValue | $.VarRef<TestValue> | null> = [
|
|
73
|
+
new TestValue('x'),
|
|
74
|
+
null,
|
|
75
|
+
]
|
|
76
|
+
|
|
77
|
+
expect(IsEqualVTSlice(left, right)).toBe(true)
|
|
78
|
+
})
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
describe('protobuf-go-lite runtime interfaces', () => {
|
|
82
|
+
it('registers CloneMessage metadata for Go type assertions', () => {
|
|
83
|
+
const [value, ok] = $.typeAssertTuple<CloneMessage | null>(
|
|
84
|
+
new TestCloneMessage(),
|
|
85
|
+
'protobuf_go_lite.CloneMessage',
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
expect(ok).toBe(true)
|
|
89
|
+
expect(value?.CloneMessageVT()).toBeInstanceOf(TestCloneMessage)
|
|
90
|
+
})
|
|
38
91
|
})
|
|
39
92
|
|
|
40
93
|
describe('protobuf-go-lite wire helpers', () => {
|
|
@@ -50,9 +103,14 @@ describe('protobuf-go-lite wire helpers', () => {
|
|
|
50
103
|
expect(DecodeVarintInt32(buf, offset)).toEqual([300, 4, null])
|
|
51
104
|
expect(DecodeVarintInt64(buf, offset)).toEqual([300, 4, null])
|
|
52
105
|
expect(DecodeVarintUint32(buf, offset)).toEqual([300, 4, null])
|
|
53
|
-
expect(Array.from(AppendVarint([], 300) as number[])).toEqual([
|
|
54
|
-
|
|
55
|
-
|
|
106
|
+
expect(Array.from(AppendVarint([], 300) as number[])).toEqual([0xac, 0x02])
|
|
107
|
+
expect(SizeOfVarint(0xffffffffffffffffn)).toBe(10)
|
|
108
|
+
expect(Array.from(AppendVarint([], 0xffffffffffffffffn) as number[])).toEqual([
|
|
109
|
+
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
|
|
110
|
+
])
|
|
111
|
+
expect(ConsumeVarint(AppendVarint([], 0xffffffffffffffffn))).toEqual([
|
|
112
|
+
0xffffffffffffffffn,
|
|
113
|
+
10,
|
|
56
114
|
])
|
|
57
115
|
})
|
|
58
116
|
|
|
@@ -80,10 +138,7 @@ describe('protobuf-go-lite wire helpers', () => {
|
|
|
80
138
|
5,
|
|
81
139
|
null,
|
|
82
140
|
])
|
|
83
|
-
expect(Skip(new Uint8Array([0x0c]))).toEqual([
|
|
84
|
-
0,
|
|
85
|
-
ErrUnexpectedEndOfGroup,
|
|
86
|
-
])
|
|
141
|
+
expect(Skip(new Uint8Array([0x0c]))).toEqual([0, ErrUnexpectedEndOfGroup])
|
|
87
142
|
})
|
|
88
143
|
|
|
89
144
|
it('reports protobuf wire errors as Go errors', () => {
|