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.
124 lines
4.2 KiB
124 lines
4.2 KiB
// 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.
|
|
import { int64FromString, int64ToString, uInt64ToString, } from "./wire/varint.js";
|
|
/**
|
|
* Int64Support for the current environment.
|
|
*/
|
|
export const protoInt64 = /*@__PURE__*/ 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 int64FromString(value);
|
|
},
|
|
uEnc(value) {
|
|
if (typeof value != "string") {
|
|
value = value.toString();
|
|
}
|
|
assertUInt64String(value);
|
|
return int64FromString(value);
|
|
},
|
|
dec(lo, hi) {
|
|
return int64ToString(lo, hi);
|
|
},
|
|
uDec(lo, hi) {
|
|
return 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);
|
|
}
|
|
}
|