@secondlayer/cli 22.3.3 → 23.0.0
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/README.md +0 -1
- package/dist/cli.js +77 -2700
- package/dist/cli.js.map +12 -26
- package/dist/index.js +1 -14
- package/dist/index.js.map +2 -2
- package/package.json +6 -6
package/dist/cli.js
CHANGED
|
@@ -33,19 +33,6 @@ var __toESM = (mod, isNodeMode, target) => {
|
|
|
33
33
|
return to;
|
|
34
34
|
};
|
|
35
35
|
var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
36
|
-
var __returnValue = (v) => v;
|
|
37
|
-
function __exportSetter(name, newValue) {
|
|
38
|
-
this[name] = __returnValue.bind(null, newValue);
|
|
39
|
-
}
|
|
40
|
-
var __export = (target, all) => {
|
|
41
|
-
for (var name in all)
|
|
42
|
-
__defProp(target, name, {
|
|
43
|
-
get: all[name],
|
|
44
|
-
enumerable: true,
|
|
45
|
-
configurable: true,
|
|
46
|
-
set: __exportSetter.bind(all, name)
|
|
47
|
-
});
|
|
48
|
-
};
|
|
49
36
|
var __esm = (fn, res, err) => () => {
|
|
50
37
|
if (fn)
|
|
51
38
|
try {
|
|
@@ -2144,7 +2131,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
|
2144
2131
|
// src/lib/api-url.ts
|
|
2145
2132
|
import { isHostedApiUrl } from "@secondlayer/sdk";
|
|
2146
2133
|
function resolveApiUrl() {
|
|
2147
|
-
return (process.env.SECONDLAYER_API_URL ??
|
|
2134
|
+
return (process.env.SECONDLAYER_API_URL ?? LOCAL_API_URL).replace(/\/+$/, "");
|
|
2148
2135
|
}
|
|
2149
2136
|
function resolveArchiveOpsUrl() {
|
|
2150
2137
|
return (process.env.SL_CREDITS_API_URL ?? ARCHIVE_OPS_API_URL).replace(/\/+$/, "");
|
|
@@ -29197,75 +29184,12 @@ async function sha256File(path) {
|
|
|
29197
29184
|
var init_fs = () => {};
|
|
29198
29185
|
|
|
29199
29186
|
// src/lib/config.ts
|
|
29200
|
-
var exports_config = {};
|
|
29201
|
-
__export(exports_config, {
|
|
29202
|
-
clearConfig: () => clearConfig,
|
|
29203
|
-
getConfigPath: () => getConfigPath,
|
|
29204
|
-
getDataDir: () => getDataDir,
|
|
29205
|
-
getDefaultConfig: () => getDefaultConfig,
|
|
29206
|
-
isDefaultValue: () => isDefaultValue,
|
|
29207
|
-
loadConfig: () => loadConfig2,
|
|
29208
|
-
requireLocalNetwork: () => requireLocalNetwork,
|
|
29209
|
-
resetConfig: () => resetConfig,
|
|
29210
|
-
setConfigValue: () => setConfigValue
|
|
29211
|
-
});
|
|
29212
29187
|
import { homedir as homedir2 } from "node:os";
|
|
29213
29188
|
import { join as join6 } from "node:path";
|
|
29214
29189
|
import { z as z3 } from "zod";
|
|
29215
29190
|
async function ensureConfigDir() {
|
|
29216
29191
|
await ensureDir(CONFIG_DIR);
|
|
29217
29192
|
}
|
|
29218
|
-
function resolvePath(path) {
|
|
29219
|
-
if (path.startsWith("~/")) {
|
|
29220
|
-
return join6(homedir2(), path.slice(2));
|
|
29221
|
-
}
|
|
29222
|
-
return path;
|
|
29223
|
-
}
|
|
29224
|
-
function getDataDir(config) {
|
|
29225
|
-
const dataDir = config?.dataDir ?? DEFAULT_CONFIG.dataDir;
|
|
29226
|
-
return resolvePath(dataDir);
|
|
29227
|
-
}
|
|
29228
|
-
function migrateConfig(raw) {
|
|
29229
|
-
if (!raw || typeof raw !== "object") {
|
|
29230
|
-
return { ...DEFAULT_CONFIG };
|
|
29231
|
-
}
|
|
29232
|
-
const old = raw;
|
|
29233
|
-
const migrated = { ...DEFAULT_CONFIG };
|
|
29234
|
-
if (typeof old.network === "string" && ["local", "testnet", "mainnet"].includes(old.network)) {
|
|
29235
|
-
migrated.network = old.network;
|
|
29236
|
-
}
|
|
29237
|
-
if (typeof old.dataDir === "string") {
|
|
29238
|
-
migrated.dataDir = old.dataDir;
|
|
29239
|
-
}
|
|
29240
|
-
if (typeof old.defaultProject === "string") {
|
|
29241
|
-
migrated.defaultProject = old.defaultProject;
|
|
29242
|
-
}
|
|
29243
|
-
if (typeof old.nodeInstallPath === "string" || typeof old.nodeNetwork === "string") {
|
|
29244
|
-
migrated.node = {
|
|
29245
|
-
installPath: old.nodeInstallPath || "",
|
|
29246
|
-
network: old.nodeNetwork || "mainnet"
|
|
29247
|
-
};
|
|
29248
|
-
if (!migrated.node.installPath) {
|
|
29249
|
-
migrated.node = undefined;
|
|
29250
|
-
}
|
|
29251
|
-
}
|
|
29252
|
-
if (old.node && typeof old.node === "object") {
|
|
29253
|
-
migrated.node = old.node;
|
|
29254
|
-
}
|
|
29255
|
-
if (old.ports && typeof old.ports === "object") {
|
|
29256
|
-
migrated.ports = { ...DEFAULT_CONFIG.ports, ...old.ports };
|
|
29257
|
-
}
|
|
29258
|
-
if (old.database && typeof old.database === "object") {
|
|
29259
|
-
migrated.database = {
|
|
29260
|
-
...DEFAULT_CONFIG.database,
|
|
29261
|
-
...old.database
|
|
29262
|
-
};
|
|
29263
|
-
}
|
|
29264
|
-
if (typeof old.indexerPort === "number") {
|
|
29265
|
-
migrated.ports.indexer = old.indexerPort;
|
|
29266
|
-
}
|
|
29267
|
-
return migrated;
|
|
29268
|
-
}
|
|
29269
29193
|
async function loadConfig2() {
|
|
29270
29194
|
let config;
|
|
29271
29195
|
if (!await fileExists(CONFIG_PATH)) {
|
|
@@ -29273,8 +29197,7 @@ async function loadConfig2() {
|
|
|
29273
29197
|
} else {
|
|
29274
29198
|
try {
|
|
29275
29199
|
const raw = await readJsonFile(CONFIG_PATH);
|
|
29276
|
-
|
|
29277
|
-
config = ConfigSchema.parse(migrated);
|
|
29200
|
+
config = ConfigSchema.parse(raw);
|
|
29278
29201
|
} catch (error) {
|
|
29279
29202
|
console.error("Warning: Invalid config file, using defaults");
|
|
29280
29203
|
config = { ...DEFAULT_CONFIG };
|
|
@@ -29295,27 +29218,6 @@ function applyEnvOverrides(config) {
|
|
|
29295
29218
|
console.error(`Warning: STACKS_NETWORK=${net} is not mainnet, testnet, or devnet; using ${result.network}`);
|
|
29296
29219
|
}
|
|
29297
29220
|
}
|
|
29298
|
-
if (process.env.SL_DATA_DIR) {
|
|
29299
|
-
result.dataDir = process.env.SL_DATA_DIR;
|
|
29300
|
-
}
|
|
29301
|
-
if (process.env.SL_API_PORT) {
|
|
29302
|
-
const port = Number.parseInt(process.env.SL_API_PORT, 10);
|
|
29303
|
-
if (!Number.isNaN(port) && port > 0 && port <= 65535) {
|
|
29304
|
-
result.ports = { ...result.ports, api: port };
|
|
29305
|
-
}
|
|
29306
|
-
}
|
|
29307
|
-
if (process.env.SL_INDEXER_PORT) {
|
|
29308
|
-
const port = Number.parseInt(process.env.SL_INDEXER_PORT, 10);
|
|
29309
|
-
if (!Number.isNaN(port) && port > 0 && port <= 65535) {
|
|
29310
|
-
result.ports = { ...result.ports, indexer: port };
|
|
29311
|
-
}
|
|
29312
|
-
}
|
|
29313
|
-
if (process.env.STACKS_NODE_RPC_URL) {
|
|
29314
|
-
result.nodeRpcUrl = process.env.STACKS_NODE_RPC_URL;
|
|
29315
|
-
}
|
|
29316
|
-
if (process.env.DATABASE_URL) {
|
|
29317
|
-
result.database = { type: "external", url: process.env.DATABASE_URL };
|
|
29318
|
-
}
|
|
29319
29221
|
return result;
|
|
29320
29222
|
}
|
|
29321
29223
|
async function saveConfig(config) {
|
|
@@ -29325,45 +29227,11 @@ async function saveConfig(config) {
|
|
|
29325
29227
|
`);
|
|
29326
29228
|
}
|
|
29327
29229
|
async function setConfigValue(key, value) {
|
|
29328
|
-
|
|
29329
|
-
|
|
29330
|
-
let current = config;
|
|
29331
|
-
for (let i = 0;i < keys.length - 1; i++) {
|
|
29332
|
-
const k = keys[i];
|
|
29333
|
-
if (current[k] === undefined) {
|
|
29334
|
-
current[k] = {};
|
|
29335
|
-
}
|
|
29336
|
-
current = current[k];
|
|
29337
|
-
}
|
|
29338
|
-
const finalKey = keys[keys.length - 1];
|
|
29339
|
-
const parsedValue = parseValue(value);
|
|
29340
|
-
current[finalKey] = parsedValue;
|
|
29341
|
-
await saveConfig(config);
|
|
29342
|
-
}
|
|
29343
|
-
function parseValue(value) {
|
|
29344
|
-
if (typeof value !== "string") {
|
|
29345
|
-
return value;
|
|
29230
|
+
if (!(key in ConfigSchema.shape)) {
|
|
29231
|
+
throw new Error(`Invalid config key: ${key}`);
|
|
29346
29232
|
}
|
|
29347
|
-
|
|
29348
|
-
|
|
29349
|
-
if (value === "false")
|
|
29350
|
-
return false;
|
|
29351
|
-
const num = Number(value);
|
|
29352
|
-
if (!Number.isNaN(num) && value.trim() !== "") {
|
|
29353
|
-
return num;
|
|
29354
|
-
}
|
|
29355
|
-
return value;
|
|
29356
|
-
}
|
|
29357
|
-
function getConfigValue(config, key) {
|
|
29358
|
-
const keys = key.split(".");
|
|
29359
|
-
let current = config;
|
|
29360
|
-
for (const k of keys) {
|
|
29361
|
-
if (current === null || current === undefined || typeof current !== "object") {
|
|
29362
|
-
return;
|
|
29363
|
-
}
|
|
29364
|
-
current = current[k];
|
|
29365
|
-
}
|
|
29366
|
-
return current;
|
|
29233
|
+
const config = await loadConfig2();
|
|
29234
|
+
await saveConfig({ ...config, [key]: value });
|
|
29367
29235
|
}
|
|
29368
29236
|
async function resetConfig() {
|
|
29369
29237
|
await saveConfig({ ...DEFAULT_CONFIG });
|
|
@@ -29392,44 +29260,16 @@ async function requireLocalNetwork() {
|
|
|
29392
29260
|
}
|
|
29393
29261
|
return config;
|
|
29394
29262
|
}
|
|
29395
|
-
|
|
29396
|
-
const currentValue = getConfigValue(config, key);
|
|
29397
|
-
const defaultValue = getConfigValue(DEFAULT_CONFIG, key);
|
|
29398
|
-
return JSON.stringify(currentValue) === JSON.stringify(defaultValue);
|
|
29399
|
-
}
|
|
29400
|
-
var PortsSchema, NodeSchema, DatabaseSchema, NetworkSchema, ConfigSchema, CONFIG_DIR, CONFIG_PATH, DEFAULT_CONFIG;
|
|
29263
|
+
var NetworkSchema, ConfigSchema, CONFIG_DIR, CONFIG_PATH, DEFAULT_CONFIG;
|
|
29401
29264
|
var init_config2 = __esm(() => {
|
|
29402
29265
|
init_fs();
|
|
29403
|
-
PortsSchema = z3.object({
|
|
29404
|
-
api: z3.number().int().min(1).max(65535).default(3800),
|
|
29405
|
-
indexer: z3.number().int().min(1).max(65535).default(3700)
|
|
29406
|
-
});
|
|
29407
|
-
NodeSchema = z3.object({
|
|
29408
|
-
installPath: z3.string().min(1),
|
|
29409
|
-
network: z3.enum(["mainnet", "testnet"]).default("mainnet")
|
|
29410
|
-
});
|
|
29411
|
-
DatabaseSchema = z3.object({
|
|
29412
|
-
type: z3.enum(["docker", "external"]).default("docker"),
|
|
29413
|
-
url: z3.string().url().optional()
|
|
29414
|
-
});
|
|
29415
29266
|
NetworkSchema = z3.enum(["local", "testnet", "mainnet"]);
|
|
29416
29267
|
ConfigSchema = z3.object({
|
|
29417
|
-
network: NetworkSchema.default("mainnet")
|
|
29418
|
-
nodeRpcUrl: z3.string().url().optional(),
|
|
29419
|
-
dataDir: z3.string().default("~/.secondlayer/data"),
|
|
29420
|
-
node: NodeSchema.optional(),
|
|
29421
|
-
ports: PortsSchema.default({ api: 3800, indexer: 3700 }),
|
|
29422
|
-
database: DatabaseSchema.default({ type: "docker" }),
|
|
29423
|
-
defaultProject: z3.string().optional()
|
|
29268
|
+
network: NetworkSchema.default("mainnet")
|
|
29424
29269
|
});
|
|
29425
29270
|
CONFIG_DIR = join6(homedir2(), ".secondlayer");
|
|
29426
29271
|
CONFIG_PATH = join6(CONFIG_DIR, "config.json");
|
|
29427
|
-
DEFAULT_CONFIG = {
|
|
29428
|
-
network: "mainnet",
|
|
29429
|
-
dataDir: "~/.secondlayer/data",
|
|
29430
|
-
ports: { api: 3800, indexer: 3700 },
|
|
29431
|
-
database: { type: "docker" }
|
|
29432
|
-
};
|
|
29272
|
+
DEFAULT_CONFIG = { network: "mainnet" };
|
|
29433
29273
|
});
|
|
29434
29274
|
|
|
29435
29275
|
// src/lib/filter-params.ts
|
|
@@ -31955,1995 +31795,9 @@ var init_index_api = __esm(() => {
|
|
|
31955
31795
|
RUNE_KINDS = ["etch", "mint", "transfer", "burn"];
|
|
31956
31796
|
});
|
|
31957
31797
|
|
|
31958
|
-
// ../../node_modules/postgres/src/query.js
|
|
31959
|
-
function cachedError(xs) {
|
|
31960
|
-
if (originCache.has(xs))
|
|
31961
|
-
return originCache.get(xs);
|
|
31962
|
-
const x = Error.stackTraceLimit;
|
|
31963
|
-
Error.stackTraceLimit = 4;
|
|
31964
|
-
originCache.set(xs, new Error);
|
|
31965
|
-
Error.stackTraceLimit = x;
|
|
31966
|
-
return originCache.get(xs);
|
|
31967
|
-
}
|
|
31968
|
-
var originCache, originStackCache, originError, CLOSE, Query;
|
|
31969
|
-
var init_query = __esm(() => {
|
|
31970
|
-
originCache = new Map;
|
|
31971
|
-
originStackCache = new Map;
|
|
31972
|
-
originError = Symbol("OriginError");
|
|
31973
|
-
CLOSE = {};
|
|
31974
|
-
Query = class Query extends Promise {
|
|
31975
|
-
constructor(strings, args, handler, canceller, options = {}) {
|
|
31976
|
-
let resolve, reject;
|
|
31977
|
-
super((a, b) => {
|
|
31978
|
-
resolve = a;
|
|
31979
|
-
reject = b;
|
|
31980
|
-
});
|
|
31981
|
-
this.tagged = Array.isArray(strings.raw);
|
|
31982
|
-
this.strings = strings;
|
|
31983
|
-
this.args = args;
|
|
31984
|
-
this.handler = handler;
|
|
31985
|
-
this.canceller = canceller;
|
|
31986
|
-
this.options = options;
|
|
31987
|
-
this.state = null;
|
|
31988
|
-
this.statement = null;
|
|
31989
|
-
this.resolve = (x) => (this.active = false, resolve(x));
|
|
31990
|
-
this.reject = (x) => (this.active = false, reject(x));
|
|
31991
|
-
this.active = false;
|
|
31992
|
-
this.cancelled = null;
|
|
31993
|
-
this.executed = false;
|
|
31994
|
-
this.signature = "";
|
|
31995
|
-
this[originError] = this.handler.debug ? new Error : this.tagged && cachedError(this.strings);
|
|
31996
|
-
}
|
|
31997
|
-
get origin() {
|
|
31998
|
-
return (this.handler.debug ? this[originError].stack : this.tagged && originStackCache.has(this.strings) ? originStackCache.get(this.strings) : originStackCache.set(this.strings, this[originError].stack).get(this.strings)) || "";
|
|
31999
|
-
}
|
|
32000
|
-
static get [Symbol.species]() {
|
|
32001
|
-
return Promise;
|
|
32002
|
-
}
|
|
32003
|
-
cancel() {
|
|
32004
|
-
return this.canceller && (this.canceller(this), this.canceller = null);
|
|
32005
|
-
}
|
|
32006
|
-
simple() {
|
|
32007
|
-
this.options.simple = true;
|
|
32008
|
-
this.options.prepare = false;
|
|
32009
|
-
return this;
|
|
32010
|
-
}
|
|
32011
|
-
async readable() {
|
|
32012
|
-
this.simple();
|
|
32013
|
-
this.streaming = true;
|
|
32014
|
-
return this;
|
|
32015
|
-
}
|
|
32016
|
-
async writable() {
|
|
32017
|
-
this.simple();
|
|
32018
|
-
this.streaming = true;
|
|
32019
|
-
return this;
|
|
32020
|
-
}
|
|
32021
|
-
cursor(rows = 1, fn) {
|
|
32022
|
-
this.options.simple = false;
|
|
32023
|
-
if (typeof rows === "function") {
|
|
32024
|
-
fn = rows;
|
|
32025
|
-
rows = 1;
|
|
32026
|
-
}
|
|
32027
|
-
this.cursorRows = rows;
|
|
32028
|
-
if (typeof fn === "function")
|
|
32029
|
-
return this.cursorFn = fn, this;
|
|
32030
|
-
let prev;
|
|
32031
|
-
return {
|
|
32032
|
-
[Symbol.asyncIterator]: () => ({
|
|
32033
|
-
next: () => {
|
|
32034
|
-
if (this.executed && !this.active)
|
|
32035
|
-
return { done: true };
|
|
32036
|
-
prev && prev();
|
|
32037
|
-
const promise = new Promise((resolve, reject) => {
|
|
32038
|
-
this.cursorFn = (value) => {
|
|
32039
|
-
resolve({ value, done: false });
|
|
32040
|
-
return new Promise((r) => prev = r);
|
|
32041
|
-
};
|
|
32042
|
-
this.resolve = () => (this.active = false, resolve({ done: true }));
|
|
32043
|
-
this.reject = (x) => (this.active = false, reject(x));
|
|
32044
|
-
});
|
|
32045
|
-
this.execute();
|
|
32046
|
-
return promise;
|
|
32047
|
-
},
|
|
32048
|
-
return() {
|
|
32049
|
-
prev && prev(CLOSE);
|
|
32050
|
-
return { done: true };
|
|
32051
|
-
}
|
|
32052
|
-
})
|
|
32053
|
-
};
|
|
32054
|
-
}
|
|
32055
|
-
describe() {
|
|
32056
|
-
this.options.simple = false;
|
|
32057
|
-
this.onlyDescribe = this.options.prepare = true;
|
|
32058
|
-
return this;
|
|
32059
|
-
}
|
|
32060
|
-
stream() {
|
|
32061
|
-
throw new Error(".stream has been renamed to .forEach");
|
|
32062
|
-
}
|
|
32063
|
-
forEach(fn) {
|
|
32064
|
-
this.forEachFn = fn;
|
|
32065
|
-
this.handle();
|
|
32066
|
-
return this;
|
|
32067
|
-
}
|
|
32068
|
-
raw() {
|
|
32069
|
-
this.isRaw = true;
|
|
32070
|
-
return this;
|
|
32071
|
-
}
|
|
32072
|
-
values() {
|
|
32073
|
-
this.isRaw = "values";
|
|
32074
|
-
return this;
|
|
32075
|
-
}
|
|
32076
|
-
async handle() {
|
|
32077
|
-
!this.executed && (this.executed = true) && await 1 && this.handler(this);
|
|
32078
|
-
}
|
|
32079
|
-
execute() {
|
|
32080
|
-
this.handle();
|
|
32081
|
-
return this;
|
|
32082
|
-
}
|
|
32083
|
-
then() {
|
|
32084
|
-
this.handle();
|
|
32085
|
-
return super.then.apply(this, arguments);
|
|
32086
|
-
}
|
|
32087
|
-
catch() {
|
|
32088
|
-
this.handle();
|
|
32089
|
-
return super.catch.apply(this, arguments);
|
|
32090
|
-
}
|
|
32091
|
-
finally() {
|
|
32092
|
-
this.handle();
|
|
32093
|
-
return super.finally.apply(this, arguments);
|
|
32094
|
-
}
|
|
32095
|
-
};
|
|
32096
|
-
});
|
|
32097
|
-
|
|
32098
|
-
// ../../node_modules/postgres/src/errors.js
|
|
32099
|
-
function connection(x, options, socket) {
|
|
32100
|
-
const { host, port } = socket || options;
|
|
32101
|
-
const error = Object.assign(new Error("write " + x + " " + (options.path || host + ":" + port)), {
|
|
32102
|
-
code: x,
|
|
32103
|
-
errno: x,
|
|
32104
|
-
address: options.path || host
|
|
32105
|
-
}, options.path ? {} : { port });
|
|
32106
|
-
Error.captureStackTrace(error, connection);
|
|
32107
|
-
return error;
|
|
32108
|
-
}
|
|
32109
|
-
function postgres(x) {
|
|
32110
|
-
const error = new PostgresError(x);
|
|
32111
|
-
Error.captureStackTrace(error, postgres);
|
|
32112
|
-
return error;
|
|
32113
|
-
}
|
|
32114
|
-
function generic(code, message) {
|
|
32115
|
-
const error = Object.assign(new Error(code + ": " + message), { code });
|
|
32116
|
-
Error.captureStackTrace(error, generic);
|
|
32117
|
-
return error;
|
|
32118
|
-
}
|
|
32119
|
-
function notSupported(x) {
|
|
32120
|
-
const error = Object.assign(new Error(x + " (B) is not supported"), {
|
|
32121
|
-
code: "MESSAGE_NOT_SUPPORTED",
|
|
32122
|
-
name: x
|
|
32123
|
-
});
|
|
32124
|
-
Error.captureStackTrace(error, notSupported);
|
|
32125
|
-
return error;
|
|
32126
|
-
}
|
|
32127
|
-
var PostgresError, Errors;
|
|
32128
|
-
var init_errors2 = __esm(() => {
|
|
32129
|
-
PostgresError = class PostgresError extends Error {
|
|
32130
|
-
constructor(x) {
|
|
32131
|
-
super(x.message);
|
|
32132
|
-
this.name = this.constructor.name;
|
|
32133
|
-
Object.assign(this, x);
|
|
32134
|
-
}
|
|
32135
|
-
};
|
|
32136
|
-
Errors = {
|
|
32137
|
-
connection,
|
|
32138
|
-
postgres,
|
|
32139
|
-
generic,
|
|
32140
|
-
notSupported
|
|
32141
|
-
};
|
|
32142
|
-
});
|
|
32143
|
-
|
|
32144
|
-
// ../../node_modules/postgres/src/types.js
|
|
32145
|
-
class NotTagged {
|
|
32146
|
-
then() {
|
|
32147
|
-
notTagged();
|
|
32148
|
-
}
|
|
32149
|
-
catch() {
|
|
32150
|
-
notTagged();
|
|
32151
|
-
}
|
|
32152
|
-
finally() {
|
|
32153
|
-
notTagged();
|
|
32154
|
-
}
|
|
32155
|
-
}
|
|
32156
|
-
function handleValue(x, parameters, types, options) {
|
|
32157
|
-
let value = x instanceof Parameter ? x.value : x;
|
|
32158
|
-
if (value === undefined) {
|
|
32159
|
-
x instanceof Parameter ? x.value = options.transform.undefined : value = x = options.transform.undefined;
|
|
32160
|
-
if (value === undefined)
|
|
32161
|
-
throw Errors.generic("UNDEFINED_VALUE", "Undefined values are not allowed");
|
|
32162
|
-
}
|
|
32163
|
-
return "$" + types.push(x instanceof Parameter ? (parameters.push(x.value), x.array ? x.array[x.type || inferType(x.value)] || x.type || firstIsString(x.value) : x.type) : (parameters.push(x), inferType(x)));
|
|
32164
|
-
}
|
|
32165
|
-
function stringify(q, string, value, parameters, types, options) {
|
|
32166
|
-
for (let i = 1;i < q.strings.length; i++) {
|
|
32167
|
-
string += stringifyValue(string, value, parameters, types, options) + q.strings[i];
|
|
32168
|
-
value = q.args[i];
|
|
32169
|
-
}
|
|
32170
|
-
return string;
|
|
32171
|
-
}
|
|
32172
|
-
function stringifyValue(string, value, parameters, types, o) {
|
|
32173
|
-
return value instanceof Builder ? value.build(string, parameters, types, o) : value instanceof Query ? fragment(value, parameters, types, o) : value instanceof Identifier ? value.value : value && value[0] instanceof Query ? value.reduce((acc, x) => acc + " " + fragment(x, parameters, types, o), "") : handleValue(value, parameters, types, o);
|
|
32174
|
-
}
|
|
32175
|
-
function fragment(q, parameters, types, options) {
|
|
32176
|
-
q.fragment = true;
|
|
32177
|
-
return stringify(q, q.strings[0], q.args[0], parameters, types, options);
|
|
32178
|
-
}
|
|
32179
|
-
function valuesBuilder(first, parameters, types, columns, options) {
|
|
32180
|
-
return first.map((row) => "(" + columns.map((column) => stringifyValue("values", row[column], parameters, types, options)).join(",") + ")").join(",");
|
|
32181
|
-
}
|
|
32182
|
-
function values(first, rest, parameters, types, options) {
|
|
32183
|
-
const multi = Array.isArray(first[0]);
|
|
32184
|
-
const columns = rest.length ? rest.flat() : Object.keys(multi ? first[0] : first);
|
|
32185
|
-
return valuesBuilder(multi ? first : [first], parameters, types, columns, options);
|
|
32186
|
-
}
|
|
32187
|
-
function select2(first, rest, parameters, types, options) {
|
|
32188
|
-
typeof first === "string" && (first = [first].concat(rest));
|
|
32189
|
-
if (Array.isArray(first))
|
|
32190
|
-
return escapeIdentifiers(first, options);
|
|
32191
|
-
let value;
|
|
32192
|
-
const columns = rest.length ? rest.flat() : Object.keys(first);
|
|
32193
|
-
return columns.map((x) => {
|
|
32194
|
-
value = first[x];
|
|
32195
|
-
return (value instanceof Query ? fragment(value, parameters, types, options) : value instanceof Identifier ? value.value : handleValue(value, parameters, types, options)) + " as " + escapeIdentifier(options.transform.column.to ? options.transform.column.to(x) : x);
|
|
32196
|
-
}).join(",");
|
|
32197
|
-
}
|
|
32198
|
-
function notTagged() {
|
|
32199
|
-
throw Errors.generic("NOT_TAGGED_CALL", "Query not called as a tagged template literal");
|
|
32200
|
-
}
|
|
32201
|
-
function firstIsString(x) {
|
|
32202
|
-
if (Array.isArray(x))
|
|
32203
|
-
return firstIsString(x[0]);
|
|
32204
|
-
return typeof x === "string" ? 1009 : 0;
|
|
32205
|
-
}
|
|
32206
|
-
function typeHandlers(types) {
|
|
32207
|
-
return Object.keys(types).reduce((acc, k) => {
|
|
32208
|
-
types[k].from && [].concat(types[k].from).forEach((x) => acc.parsers[x] = types[k].parse);
|
|
32209
|
-
if (types[k].serialize) {
|
|
32210
|
-
acc.serializers[types[k].to] = types[k].serialize;
|
|
32211
|
-
types[k].from && [].concat(types[k].from).forEach((x) => acc.serializers[x] = types[k].serialize);
|
|
32212
|
-
}
|
|
32213
|
-
return acc;
|
|
32214
|
-
}, { parsers: {}, serializers: {} });
|
|
32215
|
-
}
|
|
32216
|
-
function escapeIdentifiers(xs, { transform: { column } }) {
|
|
32217
|
-
return xs.map((x) => escapeIdentifier(column.to ? column.to(x) : x)).join(",");
|
|
32218
|
-
}
|
|
32219
|
-
function arrayEscape(x) {
|
|
32220
|
-
return x.replace(escapeBackslash, "\\\\").replace(escapeQuote, "\\\"");
|
|
32221
|
-
}
|
|
32222
|
-
function arrayParserLoop(s, x, parser, typarray) {
|
|
32223
|
-
const xs = [];
|
|
32224
|
-
const delimiter = typarray === 1020 ? ";" : ",";
|
|
32225
|
-
for (;s.i < x.length; s.i++) {
|
|
32226
|
-
s.char = x[s.i];
|
|
32227
|
-
if (s.quoted) {
|
|
32228
|
-
if (s.char === "\\") {
|
|
32229
|
-
s.str += x[++s.i];
|
|
32230
|
-
} else if (s.char === '"') {
|
|
32231
|
-
xs.push(parser ? parser(s.str) : s.str);
|
|
32232
|
-
s.str = "";
|
|
32233
|
-
s.quoted = x[s.i + 1] === '"';
|
|
32234
|
-
s.last = s.i + 2;
|
|
32235
|
-
} else {
|
|
32236
|
-
s.str += s.char;
|
|
32237
|
-
}
|
|
32238
|
-
} else if (s.char === '"') {
|
|
32239
|
-
s.quoted = true;
|
|
32240
|
-
} else if (s.char === "{") {
|
|
32241
|
-
s.last = ++s.i;
|
|
32242
|
-
xs.push(arrayParserLoop(s, x, parser, typarray));
|
|
32243
|
-
} else if (s.char === "}") {
|
|
32244
|
-
s.quoted = false;
|
|
32245
|
-
s.last < s.i && xs.push(parser ? parser(x.slice(s.last, s.i)) : x.slice(s.last, s.i));
|
|
32246
|
-
s.last = s.i + 1;
|
|
32247
|
-
break;
|
|
32248
|
-
} else if (s.char === delimiter && s.p !== "}" && s.p !== '"') {
|
|
32249
|
-
xs.push(parser ? parser(x.slice(s.last, s.i)) : x.slice(s.last, s.i));
|
|
32250
|
-
s.last = s.i + 1;
|
|
32251
|
-
}
|
|
32252
|
-
s.p = s.char;
|
|
32253
|
-
}
|
|
32254
|
-
s.last < s.i && xs.push(parser ? parser(x.slice(s.last, s.i + 1)) : x.slice(s.last, s.i + 1));
|
|
32255
|
-
return xs;
|
|
32256
|
-
}
|
|
32257
|
-
function createJsonTransform(fn) {
|
|
32258
|
-
return function jsonTransform(x, column) {
|
|
32259
|
-
return typeof x === "object" && x !== null && (column.type === 114 || column.type === 3802) ? Array.isArray(x) ? x.map((x) => jsonTransform(x, column)) : Object.entries(x).reduce((acc, [k, v]) => Object.assign(acc, { [fn(k)]: jsonTransform(v, column) }), {}) : x;
|
|
32260
|
-
};
|
|
32261
|
-
}
|
|
32262
|
-
var types5, Identifier, Parameter, Builder, defaultHandlers, builders, serializers, parsers, mergeUserTypes = function(types) {
|
|
32263
|
-
const user = typeHandlers(types || {});
|
|
32264
|
-
return {
|
|
32265
|
-
serializers: Object.assign({}, serializers, user.serializers),
|
|
32266
|
-
parsers: Object.assign({}, parsers, user.parsers)
|
|
32267
|
-
};
|
|
32268
|
-
}, escapeIdentifier = function escape(str) {
|
|
32269
|
-
return '"' + str.replace(/"/g, '""').replace(/\./g, '"."') + '"';
|
|
32270
|
-
}, inferType = function inferType(x) {
|
|
32271
|
-
return x instanceof Parameter ? x.type : x instanceof Date ? 1184 : x instanceof Uint8Array ? 17 : x === true || x === false ? 16 : typeof x === "bigint" ? 20 : Array.isArray(x) ? inferType(x[0]) : 0;
|
|
32272
|
-
}, escapeBackslash, escapeQuote, arraySerializer = function arraySerializer(xs, serializer, options, typarray) {
|
|
32273
|
-
if (Array.isArray(xs) === false)
|
|
32274
|
-
return xs;
|
|
32275
|
-
if (!xs.length)
|
|
32276
|
-
return "{}";
|
|
32277
|
-
const first = xs[0];
|
|
32278
|
-
const delimiter = typarray === 1020 ? ";" : ",";
|
|
32279
|
-
if (Array.isArray(first) && !first.type)
|
|
32280
|
-
return "{" + xs.map((x) => arraySerializer(x, serializer, options, typarray)).join(delimiter) + "}";
|
|
32281
|
-
return "{" + xs.map((x) => {
|
|
32282
|
-
if (x === undefined) {
|
|
32283
|
-
x = options.transform.undefined;
|
|
32284
|
-
if (x === undefined)
|
|
32285
|
-
throw Errors.generic("UNDEFINED_VALUE", "Undefined values are not allowed");
|
|
32286
|
-
}
|
|
32287
|
-
return x === null ? "null" : '"' + arrayEscape(serializer ? serializer(x.type ? x.value : x) : "" + x) + '"';
|
|
32288
|
-
}).join(delimiter) + "}";
|
|
32289
|
-
}, arrayParserState, arrayParser = function arrayParser(x, parser, typarray) {
|
|
32290
|
-
arrayParserState.i = arrayParserState.last = 0;
|
|
32291
|
-
return arrayParserLoop(arrayParserState, x, parser, typarray);
|
|
32292
|
-
}, toCamel = (x) => {
|
|
32293
|
-
let str = x[0];
|
|
32294
|
-
for (let i = 1;i < x.length; i++)
|
|
32295
|
-
str += x[i] === "_" ? x[++i].toUpperCase() : x[i];
|
|
32296
|
-
return str;
|
|
32297
|
-
}, toPascal = (x) => {
|
|
32298
|
-
let str = x[0].toUpperCase();
|
|
32299
|
-
for (let i = 1;i < x.length; i++)
|
|
32300
|
-
str += x[i] === "_" ? x[++i].toUpperCase() : x[i];
|
|
32301
|
-
return str;
|
|
32302
|
-
}, toKebab = (x) => x.replace(/_/g, "-"), fromCamel = (x) => x.replace(/([A-Z])/g, "_$1").toLowerCase(), fromPascal = (x) => (x.slice(0, 1) + x.slice(1).replace(/([A-Z])/g, "_$1")).toLowerCase(), fromKebab = (x) => x.replace(/-/g, "_"), camel, pascal, kebab;
|
|
32303
|
-
var init_types4 = __esm(() => {
|
|
32304
|
-
init_query();
|
|
32305
|
-
init_errors2();
|
|
32306
|
-
types5 = {
|
|
32307
|
-
string: {
|
|
32308
|
-
to: 25,
|
|
32309
|
-
from: null,
|
|
32310
|
-
serialize: (x) => "" + x
|
|
32311
|
-
},
|
|
32312
|
-
number: {
|
|
32313
|
-
to: 0,
|
|
32314
|
-
from: [21, 23, 26, 700, 701],
|
|
32315
|
-
serialize: (x) => "" + x,
|
|
32316
|
-
parse: (x) => +x
|
|
32317
|
-
},
|
|
32318
|
-
json: {
|
|
32319
|
-
to: 114,
|
|
32320
|
-
from: [114, 3802],
|
|
32321
|
-
serialize: (x) => JSON.stringify(x),
|
|
32322
|
-
parse: (x) => JSON.parse(x)
|
|
32323
|
-
},
|
|
32324
|
-
boolean: {
|
|
32325
|
-
to: 16,
|
|
32326
|
-
from: 16,
|
|
32327
|
-
serialize: (x) => x === true ? "t" : "f",
|
|
32328
|
-
parse: (x) => x === "t"
|
|
32329
|
-
},
|
|
32330
|
-
date: {
|
|
32331
|
-
to: 1184,
|
|
32332
|
-
from: [1082, 1114, 1184],
|
|
32333
|
-
serialize: (x) => (x instanceof Date ? x : new Date(x)).toISOString(),
|
|
32334
|
-
parse: (x) => new Date(x)
|
|
32335
|
-
},
|
|
32336
|
-
bytea: {
|
|
32337
|
-
to: 17,
|
|
32338
|
-
from: 17,
|
|
32339
|
-
serialize: (x) => "\\x" + Buffer.from(x).toString("hex"),
|
|
32340
|
-
parse: (x) => Buffer.from(x.slice(2), "hex")
|
|
32341
|
-
}
|
|
32342
|
-
};
|
|
32343
|
-
Identifier = class Identifier extends NotTagged {
|
|
32344
|
-
constructor(value) {
|
|
32345
|
-
super();
|
|
32346
|
-
this.value = escapeIdentifier(value);
|
|
32347
|
-
}
|
|
32348
|
-
};
|
|
32349
|
-
Parameter = class Parameter extends NotTagged {
|
|
32350
|
-
constructor(value, type, array) {
|
|
32351
|
-
super();
|
|
32352
|
-
this.value = value;
|
|
32353
|
-
this.type = type;
|
|
32354
|
-
this.array = array;
|
|
32355
|
-
}
|
|
32356
|
-
};
|
|
32357
|
-
Builder = class Builder extends NotTagged {
|
|
32358
|
-
constructor(first, rest) {
|
|
32359
|
-
super();
|
|
32360
|
-
this.first = first;
|
|
32361
|
-
this.rest = rest;
|
|
32362
|
-
}
|
|
32363
|
-
build(before, parameters, types, options) {
|
|
32364
|
-
const keyword = builders.map(([x, fn]) => ({ fn, i: before.search(x) })).sort((a, b) => a.i - b.i).pop();
|
|
32365
|
-
return keyword.i === -1 ? escapeIdentifiers(this.first, options) : keyword.fn(this.first, this.rest, parameters, types, options);
|
|
32366
|
-
}
|
|
32367
|
-
};
|
|
32368
|
-
defaultHandlers = typeHandlers(types5);
|
|
32369
|
-
builders = Object.entries({
|
|
32370
|
-
values,
|
|
32371
|
-
in: (...xs) => {
|
|
32372
|
-
const x = values(...xs);
|
|
32373
|
-
return x === "()" ? "(null)" : x;
|
|
32374
|
-
},
|
|
32375
|
-
select: select2,
|
|
32376
|
-
as: select2,
|
|
32377
|
-
returning: select2,
|
|
32378
|
-
"\\(": select2,
|
|
32379
|
-
update(first, rest, parameters, types, options) {
|
|
32380
|
-
return (rest.length ? rest.flat() : Object.keys(first)).map((x) => escapeIdentifier(options.transform.column.to ? options.transform.column.to(x) : x) + "=" + stringifyValue("values", first[x], parameters, types, options));
|
|
32381
|
-
},
|
|
32382
|
-
insert(first, rest, parameters, types, options) {
|
|
32383
|
-
const columns = rest.length ? rest.flat() : Object.keys(Array.isArray(first) ? first[0] : first);
|
|
32384
|
-
return "(" + escapeIdentifiers(columns, options) + ")values" + valuesBuilder(Array.isArray(first) ? first : [first], parameters, types, columns, options);
|
|
32385
|
-
}
|
|
32386
|
-
}).map(([x, fn]) => [new RegExp("((?:^|[\\s(])" + x + "(?:$|[\\s(]))(?![\\s\\S]*\\1)", "i"), fn]);
|
|
32387
|
-
serializers = defaultHandlers.serializers;
|
|
32388
|
-
parsers = defaultHandlers.parsers;
|
|
32389
|
-
escapeBackslash = /\\/g;
|
|
32390
|
-
escapeQuote = /"/g;
|
|
32391
|
-
arrayParserState = {
|
|
32392
|
-
i: 0,
|
|
32393
|
-
char: null,
|
|
32394
|
-
str: "",
|
|
32395
|
-
quoted: false,
|
|
32396
|
-
last: 0
|
|
32397
|
-
};
|
|
32398
|
-
toCamel.column = { from: toCamel };
|
|
32399
|
-
toCamel.value = { from: createJsonTransform(toCamel) };
|
|
32400
|
-
fromCamel.column = { to: fromCamel };
|
|
32401
|
-
camel = { ...toCamel };
|
|
32402
|
-
camel.column.to = fromCamel;
|
|
32403
|
-
toPascal.column = { from: toPascal };
|
|
32404
|
-
toPascal.value = { from: createJsonTransform(toPascal) };
|
|
32405
|
-
fromPascal.column = { to: fromPascal };
|
|
32406
|
-
pascal = { ...toPascal };
|
|
32407
|
-
pascal.column.to = fromPascal;
|
|
32408
|
-
toKebab.column = { from: toKebab };
|
|
32409
|
-
toKebab.value = { from: createJsonTransform(toKebab) };
|
|
32410
|
-
fromKebab.column = { to: fromKebab };
|
|
32411
|
-
kebab = { ...toKebab };
|
|
32412
|
-
kebab.column.to = fromKebab;
|
|
32413
|
-
});
|
|
32414
|
-
|
|
32415
|
-
// ../../node_modules/postgres/src/result.js
|
|
32416
|
-
var Result;
|
|
32417
|
-
var init_result2 = __esm(() => {
|
|
32418
|
-
Result = class Result extends Array {
|
|
32419
|
-
constructor() {
|
|
32420
|
-
super();
|
|
32421
|
-
Object.defineProperties(this, {
|
|
32422
|
-
count: { value: null, writable: true },
|
|
32423
|
-
state: { value: null, writable: true },
|
|
32424
|
-
command: { value: null, writable: true },
|
|
32425
|
-
columns: { value: null, writable: true },
|
|
32426
|
-
statement: { value: null, writable: true }
|
|
32427
|
-
});
|
|
32428
|
-
}
|
|
32429
|
-
static get [Symbol.species]() {
|
|
32430
|
-
return Array;
|
|
32431
|
-
}
|
|
32432
|
-
};
|
|
32433
|
-
});
|
|
32434
|
-
|
|
32435
|
-
// ../../node_modules/postgres/src/queue.js
|
|
32436
|
-
function Queue(initial = []) {
|
|
32437
|
-
let xs = initial.slice();
|
|
32438
|
-
let index = 0;
|
|
32439
|
-
return {
|
|
32440
|
-
get length() {
|
|
32441
|
-
return xs.length - index;
|
|
32442
|
-
},
|
|
32443
|
-
remove: (x) => {
|
|
32444
|
-
const index = xs.indexOf(x);
|
|
32445
|
-
return index === -1 ? null : (xs.splice(index, 1), x);
|
|
32446
|
-
},
|
|
32447
|
-
push: (x) => (xs.push(x), x),
|
|
32448
|
-
shift: () => {
|
|
32449
|
-
const out = xs[index++];
|
|
32450
|
-
if (index === xs.length) {
|
|
32451
|
-
index = 0;
|
|
32452
|
-
xs = [];
|
|
32453
|
-
} else {
|
|
32454
|
-
xs[index - 1] = undefined;
|
|
32455
|
-
}
|
|
32456
|
-
return out;
|
|
32457
|
-
}
|
|
32458
|
-
};
|
|
32459
|
-
}
|
|
32460
|
-
var queue_default;
|
|
32461
|
-
var init_queue = __esm(() => {
|
|
32462
|
-
queue_default = Queue;
|
|
32463
|
-
});
|
|
32464
|
-
|
|
32465
|
-
// ../../node_modules/postgres/src/bytes.js
|
|
32466
|
-
function fit(x) {
|
|
32467
|
-
if (buffer.length - b2.i < x) {
|
|
32468
|
-
const prev = buffer, length = prev.length;
|
|
32469
|
-
buffer = Buffer.allocUnsafe(length + (length >> 1) + x);
|
|
32470
|
-
prev.copy(buffer);
|
|
32471
|
-
}
|
|
32472
|
-
}
|
|
32473
|
-
function reset3() {
|
|
32474
|
-
b2.i = 0;
|
|
32475
|
-
return b2;
|
|
32476
|
-
}
|
|
32477
|
-
var size = 256, buffer, messages, b2, bytes_default;
|
|
32478
|
-
var init_bytes = __esm(() => {
|
|
32479
|
-
buffer = Buffer.allocUnsafe(size);
|
|
32480
|
-
messages = "BCcDdEFfHPpQSX".split("").reduce((acc, x) => {
|
|
32481
|
-
const v = x.charCodeAt(0);
|
|
32482
|
-
acc[x] = () => {
|
|
32483
|
-
buffer[0] = v;
|
|
32484
|
-
b2.i = 5;
|
|
32485
|
-
return b2;
|
|
32486
|
-
};
|
|
32487
|
-
return acc;
|
|
32488
|
-
}, {});
|
|
32489
|
-
b2 = Object.assign(reset3, messages, {
|
|
32490
|
-
N: String.fromCharCode(0),
|
|
32491
|
-
i: 0,
|
|
32492
|
-
inc(x) {
|
|
32493
|
-
b2.i += x;
|
|
32494
|
-
return b2;
|
|
32495
|
-
},
|
|
32496
|
-
str(x) {
|
|
32497
|
-
const length = Buffer.byteLength(x);
|
|
32498
|
-
fit(length);
|
|
32499
|
-
b2.i += buffer.write(x, b2.i, length, "utf8");
|
|
32500
|
-
return b2;
|
|
32501
|
-
},
|
|
32502
|
-
i16(x) {
|
|
32503
|
-
fit(2);
|
|
32504
|
-
buffer.writeUInt16BE(x, b2.i);
|
|
32505
|
-
b2.i += 2;
|
|
32506
|
-
return b2;
|
|
32507
|
-
},
|
|
32508
|
-
i32(x, i) {
|
|
32509
|
-
if (i || i === 0) {
|
|
32510
|
-
buffer.writeUInt32BE(x, i);
|
|
32511
|
-
return b2;
|
|
32512
|
-
}
|
|
32513
|
-
fit(4);
|
|
32514
|
-
buffer.writeUInt32BE(x, b2.i);
|
|
32515
|
-
b2.i += 4;
|
|
32516
|
-
return b2;
|
|
32517
|
-
},
|
|
32518
|
-
z(x) {
|
|
32519
|
-
fit(x);
|
|
32520
|
-
buffer.fill(0, b2.i, b2.i + x);
|
|
32521
|
-
b2.i += x;
|
|
32522
|
-
return b2;
|
|
32523
|
-
},
|
|
32524
|
-
raw(x) {
|
|
32525
|
-
buffer = Buffer.concat([buffer.subarray(0, b2.i), x]);
|
|
32526
|
-
b2.i = buffer.length;
|
|
32527
|
-
return b2;
|
|
32528
|
-
},
|
|
32529
|
-
end(at = 1) {
|
|
32530
|
-
buffer.writeUInt32BE(b2.i - at, at);
|
|
32531
|
-
const out = buffer.subarray(0, b2.i);
|
|
32532
|
-
b2.i = 0;
|
|
32533
|
-
buffer = Buffer.allocUnsafe(size);
|
|
32534
|
-
return out;
|
|
32535
|
-
}
|
|
32536
|
-
});
|
|
32537
|
-
bytes_default = b2;
|
|
32538
|
-
});
|
|
32539
|
-
|
|
32540
|
-
// ../../node_modules/postgres/src/connection.js
|
|
32541
|
-
import net2 from "net";
|
|
32542
|
-
import tls from "tls";
|
|
32543
|
-
import crypto2 from "crypto";
|
|
32544
|
-
import Stream from "stream";
|
|
32545
|
-
import { performance } from "perf_hooks";
|
|
32546
|
-
function Connection(options, queues = {}, { onopen = noop5, onend = noop5, onclose = noop5 } = {}) {
|
|
32547
|
-
const {
|
|
32548
|
-
sslnegotiation,
|
|
32549
|
-
ssl,
|
|
32550
|
-
max,
|
|
32551
|
-
user,
|
|
32552
|
-
host,
|
|
32553
|
-
port,
|
|
32554
|
-
database,
|
|
32555
|
-
parsers,
|
|
32556
|
-
transform,
|
|
32557
|
-
onnotice,
|
|
32558
|
-
onnotify,
|
|
32559
|
-
onparameter,
|
|
32560
|
-
max_pipeline,
|
|
32561
|
-
keep_alive,
|
|
32562
|
-
backoff,
|
|
32563
|
-
target_session_attrs
|
|
32564
|
-
} = options;
|
|
32565
|
-
const sent = queue_default(), id = uid++, backend = { pid: null, secret: null }, idleTimer = timer2(end, options.idle_timeout), lifeTimer = timer2(end, options.max_lifetime), connectTimer = timer2(connectTimedOut, options.connect_timeout);
|
|
32566
|
-
let socket = null, cancelMessage, errorResponse = null, result = new Result, incoming = Buffer.alloc(0), needsTypes = options.fetch_types, backendParameters = {}, statements = {}, statementId = Math.random().toString(36).slice(2), statementCount = 1, closedTime = 0, remaining = 0, hostIndex = 0, retries = 0, length = 0, delay = 0, rows = 0, serverSignature = null, nextWriteTimer = null, terminated = false, incomings = null, results = null, initial = null, ending = null, stream = null, chunk = null, ended = null, nonce = null, query = null, final = null;
|
|
32567
|
-
const connection = {
|
|
32568
|
-
queue: queues.closed,
|
|
32569
|
-
idleTimer,
|
|
32570
|
-
connect(query) {
|
|
32571
|
-
initial = query;
|
|
32572
|
-
reconnect();
|
|
32573
|
-
},
|
|
32574
|
-
terminate,
|
|
32575
|
-
execute,
|
|
32576
|
-
cancel,
|
|
32577
|
-
end,
|
|
32578
|
-
count: 0,
|
|
32579
|
-
id
|
|
32580
|
-
};
|
|
32581
|
-
queues.closed && queues.closed.push(connection);
|
|
32582
|
-
return connection;
|
|
32583
|
-
async function createSocket() {
|
|
32584
|
-
let x;
|
|
32585
|
-
try {
|
|
32586
|
-
x = options.socket ? await Promise.resolve(options.socket(options)) : new net2.Socket;
|
|
32587
|
-
} catch (e) {
|
|
32588
|
-
error(e);
|
|
32589
|
-
return;
|
|
32590
|
-
}
|
|
32591
|
-
x.on("error", error);
|
|
32592
|
-
x.on("close", closed);
|
|
32593
|
-
x.on("drain", drain);
|
|
32594
|
-
return x;
|
|
32595
|
-
}
|
|
32596
|
-
async function cancel({ pid, secret }, resolve, reject) {
|
|
32597
|
-
try {
|
|
32598
|
-
cancelMessage = bytes_default().i32(16).i32(80877102).i32(pid).i32(secret).end(16);
|
|
32599
|
-
await connect();
|
|
32600
|
-
socket.once("error", reject);
|
|
32601
|
-
socket.once("close", resolve);
|
|
32602
|
-
} catch (error) {
|
|
32603
|
-
reject(error);
|
|
32604
|
-
}
|
|
32605
|
-
}
|
|
32606
|
-
function execute(q) {
|
|
32607
|
-
if (terminated)
|
|
32608
|
-
return queryError(q, Errors.connection("CONNECTION_DESTROYED", options));
|
|
32609
|
-
if (stream)
|
|
32610
|
-
return queryError(q, Errors.generic("COPY_IN_PROGRESS", "You cannot execute queries during copy"));
|
|
32611
|
-
if (q.cancelled)
|
|
32612
|
-
return;
|
|
32613
|
-
try {
|
|
32614
|
-
q.state = backend;
|
|
32615
|
-
query ? sent.push(q) : (query = q, query.active = true);
|
|
32616
|
-
build(q);
|
|
32617
|
-
return write(toBuffer(q)) && !q.describeFirst && !q.cursorFn && sent.length < max_pipeline && (!q.options.onexecute || q.options.onexecute(connection));
|
|
32618
|
-
} catch (error) {
|
|
32619
|
-
sent.length === 0 && write(Sync);
|
|
32620
|
-
errored(error);
|
|
32621
|
-
return true;
|
|
32622
|
-
}
|
|
32623
|
-
}
|
|
32624
|
-
function toBuffer(q) {
|
|
32625
|
-
if (q.parameters.length >= 65534)
|
|
32626
|
-
throw Errors.generic("MAX_PARAMETERS_EXCEEDED", "Max number of parameters (65534) exceeded");
|
|
32627
|
-
return q.options.simple ? bytes_default().Q().str(q.statement.string + bytes_default.N).end() : q.describeFirst ? Buffer.concat([describe(q), Flush]) : q.prepare ? q.prepared ? prepared(q) : Buffer.concat([describe(q), prepared(q)]) : unnamed(q);
|
|
32628
|
-
}
|
|
32629
|
-
function describe(q) {
|
|
32630
|
-
return Buffer.concat([
|
|
32631
|
-
Parse(q.statement.string, q.parameters, q.statement.types, q.statement.name),
|
|
32632
|
-
Describe("S", q.statement.name)
|
|
32633
|
-
]);
|
|
32634
|
-
}
|
|
32635
|
-
function prepared(q) {
|
|
32636
|
-
return Buffer.concat([
|
|
32637
|
-
Bind(q.parameters, q.statement.types, q.statement.name, q.cursorName),
|
|
32638
|
-
q.cursorFn ? Execute("", q.cursorRows) : ExecuteUnnamed
|
|
32639
|
-
]);
|
|
32640
|
-
}
|
|
32641
|
-
function unnamed(q) {
|
|
32642
|
-
return Buffer.concat([
|
|
32643
|
-
Parse(q.statement.string, q.parameters, q.statement.types),
|
|
32644
|
-
DescribeUnnamed,
|
|
32645
|
-
prepared(q)
|
|
32646
|
-
]);
|
|
32647
|
-
}
|
|
32648
|
-
function build(q) {
|
|
32649
|
-
const parameters = [], types = [];
|
|
32650
|
-
const string = stringify(q, q.strings[0], q.args[0], parameters, types, options);
|
|
32651
|
-
!q.tagged && q.args.forEach((x) => handleValue(x, parameters, types, options));
|
|
32652
|
-
q.prepare = options.prepare && ("prepare" in q.options ? q.options.prepare : true);
|
|
32653
|
-
q.string = string;
|
|
32654
|
-
q.signature = q.prepare && types + string;
|
|
32655
|
-
q.onlyDescribe && delete statements[q.signature];
|
|
32656
|
-
q.parameters = q.parameters || parameters;
|
|
32657
|
-
q.prepared = q.prepare && q.signature in statements;
|
|
32658
|
-
q.describeFirst = q.onlyDescribe || parameters.length && !q.prepared;
|
|
32659
|
-
q.statement = q.prepared ? statements[q.signature] : { string, types, name: q.prepare ? statementId + statementCount++ : "" };
|
|
32660
|
-
typeof options.debug === "function" && options.debug(id, string, parameters, types);
|
|
32661
|
-
}
|
|
32662
|
-
function write(x, fn) {
|
|
32663
|
-
chunk = chunk ? Buffer.concat([chunk, x]) : Buffer.from(x);
|
|
32664
|
-
if (fn || chunk.length >= 1024)
|
|
32665
|
-
return nextWrite(fn);
|
|
32666
|
-
nextWriteTimer === null && (nextWriteTimer = setImmediate(nextWrite));
|
|
32667
|
-
return true;
|
|
32668
|
-
}
|
|
32669
|
-
function nextWrite(fn) {
|
|
32670
|
-
const x = socket.write(chunk, fn);
|
|
32671
|
-
nextWriteTimer !== null && clearImmediate(nextWriteTimer);
|
|
32672
|
-
chunk = nextWriteTimer = null;
|
|
32673
|
-
return x;
|
|
32674
|
-
}
|
|
32675
|
-
function connectTimedOut() {
|
|
32676
|
-
errored(Errors.connection("CONNECT_TIMEOUT", options, socket));
|
|
32677
|
-
socket.destroy();
|
|
32678
|
-
}
|
|
32679
|
-
async function secure() {
|
|
32680
|
-
if (sslnegotiation !== "direct") {
|
|
32681
|
-
write(SSLRequest);
|
|
32682
|
-
const canSSL = await new Promise((r) => socket.once("data", (x) => r(x[0] === 83)));
|
|
32683
|
-
if (!canSSL && ssl === "prefer")
|
|
32684
|
-
return connected();
|
|
32685
|
-
}
|
|
32686
|
-
const options = {
|
|
32687
|
-
socket,
|
|
32688
|
-
servername: net2.isIP(socket.host) ? undefined : socket.host
|
|
32689
|
-
};
|
|
32690
|
-
if (sslnegotiation === "direct")
|
|
32691
|
-
options.ALPNProtocols = ["postgresql"];
|
|
32692
|
-
if (ssl === "require" || ssl === "allow" || ssl === "prefer")
|
|
32693
|
-
options.rejectUnauthorized = false;
|
|
32694
|
-
else if (typeof ssl === "object")
|
|
32695
|
-
Object.assign(options, ssl);
|
|
32696
|
-
socket.removeAllListeners();
|
|
32697
|
-
socket = tls.connect(options);
|
|
32698
|
-
socket.on("secureConnect", connected);
|
|
32699
|
-
socket.on("error", error);
|
|
32700
|
-
socket.on("close", closed);
|
|
32701
|
-
socket.on("drain", drain);
|
|
32702
|
-
}
|
|
32703
|
-
function drain() {
|
|
32704
|
-
!query && onopen(connection);
|
|
32705
|
-
}
|
|
32706
|
-
function data(x) {
|
|
32707
|
-
if (incomings) {
|
|
32708
|
-
incomings.push(x);
|
|
32709
|
-
remaining -= x.length;
|
|
32710
|
-
if (remaining > 0)
|
|
32711
|
-
return;
|
|
32712
|
-
}
|
|
32713
|
-
incoming = incomings ? Buffer.concat(incomings, length - remaining) : incoming.length === 0 ? x : Buffer.concat([incoming, x], incoming.length + x.length);
|
|
32714
|
-
while (incoming.length > 4) {
|
|
32715
|
-
length = incoming.readUInt32BE(1);
|
|
32716
|
-
if (length >= incoming.length) {
|
|
32717
|
-
remaining = length - incoming.length;
|
|
32718
|
-
incomings = [incoming];
|
|
32719
|
-
break;
|
|
32720
|
-
}
|
|
32721
|
-
try {
|
|
32722
|
-
handle(incoming.subarray(0, length + 1));
|
|
32723
|
-
} catch (e) {
|
|
32724
|
-
query && (query.cursorFn || query.describeFirst) && write(Sync);
|
|
32725
|
-
errored(e);
|
|
32726
|
-
}
|
|
32727
|
-
incoming = incoming.subarray(length + 1);
|
|
32728
|
-
remaining = 0;
|
|
32729
|
-
incomings = null;
|
|
32730
|
-
}
|
|
32731
|
-
}
|
|
32732
|
-
async function connect() {
|
|
32733
|
-
terminated = false;
|
|
32734
|
-
backendParameters = {};
|
|
32735
|
-
socket || (socket = await createSocket());
|
|
32736
|
-
if (!socket)
|
|
32737
|
-
return;
|
|
32738
|
-
connectTimer.start();
|
|
32739
|
-
if (options.socket)
|
|
32740
|
-
return ssl ? secure() : connected();
|
|
32741
|
-
socket.on("connect", ssl ? secure : connected);
|
|
32742
|
-
if (options.path)
|
|
32743
|
-
return socket.connect(options.path);
|
|
32744
|
-
socket.ssl = ssl;
|
|
32745
|
-
socket.connect(port[hostIndex], host[hostIndex]);
|
|
32746
|
-
socket.host = host[hostIndex];
|
|
32747
|
-
socket.port = port[hostIndex];
|
|
32748
|
-
hostIndex = (hostIndex + 1) % port.length;
|
|
32749
|
-
}
|
|
32750
|
-
function reconnect() {
|
|
32751
|
-
setTimeout(connect, closedTime ? Math.max(0, closedTime + delay - performance.now()) : 0);
|
|
32752
|
-
}
|
|
32753
|
-
function connected() {
|
|
32754
|
-
try {
|
|
32755
|
-
statements = {};
|
|
32756
|
-
needsTypes = options.fetch_types;
|
|
32757
|
-
statementId = Math.random().toString(36).slice(2);
|
|
32758
|
-
statementCount = 1;
|
|
32759
|
-
lifeTimer.start();
|
|
32760
|
-
socket.on("data", data);
|
|
32761
|
-
keep_alive && socket.setKeepAlive && socket.setKeepAlive(true, 1000 * keep_alive);
|
|
32762
|
-
const s = StartupMessage();
|
|
32763
|
-
write(s);
|
|
32764
|
-
} catch (err) {
|
|
32765
|
-
error(err);
|
|
32766
|
-
}
|
|
32767
|
-
}
|
|
32768
|
-
function error(err) {
|
|
32769
|
-
if (connection.queue === queues.connecting && options.host[retries + 1])
|
|
32770
|
-
return;
|
|
32771
|
-
errored(err);
|
|
32772
|
-
while (sent.length)
|
|
32773
|
-
queryError(sent.shift(), err);
|
|
32774
|
-
}
|
|
32775
|
-
function errored(err) {
|
|
32776
|
-
stream && (stream.destroy(err), stream = null);
|
|
32777
|
-
query && queryError(query, err);
|
|
32778
|
-
initial && (queryError(initial, err), initial = null);
|
|
32779
|
-
}
|
|
32780
|
-
function queryError(query, err) {
|
|
32781
|
-
if (query.reserve)
|
|
32782
|
-
return query.reject(err);
|
|
32783
|
-
if (!err || typeof err !== "object")
|
|
32784
|
-
err = new Error(err);
|
|
32785
|
-
"query" in err || "parameters" in err || Object.defineProperties(err, {
|
|
32786
|
-
stack: { value: err.stack + query.origin.replace(/.*\n/, `
|
|
32787
|
-
`), enumerable: options.debug },
|
|
32788
|
-
query: { value: query.string, enumerable: options.debug },
|
|
32789
|
-
parameters: { value: query.parameters, enumerable: options.debug },
|
|
32790
|
-
args: { value: query.args, enumerable: options.debug },
|
|
32791
|
-
types: { value: query.statement && query.statement.types, enumerable: options.debug }
|
|
32792
|
-
});
|
|
32793
|
-
query.reject(err);
|
|
32794
|
-
}
|
|
32795
|
-
function end() {
|
|
32796
|
-
return ending || (!connection.reserved && onend(connection), !connection.reserved && !initial && !query && sent.length === 0 ? (terminate(), new Promise((r) => socket && socket.readyState !== "closed" ? socket.once("close", r) : r())) : ending = new Promise((r) => ended = r));
|
|
32797
|
-
}
|
|
32798
|
-
function terminate() {
|
|
32799
|
-
terminated = true;
|
|
32800
|
-
if (stream || query || initial || sent.length)
|
|
32801
|
-
error(Errors.connection("CONNECTION_DESTROYED", options));
|
|
32802
|
-
clearImmediate(nextWriteTimer);
|
|
32803
|
-
if (socket) {
|
|
32804
|
-
socket.removeListener("data", data);
|
|
32805
|
-
socket.removeListener("connect", connected);
|
|
32806
|
-
socket.readyState === "open" && socket.end(bytes_default().X().end());
|
|
32807
|
-
}
|
|
32808
|
-
ended && (ended(), ending = ended = null);
|
|
32809
|
-
}
|
|
32810
|
-
async function closed(hadError) {
|
|
32811
|
-
incoming = Buffer.alloc(0);
|
|
32812
|
-
remaining = 0;
|
|
32813
|
-
incomings = null;
|
|
32814
|
-
clearImmediate(nextWriteTimer);
|
|
32815
|
-
socket.removeListener("data", data);
|
|
32816
|
-
socket.removeListener("connect", connected);
|
|
32817
|
-
idleTimer.cancel();
|
|
32818
|
-
lifeTimer.cancel();
|
|
32819
|
-
connectTimer.cancel();
|
|
32820
|
-
socket.removeAllListeners();
|
|
32821
|
-
socket = null;
|
|
32822
|
-
if (initial)
|
|
32823
|
-
return reconnect();
|
|
32824
|
-
!hadError && (query || sent.length) && error(Errors.connection("CONNECTION_CLOSED", options, socket));
|
|
32825
|
-
closedTime = performance.now();
|
|
32826
|
-
hadError && options.shared.retries++;
|
|
32827
|
-
delay = (typeof backoff === "function" ? backoff(options.shared.retries) : backoff) * 1000;
|
|
32828
|
-
onclose(connection, Errors.connection("CONNECTION_CLOSED", options, socket));
|
|
32829
|
-
}
|
|
32830
|
-
function handle(xs, x = xs[0]) {
|
|
32831
|
-
(x === 68 ? DataRow : x === 100 ? CopyData : x === 65 ? NotificationResponse : x === 83 ? ParameterStatus : x === 90 ? ReadyForQuery : x === 67 ? CommandComplete : x === 50 ? BindComplete : x === 49 ? ParseComplete : x === 116 ? ParameterDescription : x === 84 ? RowDescription : x === 82 ? Authentication : x === 110 ? NoData : x === 75 ? BackendKeyData : x === 69 ? ErrorResponse : x === 115 ? PortalSuspended : x === 51 ? CloseComplete : x === 71 ? CopyInResponse : x === 78 ? NoticeResponse : x === 72 ? CopyOutResponse : x === 99 ? CopyDone : x === 73 ? EmptyQueryResponse : x === 86 ? FunctionCallResponse : x === 118 ? NegotiateProtocolVersion : x === 87 ? CopyBothResponse : UnknownMessage)(xs);
|
|
32832
|
-
}
|
|
32833
|
-
function DataRow(x) {
|
|
32834
|
-
let index = 7;
|
|
32835
|
-
let length;
|
|
32836
|
-
let column;
|
|
32837
|
-
let value;
|
|
32838
|
-
const row = query.isRaw ? new Array(query.statement.columns.length) : {};
|
|
32839
|
-
for (let i = 0;i < query.statement.columns.length; i++) {
|
|
32840
|
-
column = query.statement.columns[i];
|
|
32841
|
-
length = x.readInt32BE(index);
|
|
32842
|
-
index += 4;
|
|
32843
|
-
value = length === -1 ? null : query.isRaw === true ? x.subarray(index, index += length) : column.parser === undefined ? x.toString("utf8", index, index += length) : column.parser.array === true ? column.parser(x.toString("utf8", index + 1, index += length)) : column.parser(x.toString("utf8", index, index += length));
|
|
32844
|
-
query.isRaw ? row[i] = query.isRaw === true ? value : transform.value.from ? transform.value.from(value, column) : value : row[column.name] = transform.value.from ? transform.value.from(value, column) : value;
|
|
32845
|
-
}
|
|
32846
|
-
query.forEachFn ? query.forEachFn(transform.row.from ? transform.row.from(row) : row, result) : result[rows++] = transform.row.from ? transform.row.from(row) : row;
|
|
32847
|
-
}
|
|
32848
|
-
function ParameterStatus(x) {
|
|
32849
|
-
const [k, v] = x.toString("utf8", 5, x.length - 1).split(bytes_default.N);
|
|
32850
|
-
backendParameters[k] = v;
|
|
32851
|
-
if (options.parameters[k] !== v) {
|
|
32852
|
-
options.parameters[k] = v;
|
|
32853
|
-
onparameter && onparameter(k, v);
|
|
32854
|
-
}
|
|
32855
|
-
}
|
|
32856
|
-
function ReadyForQuery(x) {
|
|
32857
|
-
if (query) {
|
|
32858
|
-
if (errorResponse) {
|
|
32859
|
-
query.retried ? errored(query.retried) : query.prepared && retryRoutines.has(errorResponse.routine) ? retry(query, errorResponse) : errored(errorResponse);
|
|
32860
|
-
} else {
|
|
32861
|
-
query.resolve(results || result);
|
|
32862
|
-
}
|
|
32863
|
-
} else if (errorResponse) {
|
|
32864
|
-
errored(errorResponse);
|
|
32865
|
-
}
|
|
32866
|
-
query = results = errorResponse = null;
|
|
32867
|
-
result = new Result;
|
|
32868
|
-
connectTimer.cancel();
|
|
32869
|
-
if (initial) {
|
|
32870
|
-
if (target_session_attrs) {
|
|
32871
|
-
if (!backendParameters.in_hot_standby || !backendParameters.default_transaction_read_only)
|
|
32872
|
-
return fetchState();
|
|
32873
|
-
else if (tryNext(target_session_attrs, backendParameters))
|
|
32874
|
-
return terminate();
|
|
32875
|
-
}
|
|
32876
|
-
if (needsTypes) {
|
|
32877
|
-
initial.reserve && (initial = null);
|
|
32878
|
-
return fetchArrayTypes();
|
|
32879
|
-
}
|
|
32880
|
-
initial && !initial.reserve && execute(initial);
|
|
32881
|
-
options.shared.retries = retries = 0;
|
|
32882
|
-
initial = null;
|
|
32883
|
-
return;
|
|
32884
|
-
}
|
|
32885
|
-
while (sent.length && (query = sent.shift()) && (query.active = true, query.cancelled))
|
|
32886
|
-
Connection(options).cancel(query.state, query.cancelled.resolve, query.cancelled.reject);
|
|
32887
|
-
if (query)
|
|
32888
|
-
return;
|
|
32889
|
-
connection.reserved ? !connection.reserved.release && x[5] === 73 ? ending ? terminate() : (connection.reserved = null, onopen(connection)) : connection.reserved() : ending ? terminate() : onopen(connection);
|
|
32890
|
-
}
|
|
32891
|
-
function CommandComplete(x) {
|
|
32892
|
-
rows = 0;
|
|
32893
|
-
for (let i = x.length - 1;i > 0; i--) {
|
|
32894
|
-
if (x[i] === 32 && x[i + 1] < 58 && result.count === null)
|
|
32895
|
-
result.count = +x.toString("utf8", i + 1, x.length - 1);
|
|
32896
|
-
if (x[i - 1] >= 65) {
|
|
32897
|
-
result.command = x.toString("utf8", 5, i);
|
|
32898
|
-
result.state = backend;
|
|
32899
|
-
break;
|
|
32900
|
-
}
|
|
32901
|
-
}
|
|
32902
|
-
final && (final(), final = null);
|
|
32903
|
-
if (result.command === "BEGIN" && max !== 1 && !connection.reserved)
|
|
32904
|
-
return errored(Errors.generic("UNSAFE_TRANSACTION", "Only use sql.begin, sql.reserved or max: 1"));
|
|
32905
|
-
if (query.options.simple)
|
|
32906
|
-
return BindComplete();
|
|
32907
|
-
if (query.cursorFn) {
|
|
32908
|
-
result.count && query.cursorFn(result);
|
|
32909
|
-
write(Sync);
|
|
32910
|
-
}
|
|
32911
|
-
}
|
|
32912
|
-
function ParseComplete() {
|
|
32913
|
-
query.parsing = false;
|
|
32914
|
-
}
|
|
32915
|
-
function BindComplete() {
|
|
32916
|
-
!result.statement && (result.statement = query.statement);
|
|
32917
|
-
result.columns = query.statement.columns;
|
|
32918
|
-
}
|
|
32919
|
-
function ParameterDescription(x) {
|
|
32920
|
-
const length = x.readUInt16BE(5);
|
|
32921
|
-
for (let i = 0;i < length; ++i)
|
|
32922
|
-
!query.statement.types[i] && (query.statement.types[i] = x.readUInt32BE(7 + i * 4));
|
|
32923
|
-
query.prepare && (statements[query.signature] = query.statement);
|
|
32924
|
-
query.describeFirst && !query.onlyDescribe && (write(prepared(query)), query.describeFirst = false);
|
|
32925
|
-
}
|
|
32926
|
-
function RowDescription(x) {
|
|
32927
|
-
if (result.command) {
|
|
32928
|
-
results = results || [result];
|
|
32929
|
-
results.push(result = new Result);
|
|
32930
|
-
result.count = null;
|
|
32931
|
-
query.statement.columns = null;
|
|
32932
|
-
}
|
|
32933
|
-
const length = x.readUInt16BE(5);
|
|
32934
|
-
let index = 7;
|
|
32935
|
-
let start;
|
|
32936
|
-
query.statement.columns = Array(length);
|
|
32937
|
-
for (let i = 0;i < length; ++i) {
|
|
32938
|
-
start = index;
|
|
32939
|
-
while (x[index++] !== 0)
|
|
32940
|
-
;
|
|
32941
|
-
const table = x.readUInt32BE(index);
|
|
32942
|
-
const number = x.readUInt16BE(index + 4);
|
|
32943
|
-
const type = x.readUInt32BE(index + 6);
|
|
32944
|
-
query.statement.columns[i] = {
|
|
32945
|
-
name: transform.column.from ? transform.column.from(x.toString("utf8", start, index - 1)) : x.toString("utf8", start, index - 1),
|
|
32946
|
-
parser: parsers[type],
|
|
32947
|
-
table,
|
|
32948
|
-
number,
|
|
32949
|
-
type
|
|
32950
|
-
};
|
|
32951
|
-
index += 18;
|
|
32952
|
-
}
|
|
32953
|
-
result.statement = query.statement;
|
|
32954
|
-
if (query.onlyDescribe)
|
|
32955
|
-
return query.resolve(query.statement), write(Sync);
|
|
32956
|
-
}
|
|
32957
|
-
async function Authentication(x, type = x.readUInt32BE(5)) {
|
|
32958
|
-
(type === 3 ? AuthenticationCleartextPassword : type === 5 ? AuthenticationMD5Password : type === 10 ? SASL : type === 11 ? SASLContinue : type === 12 ? SASLFinal : type !== 0 ? UnknownAuth : noop5)(x, type);
|
|
32959
|
-
}
|
|
32960
|
-
async function AuthenticationCleartextPassword() {
|
|
32961
|
-
const payload = await Pass();
|
|
32962
|
-
write(bytes_default().p().str(payload).z(1).end());
|
|
32963
|
-
}
|
|
32964
|
-
async function AuthenticationMD5Password(x) {
|
|
32965
|
-
const payload = "md5" + await md5(Buffer.concat([
|
|
32966
|
-
Buffer.from(await md5(await Pass() + user)),
|
|
32967
|
-
x.subarray(9)
|
|
32968
|
-
]));
|
|
32969
|
-
write(bytes_default().p().str(payload).z(1).end());
|
|
32970
|
-
}
|
|
32971
|
-
async function SASL() {
|
|
32972
|
-
nonce = (await crypto2.randomBytes(18)).toString("base64");
|
|
32973
|
-
bytes_default().p().str("SCRAM-SHA-256" + bytes_default.N);
|
|
32974
|
-
const i = bytes_default.i;
|
|
32975
|
-
write(bytes_default.inc(4).str("n,,n=*,r=" + nonce).i32(bytes_default.i - i - 4, i).end());
|
|
32976
|
-
}
|
|
32977
|
-
async function SASLContinue(x) {
|
|
32978
|
-
const res = x.toString("utf8", 9).split(",").reduce((acc, x) => (acc[x[0]] = x.slice(2), acc), {});
|
|
32979
|
-
const saltedPassword = await crypto2.pbkdf2Sync(await Pass(), Buffer.from(res.s, "base64"), parseInt(res.i), 32, "sha256");
|
|
32980
|
-
const clientKey = await hmac(saltedPassword, "Client Key");
|
|
32981
|
-
const auth = "n=*,r=" + nonce + "," + "r=" + res.r + ",s=" + res.s + ",i=" + res.i + ",c=biws,r=" + res.r;
|
|
32982
|
-
serverSignature = (await hmac(await hmac(saltedPassword, "Server Key"), auth)).toString("base64");
|
|
32983
|
-
const payload = "c=biws,r=" + res.r + ",p=" + xor(clientKey, Buffer.from(await hmac(await sha256(clientKey), auth))).toString("base64");
|
|
32984
|
-
write(bytes_default().p().str(payload).end());
|
|
32985
|
-
}
|
|
32986
|
-
function SASLFinal(x) {
|
|
32987
|
-
if (x.toString("utf8", 9).split(bytes_default.N, 1)[0].slice(2) === serverSignature)
|
|
32988
|
-
return;
|
|
32989
|
-
errored(Errors.generic("SASL_SIGNATURE_MISMATCH", "The server did not return the correct signature"));
|
|
32990
|
-
socket.destroy();
|
|
32991
|
-
}
|
|
32992
|
-
function Pass() {
|
|
32993
|
-
return Promise.resolve(typeof options.pass === "function" ? options.pass() : options.pass);
|
|
32994
|
-
}
|
|
32995
|
-
function NoData() {
|
|
32996
|
-
result.statement = query.statement;
|
|
32997
|
-
result.statement.columns = [];
|
|
32998
|
-
if (query.onlyDescribe)
|
|
32999
|
-
return query.resolve(query.statement), write(Sync);
|
|
33000
|
-
}
|
|
33001
|
-
function BackendKeyData(x) {
|
|
33002
|
-
backend.pid = x.readUInt32BE(5);
|
|
33003
|
-
backend.secret = x.readUInt32BE(9);
|
|
33004
|
-
}
|
|
33005
|
-
async function fetchArrayTypes() {
|
|
33006
|
-
needsTypes = false;
|
|
33007
|
-
const types = await new Query([`
|
|
33008
|
-
select b.oid, b.typarray
|
|
33009
|
-
from pg_catalog.pg_type a
|
|
33010
|
-
left join pg_catalog.pg_type b on b.oid = a.typelem
|
|
33011
|
-
where a.typcategory = 'A'
|
|
33012
|
-
group by b.oid, b.typarray
|
|
33013
|
-
order by b.oid
|
|
33014
|
-
`], [], execute);
|
|
33015
|
-
types.forEach(({ oid, typarray }) => addArrayType(oid, typarray));
|
|
33016
|
-
}
|
|
33017
|
-
function addArrayType(oid, typarray) {
|
|
33018
|
-
if (!!options.parsers[typarray] && !!options.serializers[typarray])
|
|
33019
|
-
return;
|
|
33020
|
-
const parser = options.parsers[oid];
|
|
33021
|
-
options.shared.typeArrayMap[oid] = typarray;
|
|
33022
|
-
options.parsers[typarray] = (xs) => arrayParser(xs, parser, typarray);
|
|
33023
|
-
options.parsers[typarray].array = true;
|
|
33024
|
-
options.serializers[typarray] = (xs) => arraySerializer(xs, options.serializers[oid], options, typarray);
|
|
33025
|
-
}
|
|
33026
|
-
function tryNext(x, xs) {
|
|
33027
|
-
return x === "read-write" && xs.default_transaction_read_only === "on" || x === "read-only" && xs.default_transaction_read_only === "off" || x === "primary" && xs.in_hot_standby === "on" || x === "standby" && xs.in_hot_standby === "off" || x === "prefer-standby" && xs.in_hot_standby === "off" && options.host[retries];
|
|
33028
|
-
}
|
|
33029
|
-
function fetchState() {
|
|
33030
|
-
const query = new Query([`
|
|
33031
|
-
show transaction_read_only;
|
|
33032
|
-
select pg_catalog.pg_is_in_recovery()
|
|
33033
|
-
`], [], execute, null, { simple: true });
|
|
33034
|
-
query.resolve = ([[a], [b]]) => {
|
|
33035
|
-
backendParameters.default_transaction_read_only = a.transaction_read_only;
|
|
33036
|
-
backendParameters.in_hot_standby = b.pg_is_in_recovery ? "on" : "off";
|
|
33037
|
-
};
|
|
33038
|
-
query.execute();
|
|
33039
|
-
}
|
|
33040
|
-
function ErrorResponse(x) {
|
|
33041
|
-
if (query) {
|
|
33042
|
-
(query.cursorFn || query.describeFirst) && write(Sync);
|
|
33043
|
-
errorResponse = Errors.postgres(parseError(x));
|
|
33044
|
-
} else {
|
|
33045
|
-
errored(Errors.postgres(parseError(x)));
|
|
33046
|
-
}
|
|
33047
|
-
}
|
|
33048
|
-
function retry(q, error) {
|
|
33049
|
-
delete statements[q.signature];
|
|
33050
|
-
q.retried = error;
|
|
33051
|
-
execute(q);
|
|
33052
|
-
}
|
|
33053
|
-
function NotificationResponse(x) {
|
|
33054
|
-
if (!onnotify)
|
|
33055
|
-
return;
|
|
33056
|
-
let index = 9;
|
|
33057
|
-
while (x[index++] !== 0)
|
|
33058
|
-
;
|
|
33059
|
-
onnotify(x.toString("utf8", 9, index - 1), x.toString("utf8", index, x.length - 1));
|
|
33060
|
-
}
|
|
33061
|
-
async function PortalSuspended() {
|
|
33062
|
-
try {
|
|
33063
|
-
const x = await Promise.resolve(query.cursorFn(result));
|
|
33064
|
-
rows = 0;
|
|
33065
|
-
x === CLOSE ? write(Close(query.portal)) : (result = new Result, write(Execute("", query.cursorRows)));
|
|
33066
|
-
} catch (err) {
|
|
33067
|
-
write(Sync);
|
|
33068
|
-
query.reject(err);
|
|
33069
|
-
}
|
|
33070
|
-
}
|
|
33071
|
-
function CloseComplete() {
|
|
33072
|
-
result.count && query.cursorFn(result);
|
|
33073
|
-
query.resolve(result);
|
|
33074
|
-
}
|
|
33075
|
-
function CopyInResponse() {
|
|
33076
|
-
stream = new Stream.Writable({
|
|
33077
|
-
autoDestroy: true,
|
|
33078
|
-
write(chunk, encoding, callback) {
|
|
33079
|
-
socket.write(bytes_default().d().raw(chunk).end(), callback);
|
|
33080
|
-
},
|
|
33081
|
-
destroy(error, callback) {
|
|
33082
|
-
callback(error);
|
|
33083
|
-
socket.write(bytes_default().f().str(error + bytes_default.N).end());
|
|
33084
|
-
stream = null;
|
|
33085
|
-
},
|
|
33086
|
-
final(callback) {
|
|
33087
|
-
socket.write(bytes_default().c().end());
|
|
33088
|
-
final = callback;
|
|
33089
|
-
stream = null;
|
|
33090
|
-
}
|
|
33091
|
-
});
|
|
33092
|
-
query.resolve(stream);
|
|
33093
|
-
}
|
|
33094
|
-
function CopyOutResponse() {
|
|
33095
|
-
stream = new Stream.Readable({
|
|
33096
|
-
read() {
|
|
33097
|
-
socket.resume();
|
|
33098
|
-
}
|
|
33099
|
-
});
|
|
33100
|
-
query.resolve(stream);
|
|
33101
|
-
}
|
|
33102
|
-
function CopyBothResponse() {
|
|
33103
|
-
stream = new Stream.Duplex({
|
|
33104
|
-
autoDestroy: true,
|
|
33105
|
-
read() {
|
|
33106
|
-
socket.resume();
|
|
33107
|
-
},
|
|
33108
|
-
write(chunk, encoding, callback) {
|
|
33109
|
-
socket.write(bytes_default().d().raw(chunk).end(), callback);
|
|
33110
|
-
},
|
|
33111
|
-
destroy(error, callback) {
|
|
33112
|
-
callback(error);
|
|
33113
|
-
socket.write(bytes_default().f().str(error + bytes_default.N).end());
|
|
33114
|
-
stream = null;
|
|
33115
|
-
},
|
|
33116
|
-
final(callback) {
|
|
33117
|
-
socket.write(bytes_default().c().end());
|
|
33118
|
-
final = callback;
|
|
33119
|
-
}
|
|
33120
|
-
});
|
|
33121
|
-
query.resolve(stream);
|
|
33122
|
-
}
|
|
33123
|
-
function CopyData(x) {
|
|
33124
|
-
stream && (stream.push(x.subarray(5)) || socket.pause());
|
|
33125
|
-
}
|
|
33126
|
-
function CopyDone() {
|
|
33127
|
-
stream && stream.push(null);
|
|
33128
|
-
stream = null;
|
|
33129
|
-
}
|
|
33130
|
-
function NoticeResponse(x) {
|
|
33131
|
-
onnotice ? onnotice(parseError(x)) : console.log(parseError(x));
|
|
33132
|
-
}
|
|
33133
|
-
function EmptyQueryResponse() {}
|
|
33134
|
-
function FunctionCallResponse() {
|
|
33135
|
-
errored(Errors.notSupported("FunctionCallResponse"));
|
|
33136
|
-
}
|
|
33137
|
-
function NegotiateProtocolVersion() {
|
|
33138
|
-
errored(Errors.notSupported("NegotiateProtocolVersion"));
|
|
33139
|
-
}
|
|
33140
|
-
function UnknownMessage(x) {
|
|
33141
|
-
console.error("Postgres.js : Unknown Message:", x[0]);
|
|
33142
|
-
}
|
|
33143
|
-
function UnknownAuth(x, type) {
|
|
33144
|
-
console.error("Postgres.js : Unknown Auth:", type);
|
|
33145
|
-
}
|
|
33146
|
-
function Bind(parameters, types, statement = "", portal = "") {
|
|
33147
|
-
let prev, type;
|
|
33148
|
-
bytes_default().B().str(portal + bytes_default.N).str(statement + bytes_default.N).i16(0).i16(parameters.length);
|
|
33149
|
-
parameters.forEach((x, i) => {
|
|
33150
|
-
if (x === null)
|
|
33151
|
-
return bytes_default.i32(4294967295);
|
|
33152
|
-
type = types[i];
|
|
33153
|
-
parameters[i] = x = type in options.serializers ? options.serializers[type](x) : "" + x;
|
|
33154
|
-
prev = bytes_default.i;
|
|
33155
|
-
bytes_default.inc(4).str(x).i32(bytes_default.i - prev - 4, prev);
|
|
33156
|
-
});
|
|
33157
|
-
bytes_default.i16(0);
|
|
33158
|
-
return bytes_default.end();
|
|
33159
|
-
}
|
|
33160
|
-
function Parse(str, parameters, types, name = "") {
|
|
33161
|
-
bytes_default().P().str(name + bytes_default.N).str(str + bytes_default.N).i16(parameters.length);
|
|
33162
|
-
parameters.forEach((x, i) => bytes_default.i32(types[i] || 0));
|
|
33163
|
-
return bytes_default.end();
|
|
33164
|
-
}
|
|
33165
|
-
function Describe(x, name = "") {
|
|
33166
|
-
return bytes_default().D().str(x).str(name + bytes_default.N).end();
|
|
33167
|
-
}
|
|
33168
|
-
function Execute(portal = "", rows = 0) {
|
|
33169
|
-
return Buffer.concat([
|
|
33170
|
-
bytes_default().E().str(portal + bytes_default.N).i32(rows).end(),
|
|
33171
|
-
Flush
|
|
33172
|
-
]);
|
|
33173
|
-
}
|
|
33174
|
-
function Close(portal = "") {
|
|
33175
|
-
return Buffer.concat([
|
|
33176
|
-
bytes_default().C().str("P").str(portal + bytes_default.N).end(),
|
|
33177
|
-
bytes_default().S().end()
|
|
33178
|
-
]);
|
|
33179
|
-
}
|
|
33180
|
-
function StartupMessage() {
|
|
33181
|
-
return cancelMessage || bytes_default().inc(4).i16(3).z(2).str(Object.entries(Object.assign({
|
|
33182
|
-
user,
|
|
33183
|
-
database,
|
|
33184
|
-
client_encoding: "UTF8"
|
|
33185
|
-
}, options.connection)).filter(([, v]) => v).map(([k, v]) => k + bytes_default.N + v).join(bytes_default.N)).z(2).end(0);
|
|
33186
|
-
}
|
|
33187
|
-
}
|
|
33188
|
-
function parseError(x) {
|
|
33189
|
-
const error = {};
|
|
33190
|
-
let start = 5;
|
|
33191
|
-
for (let i = 5;i < x.length - 1; i++) {
|
|
33192
|
-
if (x[i] === 0) {
|
|
33193
|
-
error[errorFields[x[start]]] = x.toString("utf8", start + 1, i);
|
|
33194
|
-
start = i + 1;
|
|
33195
|
-
}
|
|
33196
|
-
}
|
|
33197
|
-
return error;
|
|
33198
|
-
}
|
|
33199
|
-
function md5(x) {
|
|
33200
|
-
return crypto2.createHash("md5").update(x).digest("hex");
|
|
33201
|
-
}
|
|
33202
|
-
function hmac(key, x) {
|
|
33203
|
-
return crypto2.createHmac("sha256", key).update(x).digest();
|
|
33204
|
-
}
|
|
33205
|
-
function sha256(x) {
|
|
33206
|
-
return crypto2.createHash("sha256").update(x).digest();
|
|
33207
|
-
}
|
|
33208
|
-
function xor(a, b) {
|
|
33209
|
-
const length = Math.max(a.length, b.length);
|
|
33210
|
-
const buffer = Buffer.allocUnsafe(length);
|
|
33211
|
-
for (let i = 0;i < length; i++)
|
|
33212
|
-
buffer[i] = a[i] ^ b[i];
|
|
33213
|
-
return buffer;
|
|
33214
|
-
}
|
|
33215
|
-
function timer2(fn, seconds) {
|
|
33216
|
-
seconds = typeof seconds === "function" ? seconds() : seconds;
|
|
33217
|
-
if (!seconds)
|
|
33218
|
-
return { cancel: noop5, start: noop5 };
|
|
33219
|
-
let timer;
|
|
33220
|
-
return {
|
|
33221
|
-
cancel() {
|
|
33222
|
-
timer && (clearTimeout(timer), timer = null);
|
|
33223
|
-
},
|
|
33224
|
-
start() {
|
|
33225
|
-
timer && clearTimeout(timer);
|
|
33226
|
-
timer = setTimeout(done, seconds * 1000, arguments);
|
|
33227
|
-
}
|
|
33228
|
-
};
|
|
33229
|
-
function done(args) {
|
|
33230
|
-
fn.apply(null, args);
|
|
33231
|
-
timer = null;
|
|
33232
|
-
}
|
|
33233
|
-
}
|
|
33234
|
-
var connection_default, uid = 1, Sync, Flush, SSLRequest, ExecuteUnnamed, DescribeUnnamed, noop5 = () => {}, retryRoutines, errorFields;
|
|
33235
|
-
var init_connection = __esm(() => {
|
|
33236
|
-
init_types4();
|
|
33237
|
-
init_errors2();
|
|
33238
|
-
init_result2();
|
|
33239
|
-
init_queue();
|
|
33240
|
-
init_query();
|
|
33241
|
-
init_bytes();
|
|
33242
|
-
connection_default = Connection;
|
|
33243
|
-
Sync = bytes_default().S().end();
|
|
33244
|
-
Flush = bytes_default().H().end();
|
|
33245
|
-
SSLRequest = bytes_default().i32(8).i32(80877103).end(8);
|
|
33246
|
-
ExecuteUnnamed = Buffer.concat([bytes_default().E().str(bytes_default.N).i32(0).end(), Sync]);
|
|
33247
|
-
DescribeUnnamed = bytes_default().D().str("S").str(bytes_default.N).end();
|
|
33248
|
-
retryRoutines = new Set([
|
|
33249
|
-
"FetchPreparedStatement",
|
|
33250
|
-
"RevalidateCachedQuery",
|
|
33251
|
-
"transformAssignedExpr"
|
|
33252
|
-
]);
|
|
33253
|
-
errorFields = {
|
|
33254
|
-
83: "severity_local",
|
|
33255
|
-
86: "severity",
|
|
33256
|
-
67: "code",
|
|
33257
|
-
77: "message",
|
|
33258
|
-
68: "detail",
|
|
33259
|
-
72: "hint",
|
|
33260
|
-
80: "position",
|
|
33261
|
-
112: "internal_position",
|
|
33262
|
-
113: "internal_query",
|
|
33263
|
-
87: "where",
|
|
33264
|
-
115: "schema_name",
|
|
33265
|
-
116: "table_name",
|
|
33266
|
-
99: "column_name",
|
|
33267
|
-
100: "data type_name",
|
|
33268
|
-
110: "constraint_name",
|
|
33269
|
-
70: "file",
|
|
33270
|
-
76: "line",
|
|
33271
|
-
82: "routine"
|
|
33272
|
-
};
|
|
33273
|
-
});
|
|
33274
|
-
|
|
33275
|
-
// ../../node_modules/postgres/src/subscribe.js
|
|
33276
|
-
function Subscribe(postgres, options) {
|
|
33277
|
-
const subscribers = new Map, slot = "postgresjs_" + Math.random().toString(36).slice(2), state = {};
|
|
33278
|
-
let connection, stream, ended = false;
|
|
33279
|
-
const sql = subscribe.sql = postgres({
|
|
33280
|
-
...options,
|
|
33281
|
-
transform: { column: {}, value: {}, row: {} },
|
|
33282
|
-
max: 1,
|
|
33283
|
-
fetch_types: false,
|
|
33284
|
-
idle_timeout: null,
|
|
33285
|
-
max_lifetime: null,
|
|
33286
|
-
connection: {
|
|
33287
|
-
...options.connection,
|
|
33288
|
-
replication: "database"
|
|
33289
|
-
},
|
|
33290
|
-
onclose: async function() {
|
|
33291
|
-
if (ended)
|
|
33292
|
-
return;
|
|
33293
|
-
stream = null;
|
|
33294
|
-
state.pid = state.secret = undefined;
|
|
33295
|
-
connected(await init(sql, slot, options.publications));
|
|
33296
|
-
subscribers.forEach((event) => event.forEach(({ onsubscribe }) => onsubscribe()));
|
|
33297
|
-
},
|
|
33298
|
-
no_subscribe: true
|
|
33299
|
-
});
|
|
33300
|
-
const { end, close } = sql;
|
|
33301
|
-
sql.end = async () => {
|
|
33302
|
-
ended = true;
|
|
33303
|
-
stream && await new Promise((r) => (stream.once("close", r), stream.end()));
|
|
33304
|
-
return end();
|
|
33305
|
-
};
|
|
33306
|
-
sql.close = async () => {
|
|
33307
|
-
stream && await new Promise((r) => (stream.once("close", r), stream.end()));
|
|
33308
|
-
return close();
|
|
33309
|
-
};
|
|
33310
|
-
return subscribe;
|
|
33311
|
-
async function subscribe(event, fn, onsubscribe = noop6, onerror = noop6) {
|
|
33312
|
-
event = parseEvent(event);
|
|
33313
|
-
if (!connection)
|
|
33314
|
-
connection = init(sql, slot, options.publications);
|
|
33315
|
-
const subscriber = { fn, onsubscribe };
|
|
33316
|
-
const fns = subscribers.has(event) ? subscribers.get(event).add(subscriber) : subscribers.set(event, new Set([subscriber])).get(event);
|
|
33317
|
-
const unsubscribe = () => {
|
|
33318
|
-
fns.delete(subscriber);
|
|
33319
|
-
fns.size === 0 && subscribers.delete(event);
|
|
33320
|
-
};
|
|
33321
|
-
return connection.then((x) => {
|
|
33322
|
-
connected(x);
|
|
33323
|
-
onsubscribe();
|
|
33324
|
-
stream && stream.on("error", onerror);
|
|
33325
|
-
return { unsubscribe, state, sql };
|
|
33326
|
-
});
|
|
33327
|
-
}
|
|
33328
|
-
function connected(x) {
|
|
33329
|
-
stream = x.stream;
|
|
33330
|
-
state.pid = x.state.pid;
|
|
33331
|
-
state.secret = x.state.secret;
|
|
33332
|
-
}
|
|
33333
|
-
async function init(sql, slot, publications) {
|
|
33334
|
-
if (!publications)
|
|
33335
|
-
throw new Error("Missing publication names");
|
|
33336
|
-
const xs = await sql.unsafe(`CREATE_REPLICATION_SLOT ${slot} TEMPORARY LOGICAL pgoutput NOEXPORT_SNAPSHOT`);
|
|
33337
|
-
const [x] = xs;
|
|
33338
|
-
const stream = await sql.unsafe(`START_REPLICATION SLOT ${slot} LOGICAL ${x.consistent_point} (proto_version '1', publication_names '${publications}')`).writable();
|
|
33339
|
-
const state = {
|
|
33340
|
-
lsn: Buffer.concat(x.consistent_point.split("/").map((x) => Buffer.from(("00000000" + x).slice(-8), "hex")))
|
|
33341
|
-
};
|
|
33342
|
-
stream.on("data", data);
|
|
33343
|
-
stream.on("error", error);
|
|
33344
|
-
stream.on("close", sql.close);
|
|
33345
|
-
return { stream, state: xs.state };
|
|
33346
|
-
function error(e) {
|
|
33347
|
-
console.error("Unexpected error during logical streaming - reconnecting", e);
|
|
33348
|
-
}
|
|
33349
|
-
function data(x) {
|
|
33350
|
-
if (x[0] === 119) {
|
|
33351
|
-
parse(x.subarray(25), state, sql.options.parsers, handle, options.transform);
|
|
33352
|
-
} else if (x[0] === 107 && x[17]) {
|
|
33353
|
-
state.lsn = x.subarray(1, 9);
|
|
33354
|
-
pong();
|
|
33355
|
-
}
|
|
33356
|
-
}
|
|
33357
|
-
function handle(a, b) {
|
|
33358
|
-
const path = b.relation.schema + "." + b.relation.table;
|
|
33359
|
-
call("*", a, b);
|
|
33360
|
-
call("*:" + path, a, b);
|
|
33361
|
-
b.relation.keys.length && call("*:" + path + "=" + b.relation.keys.map((x) => a[x.name]), a, b);
|
|
33362
|
-
call(b.command, a, b);
|
|
33363
|
-
call(b.command + ":" + path, a, b);
|
|
33364
|
-
b.relation.keys.length && call(b.command + ":" + path + "=" + b.relation.keys.map((x) => a[x.name]), a, b);
|
|
33365
|
-
}
|
|
33366
|
-
function pong() {
|
|
33367
|
-
const x = Buffer.alloc(34);
|
|
33368
|
-
x[0] = 114;
|
|
33369
|
-
x.fill(state.lsn, 1);
|
|
33370
|
-
x.writeBigInt64BE(BigInt(Date.now() - Date.UTC(2000, 0, 1)) * BigInt(1000), 25);
|
|
33371
|
-
stream.write(x);
|
|
33372
|
-
}
|
|
33373
|
-
}
|
|
33374
|
-
function call(x, a, b) {
|
|
33375
|
-
subscribers.has(x) && subscribers.get(x).forEach(({ fn }) => fn(a, b, x));
|
|
33376
|
-
}
|
|
33377
|
-
}
|
|
33378
|
-
function Time(x) {
|
|
33379
|
-
return new Date(Date.UTC(2000, 0, 1) + Number(x / BigInt(1000)));
|
|
33380
|
-
}
|
|
33381
|
-
function parse(x, state, parsers, handle, transform) {
|
|
33382
|
-
const char = (acc, [k, v]) => (acc[k.charCodeAt(0)] = v, acc);
|
|
33383
|
-
Object.entries({
|
|
33384
|
-
R: (x) => {
|
|
33385
|
-
let i = 1;
|
|
33386
|
-
const r = state[x.readUInt32BE(i)] = {
|
|
33387
|
-
schema: x.toString("utf8", i += 4, i = x.indexOf(0, i)) || "pg_catalog",
|
|
33388
|
-
table: x.toString("utf8", i + 1, i = x.indexOf(0, i + 1)),
|
|
33389
|
-
columns: Array(x.readUInt16BE(i += 2)),
|
|
33390
|
-
keys: []
|
|
33391
|
-
};
|
|
33392
|
-
i += 2;
|
|
33393
|
-
let columnIndex = 0, column;
|
|
33394
|
-
while (i < x.length) {
|
|
33395
|
-
column = r.columns[columnIndex++] = {
|
|
33396
|
-
key: x[i++],
|
|
33397
|
-
name: transform.column.from ? transform.column.from(x.toString("utf8", i, i = x.indexOf(0, i))) : x.toString("utf8", i, i = x.indexOf(0, i)),
|
|
33398
|
-
type: x.readUInt32BE(i += 1),
|
|
33399
|
-
parser: parsers[x.readUInt32BE(i)],
|
|
33400
|
-
atttypmod: x.readUInt32BE(i += 4)
|
|
33401
|
-
};
|
|
33402
|
-
column.key && r.keys.push(column);
|
|
33403
|
-
i += 4;
|
|
33404
|
-
}
|
|
33405
|
-
},
|
|
33406
|
-
Y: () => {},
|
|
33407
|
-
O: () => {},
|
|
33408
|
-
B: (x) => {
|
|
33409
|
-
state.date = Time(x.readBigInt64BE(9));
|
|
33410
|
-
state.lsn = x.subarray(1, 9);
|
|
33411
|
-
},
|
|
33412
|
-
I: (x) => {
|
|
33413
|
-
let i = 1;
|
|
33414
|
-
const relation = state[x.readUInt32BE(i)];
|
|
33415
|
-
const { row } = tuples(x, relation.columns, i += 7, transform);
|
|
33416
|
-
handle(row, {
|
|
33417
|
-
command: "insert",
|
|
33418
|
-
relation
|
|
33419
|
-
});
|
|
33420
|
-
},
|
|
33421
|
-
D: (x) => {
|
|
33422
|
-
let i = 1;
|
|
33423
|
-
const relation = state[x.readUInt32BE(i)];
|
|
33424
|
-
i += 4;
|
|
33425
|
-
const key = x[i] === 75;
|
|
33426
|
-
handle(key || x[i] === 79 ? tuples(x, relation.columns, i += 3, transform).row : null, {
|
|
33427
|
-
command: "delete",
|
|
33428
|
-
relation,
|
|
33429
|
-
key
|
|
33430
|
-
});
|
|
33431
|
-
},
|
|
33432
|
-
U: (x) => {
|
|
33433
|
-
let i = 1;
|
|
33434
|
-
const relation = state[x.readUInt32BE(i)];
|
|
33435
|
-
i += 4;
|
|
33436
|
-
const key = x[i] === 75;
|
|
33437
|
-
const xs = key || x[i] === 79 ? tuples(x, relation.columns, i += 3, transform) : null;
|
|
33438
|
-
xs && (i = xs.i);
|
|
33439
|
-
const { row } = tuples(x, relation.columns, i + 3, transform);
|
|
33440
|
-
handle(row, {
|
|
33441
|
-
command: "update",
|
|
33442
|
-
relation,
|
|
33443
|
-
key,
|
|
33444
|
-
old: xs && xs.row
|
|
33445
|
-
});
|
|
33446
|
-
},
|
|
33447
|
-
T: () => {},
|
|
33448
|
-
C: () => {}
|
|
33449
|
-
}).reduce(char, {})[x[0]](x);
|
|
33450
|
-
}
|
|
33451
|
-
function tuples(x, columns, xi, transform) {
|
|
33452
|
-
let type, column, value;
|
|
33453
|
-
const row = transform.raw ? new Array(columns.length) : {};
|
|
33454
|
-
for (let i = 0;i < columns.length; i++) {
|
|
33455
|
-
type = x[xi++];
|
|
33456
|
-
column = columns[i];
|
|
33457
|
-
value = type === 110 ? null : type === 117 ? undefined : column.parser === undefined ? x.toString("utf8", xi + 4, xi += 4 + x.readUInt32BE(xi)) : column.parser.array === true ? column.parser(x.toString("utf8", xi + 5, xi += 4 + x.readUInt32BE(xi))) : column.parser(x.toString("utf8", xi + 4, xi += 4 + x.readUInt32BE(xi)));
|
|
33458
|
-
transform.raw ? row[i] = transform.raw === true ? value : transform.value.from ? transform.value.from(value, column) : value : row[column.name] = transform.value.from ? transform.value.from(value, column) : value;
|
|
33459
|
-
}
|
|
33460
|
-
return { i: xi, row: transform.row.from ? transform.row.from(row) : row };
|
|
33461
|
-
}
|
|
33462
|
-
function parseEvent(x) {
|
|
33463
|
-
const xs = x.match(/^(\*|insert|update|delete)?:?([^.]+?\.?[^=]+)?=?(.+)?/i) || [];
|
|
33464
|
-
if (!xs)
|
|
33465
|
-
throw new Error("Malformed subscribe pattern: " + x);
|
|
33466
|
-
const [, command, path, key] = xs;
|
|
33467
|
-
return (command || "*") + (path ? ":" + (path.indexOf(".") === -1 ? "public." + path : path) : "") + (key ? "=" + key : "");
|
|
33468
|
-
}
|
|
33469
|
-
var noop6 = () => {};
|
|
33470
|
-
|
|
33471
|
-
// ../../node_modules/postgres/src/large.js
|
|
33472
|
-
import Stream2 from "stream";
|
|
33473
|
-
function largeObject(sql, oid, mode = 131072 | 262144) {
|
|
33474
|
-
return new Promise(async (resolve, reject) => {
|
|
33475
|
-
await sql.begin(async (sql) => {
|
|
33476
|
-
let finish;
|
|
33477
|
-
!oid && ([{ oid }] = await sql`select lo_creat(-1) as oid`);
|
|
33478
|
-
const [{ fd }] = await sql`select lo_open(${oid}, ${mode}) as fd`;
|
|
33479
|
-
const lo = {
|
|
33480
|
-
writable,
|
|
33481
|
-
readable,
|
|
33482
|
-
close: () => sql`select lo_close(${fd})`.then(finish),
|
|
33483
|
-
tell: () => sql`select lo_tell64(${fd})`,
|
|
33484
|
-
read: (x) => sql`select loread(${fd}, ${x}) as data`,
|
|
33485
|
-
write: (x) => sql`select lowrite(${fd}, ${x})`,
|
|
33486
|
-
truncate: (x) => sql`select lo_truncate64(${fd}, ${x})`,
|
|
33487
|
-
seek: (x, whence = 0) => sql`select lo_lseek64(${fd}, ${x}, ${whence})`,
|
|
33488
|
-
size: () => sql`
|
|
33489
|
-
select
|
|
33490
|
-
lo_lseek64(${fd}, location, 0) as position,
|
|
33491
|
-
seek.size
|
|
33492
|
-
from (
|
|
33493
|
-
select
|
|
33494
|
-
lo_lseek64($1, 0, 2) as size,
|
|
33495
|
-
tell.location
|
|
33496
|
-
from (select lo_tell64($1) as location) tell
|
|
33497
|
-
) seek
|
|
33498
|
-
`
|
|
33499
|
-
};
|
|
33500
|
-
resolve(lo);
|
|
33501
|
-
return new Promise(async (r) => finish = r);
|
|
33502
|
-
async function readable({
|
|
33503
|
-
highWaterMark = 2048 * 8,
|
|
33504
|
-
start = 0,
|
|
33505
|
-
end = Infinity
|
|
33506
|
-
} = {}) {
|
|
33507
|
-
let max = end - start;
|
|
33508
|
-
start && await lo.seek(start);
|
|
33509
|
-
return new Stream2.Readable({
|
|
33510
|
-
highWaterMark,
|
|
33511
|
-
async read(size) {
|
|
33512
|
-
const l = size > max ? size - max : size;
|
|
33513
|
-
max -= size;
|
|
33514
|
-
const [{ data }] = await lo.read(l);
|
|
33515
|
-
this.push(data);
|
|
33516
|
-
if (data.length < size)
|
|
33517
|
-
this.push(null);
|
|
33518
|
-
}
|
|
33519
|
-
});
|
|
33520
|
-
}
|
|
33521
|
-
async function writable({
|
|
33522
|
-
highWaterMark = 2048 * 8,
|
|
33523
|
-
start = 0
|
|
33524
|
-
} = {}) {
|
|
33525
|
-
start && await lo.seek(start);
|
|
33526
|
-
return new Stream2.Writable({
|
|
33527
|
-
highWaterMark,
|
|
33528
|
-
write(chunk, encoding, callback) {
|
|
33529
|
-
lo.write(chunk).then(() => callback(), callback);
|
|
33530
|
-
}
|
|
33531
|
-
});
|
|
33532
|
-
}
|
|
33533
|
-
}).catch(reject);
|
|
33534
|
-
});
|
|
33535
|
-
}
|
|
33536
|
-
var init_large = () => {};
|
|
33537
|
-
|
|
33538
|
-
// ../../node_modules/postgres/src/index.js
|
|
33539
|
-
import os4 from "os";
|
|
33540
|
-
import fs7 from "fs";
|
|
33541
|
-
function Postgres(a, b) {
|
|
33542
|
-
const options = parseOptions(a, b), subscribe = options.no_subscribe || Subscribe(Postgres, { ...options });
|
|
33543
|
-
let ending = false;
|
|
33544
|
-
const queries = queue_default(), connecting = queue_default(), reserved = queue_default(), closed = queue_default(), ended = queue_default(), open = queue_default(), busy = queue_default(), full = queue_default(), queues = { connecting, reserved, closed, ended, open, busy, full };
|
|
33545
|
-
const connections = [...Array(options.max)].map(() => connection_default(options, queues, { onopen, onend, onclose }));
|
|
33546
|
-
const sql = Sql(handler);
|
|
33547
|
-
Object.assign(sql, {
|
|
33548
|
-
get parameters() {
|
|
33549
|
-
return options.parameters;
|
|
33550
|
-
},
|
|
33551
|
-
largeObject: largeObject.bind(null, sql),
|
|
33552
|
-
subscribe,
|
|
33553
|
-
CLOSE,
|
|
33554
|
-
END: CLOSE,
|
|
33555
|
-
PostgresError,
|
|
33556
|
-
options,
|
|
33557
|
-
reserve,
|
|
33558
|
-
listen,
|
|
33559
|
-
begin,
|
|
33560
|
-
close,
|
|
33561
|
-
end
|
|
33562
|
-
});
|
|
33563
|
-
return sql;
|
|
33564
|
-
function Sql(handler) {
|
|
33565
|
-
handler.debug = options.debug;
|
|
33566
|
-
Object.entries(options.types).reduce((acc, [name, type]) => {
|
|
33567
|
-
acc[name] = (x) => new Parameter(x, type.to);
|
|
33568
|
-
return acc;
|
|
33569
|
-
}, typed);
|
|
33570
|
-
Object.assign(sql, {
|
|
33571
|
-
types: typed,
|
|
33572
|
-
typed,
|
|
33573
|
-
unsafe,
|
|
33574
|
-
notify,
|
|
33575
|
-
array,
|
|
33576
|
-
json,
|
|
33577
|
-
file
|
|
33578
|
-
});
|
|
33579
|
-
return sql;
|
|
33580
|
-
function typed(value, type) {
|
|
33581
|
-
return new Parameter(value, type);
|
|
33582
|
-
}
|
|
33583
|
-
function sql(strings, ...args) {
|
|
33584
|
-
const query = strings && Array.isArray(strings.raw) ? new Query(strings, args, handler, cancel) : typeof strings === "string" && !args.length ? new Identifier(options.transform.column.to ? options.transform.column.to(strings) : strings) : new Builder(strings, args);
|
|
33585
|
-
return query;
|
|
33586
|
-
}
|
|
33587
|
-
function unsafe(string, args = [], options = {}) {
|
|
33588
|
-
arguments.length === 2 && !Array.isArray(args) && (options = args, args = []);
|
|
33589
|
-
const query = new Query([string], args, handler, cancel, {
|
|
33590
|
-
prepare: false,
|
|
33591
|
-
...options,
|
|
33592
|
-
simple: "simple" in options ? options.simple : args.length === 0
|
|
33593
|
-
});
|
|
33594
|
-
return query;
|
|
33595
|
-
}
|
|
33596
|
-
function file(path, args = [], options = {}) {
|
|
33597
|
-
arguments.length === 2 && !Array.isArray(args) && (options = args, args = []);
|
|
33598
|
-
const query = new Query([], args, (query) => {
|
|
33599
|
-
fs7.readFile(path, "utf8", (err, string) => {
|
|
33600
|
-
if (err)
|
|
33601
|
-
return query.reject(err);
|
|
33602
|
-
query.strings = [string];
|
|
33603
|
-
handler(query);
|
|
33604
|
-
});
|
|
33605
|
-
}, cancel, {
|
|
33606
|
-
...options,
|
|
33607
|
-
simple: "simple" in options ? options.simple : args.length === 0
|
|
33608
|
-
});
|
|
33609
|
-
return query;
|
|
33610
|
-
}
|
|
33611
|
-
}
|
|
33612
|
-
async function listen(name, fn, onlisten) {
|
|
33613
|
-
const listener = { fn, onlisten };
|
|
33614
|
-
const sql = listen.sql || (listen.sql = Postgres({
|
|
33615
|
-
...options,
|
|
33616
|
-
max: 1,
|
|
33617
|
-
idle_timeout: null,
|
|
33618
|
-
max_lifetime: null,
|
|
33619
|
-
fetch_types: false,
|
|
33620
|
-
onclose() {
|
|
33621
|
-
Object.entries(listen.channels).forEach(([name, { listeners }]) => {
|
|
33622
|
-
delete listen.channels[name];
|
|
33623
|
-
Promise.all(listeners.map((l) => listen(name, l.fn, l.onlisten).catch(() => {})));
|
|
33624
|
-
});
|
|
33625
|
-
},
|
|
33626
|
-
onnotify(c, x) {
|
|
33627
|
-
c in listen.channels && listen.channels[c].listeners.forEach((l) => l.fn(x));
|
|
33628
|
-
}
|
|
33629
|
-
}));
|
|
33630
|
-
const channels = listen.channels || (listen.channels = {}), exists = name in channels;
|
|
33631
|
-
if (exists) {
|
|
33632
|
-
channels[name].listeners.push(listener);
|
|
33633
|
-
const result = await channels[name].result;
|
|
33634
|
-
listener.onlisten && listener.onlisten();
|
|
33635
|
-
return { state: result.state, unlisten };
|
|
33636
|
-
}
|
|
33637
|
-
channels[name] = { result: sql`listen ${sql.unsafe('"' + name.replace(/"/g, '""') + '"')}`, listeners: [listener] };
|
|
33638
|
-
const result = await channels[name].result;
|
|
33639
|
-
listener.onlisten && listener.onlisten();
|
|
33640
|
-
return { state: result.state, unlisten };
|
|
33641
|
-
async function unlisten() {
|
|
33642
|
-
if (name in channels === false)
|
|
33643
|
-
return;
|
|
33644
|
-
channels[name].listeners = channels[name].listeners.filter((x) => x !== listener);
|
|
33645
|
-
if (channels[name].listeners.length)
|
|
33646
|
-
return;
|
|
33647
|
-
delete channels[name];
|
|
33648
|
-
return sql`unlisten ${sql.unsafe('"' + name.replace(/"/g, '""') + '"')}`;
|
|
33649
|
-
}
|
|
33650
|
-
}
|
|
33651
|
-
async function notify(channel, payload) {
|
|
33652
|
-
return await sql`select pg_notify(${channel}, ${"" + payload})`;
|
|
33653
|
-
}
|
|
33654
|
-
async function reserve() {
|
|
33655
|
-
const queue = queue_default();
|
|
33656
|
-
const c = open.length ? open.shift() : await new Promise((resolve, reject) => {
|
|
33657
|
-
const query = { reserve: resolve, reject };
|
|
33658
|
-
queries.push(query);
|
|
33659
|
-
closed.length && connect(closed.shift(), query);
|
|
33660
|
-
});
|
|
33661
|
-
move(c, reserved);
|
|
33662
|
-
c.reserved = () => queue.length ? c.execute(queue.shift()) : move(c, reserved);
|
|
33663
|
-
c.reserved.release = true;
|
|
33664
|
-
const sql = Sql(handler);
|
|
33665
|
-
sql.release = () => {
|
|
33666
|
-
c.reserved = null;
|
|
33667
|
-
onopen(c);
|
|
33668
|
-
};
|
|
33669
|
-
return sql;
|
|
33670
|
-
function handler(q) {
|
|
33671
|
-
c.queue === full ? queue.push(q) : c.execute(q) || move(c, full);
|
|
33672
|
-
}
|
|
33673
|
-
}
|
|
33674
|
-
async function begin(options, fn) {
|
|
33675
|
-
!fn && (fn = options, options = "");
|
|
33676
|
-
const queries = queue_default();
|
|
33677
|
-
let savepoints = 0, connection, prepare = null;
|
|
33678
|
-
try {
|
|
33679
|
-
await sql.unsafe("begin " + options.replace(/[^a-z ]/ig, ""), [], { onexecute }).execute();
|
|
33680
|
-
return await Promise.race([
|
|
33681
|
-
scope(connection, fn),
|
|
33682
|
-
new Promise((_, reject) => connection.onclose = reject)
|
|
33683
|
-
]);
|
|
33684
|
-
} catch (error) {
|
|
33685
|
-
throw error;
|
|
33686
|
-
}
|
|
33687
|
-
async function scope(c, fn, name) {
|
|
33688
|
-
const sql = Sql(handler);
|
|
33689
|
-
sql.savepoint = savepoint;
|
|
33690
|
-
sql.prepare = (x) => prepare = x.replace(/[^a-z0-9$-_. ]/gi);
|
|
33691
|
-
let uncaughtError, result;
|
|
33692
|
-
name && await sql`savepoint ${sql(name)}`;
|
|
33693
|
-
try {
|
|
33694
|
-
result = await new Promise((resolve, reject) => {
|
|
33695
|
-
const x = fn(sql);
|
|
33696
|
-
Promise.resolve(Array.isArray(x) ? Promise.all(x) : x).then(resolve, reject);
|
|
33697
|
-
});
|
|
33698
|
-
if (uncaughtError)
|
|
33699
|
-
throw uncaughtError;
|
|
33700
|
-
} catch (e) {
|
|
33701
|
-
await (name ? sql`rollback to ${sql(name)}` : sql`rollback`);
|
|
33702
|
-
throw e instanceof PostgresError && e.code === "25P02" && uncaughtError || e;
|
|
33703
|
-
}
|
|
33704
|
-
if (!name) {
|
|
33705
|
-
prepare ? await sql`prepare transaction '${sql.unsafe(prepare)}'` : await sql`commit`;
|
|
33706
|
-
}
|
|
33707
|
-
return result;
|
|
33708
|
-
function savepoint(name, fn) {
|
|
33709
|
-
if (name && Array.isArray(name.raw))
|
|
33710
|
-
return savepoint((sql) => sql.apply(sql, arguments));
|
|
33711
|
-
arguments.length === 1 && (fn = name, name = null);
|
|
33712
|
-
return scope(c, fn, "s" + savepoints++ + (name ? "_" + name : ""));
|
|
33713
|
-
}
|
|
33714
|
-
function handler(q) {
|
|
33715
|
-
q.catch((e) => uncaughtError || (uncaughtError = e));
|
|
33716
|
-
c.queue === full ? queries.push(q) : c.execute(q) || move(c, full);
|
|
33717
|
-
}
|
|
33718
|
-
}
|
|
33719
|
-
function onexecute(c) {
|
|
33720
|
-
connection = c;
|
|
33721
|
-
move(c, reserved);
|
|
33722
|
-
c.reserved = () => queries.length ? c.execute(queries.shift()) : move(c, reserved);
|
|
33723
|
-
}
|
|
33724
|
-
}
|
|
33725
|
-
function move(c, queue) {
|
|
33726
|
-
c.queue.remove(c);
|
|
33727
|
-
queue.push(c);
|
|
33728
|
-
c.queue = queue;
|
|
33729
|
-
queue === open ? c.idleTimer.start() : c.idleTimer.cancel();
|
|
33730
|
-
return c;
|
|
33731
|
-
}
|
|
33732
|
-
function json(x) {
|
|
33733
|
-
return new Parameter(x, 3802);
|
|
33734
|
-
}
|
|
33735
|
-
function array(x, type) {
|
|
33736
|
-
if (!Array.isArray(x))
|
|
33737
|
-
return array(Array.from(arguments));
|
|
33738
|
-
return new Parameter(x, type || (x.length ? inferType(x) || 25 : 0), options.shared.typeArrayMap);
|
|
33739
|
-
}
|
|
33740
|
-
function handler(query) {
|
|
33741
|
-
if (ending)
|
|
33742
|
-
return query.reject(Errors.connection("CONNECTION_ENDED", options, options));
|
|
33743
|
-
if (open.length)
|
|
33744
|
-
return go(open.shift(), query);
|
|
33745
|
-
if (closed.length)
|
|
33746
|
-
return connect(closed.shift(), query);
|
|
33747
|
-
busy.length ? go(busy.shift(), query) : queries.push(query);
|
|
33748
|
-
}
|
|
33749
|
-
function go(c, query) {
|
|
33750
|
-
return c.execute(query) ? move(c, busy) : move(c, full);
|
|
33751
|
-
}
|
|
33752
|
-
function cancel(query) {
|
|
33753
|
-
return new Promise((resolve, reject) => {
|
|
33754
|
-
query.state ? query.active ? connection_default(options).cancel(query.state, resolve, reject) : query.cancelled = { resolve, reject } : (queries.remove(query), query.cancelled = true, query.reject(Errors.generic("57014", "canceling statement due to user request")), resolve());
|
|
33755
|
-
});
|
|
33756
|
-
}
|
|
33757
|
-
async function end({ timeout = null } = {}) {
|
|
33758
|
-
if (ending)
|
|
33759
|
-
return ending;
|
|
33760
|
-
await 1;
|
|
33761
|
-
let timer;
|
|
33762
|
-
return ending = Promise.race([
|
|
33763
|
-
new Promise((r) => timeout !== null && (timer = setTimeout(destroy, timeout * 1000, r))),
|
|
33764
|
-
Promise.all(connections.map((c) => c.end()).concat(listen.sql ? listen.sql.end({ timeout: 0 }) : [], subscribe.sql ? subscribe.sql.end({ timeout: 0 }) : []))
|
|
33765
|
-
]).then(() => clearTimeout(timer));
|
|
33766
|
-
}
|
|
33767
|
-
async function close() {
|
|
33768
|
-
await Promise.all(connections.map((c) => c.end()));
|
|
33769
|
-
}
|
|
33770
|
-
async function destroy(resolve) {
|
|
33771
|
-
await Promise.all(connections.map((c) => c.terminate()));
|
|
33772
|
-
while (queries.length)
|
|
33773
|
-
queries.shift().reject(Errors.connection("CONNECTION_DESTROYED", options));
|
|
33774
|
-
resolve();
|
|
33775
|
-
}
|
|
33776
|
-
function connect(c, query) {
|
|
33777
|
-
move(c, connecting);
|
|
33778
|
-
c.connect(query);
|
|
33779
|
-
return c;
|
|
33780
|
-
}
|
|
33781
|
-
function onend(c) {
|
|
33782
|
-
move(c, ended);
|
|
33783
|
-
}
|
|
33784
|
-
function onopen(c) {
|
|
33785
|
-
if (queries.length === 0)
|
|
33786
|
-
return move(c, open);
|
|
33787
|
-
let max = Math.ceil(queries.length / (connecting.length + 1)), ready = true;
|
|
33788
|
-
while (ready && queries.length && max-- > 0) {
|
|
33789
|
-
const query = queries.shift();
|
|
33790
|
-
if (query.reserve)
|
|
33791
|
-
return query.reserve(c);
|
|
33792
|
-
ready = c.execute(query);
|
|
33793
|
-
}
|
|
33794
|
-
ready ? move(c, busy) : move(c, full);
|
|
33795
|
-
}
|
|
33796
|
-
function onclose(c, e) {
|
|
33797
|
-
move(c, closed);
|
|
33798
|
-
c.reserved = null;
|
|
33799
|
-
c.onclose && (c.onclose(e), c.onclose = null);
|
|
33800
|
-
options.onclose && options.onclose(c.id);
|
|
33801
|
-
queries.length && connect(c, queries.shift());
|
|
33802
|
-
}
|
|
33803
|
-
}
|
|
33804
|
-
function parseOptions(a, b) {
|
|
33805
|
-
if (a && a.shared)
|
|
33806
|
-
return a;
|
|
33807
|
-
const env = process.env, o = (!a || typeof a === "string" ? b : a) || {}, { url, multihost } = parseUrl(a), query = [...url.searchParams].reduce((a, [b, c]) => (a[b] = c, a), {}), host = o.hostname || o.host || multihost || url.hostname || env.PGHOST || "localhost", port = o.port || url.port || env.PGPORT || 5432, user = o.user || o.username || url.username || env.PGUSERNAME || env.PGUSER || osUsername();
|
|
33808
|
-
o.no_prepare && (o.prepare = false);
|
|
33809
|
-
query.sslmode && (query.ssl = query.sslmode, delete query.sslmode);
|
|
33810
|
-
"timeout" in o && (console.log("The timeout option is deprecated, use idle_timeout instead"), o.idle_timeout = o.timeout);
|
|
33811
|
-
query.sslrootcert === "system" && (query.ssl = "verify-full");
|
|
33812
|
-
const ints = ["idle_timeout", "connect_timeout", "max_lifetime", "max_pipeline", "backoff", "keep_alive"];
|
|
33813
|
-
const defaults = {
|
|
33814
|
-
max: globalThis.Cloudflare ? 3 : 10,
|
|
33815
|
-
ssl: false,
|
|
33816
|
-
sslnegotiation: null,
|
|
33817
|
-
idle_timeout: null,
|
|
33818
|
-
connect_timeout: 30,
|
|
33819
|
-
max_lifetime,
|
|
33820
|
-
max_pipeline: 100,
|
|
33821
|
-
backoff,
|
|
33822
|
-
keep_alive: 60,
|
|
33823
|
-
prepare: true,
|
|
33824
|
-
debug: false,
|
|
33825
|
-
fetch_types: true,
|
|
33826
|
-
publications: "alltables",
|
|
33827
|
-
target_session_attrs: null
|
|
33828
|
-
};
|
|
33829
|
-
return {
|
|
33830
|
-
host: Array.isArray(host) ? host : host.split(",").map((x) => x.split(":")[0]),
|
|
33831
|
-
port: Array.isArray(port) ? port : host.split(",").map((x) => parseInt(x.split(":")[1] || port)),
|
|
33832
|
-
path: o.path || host.indexOf("/") > -1 && host + "/.s.PGSQL." + port,
|
|
33833
|
-
database: o.database || o.db || (url.pathname || "").slice(1) || env.PGDATABASE || user,
|
|
33834
|
-
user,
|
|
33835
|
-
pass: o.pass || o.password || url.password || env.PGPASSWORD || "",
|
|
33836
|
-
...Object.entries(defaults).reduce((acc, [k, d]) => {
|
|
33837
|
-
const value = k in o ? o[k] : (k in query) ? query[k] === "disable" || query[k] === "false" ? false : query[k] : env["PG" + k.toUpperCase()] || d;
|
|
33838
|
-
acc[k] = typeof value === "string" && ints.includes(k) ? +value : value;
|
|
33839
|
-
return acc;
|
|
33840
|
-
}, {}),
|
|
33841
|
-
connection: {
|
|
33842
|
-
application_name: env.PGAPPNAME || "postgres.js",
|
|
33843
|
-
...o.connection,
|
|
33844
|
-
...Object.entries(query).reduce((acc, [k, v]) => ((k in defaults) || (acc[k] = v), acc), {})
|
|
33845
|
-
},
|
|
33846
|
-
types: o.types || {},
|
|
33847
|
-
target_session_attrs: tsa(o, url, env),
|
|
33848
|
-
onnotice: o.onnotice,
|
|
33849
|
-
onnotify: o.onnotify,
|
|
33850
|
-
onclose: o.onclose,
|
|
33851
|
-
onparameter: o.onparameter,
|
|
33852
|
-
socket: o.socket,
|
|
33853
|
-
transform: parseTransform(o.transform || { undefined: undefined }),
|
|
33854
|
-
parameters: {},
|
|
33855
|
-
shared: { retries: 0, typeArrayMap: {} },
|
|
33856
|
-
...mergeUserTypes(o.types)
|
|
33857
|
-
};
|
|
33858
|
-
}
|
|
33859
|
-
function tsa(o, url, env) {
|
|
33860
|
-
const x = o.target_session_attrs || url.searchParams.get("target_session_attrs") || env.PGTARGETSESSIONATTRS;
|
|
33861
|
-
if (!x || ["read-write", "read-only", "primary", "standby", "prefer-standby"].includes(x))
|
|
33862
|
-
return x;
|
|
33863
|
-
throw new Error("target_session_attrs " + x + " is not supported");
|
|
33864
|
-
}
|
|
33865
|
-
function backoff(retries) {
|
|
33866
|
-
return (0.5 + Math.random() / 2) * Math.min(3 ** retries / 100, 20);
|
|
33867
|
-
}
|
|
33868
|
-
function max_lifetime() {
|
|
33869
|
-
return 60 * (30 + Math.random() * 30);
|
|
33870
|
-
}
|
|
33871
|
-
function parseTransform(x) {
|
|
33872
|
-
return {
|
|
33873
|
-
undefined: x.undefined,
|
|
33874
|
-
column: {
|
|
33875
|
-
from: typeof x.column === "function" ? x.column : x.column && x.column.from,
|
|
33876
|
-
to: x.column && x.column.to
|
|
33877
|
-
},
|
|
33878
|
-
value: {
|
|
33879
|
-
from: typeof x.value === "function" ? x.value : x.value && x.value.from,
|
|
33880
|
-
to: x.value && x.value.to
|
|
33881
|
-
},
|
|
33882
|
-
row: {
|
|
33883
|
-
from: typeof x.row === "function" ? x.row : x.row && x.row.from,
|
|
33884
|
-
to: x.row && x.row.to
|
|
33885
|
-
}
|
|
33886
|
-
};
|
|
33887
|
-
}
|
|
33888
|
-
function parseUrl(url) {
|
|
33889
|
-
if (!url || typeof url !== "string")
|
|
33890
|
-
return { url: { searchParams: new Map } };
|
|
33891
|
-
let host = url;
|
|
33892
|
-
host = host.slice(host.indexOf("://") + 3).split(/[?/]/)[0];
|
|
33893
|
-
host = decodeURIComponent(host.slice(host.indexOf("@") + 1));
|
|
33894
|
-
const urlObj = new URL(url.replace(host, host.split(",")[0]));
|
|
33895
|
-
return {
|
|
33896
|
-
url: {
|
|
33897
|
-
username: decodeURIComponent(urlObj.username),
|
|
33898
|
-
password: decodeURIComponent(urlObj.password),
|
|
33899
|
-
host: urlObj.host,
|
|
33900
|
-
hostname: urlObj.hostname,
|
|
33901
|
-
port: urlObj.port,
|
|
33902
|
-
pathname: urlObj.pathname,
|
|
33903
|
-
searchParams: urlObj.searchParams
|
|
33904
|
-
},
|
|
33905
|
-
multihost: host.indexOf(",") > -1 && host
|
|
33906
|
-
};
|
|
33907
|
-
}
|
|
33908
|
-
function osUsername() {
|
|
33909
|
-
try {
|
|
33910
|
-
return os4.userInfo().username;
|
|
33911
|
-
} catch (_) {
|
|
33912
|
-
return process.env.USERNAME || process.env.USER || process.env.LOGNAME;
|
|
33913
|
-
}
|
|
33914
|
-
}
|
|
33915
|
-
var src_default;
|
|
33916
|
-
var init_src = __esm(() => {
|
|
33917
|
-
init_types4();
|
|
33918
|
-
init_connection();
|
|
33919
|
-
init_query();
|
|
33920
|
-
init_queue();
|
|
33921
|
-
init_errors2();
|
|
33922
|
-
init_large();
|
|
33923
|
-
Object.assign(Postgres, {
|
|
33924
|
-
PostgresError,
|
|
33925
|
-
toPascal,
|
|
33926
|
-
pascal,
|
|
33927
|
-
toCamel,
|
|
33928
|
-
camel,
|
|
33929
|
-
toKebab,
|
|
33930
|
-
kebab,
|
|
33931
|
-
fromPascal,
|
|
33932
|
-
fromCamel,
|
|
33933
|
-
fromKebab,
|
|
33934
|
-
BigInt: {
|
|
33935
|
-
to: 20,
|
|
33936
|
-
from: [20],
|
|
33937
|
-
parse: (x) => BigInt(x),
|
|
33938
|
-
serialize: (x) => x.toString()
|
|
33939
|
-
}
|
|
33940
|
-
});
|
|
33941
|
-
src_default = Postgres;
|
|
33942
|
-
});
|
|
33943
|
-
|
|
33944
31798
|
// src/lib/dev-state.ts
|
|
33945
|
-
import { homedir as
|
|
33946
|
-
import { join as
|
|
31799
|
+
import { homedir as homedir3 } from "node:os";
|
|
31800
|
+
import { join as join11 } from "node:path";
|
|
33947
31801
|
function getLogsDir() {
|
|
33948
31802
|
return LOGS_DIR;
|
|
33949
31803
|
}
|
|
@@ -33968,9 +31822,9 @@ function isProcessRunning(pid) {
|
|
|
33968
31822
|
}
|
|
33969
31823
|
var STATE_DIR, DEV_STATE_PATH, LOGS_DIR;
|
|
33970
31824
|
var init_dev_state = __esm(() => {
|
|
33971
|
-
STATE_DIR =
|
|
33972
|
-
DEV_STATE_PATH =
|
|
33973
|
-
LOGS_DIR =
|
|
31825
|
+
STATE_DIR = join11(homedir3(), ".secondlayer");
|
|
31826
|
+
DEV_STATE_PATH = join11(STATE_DIR, "dev.json");
|
|
31827
|
+
LOGS_DIR = join11(STATE_DIR, "logs");
|
|
33974
31828
|
});
|
|
33975
31829
|
|
|
33976
31830
|
// ../../node_modules/commander/index.js
|
|
@@ -34034,7 +31888,7 @@ var {
|
|
|
34034
31888
|
// package.json
|
|
34035
31889
|
var package_default = {
|
|
34036
31890
|
name: "@secondlayer/cli",
|
|
34037
|
-
version: "
|
|
31891
|
+
version: "23.0.0",
|
|
34038
31892
|
description: "Run a Stacks index on your own hardware — set it up, restore verified history, and keep it current.",
|
|
34039
31893
|
repository: {
|
|
34040
31894
|
type: "git",
|
|
@@ -34081,12 +31935,12 @@ var package_default = {
|
|
|
34081
31935
|
"@biomejs/wasm-nodejs": "^1.9.0",
|
|
34082
31936
|
"@dsnp/parquetjs": "~1.8.8",
|
|
34083
31937
|
"@inquirer/prompts": "^8.2.0",
|
|
34084
|
-
"@secondlayer/bundler": "^0.7.
|
|
34085
|
-
"@secondlayer/scaffold": "^1.6.
|
|
34086
|
-
"@secondlayer/sdk": "^
|
|
34087
|
-
"@secondlayer/shared": "^
|
|
31938
|
+
"@secondlayer/bundler": "^0.7.3",
|
|
31939
|
+
"@secondlayer/scaffold": "^1.6.3",
|
|
31940
|
+
"@secondlayer/sdk": "^16.0.0",
|
|
31941
|
+
"@secondlayer/shared": "^15.0.0",
|
|
34088
31942
|
"@secondlayer/stacks": "^6.5.3",
|
|
34089
|
-
"@secondlayer/subgraphs": "^
|
|
31943
|
+
"@secondlayer/subgraphs": "^8.0.1",
|
|
34090
31944
|
"@secondlayer/verify": "^0.6.1",
|
|
34091
31945
|
esbuild: "^0.28.2",
|
|
34092
31946
|
"smol-toml": "^1.9.1",
|
|
@@ -36718,259 +34572,6 @@ function registerCodegenCommand(program) {
|
|
|
36718
34572
|
}
|
|
36719
34573
|
// src/commands/config.ts
|
|
36720
34574
|
init_config2();
|
|
36721
|
-
|
|
36722
|
-
// src/lib/detect.ts
|
|
36723
|
-
import { homedir as homedir3 } from "node:os";
|
|
36724
|
-
import { join as join8 } from "node:path";
|
|
36725
|
-
|
|
36726
|
-
// src/lib/docker.ts
|
|
36727
|
-
import { spawnSync as spawnSync2 } from "node:child_process";
|
|
36728
|
-
function run2(command, args) {
|
|
36729
|
-
const result = spawnSync2(command, args, { encoding: "utf8" });
|
|
36730
|
-
return {
|
|
36731
|
-
ok: !result.error && result.status === 0,
|
|
36732
|
-
stdout: result.stdout ?? ""
|
|
36733
|
-
};
|
|
36734
|
-
}
|
|
36735
|
-
async function isDockerAvailable() {
|
|
36736
|
-
return run2("docker", ["info"]).ok;
|
|
36737
|
-
}
|
|
36738
|
-
|
|
36739
|
-
// src/lib/detect.ts
|
|
36740
|
-
var STACKS_CONTAINER_PATTERNS = [
|
|
36741
|
-
"stacks-blockchain",
|
|
36742
|
-
"stacks-node",
|
|
36743
|
-
"stacks_blockchain",
|
|
36744
|
-
"stacks_node"
|
|
36745
|
-
];
|
|
36746
|
-
async function detectRunningContainers() {
|
|
36747
|
-
try {
|
|
36748
|
-
const psResult = await Bun.$`docker ps --format "{{.Names}}"`.quiet().nothrow();
|
|
36749
|
-
if (psResult.exitCode !== 0) {
|
|
36750
|
-
return null;
|
|
36751
|
-
}
|
|
36752
|
-
const containers = psResult.stdout.toString().trim().split(`
|
|
36753
|
-
`).filter(Boolean);
|
|
36754
|
-
const stacksContainer = containers.find((name) => STACKS_CONTAINER_PATTERNS.some((pattern) => name.toLowerCase().includes(pattern.toLowerCase())));
|
|
36755
|
-
if (!stacksContainer) {
|
|
36756
|
-
return null;
|
|
36757
|
-
}
|
|
36758
|
-
const inspectResult = await Bun.$`docker inspect ${stacksContainer}`.quiet().nothrow();
|
|
36759
|
-
if (inspectResult.exitCode !== 0) {
|
|
36760
|
-
return null;
|
|
36761
|
-
}
|
|
36762
|
-
const inspectData = JSON.parse(inspectResult.stdout.toString());
|
|
36763
|
-
if (!Array.isArray(inspectData) || inspectData.length === 0) {
|
|
36764
|
-
return null;
|
|
36765
|
-
}
|
|
36766
|
-
const container = inspectData[0];
|
|
36767
|
-
const path = await extractPathFromMounts(container);
|
|
36768
|
-
if (!path) {
|
|
36769
|
-
return null;
|
|
36770
|
-
}
|
|
36771
|
-
const network = detectNetworkFromContainer(container);
|
|
36772
|
-
return {
|
|
36773
|
-
path,
|
|
36774
|
-
network,
|
|
36775
|
-
running: true,
|
|
36776
|
-
source: "container"
|
|
36777
|
-
};
|
|
36778
|
-
} catch {
|
|
36779
|
-
return null;
|
|
36780
|
-
}
|
|
36781
|
-
}
|
|
36782
|
-
async function extractPathFromMounts(container) {
|
|
36783
|
-
if (container.Mounts && Array.isArray(container.Mounts)) {
|
|
36784
|
-
for (const mount of container.Mounts) {
|
|
36785
|
-
if (mount.Type === "bind" && mount.Source) {
|
|
36786
|
-
if (mount.Source.includes("stacks-blockchain") || mount.Source.includes("stacks-node") || mount.Destination?.includes("/stacks")) {
|
|
36787
|
-
return await findDockerComposeRoot(mount.Source);
|
|
36788
|
-
}
|
|
36789
|
-
}
|
|
36790
|
-
}
|
|
36791
|
-
}
|
|
36792
|
-
const binds = container.HostConfig?.Binds;
|
|
36793
|
-
if (binds && Array.isArray(binds)) {
|
|
36794
|
-
for (const bind of binds) {
|
|
36795
|
-
const [source] = bind.split(":");
|
|
36796
|
-
if (source && (source.includes("stacks-blockchain") || source.includes("stacks-node"))) {
|
|
36797
|
-
return await findDockerComposeRoot(source);
|
|
36798
|
-
}
|
|
36799
|
-
}
|
|
36800
|
-
}
|
|
36801
|
-
return null;
|
|
36802
|
-
}
|
|
36803
|
-
async function findDockerComposeRoot(startPath) {
|
|
36804
|
-
let current = startPath;
|
|
36805
|
-
while (current && current !== "/") {
|
|
36806
|
-
try {
|
|
36807
|
-
const composeYml = Bun.file(join8(current, "docker-compose.yml"));
|
|
36808
|
-
const composeYaml = Bun.file(join8(current, "docker-compose.yaml"));
|
|
36809
|
-
if (await composeYml.exists() || await composeYaml.exists()) {
|
|
36810
|
-
return current;
|
|
36811
|
-
}
|
|
36812
|
-
} catch {}
|
|
36813
|
-
current = getParentPath(current);
|
|
36814
|
-
}
|
|
36815
|
-
const knownPatterns = ["stacks-blockchain-docker", "stacks-node"];
|
|
36816
|
-
for (const pattern of knownPatterns) {
|
|
36817
|
-
const idx = startPath.indexOf(pattern);
|
|
36818
|
-
if (idx !== -1) {
|
|
36819
|
-
return startPath.substring(0, idx + pattern.length);
|
|
36820
|
-
}
|
|
36821
|
-
}
|
|
36822
|
-
return getParentPath(startPath);
|
|
36823
|
-
}
|
|
36824
|
-
function getParentPath(path) {
|
|
36825
|
-
const parts = path.split("/").filter(Boolean);
|
|
36826
|
-
parts.pop();
|
|
36827
|
-
return `/${parts.join("/")}`;
|
|
36828
|
-
}
|
|
36829
|
-
function detectNetworkFromContainer(container) {
|
|
36830
|
-
const config = container.Config;
|
|
36831
|
-
if (config?.Env) {
|
|
36832
|
-
for (const env of config.Env) {
|
|
36833
|
-
const lower = env.toLowerCase();
|
|
36834
|
-
if (lower.includes("network=testnet") || lower.includes("stacks_network=testnet")) {
|
|
36835
|
-
return "testnet";
|
|
36836
|
-
}
|
|
36837
|
-
if (lower.includes("network=mainnet") || lower.includes("stacks_network=mainnet")) {
|
|
36838
|
-
return "mainnet";
|
|
36839
|
-
}
|
|
36840
|
-
}
|
|
36841
|
-
}
|
|
36842
|
-
if (config?.Labels) {
|
|
36843
|
-
const networkLabel = config.Labels.network || config.Labels["stacks.network"];
|
|
36844
|
-
if (networkLabel === "testnet") {
|
|
36845
|
-
return "testnet";
|
|
36846
|
-
}
|
|
36847
|
-
}
|
|
36848
|
-
return "mainnet";
|
|
36849
|
-
}
|
|
36850
|
-
var SEARCH_PATTERNS = [
|
|
36851
|
-
"/Volumes/stacks-blockchain-docker",
|
|
36852
|
-
"/Volumes/stacks-node",
|
|
36853
|
-
"/Volumes/*/stacks-blockchain-docker",
|
|
36854
|
-
"/Volumes/*/stacks-node",
|
|
36855
|
-
`${homedir3()}/stacks-blockchain-docker`,
|
|
36856
|
-
`${homedir3()}/stacks-node`,
|
|
36857
|
-
`${homedir3()}/stacks-*`,
|
|
36858
|
-
"/opt/stacks-blockchain-docker",
|
|
36859
|
-
"/opt/stacks-node",
|
|
36860
|
-
"/opt/stacks-*"
|
|
36861
|
-
];
|
|
36862
|
-
async function scanFilesystemPaths() {
|
|
36863
|
-
const nodes = [];
|
|
36864
|
-
const checkedPaths = new Set;
|
|
36865
|
-
for (const pattern of SEARCH_PATTERNS) {
|
|
36866
|
-
const paths = await expandGlobPattern(pattern);
|
|
36867
|
-
for (const path of paths) {
|
|
36868
|
-
if (checkedPaths.has(path))
|
|
36869
|
-
continue;
|
|
36870
|
-
checkedPaths.add(path);
|
|
36871
|
-
const isValid = await isValidStacksNodeDir(path);
|
|
36872
|
-
if (!isValid)
|
|
36873
|
-
continue;
|
|
36874
|
-
const network = await detectNetworkFromFilesystem(path);
|
|
36875
|
-
const running = await isComposeProjectRunning(path);
|
|
36876
|
-
nodes.push({
|
|
36877
|
-
path,
|
|
36878
|
-
network,
|
|
36879
|
-
running,
|
|
36880
|
-
source: "filesystem"
|
|
36881
|
-
});
|
|
36882
|
-
}
|
|
36883
|
-
}
|
|
36884
|
-
return nodes;
|
|
36885
|
-
}
|
|
36886
|
-
async function expandGlobPattern(pattern) {
|
|
36887
|
-
try {
|
|
36888
|
-
const result = await Bun.$`bash -c ${`ls -d ${pattern} 2>/dev/null`}`.quiet().nothrow();
|
|
36889
|
-
if (result.exitCode !== 0) {
|
|
36890
|
-
return [];
|
|
36891
|
-
}
|
|
36892
|
-
return result.stdout.toString().trim().split(`
|
|
36893
|
-
`).filter(Boolean);
|
|
36894
|
-
} catch {
|
|
36895
|
-
return [];
|
|
36896
|
-
}
|
|
36897
|
-
}
|
|
36898
|
-
async function isValidStacksNodeDir(path) {
|
|
36899
|
-
const dirName = path.split("/").filter(Boolean).pop() ?? "";
|
|
36900
|
-
if (dirName.includes("stacks-blockchain") || dirName.includes("stacks-node")) {
|
|
36901
|
-
return true;
|
|
36902
|
-
}
|
|
36903
|
-
try {
|
|
36904
|
-
const composeYml = Bun.file(join8(path, "docker-compose.yml"));
|
|
36905
|
-
const composeYaml = Bun.file(join8(path, "docker-compose.yaml"));
|
|
36906
|
-
const hasCompose = await composeYml.exists() || await composeYaml.exists();
|
|
36907
|
-
if (!hasCompose) {
|
|
36908
|
-
return false;
|
|
36909
|
-
}
|
|
36910
|
-
const composeFile = await composeYml.exists() ? composeYml : composeYaml;
|
|
36911
|
-
const content = await composeFile.text();
|
|
36912
|
-
return content.includes("stacks-blockchain") || content.includes("stacks-node") || content.includes("blockstack/stacks-blockchain") || content.includes("hirosystems/stacks-blockchain");
|
|
36913
|
-
} catch {
|
|
36914
|
-
return false;
|
|
36915
|
-
}
|
|
36916
|
-
}
|
|
36917
|
-
async function detectNetworkFromFilesystem(path) {
|
|
36918
|
-
const envFile = Bun.file(join8(path, ".env"));
|
|
36919
|
-
if (await envFile.exists()) {
|
|
36920
|
-
try {
|
|
36921
|
-
const content = await envFile.text();
|
|
36922
|
-
if (content.includes("NETWORK=testnet") || content.includes("STACKS_NETWORK=testnet")) {
|
|
36923
|
-
return "testnet";
|
|
36924
|
-
}
|
|
36925
|
-
if (content.includes("NETWORK=mainnet") || content.includes("STACKS_NETWORK=mainnet")) {
|
|
36926
|
-
return "mainnet";
|
|
36927
|
-
}
|
|
36928
|
-
} catch {}
|
|
36929
|
-
}
|
|
36930
|
-
const testnetConfig = Bun.file(join8(path, "configurations/testnet"));
|
|
36931
|
-
const mainnetConfig = Bun.file(join8(path, "configurations/mainnet"));
|
|
36932
|
-
const activeConfig = Bun.file(join8(path, "configurations/active"));
|
|
36933
|
-
if (await activeConfig.exists()) {
|
|
36934
|
-
try {
|
|
36935
|
-
const result = await Bun.$`readlink ${join8(path, "configurations/active")}`.quiet().nothrow();
|
|
36936
|
-
const link = result.stdout.toString().trim();
|
|
36937
|
-
if (link.includes("testnet"))
|
|
36938
|
-
return "testnet";
|
|
36939
|
-
} catch {}
|
|
36940
|
-
}
|
|
36941
|
-
if (path.toLowerCase().includes("testnet")) {
|
|
36942
|
-
return "testnet";
|
|
36943
|
-
}
|
|
36944
|
-
return "mainnet";
|
|
36945
|
-
}
|
|
36946
|
-
async function isComposeProjectRunning(path) {
|
|
36947
|
-
try {
|
|
36948
|
-
const result = await Bun.$`docker compose -f ${join8(path, "docker-compose.yml")} ps -q`.quiet().nothrow();
|
|
36949
|
-
return result.exitCode === 0 && result.stdout.toString().trim().length > 0;
|
|
36950
|
-
} catch {
|
|
36951
|
-
return false;
|
|
36952
|
-
}
|
|
36953
|
-
}
|
|
36954
|
-
async function detectStacksNodes() {
|
|
36955
|
-
const nodes = [];
|
|
36956
|
-
if (await isDockerAvailable()) {
|
|
36957
|
-
const containerNode = await detectRunningContainers();
|
|
36958
|
-
if (containerNode) {
|
|
36959
|
-
nodes.push(containerNode);
|
|
36960
|
-
}
|
|
36961
|
-
}
|
|
36962
|
-
const filesystemNodes = await scanFilesystemPaths();
|
|
36963
|
-
const seenPaths = new Set(nodes.map((n) => n.path));
|
|
36964
|
-
for (const node of filesystemNodes) {
|
|
36965
|
-
if (!seenPaths.has(node.path)) {
|
|
36966
|
-
nodes.push(node);
|
|
36967
|
-
seenPaths.add(node.path);
|
|
36968
|
-
}
|
|
36969
|
-
}
|
|
36970
|
-
return nodes;
|
|
36971
|
-
}
|
|
36972
|
-
|
|
36973
|
-
// src/commands/config.ts
|
|
36974
34575
|
init_output();
|
|
36975
34576
|
function registerConfigCommand(program) {
|
|
36976
34577
|
const config = program.command("config").description("Manage CLI configuration");
|
|
@@ -36983,25 +34584,18 @@ function registerConfigCommand(program) {
|
|
|
36983
34584
|
}
|
|
36984
34585
|
note(`Config file: ${getConfigPath()}`);
|
|
36985
34586
|
console.log("");
|
|
36986
|
-
|
|
34587
|
+
printConfig(cfg);
|
|
36987
34588
|
} catch (err) {
|
|
36988
34589
|
error(`Failed to load config: ${err}`);
|
|
36989
34590
|
process.exit(1);
|
|
36990
34591
|
}
|
|
36991
34592
|
});
|
|
36992
|
-
config.command("set <key> <value>").description("Set a configuration value
|
|
34593
|
+
config.command("set <key> <value>").description("Set a configuration value").addHelpText("after", `
|
|
36993
34594
|
Examples:
|
|
36994
|
-
$ secondlayer config set network local
|
|
36995
|
-
$ secondlayer config set ports.api 3800
|
|
36996
|
-
$ secondlayer config set database.url postgres://localhost:5432/secondlayer_dev`).action(async (key, value, options) => {
|
|
34595
|
+
$ secondlayer config set network local`).action(async (key, value) => {
|
|
36997
34596
|
try {
|
|
36998
34597
|
await setConfigValue(key, value);
|
|
36999
34598
|
success(`Set ${key} = ${value}`);
|
|
37000
|
-
if (options.validate) {
|
|
37001
|
-
if (key === "database.url") {
|
|
37002
|
-
await validateDatabaseConnection(value);
|
|
37003
|
-
}
|
|
37004
|
-
}
|
|
37005
34599
|
} catch (err) {
|
|
37006
34600
|
if (err instanceof Error && err.message.includes("Invalid")) {
|
|
37007
34601
|
error(`Invalid value for ${key}: ${err.message}`);
|
|
@@ -37044,78 +34638,12 @@ Examples:
|
|
|
37044
34638
|
}
|
|
37045
34639
|
});
|
|
37046
34640
|
}
|
|
37047
|
-
|
|
37048
|
-
const
|
|
37049
|
-
|
|
37050
|
-
|
|
37051
|
-
printValue("defaultProject", cfg.defaultProject, false);
|
|
37052
|
-
}
|
|
37053
|
-
const resolvedDataDir = getDataDir(cfg);
|
|
37054
|
-
const dataDirDisplay = cfg.dataDir === resolvedDataDir ? cfg.dataDir : `${cfg.dataDir} ${dim(`→ ${resolvedDataDir}`)}`;
|
|
37055
|
-
printValue("dataDir", dataDirDisplay, isDefaultValue(cfg, "dataDir"));
|
|
37056
|
-
if (cfg.network === "local") {
|
|
37057
|
-
console.log("");
|
|
37058
|
-
console.log(blue("node:"));
|
|
37059
|
-
if (cfg.node) {
|
|
37060
|
-
printValue(" installPath", cfg.node.installPath, false, 2);
|
|
37061
|
-
printValue(" network", cfg.node.network, cfg.node.network === "mainnet", 2);
|
|
37062
|
-
} else {
|
|
37063
|
-
console.log(dim(" (not configured)"));
|
|
37064
|
-
try {
|
|
37065
|
-
const detected = await detectStacksNodes();
|
|
37066
|
-
if (detected.length > 0) {
|
|
37067
|
-
console.log("");
|
|
37068
|
-
console.log(dim(` Detected ${detected.length} node${detected.length > 1 ? "s" : ""}:`));
|
|
37069
|
-
for (const node of detected.slice(0, 3)) {
|
|
37070
|
-
const status = node.running ? green("●") : dim("○");
|
|
37071
|
-
console.log(dim(` ${status} ${node.path} (${node.network})`));
|
|
37072
|
-
}
|
|
37073
|
-
console.log(dim(" Run 'secondlayer init' to configure"));
|
|
37074
|
-
}
|
|
37075
|
-
} catch {}
|
|
37076
|
-
}
|
|
37077
|
-
console.log("");
|
|
37078
|
-
console.log(blue("ports:"));
|
|
37079
|
-
printValue(" api", cfg.ports.api, cfg.ports.api === defaults.ports.api, 2);
|
|
37080
|
-
printValue(" indexer", cfg.ports.indexer, cfg.ports.indexer === defaults.ports.indexer, 2);
|
|
37081
|
-
console.log("");
|
|
37082
|
-
console.log(blue("database:"));
|
|
37083
|
-
printValue(" type", cfg.database.type, cfg.database.type === "docker", 2);
|
|
37084
|
-
if (cfg.database.url) {
|
|
37085
|
-
printValue(" url", maskUrl(cfg.database.url), false, 2);
|
|
37086
|
-
}
|
|
37087
|
-
}
|
|
34641
|
+
function printConfig(cfg) {
|
|
34642
|
+
const isDefault = cfg.network === getDefaultConfig().network;
|
|
34643
|
+
const value = isDefault ? dim(cfg.network) : green(cfg.network);
|
|
34644
|
+
console.log(`network: ${value}${isDefault ? dim(" (default)") : ""}`);
|
|
37088
34645
|
console.log("");
|
|
37089
34646
|
}
|
|
37090
|
-
function printValue(key, value, isDefault, _indent = 0) {
|
|
37091
|
-
const valueStr = String(value);
|
|
37092
|
-
const defaultIndicator = isDefault ? dim(" (default)") : "";
|
|
37093
|
-
const valueColor = isDefault ? dim(valueStr) : green(valueStr);
|
|
37094
|
-
console.log(`${key}: ${valueColor}${defaultIndicator}`);
|
|
37095
|
-
}
|
|
37096
|
-
function maskUrl(url) {
|
|
37097
|
-
try {
|
|
37098
|
-
const parsed = new URL(url);
|
|
37099
|
-
if (parsed.password) {
|
|
37100
|
-
parsed.password = "****";
|
|
37101
|
-
}
|
|
37102
|
-
return parsed.toString();
|
|
37103
|
-
} catch {
|
|
37104
|
-
return url;
|
|
37105
|
-
}
|
|
37106
|
-
}
|
|
37107
|
-
async function validateDatabaseConnection(url) {
|
|
37108
|
-
try {
|
|
37109
|
-
await Promise.resolve().then(() => init_src());
|
|
37110
|
-
const sql = src_default(url);
|
|
37111
|
-
await sql`SELECT 1`;
|
|
37112
|
-
await sql.end();
|
|
37113
|
-
success("Database connection verified");
|
|
37114
|
-
} catch (err) {
|
|
37115
|
-
warn(`Could not connect to database: ${err instanceof Error ? err.message : err}`);
|
|
37116
|
-
console.log(dim("The URL was saved but connection failed. Check your database settings."));
|
|
37117
|
-
}
|
|
37118
|
-
}
|
|
37119
34647
|
// src/commands/context.ts
|
|
37120
34648
|
init_http();
|
|
37121
34649
|
import {
|
|
@@ -37933,9 +35461,9 @@ function registerWebhooksCommand(program) {
|
|
|
37933
35461
|
attachWebhookSubcommands(webhooks);
|
|
37934
35462
|
}
|
|
37935
35463
|
// src/commands/devnet.ts
|
|
37936
|
-
import { spawnSync as
|
|
35464
|
+
import { spawnSync as spawnSync2 } from "node:child_process";
|
|
37937
35465
|
import { existsSync as existsSync6, mkdirSync as mkdirSync3, writeFileSync as writeFileSync5 } from "node:fs";
|
|
37938
|
-
import { dirname as dirname7, join as
|
|
35466
|
+
import { dirname as dirname7, join as join10 } from "node:path";
|
|
37939
35467
|
|
|
37940
35468
|
// src/lib/devnet-compose.ts
|
|
37941
35469
|
var DEFAULT_IMAGE_OWNER = "ryanwaits";
|
|
@@ -38090,14 +35618,14 @@ volumes:
|
|
|
38090
35618
|
|
|
38091
35619
|
// src/lib/devnet-config.ts
|
|
38092
35620
|
import { existsSync as existsSync5, readFileSync as readFileSync6, writeFileSync as writeFileSync4 } from "node:fs";
|
|
38093
|
-
import { dirname as dirname6, join as
|
|
35621
|
+
import { dirname as dirname6, join as join8, parse as parsePath } from "node:path";
|
|
38094
35622
|
import { parse as parseToml } from "smol-toml";
|
|
38095
35623
|
var DEFAULT_INDEXER_OBSERVER = "host.docker.internal:3700";
|
|
38096
35624
|
function findClarinetProject(startDir) {
|
|
38097
35625
|
let dir = startDir;
|
|
38098
35626
|
const { root } = parsePath(dir);
|
|
38099
35627
|
while (true) {
|
|
38100
|
-
if (existsSync5(
|
|
35628
|
+
if (existsSync5(join8(dir, "Clarinet.toml")))
|
|
38101
35629
|
return dir;
|
|
38102
35630
|
if (dir === root)
|
|
38103
35631
|
return null;
|
|
@@ -38149,7 +35677,7 @@ init_resolve_auth();
|
|
|
38149
35677
|
// src/commands/faucet.ts
|
|
38150
35678
|
import { randomBytes as randomBytes2 } from "node:crypto";
|
|
38151
35679
|
import { readFile as readFile5 } from "node:fs/promises";
|
|
38152
|
-
import { join as
|
|
35680
|
+
import { join as join9 } from "node:path";
|
|
38153
35681
|
import { http as http3, createWalletClient } from "@secondlayer/stacks";
|
|
38154
35682
|
import { mnemonicToAccount } from "@secondlayer/stacks/accounts";
|
|
38155
35683
|
import { devnet } from "@secondlayer/stacks/chains";
|
|
@@ -38159,7 +35687,7 @@ init_output();
|
|
|
38159
35687
|
var DUST_LIMIT_SATS = 546n;
|
|
38160
35688
|
var DEFAULT_AMOUNT_SATS = 1000000n;
|
|
38161
35689
|
async function readDeployerMnemonic(projectDir) {
|
|
38162
|
-
const path =
|
|
35690
|
+
const path = join9(projectDir, "settings", "Devnet.toml");
|
|
38163
35691
|
let raw;
|
|
38164
35692
|
try {
|
|
38165
35693
|
raw = await readFile5(path, "utf8");
|
|
@@ -38276,9 +35804,9 @@ is what makes minting possible without Bitcoin.`).action(async (opts) => {
|
|
|
38276
35804
|
}
|
|
38277
35805
|
|
|
38278
35806
|
// src/commands/devnet.ts
|
|
38279
|
-
var COMPOSE_REL =
|
|
35807
|
+
var COMPOSE_REL = join10(".secondlayer", "docker-compose.yml");
|
|
38280
35808
|
function ensureDocker() {
|
|
38281
|
-
const probe =
|
|
35809
|
+
const probe = spawnSync2("docker", ["info"], { stdio: "ignore" });
|
|
38282
35810
|
if (probe.error || probe.status !== 0) {
|
|
38283
35811
|
error(`Docker isn't available.
|
|
38284
35812
|
|
|
@@ -38289,7 +35817,7 @@ function ensureDocker() {
|
|
|
38289
35817
|
}
|
|
38290
35818
|
}
|
|
38291
35819
|
function dockerCompose(composePath, args) {
|
|
38292
|
-
const res =
|
|
35820
|
+
const res = spawnSync2("docker", ["compose", "-f", composePath, ...args], {
|
|
38293
35821
|
stdio: "inherit"
|
|
38294
35822
|
});
|
|
38295
35823
|
return res.status ?? 1;
|
|
@@ -38321,7 +35849,7 @@ function registerDevnetCommand(program) {
|
|
|
38321
35849
|
}
|
|
38322
35850
|
function resolveProject(explicit) {
|
|
38323
35851
|
if (explicit) {
|
|
38324
|
-
if (!existsSync6(
|
|
35852
|
+
if (!existsSync6(join10(explicit, "Clarinet.toml"))) {
|
|
38325
35853
|
error(`No Clarinet.toml in ${explicit}`);
|
|
38326
35854
|
process.exit(1);
|
|
38327
35855
|
}
|
|
@@ -38337,7 +35865,7 @@ function resolveProject(explicit) {
|
|
|
38337
35865
|
}
|
|
38338
35866
|
async function connect(options) {
|
|
38339
35867
|
const project = resolveProject(options.project);
|
|
38340
|
-
const devnetToml =
|
|
35868
|
+
const devnetToml = join10(project, "settings", "Devnet.toml");
|
|
38341
35869
|
mkdirSync3(dirname7(devnetToml), { recursive: true });
|
|
38342
35870
|
const result = ensureEventObserver(devnetToml, DEFAULT_INDEXER_OBSERVER);
|
|
38343
35871
|
console.log(`${green("✓")} found Clarinet.toml`);
|
|
@@ -38347,7 +35875,7 @@ async function connect(options) {
|
|
|
38347
35875
|
console.log(`${green("✓")} ${result.status === "created" ? "created" : "patched"} settings/Devnet.toml`);
|
|
38348
35876
|
console.log(dim(` + stacks_node_events_observers = ["${DEFAULT_INDEXER_OBSERVER}"]`));
|
|
38349
35877
|
}
|
|
38350
|
-
const composePath =
|
|
35878
|
+
const composePath = join10(project, COMPOSE_REL);
|
|
38351
35879
|
mkdirSync3(dirname7(composePath), { recursive: true });
|
|
38352
35880
|
writeFileSync5(composePath, buildDevnetCompose({ owner: options.owner, imageTag: options.imageTag }));
|
|
38353
35881
|
console.log(`${green("✓")} wrote ${COMPOSE_REL}`);
|
|
@@ -38380,7 +35908,7 @@ Stop with: secondlayer devnet down`));
|
|
|
38380
35908
|
}
|
|
38381
35909
|
async function down(options) {
|
|
38382
35910
|
const project = resolveProject(options.project);
|
|
38383
|
-
const composePath =
|
|
35911
|
+
const composePath = join10(project, COMPOSE_REL);
|
|
38384
35912
|
if (!existsSync6(composePath)) {
|
|
38385
35913
|
error(`No ${COMPOSE_REL} in ${project} — nothing to stop. Run \`secondlayer devnet connect\` first.`);
|
|
38386
35914
|
process.exit(1);
|
|
@@ -38395,7 +35923,7 @@ async function down(options) {
|
|
|
38395
35923
|
}
|
|
38396
35924
|
async function logs(service, options) {
|
|
38397
35925
|
const project = resolveProject(options.project);
|
|
38398
|
-
const composePath =
|
|
35926
|
+
const composePath = join10(project, COMPOSE_REL);
|
|
38399
35927
|
if (!existsSync6(composePath)) {
|
|
38400
35928
|
error(`No ${COMPOSE_REL} in ${project} — run \`secondlayer devnet connect\` first.`);
|
|
38401
35929
|
process.exit(1);
|
|
@@ -38654,7 +36182,7 @@ function parseMaxPages(value) {
|
|
|
38654
36182
|
}
|
|
38655
36183
|
function consumeHandlers(io) {
|
|
38656
36184
|
return {
|
|
38657
|
-
onBatch: (events,
|
|
36185
|
+
onBatch: (events, ctx) => {
|
|
38658
36186
|
for (const e of events)
|
|
38659
36187
|
io.stdout(JSON.stringify(e));
|
|
38660
36188
|
if (ctx.cursor)
|
|
@@ -38837,7 +36365,6 @@ init_index_api();
|
|
|
38837
36365
|
init_config2();
|
|
38838
36366
|
|
|
38839
36367
|
// src/lib/health.ts
|
|
38840
|
-
init_config2();
|
|
38841
36368
|
init_dev_state();
|
|
38842
36369
|
|
|
38843
36370
|
// src/lib/network.ts
|
|
@@ -38855,96 +36382,30 @@ function networkFromId(networkId) {
|
|
|
38855
36382
|
return "testnet";
|
|
38856
36383
|
return null;
|
|
38857
36384
|
}
|
|
38858
|
-
async function validateNetworkConsistency(config) {
|
|
38859
|
-
const issues = [];
|
|
38860
|
-
const network = config.node?.network;
|
|
38861
|
-
if (!network) {
|
|
38862
|
-
return { valid: true, issues: [] };
|
|
38863
|
-
}
|
|
38864
|
-
const expected = CHAIN_IDS[network].decimal;
|
|
38865
|
-
try {
|
|
38866
|
-
const res = await fetch("http://localhost:20443/v2/info", {
|
|
38867
|
-
signal: AbortSignal.timeout(3000)
|
|
38868
|
-
});
|
|
38869
|
-
if (res.ok) {
|
|
38870
|
-
const info = await res.json();
|
|
38871
|
-
if (info.network_id !== expected) {
|
|
38872
|
-
const actual = networkFromId(info.network_id);
|
|
38873
|
-
issues.push(`RPC reports network_id=${info.network_id} (${actual ?? "unknown"}) but config says ${network} (${expected})`);
|
|
38874
|
-
}
|
|
38875
|
-
}
|
|
38876
|
-
} catch {}
|
|
38877
|
-
try {
|
|
38878
|
-
const result = await Bun.$`docker inspect --format={{.Config.Env}} stacks-blockchain`.quiet().nothrow();
|
|
38879
|
-
if (result.exitCode === 0) {
|
|
38880
|
-
const envStr = result.stdout.toString();
|
|
38881
|
-
const match = envStr.match(/STACKS_CHAIN_ID=(0x[0-9a-fA-F]+|\d+)/);
|
|
38882
|
-
if (match) {
|
|
38883
|
-
const containerId = Number.parseInt(match[1], match[1]?.startsWith("0x") ? 16 : 10);
|
|
38884
|
-
if (containerId !== expected) {
|
|
38885
|
-
issues.push(`Container STACKS_CHAIN_ID=${containerId} but config expects ${expected} (${network})`);
|
|
38886
|
-
}
|
|
38887
|
-
}
|
|
38888
|
-
}
|
|
38889
|
-
} catch {}
|
|
38890
|
-
if (config.node?.installPath) {
|
|
38891
|
-
try {
|
|
38892
|
-
const envFile = Bun.file(`${config.node.installPath}/.env`);
|
|
38893
|
-
if (await envFile.exists()) {
|
|
38894
|
-
const content = await envFile.text();
|
|
38895
|
-
const match = content.match(/STACKS_CHAIN_ID=(0x[0-9a-fA-F]+|\d+)/);
|
|
38896
|
-
if (match) {
|
|
38897
|
-
const fileId = Number.parseInt(match[1], match[1]?.startsWith("0x") ? 16 : 10);
|
|
38898
|
-
if (fileId !== expected) {
|
|
38899
|
-
issues.push(`Node .env STACKS_CHAIN_ID=${fileId} but config expects ${expected} (${network})`);
|
|
38900
|
-
}
|
|
38901
|
-
}
|
|
38902
|
-
}
|
|
38903
|
-
} catch {}
|
|
38904
|
-
}
|
|
38905
|
-
return { valid: issues.length === 0, issues };
|
|
38906
|
-
}
|
|
38907
36385
|
|
|
38908
|
-
// src/lib/
|
|
38909
|
-
|
|
38910
|
-
async function getNodeContainers() {
|
|
36386
|
+
// src/lib/health.ts
|
|
36387
|
+
async function isNodeRunning() {
|
|
38911
36388
|
try {
|
|
38912
|
-
const result = await Bun.$`docker ps --format json --filter "name=stacks"`.quiet();
|
|
36389
|
+
const result = await Bun.$`docker ps --format json --filter "name=stacks-blockchain"`.quiet();
|
|
38913
36390
|
if (result.exitCode !== 0)
|
|
38914
|
-
return
|
|
38915
|
-
|
|
38916
|
-
`).filter(Boolean)
|
|
38917
|
-
|
|
38918
|
-
|
|
38919
|
-
|
|
38920
|
-
const container = JSON.parse(line);
|
|
38921
|
-
containers.push({
|
|
38922
|
-
name: container.Names || container.Name,
|
|
38923
|
-
status: container.Status || "unknown"
|
|
38924
|
-
});
|
|
38925
|
-
} catch {}
|
|
38926
|
-
}
|
|
38927
|
-
return containers;
|
|
36391
|
+
return false;
|
|
36392
|
+
return result.stdout.toString().trim().split(`
|
|
36393
|
+
`).filter(Boolean).some((line) => {
|
|
36394
|
+
const { Status } = JSON.parse(line);
|
|
36395
|
+
return !Status?.includes("Restarting");
|
|
36396
|
+
});
|
|
38928
36397
|
} catch {
|
|
38929
|
-
return
|
|
36398
|
+
return false;
|
|
38930
36399
|
}
|
|
38931
36400
|
}
|
|
38932
|
-
async function isNodeRunning() {
|
|
38933
|
-
const containers = await getNodeContainers();
|
|
38934
|
-
return containers.some((c) => c.name.includes("stacks-blockchain") && !c.status.includes("Restarting"));
|
|
38935
|
-
}
|
|
38936
|
-
|
|
38937
|
-
// src/lib/health.ts
|
|
38938
36401
|
async function checkHealth() {
|
|
38939
|
-
const config = await loadConfig2();
|
|
38940
36402
|
const issues = [];
|
|
38941
36403
|
const node = {
|
|
38942
36404
|
running: false,
|
|
38943
|
-
network:
|
|
36405
|
+
network: null,
|
|
38944
36406
|
height: null,
|
|
38945
36407
|
burnHeight: null,
|
|
38946
36408
|
chainId: null,
|
|
38947
|
-
chainIdValid: true,
|
|
38948
36409
|
peers: 0,
|
|
38949
36410
|
version: null
|
|
38950
36411
|
};
|
|
@@ -38960,7 +36421,7 @@ async function checkHealth() {
|
|
|
38960
36421
|
node.height = info.stacks_tip_height ?? null;
|
|
38961
36422
|
node.burnHeight = info.burn_block_height ?? null;
|
|
38962
36423
|
node.version = info.server_version ?? null;
|
|
38963
|
-
node.network = networkFromId(info.network_id)
|
|
36424
|
+
node.network = networkFromId(info.network_id);
|
|
38964
36425
|
}
|
|
38965
36426
|
} catch {
|
|
38966
36427
|
issues.push("Node RPC not responding");
|
|
@@ -38974,9 +36435,6 @@ async function checkHealth() {
|
|
|
38974
36435
|
node.peers = (peers.inbound?.length ?? 0) + (peers.outbound?.length ?? 0);
|
|
38975
36436
|
}
|
|
38976
36437
|
} catch {}
|
|
38977
|
-
const validation = await validateNetworkConsistency(config);
|
|
38978
|
-
node.chainIdValid = validation.valid;
|
|
38979
|
-
issues.push(...validation.issues);
|
|
38980
36438
|
}
|
|
38981
36439
|
const containers = [];
|
|
38982
36440
|
try {
|
|
@@ -39050,8 +36508,8 @@ async function checkHealth() {
|
|
|
39050
36508
|
infrastructure.postgres = pg.stdout.toString().trim().length > 0;
|
|
39051
36509
|
} catch {}
|
|
39052
36510
|
const portsToCheck = [
|
|
39053
|
-
{ port:
|
|
39054
|
-
{ port:
|
|
36511
|
+
{ port: 3800, name: "API" },
|
|
36512
|
+
{ port: 3700, name: "Indexer" },
|
|
39055
36513
|
{ port: 20443, name: "Node RPC" }
|
|
39056
36514
|
];
|
|
39057
36515
|
for (const { port, name } of portsToCheck) {
|
|
@@ -39168,22 +36626,17 @@ function doctorVerdictSuffix(diagnosis) {
|
|
|
39168
36626
|
return ` — the API reports status=${diagnosis.overall}.`;
|
|
39169
36627
|
}
|
|
39170
36628
|
async function runLocalDoctor(jsonOutput) {
|
|
39171
|
-
const config = await loadConfig2();
|
|
39172
36629
|
const report = await checkHealth();
|
|
39173
36630
|
if (jsonOutput) {
|
|
39174
36631
|
console.log(JSON.stringify(report, null, 2));
|
|
39175
36632
|
return;
|
|
39176
36633
|
}
|
|
39177
|
-
const network =
|
|
39178
|
-
const chainIdHex = network ? getChainIdHex(network) : "N/A";
|
|
36634
|
+
const { network } = report.node;
|
|
39179
36635
|
console.log("");
|
|
39180
36636
|
console.log(blue("Stack"));
|
|
39181
36637
|
console.log(formatKeyValue([
|
|
39182
36638
|
[" Network", network ?? dim("not configured")],
|
|
39183
|
-
[
|
|
39184
|
-
" Chain ID",
|
|
39185
|
-
network ? `${chainIdHex} (${report.node.chainIdValid ? green("valid") : red("MISMATCH")})` : dim("N/A")
|
|
39186
|
-
]
|
|
36639
|
+
[" Chain ID", network ? getChainIdHex(network) : dim("N/A")]
|
|
39187
36640
|
]));
|
|
39188
36641
|
console.log("");
|
|
39189
36642
|
console.log(blue("Node"));
|
|
@@ -39226,30 +36679,8 @@ async function runLocalDoctor(jsonOutput) {
|
|
|
39226
36679
|
console.log(` ${report.infrastructure.postgres ? green("✓") : red("✗")} PostgreSQL`);
|
|
39227
36680
|
console.log("");
|
|
39228
36681
|
console.log(blue("Config"));
|
|
39229
|
-
|
|
39230
|
-
const dataDir = getDataDir(config);
|
|
39231
|
-
console.log(formatKeyValue([
|
|
39232
|
-
[" Config", dim(configPath)],
|
|
39233
|
-
[" Data dir", dim(dataDir)],
|
|
39234
|
-
[" Node path", dim(config.node?.installPath ?? "not set")]
|
|
39235
|
-
]));
|
|
36682
|
+
console.log(formatKeyValue([[" Config", dim(getConfigPath())]]));
|
|
39236
36683
|
console.log("");
|
|
39237
|
-
try {
|
|
39238
|
-
const result = await Bun.$`df -h ${dataDir}`.quiet().nothrow();
|
|
39239
|
-
if (result.exitCode === 0) {
|
|
39240
|
-
const lines = result.stdout.toString().trim().split(`
|
|
39241
|
-
`);
|
|
39242
|
-
if (lines.length >= 2) {
|
|
39243
|
-
const parts = lines[1]?.split(/\s+/);
|
|
39244
|
-
const used = parts[2];
|
|
39245
|
-
const avail = parts[3];
|
|
39246
|
-
const pct = parts[4];
|
|
39247
|
-
console.log(blue("Disk"));
|
|
39248
|
-
console.log(` Used: ${used} Available: ${avail} (${pct})`);
|
|
39249
|
-
console.log("");
|
|
39250
|
-
}
|
|
39251
|
-
}
|
|
39252
|
-
} catch {}
|
|
39253
36684
|
try {
|
|
39254
36685
|
await Promise.resolve().then(() => init_dev_state());
|
|
39255
36686
|
const logsDir = getLogsDir();
|
|
@@ -39279,54 +36710,9 @@ async function runLocalDoctor(jsonOutput) {
|
|
|
39279
36710
|
}
|
|
39280
36711
|
// src/commands/whoami.ts
|
|
39281
36712
|
init_api_url();
|
|
39282
|
-
init_config2();
|
|
39283
36713
|
init_http();
|
|
39284
36714
|
init_output();
|
|
39285
36715
|
import { resolveApiKey as resolveApiKey4 } from "@secondlayer/sdk";
|
|
39286
|
-
|
|
39287
|
-
// src/lib/project-file.ts
|
|
39288
|
-
import { existsSync as existsSync7 } from "node:fs";
|
|
39289
|
-
import { mkdir as mkdir4, readFile as readFile6, writeFile as writeFile5 } from "node:fs/promises";
|
|
39290
|
-
import { homedir as homedir5 } from "node:os";
|
|
39291
|
-
import { dirname as dirname9, join as join13, parse as parsePath2, resolve as resolve8 } from "node:path";
|
|
39292
|
-
import { z as z4 } from "zod";
|
|
39293
|
-
var ProjectFileSchema = z4.object({
|
|
39294
|
-
slug: z4.string().min(1)
|
|
39295
|
-
});
|
|
39296
|
-
var FILENAME = "project";
|
|
39297
|
-
var DIRNAME = ".secondlayer";
|
|
39298
|
-
async function readActiveProject(cwd, globalDefault) {
|
|
39299
|
-
let dir = resolve8(cwd);
|
|
39300
|
-
const home = resolve8(homedir5());
|
|
39301
|
-
const fsRoot = parsePath2(dir).root;
|
|
39302
|
-
while (true) {
|
|
39303
|
-
const candidate = join13(dir, DIRNAME, FILENAME);
|
|
39304
|
-
if (existsSync7(candidate)) {
|
|
39305
|
-
try {
|
|
39306
|
-
const raw = await readFile6(candidate, "utf8");
|
|
39307
|
-
const parsed = ProjectFileSchema.parse(JSON.parse(raw));
|
|
39308
|
-
return { slug: parsed.slug, resolvedFrom: candidate };
|
|
39309
|
-
} catch {}
|
|
39310
|
-
}
|
|
39311
|
-
if (existsSync7(join13(dir, ".git")))
|
|
39312
|
-
break;
|
|
39313
|
-
if (dir === home || dir === fsRoot)
|
|
39314
|
-
break;
|
|
39315
|
-
const parent = dirname9(dir);
|
|
39316
|
-
if (parent === dir)
|
|
39317
|
-
break;
|
|
39318
|
-
dir = parent;
|
|
39319
|
-
}
|
|
39320
|
-
if (globalDefault) {
|
|
39321
|
-
return {
|
|
39322
|
-
slug: globalDefault,
|
|
39323
|
-
resolvedFrom: join13(homedir5(), ".secondlayer", "config.json")
|
|
39324
|
-
};
|
|
39325
|
-
}
|
|
39326
|
-
return null;
|
|
39327
|
-
}
|
|
39328
|
-
|
|
39329
|
-
// src/commands/whoami.ts
|
|
39330
36716
|
async function runWhoami() {
|
|
39331
36717
|
const instanceUrl = resolveApiUrl();
|
|
39332
36718
|
const merchantUrl = resolveArchiveOpsUrl();
|
|
@@ -39342,8 +36728,6 @@ async function runWhoami() {
|
|
|
39342
36728
|
merchantOk = false;
|
|
39343
36729
|
}
|
|
39344
36730
|
const merchantCredential = source === "env" ? "SECONDLAYER_API_KEY" : source === "session" ? "session" : null;
|
|
39345
|
-
const config = await loadConfig2();
|
|
39346
|
-
const active = await readActiveProject(process.cwd(), config.defaultProject);
|
|
39347
36731
|
return {
|
|
39348
36732
|
instance: {
|
|
39349
36733
|
url: instanceUrl,
|
|
@@ -39355,8 +36739,7 @@ async function runWhoami() {
|
|
|
39355
36739
|
credential: merchantCredential,
|
|
39356
36740
|
status: merchantOk ? "set" : "missing",
|
|
39357
36741
|
email
|
|
39358
|
-
}
|
|
39359
|
-
project: active ? { slug: active.slug, source: active.resolvedFrom } : null
|
|
36742
|
+
}
|
|
39360
36743
|
};
|
|
39361
36744
|
}
|
|
39362
36745
|
function registerWhoamiCommand(program) {
|
|
@@ -39374,12 +36757,6 @@ function registerWhoamiCommand(program) {
|
|
|
39374
36757
|
const merchantCred = result.merchant.credential ?? "SECONDLAYER_API_KEY|session";
|
|
39375
36758
|
const merchantValue = result.merchant.email ? `${result.merchant.url} ${merchantCred} ${result.merchant.status} (${result.merchant.email})` : `${result.merchant.url} ${merchantCred} ${result.merchant.status}`;
|
|
39376
36759
|
rows.push(["merchant", merchantValue]);
|
|
39377
|
-
if (result.project) {
|
|
39378
|
-
rows.push(["project", result.project.slug]);
|
|
39379
|
-
rows.push(["project source", dim(result.project.source)]);
|
|
39380
|
-
} else {
|
|
39381
|
-
rows.push(["project", dim("(none)")]);
|
|
39382
|
-
}
|
|
39383
36760
|
console.log(formatKeyValue(rows));
|
|
39384
36761
|
if (result.merchant.status === "missing") {
|
|
39385
36762
|
note(`merchant identity missing. ${ARCHIVE_AUTH_HINT}`);
|
|
@@ -39667,13 +37044,13 @@ init_output();
|
|
|
39667
37044
|
init_resolve_auth();
|
|
39668
37045
|
import {
|
|
39669
37046
|
chmodSync,
|
|
39670
|
-
existsSync as
|
|
37047
|
+
existsSync as existsSync7,
|
|
39671
37048
|
mkdirSync as mkdirSync4,
|
|
39672
37049
|
readFileSync as readFileSync7,
|
|
39673
37050
|
statSync as statSync2,
|
|
39674
37051
|
writeFileSync as writeFileSync6
|
|
39675
37052
|
} from "node:fs";
|
|
39676
|
-
import { join as
|
|
37053
|
+
import { join as join12, resolve as resolve8 } from "node:path";
|
|
39677
37054
|
import { closeDb, getDb as getDb4, sql as sql2 } from "@secondlayer/shared/db";
|
|
39678
37055
|
import {
|
|
39679
37056
|
decryptBundle,
|
|
@@ -39822,10 +37199,10 @@ async function runBackup(opts) {
|
|
|
39822
37199
|
printError(plan.reason);
|
|
39823
37200
|
process.exit(BACKUP_EXIT.REFUSED);
|
|
39824
37201
|
}
|
|
39825
|
-
const outDir =
|
|
37202
|
+
const outDir = resolve8(opts.out);
|
|
39826
37203
|
mkdirSync4(outDir, { recursive: true });
|
|
39827
37204
|
console.error("dumping database…");
|
|
39828
|
-
const dumpPath =
|
|
37205
|
+
const dumpPath = join12(outDir, DB_FILE);
|
|
39829
37206
|
const dumpCmd = pgDumpInvocation(databaseUrl, dumpPath);
|
|
39830
37207
|
const dump = await runProcess(dumpCmd.cmd, "pg_dump", dumpCmd.env);
|
|
39831
37208
|
if (!dump.ok) {
|
|
@@ -39845,7 +37222,7 @@ async function runBackup(opts) {
|
|
|
39845
37222
|
const lines = SECRET_ENV_KEYS.filter((k) => process.env[k]).map((k) => `${k}=${process.env[k]}`);
|
|
39846
37223
|
const sealed = encryptBundle(lines.join(`
|
|
39847
37224
|
`), passphrase);
|
|
39848
|
-
const secretsPath =
|
|
37225
|
+
const secretsPath = join12(outDir, SECRETS_FILE);
|
|
39849
37226
|
writeFileSync6(secretsPath, sealed);
|
|
39850
37227
|
chmodSync(secretsPath, 384);
|
|
39851
37228
|
manifest.secrets = {
|
|
@@ -39854,7 +37231,7 @@ async function runBackup(opts) {
|
|
|
39854
37231
|
canary: sealKeyCanary(secretsKey)
|
|
39855
37232
|
};
|
|
39856
37233
|
}
|
|
39857
|
-
writeFileSync6(
|
|
37234
|
+
writeFileSync6(join12(outDir, MANIFEST_FILE), `${JSON.stringify(manifest, null, 2)}
|
|
39858
37235
|
`);
|
|
39859
37236
|
output({
|
|
39860
37237
|
json: opts.json,
|
|
@@ -39883,14 +37260,14 @@ function attachRestoreCommand(cmd) {
|
|
|
39883
37260
|
}
|
|
39884
37261
|
async function runRestore(opts) {
|
|
39885
37262
|
const databaseUrl = requireDatabaseUrl();
|
|
39886
|
-
const dir =
|
|
39887
|
-
const manifestPath =
|
|
39888
|
-
if (!
|
|
37263
|
+
const dir = resolve8(opts.from);
|
|
37264
|
+
const manifestPath = join12(dir, MANIFEST_FILE);
|
|
37265
|
+
if (!existsSync7(manifestPath)) {
|
|
39889
37266
|
printError(`no ${MANIFEST_FILE} in ${dir}`);
|
|
39890
37267
|
process.exit(BACKUP_EXIT.REFUSED);
|
|
39891
37268
|
}
|
|
39892
37269
|
const manifest = JSON.parse(readFileSync7(manifestPath, "utf8"));
|
|
39893
|
-
const dumpPath =
|
|
37270
|
+
const dumpPath = join12(dir, manifest.db?.file ?? DB_FILE);
|
|
39894
37271
|
if (manifest.db && await sha256File(dumpPath) !== manifest.db.sha256) {
|
|
39895
37272
|
printError("the database dump does not match the digest in the manifest; this bundle is corrupt or truncated");
|
|
39896
37273
|
process.exit(BACKUP_EXIT.REFUSED);
|
|
@@ -39904,7 +37281,7 @@ async function runRestore(opts) {
|
|
|
39904
37281
|
process.exit(BACKUP_EXIT.REFUSED);
|
|
39905
37282
|
}
|
|
39906
37283
|
try {
|
|
39907
|
-
const env = decryptBundle(readFileSync7(
|
|
37284
|
+
const env = decryptBundle(readFileSync7(join12(dir, manifest.secrets.file)), passphrase);
|
|
39908
37285
|
bundleKey = env.split(`
|
|
39909
37286
|
`).find((l) => l.startsWith("SECONDLAYER_SECRETS_KEY="))?.slice("SECONDLAYER_SECRETS_KEY=".length).trim();
|
|
39910
37287
|
} catch {
|
|
@@ -39982,8 +37359,8 @@ function registerRestoreCommand(program) {
|
|
|
39982
37359
|
// src/lib/instance-init.ts
|
|
39983
37360
|
init_output();
|
|
39984
37361
|
import { randomBytes as randomBytes3 } from "node:crypto";
|
|
39985
|
-
import { existsSync as
|
|
39986
|
-
import { resolve as
|
|
37362
|
+
import { existsSync as existsSync8, readFileSync as readFileSync8, writeFileSync as writeFileSync7 } from "node:fs";
|
|
37363
|
+
import { resolve as resolve9 } from "node:path";
|
|
39987
37364
|
import { ARCHIVE_ROOT_PUBLIC_KEY_PEM } from "@secondlayer/shared/archive/root-key";
|
|
39988
37365
|
import { generateEd25519KeyPair } from "@secondlayer/shared/crypto/ed25519";
|
|
39989
37366
|
import { INSTANCE_NETWORKS } from "@secondlayer/shared/db/queries/instance";
|
|
@@ -40032,7 +37409,7 @@ function unescapeEnvValue(raw) {
|
|
|
40032
37409
|
`).replace(/\\"/g, '"').replace(/\\\\/g, "\\");
|
|
40033
37410
|
}
|
|
40034
37411
|
function readEnvValue(envPath, key) {
|
|
40035
|
-
if (!
|
|
37412
|
+
if (!existsSync8(envPath))
|
|
40036
37413
|
return null;
|
|
40037
37414
|
const match = readFileSync8(envPath, "utf8").match(new RegExp(`^${key}=(.*)$`, "m"));
|
|
40038
37415
|
return match ? unescapeEnvValue(match[1]) : null;
|
|
@@ -40080,12 +37457,12 @@ function renderInstanceEnv(env) {
|
|
|
40080
37457
|
`);
|
|
40081
37458
|
}
|
|
40082
37459
|
function writeInstanceEnv(cwd, env, file = INSTANCE_ENV_FILE) {
|
|
40083
|
-
const path =
|
|
37460
|
+
const path = resolve9(cwd, file);
|
|
40084
37461
|
writeFileSync7(path, renderInstanceEnv(env), { mode: 384 });
|
|
40085
37462
|
return path;
|
|
40086
37463
|
}
|
|
40087
37464
|
function loadExistingInstanceEnv(cwd, file = INSTANCE_ENV_FILE) {
|
|
40088
|
-
const path =
|
|
37465
|
+
const path = resolve9(cwd, file);
|
|
40089
37466
|
return {
|
|
40090
37467
|
INSTANCE_TOKEN: readEnvValue(path, "INSTANCE_TOKEN"),
|
|
40091
37468
|
SECONDLAYER_SECRETS_KEY: readEnvValue(path, "SECONDLAYER_SECRETS_KEY"),
|
|
@@ -40261,5 +37638,5 @@ registerCreditsCommand(program);
|
|
|
40261
37638
|
registerArchiveCommand(program);
|
|
40262
37639
|
program.parse();
|
|
40263
37640
|
|
|
40264
|
-
//# debugId=
|
|
37641
|
+
//# debugId=4D42122E1253AE8B64756E2164756E21
|
|
40265
37642
|
//# sourceMappingURL=cli.js.map
|