You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
4.3 KiB
127 lines
4.3 KiB
1 month ago
|
"use strict";
|
||
|
// Copyright 2021-2024 Buf Technologies, Inc.
|
||
|
//
|
||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
// you may not use this file except in compliance with the License.
|
||
|
// You may obtain a copy of the License at
|
||
|
//
|
||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||
|
//
|
||
|
// Unless required by applicable law or agreed to in writing, software
|
||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
// See the License for the specific language governing permissions and
|
||
|
// limitations under the License.
|
||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
exports.protoInt64 = void 0;
|
||
|
const varint_js_1 = require("./wire/varint.js");
|
||
|
/**
|
||
|
* Int64Support for the current environment.
|
||
|
*/
|
||
|
exports.protoInt64 = makeInt64Support();
|
||
|
function makeInt64Support() {
|
||
|
const dv = new DataView(new ArrayBuffer(8));
|
||
|
// note that Safari 14 implements BigInt, but not the DataView methods
|
||
|
const ok = typeof BigInt === "function" &&
|
||
|
typeof dv.getBigInt64 === "function" &&
|
||
|
typeof dv.getBigUint64 === "function" &&
|
||
|
typeof dv.setBigInt64 === "function" &&
|
||
|
typeof dv.setBigUint64 === "function" &&
|
||
|
(typeof process != "object" ||
|
||
|
typeof process.env != "object" ||
|
||
|
process.env.BUF_BIGINT_DISABLE !== "1");
|
||
|
if (ok) {
|
||
|
const MIN = BigInt("-9223372036854775808"), MAX = BigInt("9223372036854775807"), UMIN = BigInt("0"), UMAX = BigInt("18446744073709551615");
|
||
|
return {
|
||
|
zero: BigInt(0),
|
||
|
supported: true,
|
||
|
parse(value) {
|
||
|
const bi = typeof value == "bigint" ? value : BigInt(value);
|
||
|
if (bi > MAX || bi < MIN) {
|
||
|
throw new Error(`invalid int64: ${value}`);
|
||
|
}
|
||
|
return bi;
|
||
|
},
|
||
|
uParse(value) {
|
||
|
const bi = typeof value == "bigint" ? value : BigInt(value);
|
||
|
if (bi > UMAX || bi < UMIN) {
|
||
|
throw new Error(`invalid uint64: ${value}`);
|
||
|
}
|
||
|
return bi;
|
||
|
},
|
||
|
enc(value) {
|
||
|
dv.setBigInt64(0, this.parse(value), true);
|
||
|
return {
|
||
|
lo: dv.getInt32(0, true),
|
||
|
hi: dv.getInt32(4, true),
|
||
|
};
|
||
|
},
|
||
|
uEnc(value) {
|
||
|
dv.setBigInt64(0, this.uParse(value), true);
|
||
|
return {
|
||
|
lo: dv.getInt32(0, true),
|
||
|
hi: dv.getInt32(4, true),
|
||
|
};
|
||
|
},
|
||
|
dec(lo, hi) {
|
||
|
dv.setInt32(0, lo, true);
|
||
|
dv.setInt32(4, hi, true);
|
||
|
return dv.getBigInt64(0, true);
|
||
|
},
|
||
|
uDec(lo, hi) {
|
||
|
dv.setInt32(0, lo, true);
|
||
|
dv.setInt32(4, hi, true);
|
||
|
return dv.getBigUint64(0, true);
|
||
|
},
|
||
|
};
|
||
|
}
|
||
|
return {
|
||
|
zero: "0",
|
||
|
supported: false,
|
||
|
parse(value) {
|
||
|
if (typeof value != "string") {
|
||
|
value = value.toString();
|
||
|
}
|
||
|
assertInt64String(value);
|
||
|
return value;
|
||
|
},
|
||
|
uParse(value) {
|
||
|
if (typeof value != "string") {
|
||
|
value = value.toString();
|
||
|
}
|
||
|
assertUInt64String(value);
|
||
|
return value;
|
||
|
},
|
||
|
enc(value) {
|
||
|
if (typeof value != "string") {
|
||
|
value = value.toString();
|
||
|
}
|
||
|
assertInt64String(value);
|
||
|
return (0, varint_js_1.int64FromString)(value);
|
||
|
},
|
||
|
uEnc(value) {
|
||
|
if (typeof value != "string") {
|
||
|
value = value.toString();
|
||
|
}
|
||
|
assertUInt64String(value);
|
||
|
return (0, varint_js_1.int64FromString)(value);
|
||
|
},
|
||
|
dec(lo, hi) {
|
||
|
return (0, varint_js_1.int64ToString)(lo, hi);
|
||
|
},
|
||
|
uDec(lo, hi) {
|
||
|
return (0, varint_js_1.uInt64ToString)(lo, hi);
|
||
|
},
|
||
|
};
|
||
|
}
|
||
|
function assertInt64String(value) {
|
||
|
if (!/^-?[0-9]+$/.test(value)) {
|
||
|
throw new Error("invalid int64: " + value);
|
||
|
}
|
||
|
}
|
||
|
function assertUInt64String(value) {
|
||
|
if (!/^[0-9]+$/.test(value)) {
|
||
|
throw new Error("invalid uint64: " + value);
|
||
|
}
|
||
|
}
|