UNPKG

@remnawave/xtls-sdk

Version:

A Typescript SDK for XRAY (XTLS) Core GRPC Api

903 lines (902 loc) 33.3 kB
"use strict"; // Code generated by protoc-gen-ts_proto. DO NOT EDIT. // versions: // protoc-gen-ts_proto v2.11.2 // protoc v6.33.4 // source: proxy/freedom/config.proto Object.defineProperty(exports, "__esModule", { value: true }); exports.Config = exports.FinalRuleConfig = exports.Range = exports.Noise = exports.Fragment = exports.DestinationOverride = exports.RuleAction = exports.protobufPackage = void 0; exports.ruleActionFromJSON = ruleActionFromJSON; exports.ruleActionToJSON = ruleActionToJSON; /* eslint-disable */ const wire_1 = require("@bufbuild/protobuf/wire"); const geodat_1 = require("../../common/geodata/geodat"); const network_1 = require("../../common/net/network"); const port_1 = require("../../common/net/port"); const server_spec_1 = require("../../common/protocol/server_spec"); const config_1 = require("../../transport/internet/config"); const typeRegistry_1 = require("../../typeRegistry"); exports.protobufPackage = "xray.proxy.freedom"; var RuleAction; (function (RuleAction) { RuleAction[RuleAction["Allow"] = 0] = "Allow"; RuleAction[RuleAction["Block"] = 1] = "Block"; RuleAction[RuleAction["UNRECOGNIZED"] = -1] = "UNRECOGNIZED"; })(RuleAction || (exports.RuleAction = RuleAction = {})); function ruleActionFromJSON(object) { switch (object) { case 0: case "Allow": return RuleAction.Allow; case 1: case "Block": return RuleAction.Block; case -1: case "UNRECOGNIZED": default: return RuleAction.UNRECOGNIZED; } } function ruleActionToJSON(object) { switch (object) { case RuleAction.Allow: return "Allow"; case RuleAction.Block: return "Block"; case RuleAction.UNRECOGNIZED: default: return "UNRECOGNIZED"; } } function createBaseDestinationOverride() { return { $type: "xray.proxy.freedom.DestinationOverride", server: undefined }; } exports.DestinationOverride = { $type: "xray.proxy.freedom.DestinationOverride", encode(message, writer = new wire_1.BinaryWriter()) { if (message.server !== undefined) { server_spec_1.ServerEndpoint.encode(message.server, writer.uint32(10).fork()).join(); } return writer; }, decode(input, length) { const reader = input instanceof wire_1.BinaryReader ? input : new wire_1.BinaryReader(input); const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseDestinationOverride(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: { if (tag !== 10) { break; } message.server = server_spec_1.ServerEndpoint.decode(reader, reader.uint32()); continue; } } if ((tag & 7) === 4 || tag === 0) { break; } reader.skip(tag & 7); } return message; }, fromJSON(object) { return { $type: exports.DestinationOverride.$type, server: isSet(object.server) ? server_spec_1.ServerEndpoint.fromJSON(object.server) : undefined, }; }, toJSON(message) { const obj = {}; if (message.server !== undefined) { obj.server = server_spec_1.ServerEndpoint.toJSON(message.server); } return obj; }, create(base) { return exports.DestinationOverride.fromPartial(base ?? {}); }, fromPartial(object) { const message = createBaseDestinationOverride(); message.server = (object.server !== undefined && object.server !== null) ? server_spec_1.ServerEndpoint.fromPartial(object.server) : undefined; return message; }, }; typeRegistry_1.messageTypeRegistry.set(exports.DestinationOverride.$type, exports.DestinationOverride); function createBaseFragment() { return { $type: "xray.proxy.freedom.Fragment", packetsFrom: 0, packetsTo: 0, lengthMin: 0, lengthMax: 0, intervalMin: 0, intervalMax: 0, maxSplitMin: 0, maxSplitMax: 0, }; } exports.Fragment = { $type: "xray.proxy.freedom.Fragment", encode(message, writer = new wire_1.BinaryWriter()) { if (message.packetsFrom !== 0) { writer.uint32(8).uint64(message.packetsFrom); } if (message.packetsTo !== 0) { writer.uint32(16).uint64(message.packetsTo); } if (message.lengthMin !== 0) { writer.uint32(24).uint64(message.lengthMin); } if (message.lengthMax !== 0) { writer.uint32(32).uint64(message.lengthMax); } if (message.intervalMin !== 0) { writer.uint32(40).uint64(message.intervalMin); } if (message.intervalMax !== 0) { writer.uint32(48).uint64(message.intervalMax); } if (message.maxSplitMin !== 0) { writer.uint32(56).uint64(message.maxSplitMin); } if (message.maxSplitMax !== 0) { writer.uint32(64).uint64(message.maxSplitMax); } return writer; }, decode(input, length) { const reader = input instanceof wire_1.BinaryReader ? input : new wire_1.BinaryReader(input); const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseFragment(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: { if (tag !== 8) { break; } message.packetsFrom = longToNumber(reader.uint64()); continue; } case 2: { if (tag !== 16) { break; } message.packetsTo = longToNumber(reader.uint64()); continue; } case 3: { if (tag !== 24) { break; } message.lengthMin = longToNumber(reader.uint64()); continue; } case 4: { if (tag !== 32) { break; } message.lengthMax = longToNumber(reader.uint64()); continue; } case 5: { if (tag !== 40) { break; } message.intervalMin = longToNumber(reader.uint64()); continue; } case 6: { if (tag !== 48) { break; } message.intervalMax = longToNumber(reader.uint64()); continue; } case 7: { if (tag !== 56) { break; } message.maxSplitMin = longToNumber(reader.uint64()); continue; } case 8: { if (tag !== 64) { break; } message.maxSplitMax = longToNumber(reader.uint64()); continue; } } if ((tag & 7) === 4 || tag === 0) { break; } reader.skip(tag & 7); } return message; }, fromJSON(object) { return { $type: exports.Fragment.$type, packetsFrom: isSet(object.packetsFrom) ? globalThis.Number(object.packetsFrom) : isSet(object.packets_from) ? globalThis.Number(object.packets_from) : 0, packetsTo: isSet(object.packetsTo) ? globalThis.Number(object.packetsTo) : isSet(object.packets_to) ? globalThis.Number(object.packets_to) : 0, lengthMin: isSet(object.lengthMin) ? globalThis.Number(object.lengthMin) : isSet(object.length_min) ? globalThis.Number(object.length_min) : 0, lengthMax: isSet(object.lengthMax) ? globalThis.Number(object.lengthMax) : isSet(object.length_max) ? globalThis.Number(object.length_max) : 0, intervalMin: isSet(object.intervalMin) ? globalThis.Number(object.intervalMin) : isSet(object.interval_min) ? globalThis.Number(object.interval_min) : 0, intervalMax: isSet(object.intervalMax) ? globalThis.Number(object.intervalMax) : isSet(object.interval_max) ? globalThis.Number(object.interval_max) : 0, maxSplitMin: isSet(object.maxSplitMin) ? globalThis.Number(object.maxSplitMin) : isSet(object.max_split_min) ? globalThis.Number(object.max_split_min) : 0, maxSplitMax: isSet(object.maxSplitMax) ? globalThis.Number(object.maxSplitMax) : isSet(object.max_split_max) ? globalThis.Number(object.max_split_max) : 0, }; }, toJSON(message) { const obj = {}; if (message.packetsFrom !== 0) { obj.packetsFrom = Math.round(message.packetsFrom); } if (message.packetsTo !== 0) { obj.packetsTo = Math.round(message.packetsTo); } if (message.lengthMin !== 0) { obj.lengthMin = Math.round(message.lengthMin); } if (message.lengthMax !== 0) { obj.lengthMax = Math.round(message.lengthMax); } if (message.intervalMin !== 0) { obj.intervalMin = Math.round(message.intervalMin); } if (message.intervalMax !== 0) { obj.intervalMax = Math.round(message.intervalMax); } if (message.maxSplitMin !== 0) { obj.maxSplitMin = Math.round(message.maxSplitMin); } if (message.maxSplitMax !== 0) { obj.maxSplitMax = Math.round(message.maxSplitMax); } return obj; }, create(base) { return exports.Fragment.fromPartial(base ?? {}); }, fromPartial(object) { const message = createBaseFragment(); message.packetsFrom = object.packetsFrom ?? 0; message.packetsTo = object.packetsTo ?? 0; message.lengthMin = object.lengthMin ?? 0; message.lengthMax = object.lengthMax ?? 0; message.intervalMin = object.intervalMin ?? 0; message.intervalMax = object.intervalMax ?? 0; message.maxSplitMin = object.maxSplitMin ?? 0; message.maxSplitMax = object.maxSplitMax ?? 0; return message; }, }; typeRegistry_1.messageTypeRegistry.set(exports.Fragment.$type, exports.Fragment); function createBaseNoise() { return { $type: "xray.proxy.freedom.Noise", lengthMin: 0, lengthMax: 0, delayMin: 0, delayMax: 0, packet: new Uint8Array(0), applyTo: "", }; } exports.Noise = { $type: "xray.proxy.freedom.Noise", encode(message, writer = new wire_1.BinaryWriter()) { if (message.lengthMin !== 0) { writer.uint32(8).uint64(message.lengthMin); } if (message.lengthMax !== 0) { writer.uint32(16).uint64(message.lengthMax); } if (message.delayMin !== 0) { writer.uint32(24).uint64(message.delayMin); } if (message.delayMax !== 0) { writer.uint32(32).uint64(message.delayMax); } if (message.packet.length !== 0) { writer.uint32(42).bytes(message.packet); } if (message.applyTo !== "") { writer.uint32(50).string(message.applyTo); } return writer; }, decode(input, length) { const reader = input instanceof wire_1.BinaryReader ? input : new wire_1.BinaryReader(input); const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseNoise(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: { if (tag !== 8) { break; } message.lengthMin = longToNumber(reader.uint64()); continue; } case 2: { if (tag !== 16) { break; } message.lengthMax = longToNumber(reader.uint64()); continue; } case 3: { if (tag !== 24) { break; } message.delayMin = longToNumber(reader.uint64()); continue; } case 4: { if (tag !== 32) { break; } message.delayMax = longToNumber(reader.uint64()); continue; } case 5: { if (tag !== 42) { break; } message.packet = reader.bytes(); continue; } case 6: { if (tag !== 50) { break; } message.applyTo = reader.string(); continue; } } if ((tag & 7) === 4 || tag === 0) { break; } reader.skip(tag & 7); } return message; }, fromJSON(object) { return { $type: exports.Noise.$type, lengthMin: isSet(object.lengthMin) ? globalThis.Number(object.lengthMin) : isSet(object.length_min) ? globalThis.Number(object.length_min) : 0, lengthMax: isSet(object.lengthMax) ? globalThis.Number(object.lengthMax) : isSet(object.length_max) ? globalThis.Number(object.length_max) : 0, delayMin: isSet(object.delayMin) ? globalThis.Number(object.delayMin) : isSet(object.delay_min) ? globalThis.Number(object.delay_min) : 0, delayMax: isSet(object.delayMax) ? globalThis.Number(object.delayMax) : isSet(object.delay_max) ? globalThis.Number(object.delay_max) : 0, packet: isSet(object.packet) ? bytesFromBase64(object.packet) : new Uint8Array(0), applyTo: isSet(object.applyTo) ? globalThis.String(object.applyTo) : isSet(object.apply_to) ? globalThis.String(object.apply_to) : "", }; }, toJSON(message) { const obj = {}; if (message.lengthMin !== 0) { obj.lengthMin = Math.round(message.lengthMin); } if (message.lengthMax !== 0) { obj.lengthMax = Math.round(message.lengthMax); } if (message.delayMin !== 0) { obj.delayMin = Math.round(message.delayMin); } if (message.delayMax !== 0) { obj.delayMax = Math.round(message.delayMax); } if (message.packet.length !== 0) { obj.packet = base64FromBytes(message.packet); } if (message.applyTo !== "") { obj.applyTo = message.applyTo; } return obj; }, create(base) { return exports.Noise.fromPartial(base ?? {}); }, fromPartial(object) { const message = createBaseNoise(); message.lengthMin = object.lengthMin ?? 0; message.lengthMax = object.lengthMax ?? 0; message.delayMin = object.delayMin ?? 0; message.delayMax = object.delayMax ?? 0; message.packet = object.packet ?? new Uint8Array(0); message.applyTo = object.applyTo ?? ""; return message; }, }; typeRegistry_1.messageTypeRegistry.set(exports.Noise.$type, exports.Noise); function createBaseRange() { return { $type: "xray.proxy.freedom.Range", min: 0, max: 0 }; } exports.Range = { $type: "xray.proxy.freedom.Range", encode(message, writer = new wire_1.BinaryWriter()) { if (message.min !== 0) { writer.uint32(8).uint64(message.min); } if (message.max !== 0) { writer.uint32(16).uint64(message.max); } return writer; }, decode(input, length) { const reader = input instanceof wire_1.BinaryReader ? input : new wire_1.BinaryReader(input); const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseRange(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: { if (tag !== 8) { break; } message.min = longToNumber(reader.uint64()); continue; } case 2: { if (tag !== 16) { break; } message.max = longToNumber(reader.uint64()); continue; } } if ((tag & 7) === 4 || tag === 0) { break; } reader.skip(tag & 7); } return message; }, fromJSON(object) { return { $type: exports.Range.$type, min: isSet(object.min) ? globalThis.Number(object.min) : 0, max: isSet(object.max) ? globalThis.Number(object.max) : 0, }; }, toJSON(message) { const obj = {}; if (message.min !== 0) { obj.min = Math.round(message.min); } if (message.max !== 0) { obj.max = Math.round(message.max); } return obj; }, create(base) { return exports.Range.fromPartial(base ?? {}); }, fromPartial(object) { const message = createBaseRange(); message.min = object.min ?? 0; message.max = object.max ?? 0; return message; }, }; typeRegistry_1.messageTypeRegistry.set(exports.Range.$type, exports.Range); function createBaseFinalRuleConfig() { return { $type: "xray.proxy.freedom.FinalRuleConfig", action: 0, networks: [], portList: undefined, ip: [], blockDelay: undefined, }; } exports.FinalRuleConfig = { $type: "xray.proxy.freedom.FinalRuleConfig", encode(message, writer = new wire_1.BinaryWriter()) { if (message.action !== 0) { writer.uint32(8).int32(message.action); } writer.uint32(18).fork(); for (const v of message.networks) { writer.int32(v); } writer.join(); if (message.portList !== undefined) { port_1.PortList.encode(message.portList, writer.uint32(26).fork()).join(); } for (const v of message.ip) { geodat_1.IPRule.encode(v, writer.uint32(34).fork()).join(); } if (message.blockDelay !== undefined) { exports.Range.encode(message.blockDelay, writer.uint32(42).fork()).join(); } return writer; }, decode(input, length) { const reader = input instanceof wire_1.BinaryReader ? input : new wire_1.BinaryReader(input); const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseFinalRuleConfig(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: { if (tag !== 8) { break; } message.action = reader.int32(); continue; } case 2: { if (tag === 16) { message.networks.push(reader.int32()); continue; } if (tag === 18) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.networks.push(reader.int32()); } continue; } break; } case 3: { if (tag !== 26) { break; } message.portList = port_1.PortList.decode(reader, reader.uint32()); continue; } case 4: { if (tag !== 34) { break; } message.ip.push(geodat_1.IPRule.decode(reader, reader.uint32())); continue; } case 5: { if (tag !== 42) { break; } message.blockDelay = exports.Range.decode(reader, reader.uint32()); continue; } } if ((tag & 7) === 4 || tag === 0) { break; } reader.skip(tag & 7); } return message; }, fromJSON(object) { return { $type: exports.FinalRuleConfig.$type, action: isSet(object.action) ? ruleActionFromJSON(object.action) : 0, networks: globalThis.Array.isArray(object?.networks) ? object.networks.map((e) => (0, network_1.networkFromJSON)(e)) : [], portList: isSet(object.portList) ? port_1.PortList.fromJSON(object.portList) : isSet(object.port_list) ? port_1.PortList.fromJSON(object.port_list) : undefined, ip: globalThis.Array.isArray(object?.ip) ? object.ip.map((e) => geodat_1.IPRule.fromJSON(e)) : [], blockDelay: isSet(object.blockDelay) ? exports.Range.fromJSON(object.blockDelay) : isSet(object.block_delay) ? exports.Range.fromJSON(object.block_delay) : undefined, }; }, toJSON(message) { const obj = {}; if (message.action !== 0) { obj.action = ruleActionToJSON(message.action); } if (message.networks?.length) { obj.networks = message.networks.map((e) => (0, network_1.networkToJSON)(e)); } if (message.portList !== undefined) { obj.portList = port_1.PortList.toJSON(message.portList); } if (message.ip?.length) { obj.ip = message.ip.map((e) => geodat_1.IPRule.toJSON(e)); } if (message.blockDelay !== undefined) { obj.blockDelay = exports.Range.toJSON(message.blockDelay); } return obj; }, create(base) { return exports.FinalRuleConfig.fromPartial(base ?? {}); }, fromPartial(object) { const message = createBaseFinalRuleConfig(); message.action = object.action ?? 0; message.networks = object.networks?.map((e) => e) || []; message.portList = (object.portList !== undefined && object.portList !== null) ? port_1.PortList.fromPartial(object.portList) : undefined; message.ip = object.ip?.map((e) => geodat_1.IPRule.fromPartial(e)) || []; message.blockDelay = (object.blockDelay !== undefined && object.blockDelay !== null) ? exports.Range.fromPartial(object.blockDelay) : undefined; return message; }, }; typeRegistry_1.messageTypeRegistry.set(exports.FinalRuleConfig.$type, exports.FinalRuleConfig); function createBaseConfig() { return { $type: "xray.proxy.freedom.Config", domainStrategy: 0, destinationOverride: undefined, userLevel: 0, fragment: undefined, proxyProtocol: 0, noises: [], finalRules: [], }; } exports.Config = { $type: "xray.proxy.freedom.Config", encode(message, writer = new wire_1.BinaryWriter()) { if (message.domainStrategy !== 0) { writer.uint32(8).int32(message.domainStrategy); } if (message.destinationOverride !== undefined) { exports.DestinationOverride.encode(message.destinationOverride, writer.uint32(26).fork()).join(); } if (message.userLevel !== 0) { writer.uint32(32).uint32(message.userLevel); } if (message.fragment !== undefined) { exports.Fragment.encode(message.fragment, writer.uint32(42).fork()).join(); } if (message.proxyProtocol !== 0) { writer.uint32(48).uint32(message.proxyProtocol); } for (const v of message.noises) { exports.Noise.encode(v, writer.uint32(58).fork()).join(); } for (const v of message.finalRules) { exports.FinalRuleConfig.encode(v, writer.uint32(66).fork()).join(); } return writer; }, decode(input, length) { const reader = input instanceof wire_1.BinaryReader ? input : new wire_1.BinaryReader(input); const end = length === undefined ? reader.len : reader.pos + length; const message = createBaseConfig(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: { if (tag !== 8) { break; } message.domainStrategy = reader.int32(); continue; } case 3: { if (tag !== 26) { break; } message.destinationOverride = exports.DestinationOverride.decode(reader, reader.uint32()); continue; } case 4: { if (tag !== 32) { break; } message.userLevel = reader.uint32(); continue; } case 5: { if (tag !== 42) { break; } message.fragment = exports.Fragment.decode(reader, reader.uint32()); continue; } case 6: { if (tag !== 48) { break; } message.proxyProtocol = reader.uint32(); continue; } case 7: { if (tag !== 58) { break; } message.noises.push(exports.Noise.decode(reader, reader.uint32())); continue; } case 8: { if (tag !== 66) { break; } message.finalRules.push(exports.FinalRuleConfig.decode(reader, reader.uint32())); continue; } } if ((tag & 7) === 4 || tag === 0) { break; } reader.skip(tag & 7); } return message; }, fromJSON(object) { return { $type: exports.Config.$type, domainStrategy: isSet(object.domainStrategy) ? (0, config_1.domainStrategyFromJSON)(object.domainStrategy) : isSet(object.domain_strategy) ? (0, config_1.domainStrategyFromJSON)(object.domain_strategy) : 0, destinationOverride: isSet(object.destinationOverride) ? exports.DestinationOverride.fromJSON(object.destinationOverride) : isSet(object.destination_override) ? exports.DestinationOverride.fromJSON(object.destination_override) : undefined, userLevel: isSet(object.userLevel) ? globalThis.Number(object.userLevel) : isSet(object.user_level) ? globalThis.Number(object.user_level) : 0, fragment: isSet(object.fragment) ? exports.Fragment.fromJSON(object.fragment) : undefined, proxyProtocol: isSet(object.proxyProtocol) ? globalThis.Number(object.proxyProtocol) : isSet(object.proxy_protocol) ? globalThis.Number(object.proxy_protocol) : 0, noises: globalThis.Array.isArray(object?.noises) ? object.noises.map((e) => exports.Noise.fromJSON(e)) : [], finalRules: globalThis.Array.isArray(object?.finalRules) ? object.finalRules.map((e) => exports.FinalRuleConfig.fromJSON(e)) : globalThis.Array.isArray(object?.final_rules) ? object.final_rules.map((e) => exports.FinalRuleConfig.fromJSON(e)) : [], }; }, toJSON(message) { const obj = {}; if (message.domainStrategy !== 0) { obj.domainStrategy = (0, config_1.domainStrategyToJSON)(message.domainStrategy); } if (message.destinationOverride !== undefined) { obj.destinationOverride = exports.DestinationOverride.toJSON(message.destinationOverride); } if (message.userLevel !== 0) { obj.userLevel = Math.round(message.userLevel); } if (message.fragment !== undefined) { obj.fragment = exports.Fragment.toJSON(message.fragment); } if (message.proxyProtocol !== 0) { obj.proxyProtocol = Math.round(message.proxyProtocol); } if (message.noises?.length) { obj.noises = message.noises.map((e) => exports.Noise.toJSON(e)); } if (message.finalRules?.length) { obj.finalRules = message.finalRules.map((e) => exports.FinalRuleConfig.toJSON(e)); } return obj; }, create(base) { return exports.Config.fromPartial(base ?? {}); }, fromPartial(object) { const message = createBaseConfig(); message.domainStrategy = object.domainStrategy ?? 0; message.destinationOverride = (object.destinationOverride !== undefined && object.destinationOverride !== null) ? exports.DestinationOverride.fromPartial(object.destinationOverride) : undefined; message.userLevel = object.userLevel ?? 0; message.fragment = (object.fragment !== undefined && object.fragment !== null) ? exports.Fragment.fromPartial(object.fragment) : undefined; message.proxyProtocol = object.proxyProtocol ?? 0; message.noises = object.noises?.map((e) => exports.Noise.fromPartial(e)) || []; message.finalRules = object.finalRules?.map((e) => exports.FinalRuleConfig.fromPartial(e)) || []; return message; }, }; typeRegistry_1.messageTypeRegistry.set(exports.Config.$type, exports.Config); function bytesFromBase64(b64) { if (globalThis.Buffer) { return Uint8Array.from(globalThis.Buffer.from(b64, "base64")); } else { const bin = globalThis.atob(b64); const arr = new Uint8Array(bin.length); for (let i = 0; i < bin.length; ++i) { arr[i] = bin.charCodeAt(i); } return arr; } } function base64FromBytes(arr) { if (globalThis.Buffer) { return globalThis.Buffer.from(arr).toString("base64"); } else { const bin = []; arr.forEach((byte) => { bin.push(globalThis.String.fromCharCode(byte)); }); return globalThis.btoa(bin.join("")); } } function longToNumber(int64) { const num = globalThis.Number(int64.toString()); if (num > globalThis.Number.MAX_SAFE_INTEGER) { throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER"); } if (num < globalThis.Number.MIN_SAFE_INTEGER) { throw new globalThis.Error("Value is smaller than Number.MIN_SAFE_INTEGER"); } return num; } function isSet(value) { return value !== null && value !== undefined; }