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
@@ -51,6 +51,88 @@ export interface CloneVT<T> extends CloneMessage {
51
51
  CloneVT(): T
52
52
  }
53
53
 
54
+ export function ClonePtr<T>(v: T | $.VarRef<T> | null): $.VarRef<T> | null {
55
+ const value = $.pointerValueOrNil(v)
56
+ return value == null ? null : $.varRef(value)
57
+ }
58
+
59
+ export function CloneBytes<S extends $.Slice<number> | Uint8Array | null>(
60
+ v: S,
61
+ ): S {
62
+ if (v == null) {
63
+ return null as S
64
+ }
65
+ if (v instanceof Uint8Array) {
66
+ return new Uint8Array(v) as S
67
+ }
68
+ return $.asArray(v).slice() as S
69
+ }
70
+
71
+ export function CloneSlice<S extends $.Slice<T> | null, T>(s: S): S {
72
+ if (s == null) {
73
+ return null as S
74
+ }
75
+ if (s instanceof Uint8Array) {
76
+ return new Uint8Array(s) as S
77
+ }
78
+ return $.asArray(s).slice() as S
79
+ }
80
+
81
+ export function CloneMap<K, V>(m: Map<K, V> | null): Map<K, V> | null {
82
+ return m == null ? null : new Map(m)
83
+ }
84
+
85
+ export function CloneBytesSlice<
86
+ S extends $.Slice<$.Slice<number> | null> | null,
87
+ >(s: S): S {
88
+ if (s == null) {
89
+ return null as S
90
+ }
91
+ return $.asArray(s).map((v) => CloneBytes(v)) as S
92
+ }
93
+
94
+ export function CloneBytesMap<K, V extends $.Slice<number> | null>(
95
+ m: Map<K, V> | null,
96
+ ): Map<K, V> | null {
97
+ if (m == null) {
98
+ return null
99
+ }
100
+ const out = new Map<K, V>()
101
+ for (const [k, v] of m.entries()) {
102
+ out.set(k, CloneBytes(v) as V)
103
+ }
104
+ return out
105
+ }
106
+
107
+ export function CloneVTValue<T extends CloneVT<T>>(
108
+ v: T | $.VarRef<T> | null,
109
+ ): T | null {
110
+ const value = $.pointerValueOrNil(v)
111
+ return value == null ? null : value.CloneVT()
112
+ }
113
+
114
+ export function CloneVTSlice<T extends CloneVT<T>>(
115
+ s: $.Slice<T | $.VarRef<T> | null> | null,
116
+ ): $.Slice<T | null> | null {
117
+ if (s == null) {
118
+ return null
119
+ }
120
+ return $.asArray(s).map((v) => CloneVTValue(v))
121
+ }
122
+
123
+ export function CloneVTMap<K, V extends CloneVT<V>>(
124
+ m: Map<K, V | $.VarRef<V> | null> | null,
125
+ ): Map<K, V | null> | null {
126
+ if (m == null) {
127
+ return null
128
+ }
129
+ const out = new Map<K, V | null>()
130
+ for (const [k, v] of m.entries()) {
131
+ out.set(k, CloneVTValue(v))
132
+ }
133
+ return out
134
+ }
135
+
54
136
  export interface EqualVT<T> {
55
137
  EqualVT(other: T): boolean
56
138
  }
