@blamejs/core 0.7.18 → 0.7.20
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/CHANGELOG.md +427 -423
- package/README.md +150 -150
- package/bin/blamejs.js +0 -0
- package/index.js +310 -308
- package/lib/api-key.js +660 -660
- package/lib/api-snapshot.js +338 -338
- package/lib/app-shutdown.js +385 -385
- package/lib/app.js +365 -365
- package/lib/archive.js +250 -250
- package/lib/atomic-file.js +544 -544
- package/lib/audit-chain.js +177 -177
- package/lib/audit-sign.js +344 -344
- package/lib/audit-tools.js +677 -677
- package/lib/audit.js +766 -766
- package/lib/auth/jwt-external.js +365 -0
- package/lib/auth/jwt.js +337 -311
- package/lib/auth/lockout.js +436 -436
- package/lib/auth/oauth.js +721 -721
- package/lib/auth/passkey.js +181 -181
- package/lib/auth/password.js +628 -594
- package/lib/backup/bundle.js +217 -217
- package/lib/backup/crypto.js +176 -176
- package/lib/backup/index.js +515 -515
- package/lib/backup/manifest.js +282 -282
- package/lib/break-glass.js +1338 -1338
- package/lib/bundler.js +441 -441
- package/lib/cache-redis.js +256 -256
- package/lib/cache.js +1206 -1206
- package/lib/canonical-json.js +115 -115
- package/lib/chain-writer.js +234 -234
- package/lib/cli-helpers.js +206 -206
- package/lib/cli.js +2334 -2334
- package/lib/cluster-provider-db.js +317 -317
- package/lib/cluster-storage.js +226 -226
- package/lib/cluster.js +703 -703
- package/lib/config-drift.js +301 -301
- package/lib/consent.js +222 -222
- package/lib/constants.js +191 -191
- package/lib/cookies.js +350 -315
- package/lib/credential-hash.js +322 -322
- package/lib/crypto.js +266 -266
- package/lib/csv.js +275 -275
- package/lib/db-declare-row-policy.js +267 -267
- package/lib/db-declare-view.js +420 -420
- package/lib/db-query.js +406 -406
- package/lib/db-schema.js +319 -319
- package/lib/db.js +1288 -1288
- package/lib/deprecate.js +222 -222
- package/lib/dev.js +335 -335
- package/lib/dual-control.js +473 -473
- package/lib/error-page.js +420 -420
- package/lib/external-db-migrate.js +441 -441
- package/lib/external-db.js +1061 -1061
- package/lib/file-type.js +273 -273
- package/lib/forms.js +422 -422
- package/lib/framework-error.js +293 -293
- package/lib/framework-schema.js +717 -717
- package/lib/handlers.js +350 -350
- package/lib/http-client-cookie-jar.js +508 -508
- package/lib/http-client.js +1195 -1195
- package/lib/i18n.js +878 -878
- package/lib/jobs.js +185 -185
- package/lib/log-stream-cloudwatch.js +369 -369
- package/lib/log-stream-local.js +146 -146
- package/lib/log-stream-otlp-grpc.js +410 -410
- package/lib/log-stream-otlp.js +286 -286
- package/lib/log-stream-syslog.js +302 -302
- package/lib/log-stream-webhook.js +199 -199
- package/lib/log-stream.js +330 -330
- package/lib/log.js +500 -500
- package/lib/mail-bounce.js +528 -528
- package/lib/mail-dkim.js +369 -369
- package/lib/mail.js +981 -981
- package/lib/metrics.js +683 -683
- package/lib/middleware/api-encrypt.js +936 -936
- package/lib/middleware/attach-user.js +157 -157
- package/lib/middleware/bearer-auth.js +152 -0
- package/lib/middleware/body-parser.js +1170 -1170
- package/lib/middleware/bot-guard.js +178 -178
- package/lib/middleware/compression.js +452 -452
- package/lib/middleware/cors.js +314 -314
- package/lib/middleware/csp-nonce.js +348 -348
- package/lib/middleware/csrf-protect.js +399 -316
- package/lib/middleware/db-role-for.js +264 -264
- package/lib/middleware/fetch-metadata.js +129 -0
- package/lib/middleware/health.js +392 -392
- package/lib/middleware/index.js +85 -79
- package/lib/middleware/rate-limit.js +358 -358
- package/lib/middleware/request-id.js +61 -61
- package/lib/middleware/request-log.js +168 -168
- package/lib/middleware/require-auth.js +104 -104
- package/lib/middleware/security-headers.js +121 -116
- package/lib/middleware/sse.js +166 -166
- package/lib/migrations.js +383 -383
- package/lib/mtls-ca.js +518 -518
- package/lib/mtls-engine-default.js +481 -481
- package/lib/network-dns.js +632 -632
- package/lib/network-heartbeat.js +290 -290
- package/lib/network-nts.js +574 -574
- package/lib/network-proxy.js +265 -265
- package/lib/network-tls.js +328 -328
- package/lib/network.js +233 -233
- package/lib/notify.js +612 -612
- package/lib/ntp-check.js +229 -229
- package/lib/numeric-bounds.js +111 -111
- package/lib/object-store/azure-blob-bucket-ops.js +349 -349
- package/lib/object-store/azure-blob.js +488 -488
- package/lib/object-store/gcs-bucket-ops.js +351 -351
- package/lib/object-store/gcs.js +519 -519
- package/lib/object-store/http-put.js +153 -153
- package/lib/object-store/index.js +197 -197
- package/lib/object-store/sigv4-bucket-ops.js +1092 -1092
- package/lib/object-store/sigv4.js +903 -903
- package/lib/observability.js +151 -151
- package/lib/otel-export.js +269 -269
- package/lib/pagination.js +464 -464
- package/lib/parsers/index.js +80 -80
- package/lib/parsers/safe-env.js +642 -642
- package/lib/parsers/safe-ini.js +292 -292
- package/lib/parsers/safe-toml.js +784 -784
- package/lib/parsers/safe-xml.js +390 -390
- package/lib/parsers/safe-yaml.js +1015 -1015
- package/lib/permissions.js +708 -708
- package/lib/pqc-agent.js +87 -87
- package/lib/pqc-gate.js +279 -279
- package/lib/protobuf-encoder.js +190 -190
- package/lib/protocol-dispatcher.js +161 -161
- package/lib/pubsub-redis.js +167 -167
- package/lib/pubsub.js +429 -429
- package/lib/queue-local.js +476 -476
- package/lib/queue-redis.js +745 -745
- package/lib/queue-sqs.js +319 -319
- package/lib/queue.js +695 -695
- package/lib/redis-client.js +519 -519
- package/lib/request-helpers.js +340 -340
- package/lib/restore-bundle.js +237 -237
- package/lib/restore-rollback.js +259 -259
- package/lib/restore.js +409 -409
- package/lib/retry.js +376 -376
- package/lib/router.js +748 -748
- package/lib/safe-async.js +735 -735
- package/lib/safe-buffer.js +237 -237
- package/lib/safe-json.js +541 -541
- package/lib/safe-schema.js +1266 -1266
- package/lib/safe-url.js +159 -159
- package/lib/scheduler.js +706 -706
- package/lib/security-assert.js +373 -373
- package/lib/seeders.js +618 -618
- package/lib/session.js +535 -478
- package/lib/slug.js +269 -269
- package/lib/ssrf-guard.js +401 -401
- package/lib/static.js +7 -5
- package/lib/storage.js +471 -471
- package/lib/subject.js +281 -281
- package/lib/template.js +791 -791
- package/lib/testing.js +798 -798
- package/lib/time.js +310 -310
- package/lib/totp.js +302 -302
- package/lib/tracing.js +494 -494
- package/lib/uuid.js +132 -132
- package/lib/validate-opts.js +340 -340
- package/lib/vault/index.js +308 -308
- package/lib/vault/rotate.js +784 -784
- package/lib/vault/wrap.js +296 -296
- package/lib/vendor/noble-ciphers.cjs +9 -9
- package/lib/webhook.js +595 -595
- package/lib/websocket.js +1048 -1048
- package/package.json +77 -77
- package/sbom.cyclonedx.json +7 -7
package/lib/protobuf-encoder.js
CHANGED
|
@@ -1,190 +1,190 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* protobuf-encoder — minimal proto3 wire-format encoder.
|
|
4
|
-
*
|
|
5
|
-
* Write-only — there is no decoder. The framework emits OTLP gRPC log
|
|
6
|
-
* records (a fixed schema) and never reads protobuf back. A decoder
|
|
7
|
-
* would double the surface area + maintenance burden for no use case
|
|
8
|
-
* the framework owns end-to-end.
|
|
9
|
-
*
|
|
10
|
-
* Wire format reference:
|
|
11
|
-
* https://protobuf.dev/programming-guides/encoding/
|
|
12
|
-
*
|
|
13
|
-
* Wire types used:
|
|
14
|
-
* 0 varint — uint32 / uint64 / int32 / int64 / bool / enum
|
|
15
|
-
* 1 64-bit — fixed64 / sfixed64 / double
|
|
16
|
-
* 2 length-delimited — string / bytes / embedded message / packed repeated
|
|
17
|
-
* 5 32-bit — fixed32 / sfixed32 / float
|
|
18
|
-
*
|
|
19
|
-
* Each field on the wire:
|
|
20
|
-
* tag = (fieldNumber << 3) | wireType (encoded as varint)
|
|
21
|
-
* value (per wire type)
|
|
22
|
-
*
|
|
23
|
-
* Operators reach for this primitive when constructing a protobuf
|
|
24
|
-
* message body for an external service that accepts proto over HTTP
|
|
25
|
-
* (gRPC, AWS sigv4-protobuf, GCP protobuf APIs, etc.). All buffer
|
|
26
|
-
* concatenation is deferred — every encoder function returns a Buffer
|
|
27
|
-
* the caller can splice in any order.
|
|
28
|
-
*/
|
|
29
|
-
|
|
30
|
-
var C = require("./constants");
|
|
31
|
-
|
|
32
|
-
var WIRE_VARINT = 0;
|
|
33
|
-
var WIRE_64BIT = 1;
|
|
34
|
-
var WIRE_LDELIM = 2;
|
|
35
|
-
// Varint base — each byte carries 7 payload bits + 1 continuation bit.
|
|
36
|
-
var VARINT_BASE = 128;
|
|
37
|
-
// Wire-format byte counts for fixed-size fields.
|
|
38
|
-
var FIXED64_BYTES = C.BYTES.bytes(8);
|
|
39
|
-
// WIRE_32BIT (5) is unused — fixed32 / sfixed32 / float aren't on the
|
|
40
|
-
// OTel logs schema. Reserved here as documentation; un-comment + add
|
|
41
|
-
// helpers when a future caller (metrics histograms?) needs them.
|
|
42
|
-
// var WIRE_32BIT = 5;
|
|
43
|
-
|
|
44
|
-
function _writeVarint(value) {
|
|
45
|
-
// proto3 varints are unsigned for the integer types we use here;
|
|
46
|
-
// negative int32/int64 would need 10-byte two's-complement encoding,
|
|
47
|
-
// but OTel log severity numbers / unix nanos are all non-negative.
|
|
48
|
-
if (typeof value === "number") {
|
|
49
|
-
if (value < 0) {
|
|
50
|
-
throw new Error("protobuf-encoder: negative varint not supported (got " + value + ")");
|
|
51
|
-
}
|
|
52
|
-
if (!Number.isFinite(value)) {
|
|
53
|
-
throw new Error("protobuf-encoder: non-finite varint (got " + value + ")");
|
|
54
|
-
}
|
|
55
|
-
} else if (typeof value === "bigint") {
|
|
56
|
-
if (value < 0n) {
|
|
57
|
-
throw new Error("protobuf-encoder: negative varint not supported (got " + value + ")");
|
|
58
|
-
}
|
|
59
|
-
} else {
|
|
60
|
-
throw new Error("protobuf-encoder: varint must be number or bigint, got " + typeof value);
|
|
61
|
-
}
|
|
62
|
-
var bytes = [];
|
|
63
|
-
if (typeof value === "bigint") {
|
|
64
|
-
var v = value;
|
|
65
|
-
do {
|
|
66
|
-
var lower = Number(v & 0x7fn);
|
|
67
|
-
v = v >> 7n;
|
|
68
|
-
if (v !== 0n) lower |= 0x80;
|
|
69
|
-
bytes.push(lower);
|
|
70
|
-
} while (v !== 0n);
|
|
71
|
-
} else {
|
|
72
|
-
// Number path — JS numbers safely hold integers up to 2^53.
|
|
73
|
-
var n = value;
|
|
74
|
-
do {
|
|
75
|
-
var byte = n & 0x7f;
|
|
76
|
-
n = Math.floor(n / VARINT_BASE);
|
|
77
|
-
if (n > 0) byte |= 0x80;
|
|
78
|
-
bytes.push(byte);
|
|
79
|
-
} while (n > 0);
|
|
80
|
-
}
|
|
81
|
-
return Buffer.from(bytes);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
function _tag(fieldNumber, wireType) {
|
|
85
|
-
return _writeVarint((fieldNumber << 3) | wireType);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
function uint32(fieldNumber, value) {
|
|
89
|
-
if (value === 0) return Buffer.alloc(0); // proto3 default — skip
|
|
90
|
-
return Buffer.concat([_tag(fieldNumber, WIRE_VARINT), _writeVarint(value)]);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
function uint64(fieldNumber, value) {
|
|
94
|
-
if (value === 0 || value === 0n) return Buffer.alloc(0);
|
|
95
|
-
return Buffer.concat([_tag(fieldNumber, WIRE_VARINT), _writeVarint(value)]);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
function bool(fieldNumber, value) {
|
|
99
|
-
if (!value) return Buffer.alloc(0); // proto3 default
|
|
100
|
-
return Buffer.concat([_tag(fieldNumber, WIRE_VARINT), Buffer.from([1])]);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
function fixed64(fieldNumber, value) {
|
|
104
|
-
// For OTel: time_unix_nano fields are fixed64. Accept BigInt or
|
|
105
|
-
// Number; encode as little-endian 8 bytes.
|
|
106
|
-
var buf = Buffer.alloc(FIXED64_BYTES);
|
|
107
|
-
if (typeof value === "bigint") {
|
|
108
|
-
buf.writeBigUInt64LE(value, 0);
|
|
109
|
-
} else {
|
|
110
|
-
if (value < 0 || !Number.isFinite(value)) {
|
|
111
|
-
throw new Error("protobuf-encoder: fixed64 must be non-negative finite (got " + value + ")");
|
|
112
|
-
}
|
|
113
|
-
// Number path — split into low/high 32-bit halves.
|
|
114
|
-
var low = value % 0x100000000;
|
|
115
|
-
var high = Math.floor(value / 0x100000000);
|
|
116
|
-
buf.writeUInt32LE(low, 0);
|
|
117
|
-
buf.writeUInt32LE(high, 4);
|
|
118
|
-
}
|
|
119
|
-
return Buffer.concat([_tag(fieldNumber, WIRE_64BIT), buf]);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
function double(fieldNumber, value) {
|
|
123
|
-
if (value === 0) return Buffer.alloc(0); // proto3 default
|
|
124
|
-
var buf = Buffer.alloc(FIXED64_BYTES);
|
|
125
|
-
buf.writeDoubleLE(value, 0);
|
|
126
|
-
return Buffer.concat([_tag(fieldNumber, WIRE_64BIT), buf]);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
function string(fieldNumber, value) {
|
|
130
|
-
if (value === "" || value == null) return Buffer.alloc(0);
|
|
131
|
-
var bodyBuf = Buffer.from(String(value), "utf8");
|
|
132
|
-
return Buffer.concat([
|
|
133
|
-
_tag(fieldNumber, WIRE_LDELIM),
|
|
134
|
-
_writeVarint(bodyBuf.length),
|
|
135
|
-
bodyBuf,
|
|
136
|
-
]);
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
function bytes(fieldNumber, value) {
|
|
140
|
-
if (!value || value.length === 0) return Buffer.alloc(0);
|
|
141
|
-
var buf = Buffer.isBuffer(value) ? value : Buffer.from(value);
|
|
142
|
-
return Buffer.concat([
|
|
143
|
-
_tag(fieldNumber, WIRE_LDELIM),
|
|
144
|
-
_writeVarint(buf.length),
|
|
145
|
-
buf,
|
|
146
|
-
]);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
function embeddedMessage(fieldNumber, bodyBuf) {
|
|
150
|
-
// bodyBuf is the already-encoded inner message body (a Buffer).
|
|
151
|
-
// Caller can pass an empty buffer to encode an empty message;
|
|
152
|
-
// proto3 default-skips messages whose every field is at default,
|
|
153
|
-
// but we allow the caller to choose: we always emit the tag +
|
|
154
|
-
// length-delimited body, which lets the operator force-include an
|
|
155
|
-
// empty Resource{} when needed.
|
|
156
|
-
return Buffer.concat([
|
|
157
|
-
_tag(fieldNumber, WIRE_LDELIM),
|
|
158
|
-
_writeVarint(bodyBuf.length),
|
|
159
|
-
bodyBuf,
|
|
160
|
-
]);
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// Repeated unpacked: each entry encoded with its own tag+value. This
|
|
164
|
-
// is the proto3 default for non-scalar repeated fields (messages,
|
|
165
|
-
// strings) — packed encoding only applies to scalar varint/fixed
|
|
166
|
-
// types. The caller passes an array and per-entry encoder.
|
|
167
|
-
function repeatedMessage(fieldNumber, items, perItemBodyEncoder) {
|
|
168
|
-
if (!items || items.length === 0) return Buffer.alloc(0);
|
|
169
|
-
var pieces = new Array(items.length);
|
|
170
|
-
for (var i = 0; i < items.length; i++) {
|
|
171
|
-
var inner = perItemBodyEncoder(items[i]);
|
|
172
|
-
pieces[i] = embeddedMessage(fieldNumber, inner);
|
|
173
|
-
}
|
|
174
|
-
return Buffer.concat(pieces);
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
module.exports = {
|
|
178
|
-
uint32: uint32,
|
|
179
|
-
uint64: uint64,
|
|
180
|
-
bool: bool,
|
|
181
|
-
fixed64: fixed64,
|
|
182
|
-
double: double,
|
|
183
|
-
string: string,
|
|
184
|
-
bytes: bytes,
|
|
185
|
-
embeddedMessage: embeddedMessage,
|
|
186
|
-
repeatedMessage: repeatedMessage,
|
|
187
|
-
// Exposed for tests — verify varint encoding directly.
|
|
188
|
-
_writeVarint: _writeVarint,
|
|
189
|
-
_tag: _tag,
|
|
190
|
-
};
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* protobuf-encoder — minimal proto3 wire-format encoder.
|
|
4
|
+
*
|
|
5
|
+
* Write-only — there is no decoder. The framework emits OTLP gRPC log
|
|
6
|
+
* records (a fixed schema) and never reads protobuf back. A decoder
|
|
7
|
+
* would double the surface area + maintenance burden for no use case
|
|
8
|
+
* the framework owns end-to-end.
|
|
9
|
+
*
|
|
10
|
+
* Wire format reference:
|
|
11
|
+
* https://protobuf.dev/programming-guides/encoding/
|
|
12
|
+
*
|
|
13
|
+
* Wire types used:
|
|
14
|
+
* 0 varint — uint32 / uint64 / int32 / int64 / bool / enum
|
|
15
|
+
* 1 64-bit — fixed64 / sfixed64 / double
|
|
16
|
+
* 2 length-delimited — string / bytes / embedded message / packed repeated
|
|
17
|
+
* 5 32-bit — fixed32 / sfixed32 / float
|
|
18
|
+
*
|
|
19
|
+
* Each field on the wire:
|
|
20
|
+
* tag = (fieldNumber << 3) | wireType (encoded as varint)
|
|
21
|
+
* value (per wire type)
|
|
22
|
+
*
|
|
23
|
+
* Operators reach for this primitive when constructing a protobuf
|
|
24
|
+
* message body for an external service that accepts proto over HTTP
|
|
25
|
+
* (gRPC, AWS sigv4-protobuf, GCP protobuf APIs, etc.). All buffer
|
|
26
|
+
* concatenation is deferred — every encoder function returns a Buffer
|
|
27
|
+
* the caller can splice in any order.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
var C = require("./constants");
|
|
31
|
+
|
|
32
|
+
var WIRE_VARINT = 0;
|
|
33
|
+
var WIRE_64BIT = 1;
|
|
34
|
+
var WIRE_LDELIM = 2;
|
|
35
|
+
// Varint base — each byte carries 7 payload bits + 1 continuation bit.
|
|
36
|
+
var VARINT_BASE = 128;
|
|
37
|
+
// Wire-format byte counts for fixed-size fields.
|
|
38
|
+
var FIXED64_BYTES = C.BYTES.bytes(8);
|
|
39
|
+
// WIRE_32BIT (5) is unused — fixed32 / sfixed32 / float aren't on the
|
|
40
|
+
// OTel logs schema. Reserved here as documentation; un-comment + add
|
|
41
|
+
// helpers when a future caller (metrics histograms?) needs them.
|
|
42
|
+
// var WIRE_32BIT = 5;
|
|
43
|
+
|
|
44
|
+
function _writeVarint(value) {
|
|
45
|
+
// proto3 varints are unsigned for the integer types we use here;
|
|
46
|
+
// negative int32/int64 would need 10-byte two's-complement encoding,
|
|
47
|
+
// but OTel log severity numbers / unix nanos are all non-negative.
|
|
48
|
+
if (typeof value === "number") {
|
|
49
|
+
if (value < 0) {
|
|
50
|
+
throw new Error("protobuf-encoder: negative varint not supported (got " + value + ")");
|
|
51
|
+
}
|
|
52
|
+
if (!Number.isFinite(value)) {
|
|
53
|
+
throw new Error("protobuf-encoder: non-finite varint (got " + value + ")");
|
|
54
|
+
}
|
|
55
|
+
} else if (typeof value === "bigint") {
|
|
56
|
+
if (value < 0n) {
|
|
57
|
+
throw new Error("protobuf-encoder: negative varint not supported (got " + value + ")");
|
|
58
|
+
}
|
|
59
|
+
} else {
|
|
60
|
+
throw new Error("protobuf-encoder: varint must be number or bigint, got " + typeof value);
|
|
61
|
+
}
|
|
62
|
+
var bytes = [];
|
|
63
|
+
if (typeof value === "bigint") {
|
|
64
|
+
var v = value;
|
|
65
|
+
do {
|
|
66
|
+
var lower = Number(v & 0x7fn);
|
|
67
|
+
v = v >> 7n;
|
|
68
|
+
if (v !== 0n) lower |= 0x80;
|
|
69
|
+
bytes.push(lower);
|
|
70
|
+
} while (v !== 0n);
|
|
71
|
+
} else {
|
|
72
|
+
// Number path — JS numbers safely hold integers up to 2^53.
|
|
73
|
+
var n = value;
|
|
74
|
+
do {
|
|
75
|
+
var byte = n & 0x7f;
|
|
76
|
+
n = Math.floor(n / VARINT_BASE);
|
|
77
|
+
if (n > 0) byte |= 0x80;
|
|
78
|
+
bytes.push(byte);
|
|
79
|
+
} while (n > 0);
|
|
80
|
+
}
|
|
81
|
+
return Buffer.from(bytes);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function _tag(fieldNumber, wireType) {
|
|
85
|
+
return _writeVarint((fieldNumber << 3) | wireType);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function uint32(fieldNumber, value) {
|
|
89
|
+
if (value === 0) return Buffer.alloc(0); // proto3 default — skip
|
|
90
|
+
return Buffer.concat([_tag(fieldNumber, WIRE_VARINT), _writeVarint(value)]);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function uint64(fieldNumber, value) {
|
|
94
|
+
if (value === 0 || value === 0n) return Buffer.alloc(0);
|
|
95
|
+
return Buffer.concat([_tag(fieldNumber, WIRE_VARINT), _writeVarint(value)]);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function bool(fieldNumber, value) {
|
|
99
|
+
if (!value) return Buffer.alloc(0); // proto3 default
|
|
100
|
+
return Buffer.concat([_tag(fieldNumber, WIRE_VARINT), Buffer.from([1])]);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function fixed64(fieldNumber, value) {
|
|
104
|
+
// For OTel: time_unix_nano fields are fixed64. Accept BigInt or
|
|
105
|
+
// Number; encode as little-endian 8 bytes.
|
|
106
|
+
var buf = Buffer.alloc(FIXED64_BYTES);
|
|
107
|
+
if (typeof value === "bigint") {
|
|
108
|
+
buf.writeBigUInt64LE(value, 0);
|
|
109
|
+
} else {
|
|
110
|
+
if (value < 0 || !Number.isFinite(value)) {
|
|
111
|
+
throw new Error("protobuf-encoder: fixed64 must be non-negative finite (got " + value + ")");
|
|
112
|
+
}
|
|
113
|
+
// Number path — split into low/high 32-bit halves.
|
|
114
|
+
var low = value % 0x100000000;
|
|
115
|
+
var high = Math.floor(value / 0x100000000);
|
|
116
|
+
buf.writeUInt32LE(low, 0);
|
|
117
|
+
buf.writeUInt32LE(high, 4);
|
|
118
|
+
}
|
|
119
|
+
return Buffer.concat([_tag(fieldNumber, WIRE_64BIT), buf]);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function double(fieldNumber, value) {
|
|
123
|
+
if (value === 0) return Buffer.alloc(0); // proto3 default
|
|
124
|
+
var buf = Buffer.alloc(FIXED64_BYTES);
|
|
125
|
+
buf.writeDoubleLE(value, 0);
|
|
126
|
+
return Buffer.concat([_tag(fieldNumber, WIRE_64BIT), buf]);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function string(fieldNumber, value) {
|
|
130
|
+
if (value === "" || value == null) return Buffer.alloc(0);
|
|
131
|
+
var bodyBuf = Buffer.from(String(value), "utf8");
|
|
132
|
+
return Buffer.concat([
|
|
133
|
+
_tag(fieldNumber, WIRE_LDELIM),
|
|
134
|
+
_writeVarint(bodyBuf.length),
|
|
135
|
+
bodyBuf,
|
|
136
|
+
]);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function bytes(fieldNumber, value) {
|
|
140
|
+
if (!value || value.length === 0) return Buffer.alloc(0);
|
|
141
|
+
var buf = Buffer.isBuffer(value) ? value : Buffer.from(value);
|
|
142
|
+
return Buffer.concat([
|
|
143
|
+
_tag(fieldNumber, WIRE_LDELIM),
|
|
144
|
+
_writeVarint(buf.length),
|
|
145
|
+
buf,
|
|
146
|
+
]);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function embeddedMessage(fieldNumber, bodyBuf) {
|
|
150
|
+
// bodyBuf is the already-encoded inner message body (a Buffer).
|
|
151
|
+
// Caller can pass an empty buffer to encode an empty message;
|
|
152
|
+
// proto3 default-skips messages whose every field is at default,
|
|
153
|
+
// but we allow the caller to choose: we always emit the tag +
|
|
154
|
+
// length-delimited body, which lets the operator force-include an
|
|
155
|
+
// empty Resource{} when needed.
|
|
156
|
+
return Buffer.concat([
|
|
157
|
+
_tag(fieldNumber, WIRE_LDELIM),
|
|
158
|
+
_writeVarint(bodyBuf.length),
|
|
159
|
+
bodyBuf,
|
|
160
|
+
]);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Repeated unpacked: each entry encoded with its own tag+value. This
|
|
164
|
+
// is the proto3 default for non-scalar repeated fields (messages,
|
|
165
|
+
// strings) — packed encoding only applies to scalar varint/fixed
|
|
166
|
+
// types. The caller passes an array and per-entry encoder.
|
|
167
|
+
function repeatedMessage(fieldNumber, items, perItemBodyEncoder) {
|
|
168
|
+
if (!items || items.length === 0) return Buffer.alloc(0);
|
|
169
|
+
var pieces = new Array(items.length);
|
|
170
|
+
for (var i = 0; i < items.length; i++) {
|
|
171
|
+
var inner = perItemBodyEncoder(items[i]);
|
|
172
|
+
pieces[i] = embeddedMessage(fieldNumber, inner);
|
|
173
|
+
}
|
|
174
|
+
return Buffer.concat(pieces);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
module.exports = {
|
|
178
|
+
uint32: uint32,
|
|
179
|
+
uint64: uint64,
|
|
180
|
+
bool: bool,
|
|
181
|
+
fixed64: fixed64,
|
|
182
|
+
double: double,
|
|
183
|
+
string: string,
|
|
184
|
+
bytes: bytes,
|
|
185
|
+
embeddedMessage: embeddedMessage,
|
|
186
|
+
repeatedMessage: repeatedMessage,
|
|
187
|
+
// Exposed for tests — verify varint encoding directly.
|
|
188
|
+
_writeVarint: _writeVarint,
|
|
189
|
+
_tag: _tag,
|
|
190
|
+
};
|