@@ -73,7 +155,9 @@ export function IsEqualVT<T>(
73
155
  arg1: T | $.VarRef<T> | null,
74
156
  arg2?: T | $.VarRef<T> | null,
75
157
  ): boolean {
76
- const t1 = $.pointerValueOrNil(arg2 === undefined ? (arg0 as T | $.VarRef<T> | null) : arg1)
158
+ const t1 = $.pointerValueOrNil(
159
+ arg2 === undefined ? (arg0 as T | $.VarRef<T> | null) : arg1,
160
+ )
77
161
  const t2 = $.pointerValueOrNil(arg2 === undefined ? arg1 : arg2)
78
162
  if (t1 == null || t2 == null) {
79
163
  return t1 == t2
@@ -102,6 +186,567 @@ export function IsEqualVTSlice<T>(
102
186
  return true
103
187
  }
104
188
 
189
+ export function EqualPtr<T>(
190
+ a: T | $.VarRef<T> | null,
191
+ b: T | $.VarRef<T> | null,
192
+ ): boolean {
193
+ const av = $.pointerValueOrNil(a)
194
+ const bv = $.pointerValueOrNil(b)
195
+ return (
196
+ (av == null && bv == null) ||
197
+ (av != null && bv != null && $.comparableEqual(av, bv))
198
+ )
199
+ }
200
+
201
+ export function EqualBytes(
202
+ a: $.Slice<number> | Uint8Array | null,
203
+ b: $.Slice<number> | Uint8Array | null,
204
+ ): boolean {
205
+ if ($.len(a) !== $.len(b)) {
206
+ return false
207
+ }
208
+ const aa = $.asArray(a as $.Slice<number>)
209
+ const bb = $.asArray(b as $.Slice<number>)
210
+ for (let i = 0; i < aa.length; i++) {
211
+ if (aa[i] !== bb[i]) {
212
+ return false
213
+ }
214
+ }
215
+ return true
216
+ }
217
+
218
+ export function EqualBytesPresent(
219
+ a: $.Slice<number> | Uint8Array | null,
220
+ b: $.Slice<number> | Uint8Array | null,
221
+ ): boolean {
222
+ return (
223
+ (a == null && b == null) || (a != null && b != null && EqualBytes(a, b))
224
+ )
225
+ }
226
+
227
+ export function EqualSlice<T>(
228
+ a: $.Slice<T> | null,
229
+ b: $.Slice<T> | null,
230
+ ): boolean {
231
+ if ($.len(a) !== $.len(b)) {
232
+ return false
233
+ }
234
+ const aa = $.asArray(a)
235
+ const bb = $.asArray(b)
236
+ for (let i = 0; i < aa.length; i++) {
237
+ if (!$.comparableEqual(aa[i], bb[i])) {
238
+ return false
239
+ }
240
+ }
241
+ return true
242
+ }
243
+
244
+ export function EqualMap<K, V>(
245
+ a: Map<K, V> | null,
246
+ b: Map<K, V> | null,
247
+ ): boolean {
248
+ if ($.len(a) !== $.len(b)) {
249
+ return false
250
+ }
251
+ for (const [k, av] of (a ?? new Map<K, V>()).entries()) {
252
+ const [bv, ok] = $.mapGet(b, k, undefined)
253
+ if (!ok || !$.comparableEqual(av, bv)) {
254
+ return false
255
+ }
256
+ }
257
+ return true
258
+ }
259
+
260
+ export function EqualBytesSlice(
261
+ a: $.Slice<$.Slice<number> | Uint8Array | null> | null,
262
+ b: $.Slice<$.Slice<number> | Uint8Array | null> | null,
263
+ ): boolean {
264
+ if ($.len(a) !== $.len(b)) {
265
+ return false
266
+ }
267
+ const aa = $.asArray(a)
268
+ const bb = $.asArray(b)
269
+ for (let i = 0; i < aa.length; i++) {
270
+ if (!EqualBytes(aa[i], bb[i])) {
271
+ return false
272
+ }
273
+ }
274
+ return true
275
+ }
276
+
277
+ export function EqualBytesMap<K>(
278
+ a: Map<K, $.Slice<number> | Uint8Array | null> | null,
279
+ b: Map<K, $.Slice<number> | Uint8Array | null> | null,
280
+ ): boolean {
281
+ if ($.len(a) !== $.len(b)) {
282
+ return false
283
+ }
284
+ for (const [k, av] of (a ?? new Map()).entries()) {
285
+ const [bv, ok] = $.mapGet(b, k, null)
286
+ if (!ok || !EqualBytes(av, bv)) {
287
+ return false
288
+ }
289
+ }
290
+ return true
291
+ }
292
+
293
+ export function EqualVTImplicit<T extends EqualVT<T>>(
294
+ a: T | $.VarRef<T> | null,
295
+ b: T | $.VarRef<T> | null,
296
+ empty: () => T,
297
+ ): boolean {
298
+ let av = $.pointerValueOrNil(a)
299
+ let bv = $.pointerValueOrNil(b)
300
+ if (av === bv) {
301
+ return true
302
+ }
303
+ if (av == null) {
304
+ av = empty()
305
+ }
306
+ if (bv == null) {
307
+ bv = empty()
308
+ }
309
+ return av.EqualVT(bv)
310
+ }
311
+
312
+ export function EqualVTSliceImplicit<T extends EqualVT<T>>(
313
+ a: $.Slice<T | $.VarRef<T> | null> | null,
314
+ b: $.Slice<T | $.VarRef<T> | null> | null,
315
+ empty: () => T,
316
+ ): boolean {
317
+ if ($.len(a) !== $.len(b)) {
318
+ return false
319
+ }
320
+ const aa = $.asArray(a)
321
+ const bb = $.asArray(b)
322
+ for (let i = 0; i < aa.length; i++) {
323
+ if (!EqualVTImplicit(aa[i], bb[i], empty)) {
324
+ return false
325
+ }
326
+ }
327
+ return true
328
+ }
329
+
330
+ export function EqualVTMapImplicit<K, V extends EqualVT<V>>(
331
+ a: Map<K, V | $.VarRef<V> | null> | null,
332
+ b: Map<K, V | $.VarRef<V> | null> | null,
333
+ empty: () => V,
334
+ ): boolean {
335
+ if ($.len(a) !== $.len(b)) {
336
+ return false
337
+ }
338
+ for (const [k, av] of (a ?? new Map()).entries()) {
339
+ const [bv, ok] = $.mapGet(b, k, null)
340
+ if (!ok || !EqualVTImplicit(av, bv, empty)) {
341
+ return false
342
+ }
343
+ }
344
+ return true
345
+ }
346
+
347
+ type BoundMessageType = {
348
+ typeName?: string
349
+ fields?: { list(): readonly BoundFieldInfo[] }
350
+ clone?: (value: any) => any
351
+ equals?: (a: any, b: any) => boolean
352
+ fromBinary: (bytes: Uint8Array | null | undefined) => any
353
+ fromJson?: (value: unknown) => any
354
+ fromJsonString?: (value: string | null | undefined) => any
355
+ toBinary: (value: any) => Uint8Array
356
+ toJson?: (value: any) => unknown
357
+ toJsonString?: (value: any) => string
358
+ }
359
+
360
+ type BoundFieldInfo = {
361
+ localName: string
362
+ kind: string
363
+ repeated?: boolean
364
+ oneof?: { localName: string }
365
+ T?: any
366
+ V?: BoundFieldInfo
367
+ }
368
+
369
+ type BoundMessageCtor<T = any> = {
370
+ new (init?: any): T
371
+ __protobufTypeScriptFields?: Record<string, BoundMessageCtor>
372
+ __protobufTypeScriptMessage?: BoundMessageType
373
+ }
374
+
375
+ const protobufScalarTypeBytes = 12
376
+
377
+ function boundMessageType(ctor: BoundMessageCtor): BoundMessageType {
378
+ const messageType = ctor.__protobufTypeScriptMessage
379
+ if (messageType == null) {
380
+ throw new Error('protobuf TypeScript binding is missing message type')
381
+ }
382
+ return messageType
383
+ }
384
+
385
+ function resolveBoundMessageType(value: any): BoundMessageType {
386
+ return typeof value === 'function' ? value() : value
387
+ }
388
+
389
+ function boundFieldGoName(field: BoundFieldInfo): string {
390
+ if (field.localName.length === 0) {
391
+ return field.localName
392
+ }
393
+ return field.localName[0].toUpperCase() + field.localName.slice(1)
394
+ }
395
+
396
+ function boundFieldValue(source: any, field: BoundFieldInfo): any {
397
+ if (source == null) {
398
+ return undefined
399
+ }
400
+ const local = source[field.localName]
401
+ if (local !== undefined) {
402
+ return local
403
+ }
404
+ return source[boundFieldGoName(field)]
405
+ }
406
+
407
+ function toTypeScriptScalarValue(value: any, field?: BoundFieldInfo): any {
408
+ const unwrapped = $.pointerValueOrNil(value)
409
+ if (
410
+ field?.kind === 'scalar' &&
411
+ field.T === protobufScalarTypeBytes &&
412
+ unwrapped != null &&
413
+ !(unwrapped instanceof Uint8Array)
414
+ ) {
415
+ return Uint8Array.from($.asArray(unwrapped))
416
+ }
417
+ if (unwrapped instanceof Uint8Array) {
418
+ return unwrapped
419
+ }
420
+ return unwrapped
421
+ }
422
+
423
+ function toTypeScriptFieldValue(
424
+ field: BoundFieldInfo,
425
+ value: any,
426
+ ctor?: BoundMessageCtor,
427
+ ): any {
428
+ value = $.pointerValueOrNil(value)
429
+ if (value == null) {
430
+ return undefined
431
+ }
432
+ if (field.repeated) {
433
+ return $.asArray(value).map((item) =>
434
+ toTypeScriptFieldValue({ ...field, repeated: false }, item, ctor),
435
+ )
436
+ }
437
+ if (field.kind === 'map') {
438
+ const out: Record<string, unknown> = {}
439
+ const valueInfo = field.V
440
+ const entries =
441
+ value instanceof Map ? Array.from(value.entries()) : Object.entries(value)
442
+ for (const [key, item] of entries) {
443
+ out[String(key)] =
444
+ valueInfo != null ?
445
+ toTypeScriptFieldValue(valueInfo, item, ctor)
446
+ : toTypeScriptScalarValue(item)
447
+ }
448
+ return out
449
+ }
450
+ if (field.kind === 'message') {
451
+ const messageType = resolveBoundMessageType(field.T)
452
+ return toTypeScriptMessage(value, messageType, ctor)
453
+ }
454
+ return toTypeScriptScalarValue(value, field)
455
+ }
456
+
457
+ function toTypeScriptMessage(
458
+ value: any,
459
+ messageType: BoundMessageType,
460
+ ctor?: BoundMessageCtor,
461
+ ): any {
462
+ value = $.pointerValueOrNil(value)
463
+ if (value == null) {
464
+ return undefined
465
+ }
466
+ const fields = messageType.fields?.list()
467
+ if (fields == null) {
468
+ return value
469
+ }
470
+ const fieldCtors = ctor?.__protobufTypeScriptFields ?? {}
471
+ const out: Record<string, unknown> = {}
472
+ for (const field of fields) {
473
+ if (field.oneof != null) {
474
+ continue
475
+ }
476
+ const raw = boundFieldValue(value, field)
477
+ if (raw === undefined || raw === null) {
478
+ continue
479
+ }
480
+ out[field.localName] = toTypeScriptFieldValue(
481
+ field,
482
+ raw,
483
+ fieldCtors[field.localName],
484
+ )
485
+ }
486
+ return out
487
+ }
488
+
489
+ function fromTypeScriptScalarValue(value: any): any {
490
+ if (value instanceof Uint8Array) {
491
+ return value
492
+ }
493
+ return value
494
+ }
495
+
496
+ function fromTypeScriptFieldValue(
497
+ field: BoundFieldInfo,
498
+ value: any,
499
+ ctor?: BoundMessageCtor,
500
+ ): any {
501
+ if (value == null) {
502
+ return null
503
+ }
504
+ if (field.repeated) {
505
+ return $.arrayToSlice(
506
+ value.map((item: any) =>
507
+ fromTypeScriptFieldValue({ ...field, repeated: false }, item, ctor),
508
+ ),
509
+ )
510
+ }
511
+ if (field.kind === 'map') {
512
+ const valueInfo = field.V
513
+ const out = new Map<any, any>()
514
+ for (const [key, item] of Object.entries(value)) {
515
+ out.set(
516
+ key,
517
+ valueInfo != null ?
518
+ fromTypeScriptFieldValue(valueInfo, item, ctor)
519
+ : fromTypeScriptScalarValue(item),
520
+ )
521
+ }
522
+ return out
523
+ }
524
+ if (field.kind === 'message') {
525
+ const messageType = resolveBoundMessageType(field.T)
526
+ if (ctor == null) {
527
+ return value
528
+ }
529
+ return fromTypeScriptMessage(value, ctor, messageType)
530
+ }
531
+ return fromTypeScriptScalarValue(value)
532
+ }
533
+
534
+ function fromTypeScriptWellKnownMessage(
535
+ value: any,
536
+ ctor: BoundMessageCtor,
537
+ messageType?: BoundMessageType,
538
+ ): any {
539
+ if (
540
+ messageType?.typeName === 'google.protobuf.Timestamp' &&
541
+ value instanceof Date
542
+ ) {
543
+ const ms = value.getTime()
544
+ const seconds = Math.floor(ms / 1000)
545
+ const nanos = Math.trunc((ms - seconds * 1000) * 1000000)
546
+ return new ctor({ Seconds: seconds, Nanos: nanos })
547
+ }
548
+ return undefined
549
+ }
550
+
551
+ function fromTypeScriptMessage(
552
+ value: any,
553
+ ctor: BoundMessageCtor,
554
+ messageType?: BoundMessageType,
555
+ ): any {
556
+ if (value == null) {
557
+ return null
558
+ }
559
+ const wellKnown = fromTypeScriptWellKnownMessage(value, ctor, messageType)
560
+ if (wellKnown !== undefined) {
561
+ return wellKnown
562
+ }
563
+ const out = new ctor()
564
+ const fields = (messageType ?? boundMessageType(ctor)).fields?.list()
565
+ if (fields == null) {
566
+ return Object.assign(out, value)
567
+ }
568
+ const fieldCtors = ctor.__protobufTypeScriptFields ?? {}
569
+ for (const field of fields) {
570
+ if (field.oneof != null) {
571
+ continue
572
+ }
573
+ const raw = value[field.localName]
574
+ if (raw === undefined || raw === null) {
575
+ continue
576
+ }
577
+ out[boundFieldGoName(field)] = fromTypeScriptFieldValue(
578
+ field,
579
+ raw,
580
+ fieldCtors[field.localName],
581
+ )
582
+ }
583
+ return out
584
+ }
585
+
586
+ export function CloneBoundMessage<T>(
587
+ ctor: BoundMessageCtor<T>,
588
+ value: T | $.VarRef<T> | null,
589
+ ): T | null {
590
+ const messageType = boundMessageType(ctor)
591
+ const encoded = toTypeScriptMessage(value, messageType, ctor)
592
+ const cloned = messageType.clone?.(encoded) ?? structuredClone(encoded)
593
+ return fromTypeScriptMessage(cloned, ctor, messageType)
594
+ }
595
+
596
+ export function EqualBoundMessage<T>(
597
+ ctor: BoundMessageCtor<T>,
598
+ a: T | $.VarRef<T> | null,
599
+ b: T | $.VarRef<T> | null,
600
+ ): boolean {
601
+ const messageType = boundMessageType(ctor)
602
+ const left = toTypeScriptMessage(a, messageType, ctor)
603
+ const right = toTypeScriptMessage(b, messageType, ctor)
604
+ return (
605
+ messageType.equals?.(left, right) ??
606
+ JSON.stringify(left) === JSON.stringify(right)
607
+ )
608
+ }
609
+
610
+ export function MarshalBoundMessageVT<T>(
611
+ ctor: BoundMessageCtor<T>,
612
+ value: T | $.VarRef<T> | null,
613
+ ): [$.Slice<number>, $.GoError] {
614
+ let typeName = ctor.name
615
+ try {
616
+ const messageType = boundMessageType(ctor)
617
+ typeName = messageType.typeName ?? typeName
618
+ return [
619
+ messageType.toBinary(toTypeScriptMessage(value, messageType, ctor)),
620
+ null,
621
+ ]
622
+ } catch (err) {
623
+ const msg = err instanceof Error ? err.message : String(err)
624
+ return [null, $.toGoError(new Error(`marshal ${typeName}: ${msg}`))]
625
+ }
626
+ }
627
+
628
+ export function MarshalBoundMessageToSizedBufferVT<T>(
629
+ ctor: BoundMessageCtor<T>,
630
+ value: T | $.VarRef<T> | null,
631
+ dAtA: $.Slice<number>,
632
+ ): [number, $.GoError] {
633
+ const [bytes, err] = MarshalBoundMessageVT(ctor, value)
634
+ if (err != null) {
635
+ return [0, err]
636
+ }
637
+ const byteCount = $.len(bytes)
638
+ const offset = $.len(dAtA) - byteCount
639
+ const src = $.asArray(bytes)
640
+ for (let i = 0; i < src.length; i++) {
641
+ ;(dAtA as any)[offset + i] = src[i]
642
+ }
643
+ return [byteCount, null]
644
+ }
645
+
646
+ export function SizeBoundMessageVT<T>(
647
+ ctor: BoundMessageCtor<T>,
648
+ value: T | $.VarRef<T> | null,
649
+ ): number {
650
+ const [bytes, err] = MarshalBoundMessageVT(ctor, value)
651
+ return err == null ? $.len(bytes) : 0
652
+ }
653
+
654
+ export function UnmarshalBoundMessageVT<T>(
655
+ ctor: BoundMessageCtor<T>,
656
+ target: T | $.VarRef<T> | null,
657
+ data: $.Slice<number>,
658
+ ): $.GoError {
659
+ try {
660
+ const messageType = boundMessageType(ctor)
661
+ const decoded = messageType.fromBinary(Uint8Array.from($.asArray(data)))
662
+ const next = fromTypeScriptMessage(decoded, ctor, messageType)
663
+ $.assignStruct($.pointerValue(target), $.markAsStructValue(next))
664
+ return null
665
+ } catch (err) {
666
+ return $.toGoError(err as Error)
667
+ }
668
+ }
669
+
670
+ export function MarshalBoundMessageJSON<T>(
671
+ ctor: BoundMessageCtor<T>,
672
+ value: T | $.VarRef<T> | null,
673
+ ): [$.Slice<number>, $.GoError] {
674
+ try {
675
+ const messageType = boundMessageType(ctor)
676
+ const encoded = toTypeScriptMessage(value, messageType, ctor)
677
+ const json =
678
+ messageType.toJsonString?.(encoded) ??
679
+ JSON.stringify(messageType.toJson?.(encoded) ?? encoded)
680
+ return [$.stringToBytes(json), null]
681
+ } catch (err) {
682
+ return [null, $.toGoError(err as Error)]
683
+ }
684
+ }
685
+
686
+ export function UnmarshalBoundMessageJSON<T>(
687
+ ctor: BoundMessageCtor<T>,
688
+ target: T | $.VarRef<T> | null,
689
+ data: $.Slice<number>,
690
+ ): $.GoError {
691
+ try {
692
+ const messageType = boundMessageType(ctor)
693
+ const text = $.bytesToString(data)
694
+ const decoded =
695
+ messageType.fromJsonString?.(text) ??
696
+ messageType.fromJson?.(JSON.parse(text))
697
+ const next = fromTypeScriptMessage(decoded, ctor, messageType)
698
+ $.assignStruct($.pointerValue(target), $.markAsStructValue(next))
699
+ return null
700
+ } catch (err) {
701
+ return $.toGoError(err as Error)
702
+ }
703
+ }
704
+
705
+ export function MarshalBoundMessageProtoJSON<T>(
706
+ ctor: BoundMessageCtor<T>,
707
+ value: T | $.VarRef<T> | null,
708
+ state: {
709
+ Write(v: $.Slice<number>): [number, $.GoError]
710
+ SetError(err: $.GoError): void
711
+ } | null,
712
+ ): void {
713
+ if (state == null) {
714
+ return
715
+ }
716
+ const [data, err] = MarshalBoundMessageJSON(ctor, value)
717
+ if (err != null) {
718
+ state.SetError(err)
719
+ return
720
+ }
721
+ state.Write(data)
722
+ }
723
+
724
+ export function UnmarshalBoundMessageProtoJSON<T>(
725
+ ctor: BoundMessageCtor<T>,
726
+ target: T | $.VarRef<T> | null,
727
+ state: { SetError(err: $.GoError): void } | null,
728
+ ): void {
729
+ if (state == null) {
730
+ return
731
+ }
732
+ try {
733
+ const messageType = boundMessageType(ctor)
734
+ const decoded = messageType.fromJson?.((state as any).value)
735
+ const next = fromTypeScriptMessage(decoded, ctor, messageType)
736
+ $.assignStruct($.pointerValue(target), $.markAsStructValue(next))
737
+ } catch (err) {
738
+ state.SetError($.toGoError(err as Error))
739
+ }
740
+ }
741
+
742
+ export function MarshalBoundMessageProtoText<T>(
743
+ ctor: BoundMessageCtor<T>,
744
+ value: T | $.VarRef<T> | null,
745
+ ): string {
746
+ const [data, err] = MarshalBoundMessageJSON(ctor, value)
747
+ return err == null ? $.bytesToString(data) : err.Error()
748
+ }
749
+
105
750
  export function EncodeVarint(
106
751
  dAtA: $.Slice<number>,
107
752
  offset: number,
@@ -163,6 +808,253 @@ export function SizeOfVarint(x: number | bigint): number {
163
808
  return n
164
809
  }
165
810
 
811
+ export function SizeOfZigzag(x: number | bigint): number {
812
+ const value =
813
+ typeof x === 'bigint' ?
814
+ BigInt.asIntN(64, x)
815
+ : BigInt.asIntN(64, BigInt(Math.trunc(x)))
816
+ return SizeOfVarint(BigInt.asUintN(64, (value << 1n) ^ (value >> 63n)))
817
+ }
818
+
819
+ export function SizeVarintValue(keySize: number, v: number | bigint): number {
820
+ return keySize + SizeOfVarint(v)
821
+ }
822
+
823
+ export function SizeVarintNonZero(keySize: number, v: number | bigint): number {
824
+ return normalizedVarint(v) === 0n ? 0 : SizeVarintValue(keySize, v)
825
+ }
826
+
827
+ export function SizeVarintPtr(
828
+ keySize: number,
829
+ v: number | bigint | $.VarRef<number | bigint> | null,
830
+ ): number {
831
+ const value = $.pointerValueOrNil(v)
832
+ return value == null ? 0 : SizeVarintValue(keySize, value)
833
+ }
834
+
835
+ export function SizeVarintSlice(
836
+ keySize: number,
837
+ vals: $.Slice<number | bigint> | null,
838
+ ): number {
839
+ let n = 0
840
+ for (const v of vals ?? []) {
841
+ n += SizeVarintValue(keySize, v)
842
+ }
843
+ return n
844
+ }
845
+
846
+ export function SizeVarintPacked(
847
+ keySize: number,
848
+ vals: $.Slice<number | bigint> | null,
849
+ ): number {
850
+ if ($.len(vals) === 0) {
851
+ return 0
852
+ }
853
+ let l = 0
854
+ for (const v of vals ?? []) {
855
+ l += SizeOfVarint(v)
856
+ }
857
+ return SizeBytesValue(keySize, l)
858
+ }
859
+
860
+ export function SizeZigzagValue(keySize: number, v: number | bigint): number {
861
+ return keySize + SizeOfZigzag(v)
862
+ }
863
+
864
+ export function SizeZigzagNonZero(keySize: number, v: number | bigint): number {
865
+ return BigInt.asIntN(64, normalizedVarint(v)) === 0n ?
866
+ 0
867
+ : SizeZigzagValue(keySize, v)
868
+ }
869
+
870
+ export function SizeZigzagPtr(
871
+ keySize: number,
872
+ v: number | bigint | $.VarRef<number | bigint> | null,
873
+ ): number {
874
+ const value = $.pointerValueOrNil(v)
875
+ return value == null ? 0 : SizeZigzagValue(keySize, value)
876
+ }
877
+
878
+ export function SizeZigzagSlice(
879
+ keySize: number,
880
+ vals: $.Slice<number | bigint> | null,
881
+ ): number {
882
+ let n = 0
883
+ for (const v of vals ?? []) {
884
+ n += SizeZigzagValue(keySize, v)
885
+ }
886
+ return n
887
+ }
888
+
889
+ export function SizeZigzagPacked(
890
+ keySize: number,
891
+ vals: $.Slice<number | bigint> | null,
892
+ ): number {
893
+ if ($.len(vals) === 0) {
894
+ return 0
895
+ }
896
+ let l = 0
897
+ for (const v of vals ?? []) {
898
+ l += SizeOfZigzag(v)
899
+ }
900
+ return SizeBytesValue(keySize, l)
901
+ }
902
+
903
+ export function SizeFixed32Value(keySize: number): number {
904
+ return keySize + 4
905
+ }
906
+
907
+ export function SizeFixed32NonZero(keySize: number, v: number): number {
908
+ return v === 0 ? 0 : SizeFixed32Value(keySize)
909
+ }
910
+
911
+ export function SizeFixed32Ptr(
912
+ keySize: number,
913
+ v: number | $.VarRef<number> | null,
914
+ ): number {
915
+ return $.pointerValueOrNil(v) == null ? 0 : SizeFixed32Value(keySize)
916
+ }
917
+
918
+ export function SizeFixed32Slice(
919
+ keySize: number,
920
+ vals: $.Slice<number> | null,
921
+ ): number {
922
+ return $.len(vals) * SizeFixed32Value(keySize)
923
+ }
924
+
925
+ export function SizeFixed32Packed(
926
+ keySize: number,
927
+ vals: $.Slice<number> | null,
928
+ ): number {
929
+ return $.len(vals) === 0 ? 0 : SizeBytesValue(keySize, $.len(vals) * 4)
930
+ }
931
+
932
+ export function SizeFixed64Value(keySize: number): number {
933
+ return keySize + 8
934
+ }
935
+
936
+ export function SizeFixed64NonZero(
937
+ keySize: number,
938
+ v: number | bigint,
939
+ ): number {
940
+ return v === 0 || v === 0n ? 0 : SizeFixed64Value(keySize)
941
+ }
942
+
943
+ export function SizeFixed64Ptr(
944
+ keySize: number,
945
+ v: number | bigint | $.VarRef<number | bigint> | null,
946
+ ): number {
947
+ return $.pointerValueOrNil(v) == null ? 0 : SizeFixed64Value(keySize)
948
+ }
949
+
950
+ export function SizeFixed64Slice(
951
+ keySize: number,
952
+ vals: $.Slice<number | bigint> | null,
953
+ ): number {
954
+ return $.len(vals) * SizeFixed64Value(keySize)
955
+ }
956
+
957
+ export function SizeFixed64Packed(
958
+ keySize: number,
959
+ vals: $.Slice<number | bigint> | null,
960
+ ): number {
961
+ return $.len(vals) === 0 ? 0 : SizeBytesValue(keySize, $.len(vals) * 8)
962
+ }
963
+
964
+ export function SizeBoolValue(keySize: number): number {
965
+ return keySize + 1
966
+ }
967
+
968
+ export function SizeBoolNonZero(keySize: number, v: boolean): number {
969
+ return v ? SizeBoolValue(keySize) : 0
970
+ }
971
+
972
+ export function SizeBoolPtr(
973
+ keySize: number,
974
+ v: boolean | $.VarRef<boolean> | null,
975
+ ): number {
976
+ return $.pointerValueOrNil(v) == null ? 0 : SizeBoolValue(keySize)
977
+ }
978
+
979
+ export function SizeBoolSlice(
980
+ keySize: number,
981
+ vals: $.Slice<boolean> | null,
982
+ ): number {
983
+ return $.len(vals) * SizeBoolValue(keySize)
984
+ }
985
+
986
+ export function SizeBoolPacked(
987
+ keySize: number,
988
+ vals: $.Slice<boolean> | null,
989
+ ): number {
990
+ return $.len(vals) === 0 ? 0 : SizeBytesValue(keySize, $.len(vals))
991
+ }
992
+
993
+ export function SizeStringValue(keySize: number, v: string): number {
994
+ const l = $.len(v)
995
+ return keySize + l + SizeOfVarint(l)
996
+ }
997
+
998
+ export function SizeStringNonEmpty(keySize: number, v: string): number {
999
+ return $.len(v) === 0 ? 0 : SizeStringValue(keySize, v)
1000
+ }
1001
+
1002
+ export function SizeStringPtr(
1003
+ keySize: number,
1004
+ v: string | $.VarRef<string> | null,
1005
+ ): number {
1006
+ const value = $.pointerValueOrNil(v)
1007
+ return value == null ? 0 : SizeStringValue(keySize, value)
1008
+ }
1009
+
1010
+ export function SizeStringSlice(
1011
+ keySize: number,
1012
+ vals: $.Slice<string> | null,
1013
+ ): number {
1014
+ let n = 0
1015
+ for (const v of vals ?? []) {
1016
+ n += SizeStringValue(keySize, v)
1017
+ }
1018
+ return n
1019
+ }
1020
+
1021
+ export function SizeBytesValue(keySize: number, l: number): number {
1022
+ return keySize + l + SizeOfVarint(l)
1023
+ }
1024
+
1025
+ export function SizeBytesNonEmpty(
1026
+ keySize: number,
1027
+ v: $.Slice<number> | null,
1028
+ ): number {
1029
+ return $.len(v) === 0 ? 0 : SizeBytesValue(keySize, $.len(v))
1030
+ }
1031
+
1032
+ export function SizeBytesPresent(
1033
+ keySize: number,
1034
+ v: $.Slice<number> | null,
1035
+ ): number {
1036
+ return v == null ? 0 : SizeBytesValue(keySize, $.len(v))
1037
+ }
1038
+
1039
+ export function SizeBytesSlice(
1040
+ keySize: number,
1041
+ vals: $.Slice<$.Slice<number> | null> | null,
1042
+ ): number {
1043
+ let n = 0
1044
+ for (const v of vals ?? []) {
1045
+ n += SizeBytesValue(keySize, $.len(v))
1046
+ }
1047
+ return n
1048
+ }
1049
+
1050
+ export function SizeMessage(keySize: number, msgSize: number): number {
1051
+ return SizeBytesValue(keySize, msgSize)
1052
+ }
1053
+
1054
+ export function SizeGroup(keySize: number, msgSize: number): number {
1055
+ return msgSize + 2 * keySize
1056
+ }
1057
+
166
1058
  function normalizedVarint(value: number | bigint): bigint {
167
1059
  if (typeof value === 'bigint') {
168
1060
  return BigInt.asUintN(64, value)