surrge 0.4.8 → 0.4.10
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/dist/index.js +69 -2
- package/dist/loader.js +69 -2
- package/dist/register.js +69 -2
- package/dist/storage/db.d.ts +5 -0
- package/dist/storage/db.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -3598,7 +3598,7 @@ var require_promise_limit = __commonJS((exports, module) => {
|
|
|
3598
3598
|
// package.json
|
|
3599
3599
|
var package_default = {
|
|
3600
3600
|
name: "surrge",
|
|
3601
|
-
version: "0.4.
|
|
3601
|
+
version: "0.4.10",
|
|
3602
3602
|
description: "One-line observability + analytics for Node.js/Bun",
|
|
3603
3603
|
type: "module",
|
|
3604
3604
|
exports: {
|
|
@@ -3700,22 +3700,28 @@ __export(exports_collector, {
|
|
|
3700
3700
|
// src/storage/db.ts
|
|
3701
3701
|
var exports_db = {};
|
|
3702
3702
|
__export(exports_db, {
|
|
3703
|
+
warnIfEphemeral: () => warnIfEphemeral,
|
|
3703
3704
|
reset: () => reset,
|
|
3704
3705
|
recentRequests: () => recentRequests,
|
|
3705
3706
|
recentPageViews: () => recentPageViews,
|
|
3706
3707
|
recentMetrics: () => recentMetrics,
|
|
3707
3708
|
recentLogs: () => recentLogs,
|
|
3708
3709
|
recentErrors: () => recentErrors,
|
|
3710
|
+
parseVolume: () => parseVolume,
|
|
3711
|
+
isWritable: () => isWritable,
|
|
3709
3712
|
insertRequest: () => insertRequest,
|
|
3710
3713
|
insertPageView: () => insertPageView,
|
|
3711
3714
|
insertMetric: () => insertMetric,
|
|
3712
3715
|
insertLog: () => insertLog,
|
|
3713
3716
|
insertError: () => insertError,
|
|
3714
3717
|
init: () => init,
|
|
3718
|
+
inDocker: () => inDocker,
|
|
3719
|
+
findVolume: () => findVolume,
|
|
3715
3720
|
db: () => db,
|
|
3716
3721
|
cleanup: () => cleanup,
|
|
3717
3722
|
analytics: () => analytics
|
|
3718
3723
|
});
|
|
3724
|
+
import { accessSync, constants, existsSync, readFileSync, statSync } from "node:fs";
|
|
3719
3725
|
|
|
3720
3726
|
// node_modules/@libsql/core/lib-esm/api.js
|
|
3721
3727
|
class LibsqlError extends Error {
|
|
@@ -8494,8 +8500,68 @@ CREATE INDEX IF NOT EXISTS idx_server_metrics_timestamp ON server_metrics(timest
|
|
|
8494
8500
|
var RETENTION_DAYS = 7;
|
|
8495
8501
|
|
|
8496
8502
|
// src/storage/db.ts
|
|
8503
|
+
var SYSTEM_PATHS = ["/proc", "/sys", "/dev", "/run", "/tmp", "/etc", "/bin", "/lib", "/usr", "/sbin", "/boot"];
|
|
8504
|
+
var inDocker = () => {
|
|
8505
|
+
return existsSync("/.dockerenv");
|
|
8506
|
+
};
|
|
8507
|
+
var isWritable = (path) => {
|
|
8508
|
+
try {
|
|
8509
|
+
accessSync(path, constants.W_OK);
|
|
8510
|
+
return true;
|
|
8511
|
+
} catch {
|
|
8512
|
+
return false;
|
|
8513
|
+
}
|
|
8514
|
+
};
|
|
8515
|
+
var parseVolume = (mountsContent, rootDev) => {
|
|
8516
|
+
for (const line of mountsContent.split(`
|
|
8517
|
+
`)) {
|
|
8518
|
+
const parts = line.split(" ");
|
|
8519
|
+
if (parts.length < 2)
|
|
8520
|
+
continue;
|
|
8521
|
+
const mountPoint = parts[1];
|
|
8522
|
+
if (mountPoint === "/")
|
|
8523
|
+
continue;
|
|
8524
|
+
if (SYSTEM_PATHS.some((sys) => mountPoint === sys || mountPoint.startsWith(`${sys}/`)))
|
|
8525
|
+
continue;
|
|
8526
|
+
if (!existsSync(mountPoint))
|
|
8527
|
+
continue;
|
|
8528
|
+
try {
|
|
8529
|
+
const mountDev = statSync(mountPoint).dev;
|
|
8530
|
+
if (mountDev !== rootDev && isWritable(mountPoint)) {
|
|
8531
|
+
return mountPoint;
|
|
8532
|
+
}
|
|
8533
|
+
} catch {
|
|
8534
|
+
continue;
|
|
8535
|
+
}
|
|
8536
|
+
}
|
|
8537
|
+
return null;
|
|
8538
|
+
};
|
|
8539
|
+
var findVolume = () => {
|
|
8540
|
+
if (!existsSync("/proc/mounts"))
|
|
8541
|
+
return null;
|
|
8542
|
+
try {
|
|
8543
|
+
const rootDev = statSync("/").dev;
|
|
8544
|
+
const mounts = readFileSync("/proc/mounts", "utf-8");
|
|
8545
|
+
return parseVolume(mounts, rootDev);
|
|
8546
|
+
} catch {
|
|
8547
|
+
return null;
|
|
8548
|
+
}
|
|
8549
|
+
};
|
|
8550
|
+
var resolvePath = () => {
|
|
8551
|
+
if (process.env.SURRGE_DB_PATH)
|
|
8552
|
+
return process.env.SURRGE_DB_PATH;
|
|
8553
|
+
const volume = findVolume();
|
|
8554
|
+
if (volume)
|
|
8555
|
+
return `${volume}/surrge.db`;
|
|
8556
|
+
return "surrge.db";
|
|
8557
|
+
};
|
|
8558
|
+
var warnIfEphemeral = () => {
|
|
8559
|
+
if (inDocker() && !findVolume() && !process.env.SURRGE_DB_PATH) {
|
|
8560
|
+
console.warn("[surrge] Running in Docker without persistent storage. Mount a volume at /data to persist data.");
|
|
8561
|
+
}
|
|
8562
|
+
};
|
|
8497
8563
|
var client = null;
|
|
8498
|
-
var init = (path =
|
|
8564
|
+
var init = (path = resolvePath()) => {
|
|
8499
8565
|
if (client)
|
|
8500
8566
|
return client;
|
|
8501
8567
|
const url = path === ":memory:" ? ":memory:" : `file:${path}`;
|
|
@@ -10866,6 +10932,7 @@ var handleDashboard = async (req, res) => {
|
|
|
10866
10932
|
|
|
10867
10933
|
// src/register.ts
|
|
10868
10934
|
init();
|
|
10935
|
+
warnIfEphemeral();
|
|
10869
10936
|
start();
|
|
10870
10937
|
start2();
|
|
10871
10938
|
start3();
|
package/dist/loader.js
CHANGED
|
@@ -3598,7 +3598,7 @@ var require_promise_limit = __commonJS((exports, module) => {
|
|
|
3598
3598
|
// package.json
|
|
3599
3599
|
var package_default = {
|
|
3600
3600
|
name: "surrge",
|
|
3601
|
-
version: "0.4.
|
|
3601
|
+
version: "0.4.10",
|
|
3602
3602
|
description: "One-line observability + analytics for Node.js/Bun",
|
|
3603
3603
|
type: "module",
|
|
3604
3604
|
exports: {
|
|
@@ -3700,22 +3700,28 @@ __export(exports_collector, {
|
|
|
3700
3700
|
// src/storage/db.ts
|
|
3701
3701
|
var exports_db = {};
|
|
3702
3702
|
__export(exports_db, {
|
|
3703
|
+
warnIfEphemeral: () => warnIfEphemeral,
|
|
3703
3704
|
reset: () => reset,
|
|
3704
3705
|
recentRequests: () => recentRequests,
|
|
3705
3706
|
recentPageViews: () => recentPageViews,
|
|
3706
3707
|
recentMetrics: () => recentMetrics,
|
|
3707
3708
|
recentLogs: () => recentLogs,
|
|
3708
3709
|
recentErrors: () => recentErrors,
|
|
3710
|
+
parseVolume: () => parseVolume,
|
|
3711
|
+
isWritable: () => isWritable,
|
|
3709
3712
|
insertRequest: () => insertRequest,
|
|
3710
3713
|
insertPageView: () => insertPageView,
|
|
3711
3714
|
insertMetric: () => insertMetric,
|
|
3712
3715
|
insertLog: () => insertLog,
|
|
3713
3716
|
insertError: () => insertError,
|
|
3714
3717
|
init: () => init,
|
|
3718
|
+
inDocker: () => inDocker,
|
|
3719
|
+
findVolume: () => findVolume,
|
|
3715
3720
|
db: () => db,
|
|
3716
3721
|
cleanup: () => cleanup,
|
|
3717
3722
|
analytics: () => analytics
|
|
3718
3723
|
});
|
|
3724
|
+
import { accessSync, constants, existsSync, readFileSync, statSync } from "node:fs";
|
|
3719
3725
|
|
|
3720
3726
|
// node_modules/@libsql/core/lib-esm/api.js
|
|
3721
3727
|
class LibsqlError extends Error {
|
|
@@ -8494,8 +8500,68 @@ CREATE INDEX IF NOT EXISTS idx_server_metrics_timestamp ON server_metrics(timest
|
|
|
8494
8500
|
var RETENTION_DAYS = 7;
|
|
8495
8501
|
|
|
8496
8502
|
// src/storage/db.ts
|
|
8503
|
+
var SYSTEM_PATHS = ["/proc", "/sys", "/dev", "/run", "/tmp", "/etc", "/bin", "/lib", "/usr", "/sbin", "/boot"];
|
|
8504
|
+
var inDocker = () => {
|
|
8505
|
+
return existsSync("/.dockerenv");
|
|
8506
|
+
};
|
|
8507
|
+
var isWritable = (path) => {
|
|
8508
|
+
try {
|
|
8509
|
+
accessSync(path, constants.W_OK);
|
|
8510
|
+
return true;
|
|
8511
|
+
} catch {
|
|
8512
|
+
return false;
|
|
8513
|
+
}
|
|
8514
|
+
};
|
|
8515
|
+
var parseVolume = (mountsContent, rootDev) => {
|
|
8516
|
+
for (const line of mountsContent.split(`
|
|
8517
|
+
`)) {
|
|
8518
|
+
const parts = line.split(" ");
|
|
8519
|
+
if (parts.length < 2)
|
|
8520
|
+
continue;
|
|
8521
|
+
const mountPoint = parts[1];
|
|
8522
|
+
if (mountPoint === "/")
|
|
8523
|
+
continue;
|
|
8524
|
+
if (SYSTEM_PATHS.some((sys) => mountPoint === sys || mountPoint.startsWith(`${sys}/`)))
|
|
8525
|
+
continue;
|
|
8526
|
+
if (!existsSync(mountPoint))
|
|
8527
|
+
continue;
|
|
8528
|
+
try {
|
|
8529
|
+
const mountDev = statSync(mountPoint).dev;
|
|
8530
|
+
if (mountDev !== rootDev && isWritable(mountPoint)) {
|
|
8531
|
+
return mountPoint;
|
|
8532
|
+
}
|
|
8533
|
+
} catch {
|
|
8534
|
+
continue;
|
|
8535
|
+
}
|
|
8536
|
+
}
|
|
8537
|
+
return null;
|
|
8538
|
+
};
|
|
8539
|
+
var findVolume = () => {
|
|
8540
|
+
if (!existsSync("/proc/mounts"))
|
|
8541
|
+
return null;
|
|
8542
|
+
try {
|
|
8543
|
+
const rootDev = statSync("/").dev;
|
|
8544
|
+
const mounts = readFileSync("/proc/mounts", "utf-8");
|
|
8545
|
+
return parseVolume(mounts, rootDev);
|
|
8546
|
+
} catch {
|
|
8547
|
+
return null;
|
|
8548
|
+
}
|
|
8549
|
+
};
|
|
8550
|
+
var resolvePath = () => {
|
|
8551
|
+
if (process.env.SURRGE_DB_PATH)
|
|
8552
|
+
return process.env.SURRGE_DB_PATH;
|
|
8553
|
+
const volume = findVolume();
|
|
8554
|
+
if (volume)
|
|
8555
|
+
return `${volume}/surrge.db`;
|
|
8556
|
+
return "surrge.db";
|
|
8557
|
+
};
|
|
8558
|
+
var warnIfEphemeral = () => {
|
|
8559
|
+
if (inDocker() && !findVolume() && !process.env.SURRGE_DB_PATH) {
|
|
8560
|
+
console.warn("[surrge] Running in Docker without persistent storage. Mount a volume at /data to persist data.");
|
|
8561
|
+
}
|
|
8562
|
+
};
|
|
8497
8563
|
var client = null;
|
|
8498
|
-
var init = (path =
|
|
8564
|
+
var init = (path = resolvePath()) => {
|
|
8499
8565
|
if (client)
|
|
8500
8566
|
return client;
|
|
8501
8567
|
const url = path === ":memory:" ? ":memory:" : `file:${path}`;
|
|
@@ -10866,6 +10932,7 @@ var handleDashboard = async (req, res) => {
|
|
|
10866
10932
|
|
|
10867
10933
|
// src/register.ts
|
|
10868
10934
|
init();
|
|
10935
|
+
warnIfEphemeral();
|
|
10869
10936
|
start();
|
|
10870
10937
|
start2();
|
|
10871
10938
|
start3();
|
package/dist/register.js
CHANGED
|
@@ -3598,7 +3598,7 @@ var require_promise_limit = __commonJS((exports, module) => {
|
|
|
3598
3598
|
// package.json
|
|
3599
3599
|
var package_default = {
|
|
3600
3600
|
name: "surrge",
|
|
3601
|
-
version: "0.4.
|
|
3601
|
+
version: "0.4.10",
|
|
3602
3602
|
description: "One-line observability + analytics for Node.js/Bun",
|
|
3603
3603
|
type: "module",
|
|
3604
3604
|
exports: {
|
|
@@ -3700,22 +3700,28 @@ __export(exports_collector, {
|
|
|
3700
3700
|
// src/storage/db.ts
|
|
3701
3701
|
var exports_db = {};
|
|
3702
3702
|
__export(exports_db, {
|
|
3703
|
+
warnIfEphemeral: () => warnIfEphemeral,
|
|
3703
3704
|
reset: () => reset,
|
|
3704
3705
|
recentRequests: () => recentRequests,
|
|
3705
3706
|
recentPageViews: () => recentPageViews,
|
|
3706
3707
|
recentMetrics: () => recentMetrics,
|
|
3707
3708
|
recentLogs: () => recentLogs,
|
|
3708
3709
|
recentErrors: () => recentErrors,
|
|
3710
|
+
parseVolume: () => parseVolume,
|
|
3711
|
+
isWritable: () => isWritable,
|
|
3709
3712
|
insertRequest: () => insertRequest,
|
|
3710
3713
|
insertPageView: () => insertPageView,
|
|
3711
3714
|
insertMetric: () => insertMetric,
|
|
3712
3715
|
insertLog: () => insertLog,
|
|
3713
3716
|
insertError: () => insertError,
|
|
3714
3717
|
init: () => init,
|
|
3718
|
+
inDocker: () => inDocker,
|
|
3719
|
+
findVolume: () => findVolume,
|
|
3715
3720
|
db: () => db,
|
|
3716
3721
|
cleanup: () => cleanup,
|
|
3717
3722
|
analytics: () => analytics
|
|
3718
3723
|
});
|
|
3724
|
+
import { accessSync, constants, existsSync, readFileSync, statSync } from "node:fs";
|
|
3719
3725
|
|
|
3720
3726
|
// node_modules/@libsql/core/lib-esm/api.js
|
|
3721
3727
|
class LibsqlError extends Error {
|
|
@@ -8494,8 +8500,68 @@ CREATE INDEX IF NOT EXISTS idx_server_metrics_timestamp ON server_metrics(timest
|
|
|
8494
8500
|
var RETENTION_DAYS = 7;
|
|
8495
8501
|
|
|
8496
8502
|
// src/storage/db.ts
|
|
8503
|
+
var SYSTEM_PATHS = ["/proc", "/sys", "/dev", "/run", "/tmp", "/etc", "/bin", "/lib", "/usr", "/sbin", "/boot"];
|
|
8504
|
+
var inDocker = () => {
|
|
8505
|
+
return existsSync("/.dockerenv");
|
|
8506
|
+
};
|
|
8507
|
+
var isWritable = (path) => {
|
|
8508
|
+
try {
|
|
8509
|
+
accessSync(path, constants.W_OK);
|
|
8510
|
+
return true;
|
|
8511
|
+
} catch {
|
|
8512
|
+
return false;
|
|
8513
|
+
}
|
|
8514
|
+
};
|
|
8515
|
+
var parseVolume = (mountsContent, rootDev) => {
|
|
8516
|
+
for (const line of mountsContent.split(`
|
|
8517
|
+
`)) {
|
|
8518
|
+
const parts = line.split(" ");
|
|
8519
|
+
if (parts.length < 2)
|
|
8520
|
+
continue;
|
|
8521
|
+
const mountPoint = parts[1];
|
|
8522
|
+
if (mountPoint === "/")
|
|
8523
|
+
continue;
|
|
8524
|
+
if (SYSTEM_PATHS.some((sys) => mountPoint === sys || mountPoint.startsWith(`${sys}/`)))
|
|
8525
|
+
continue;
|
|
8526
|
+
if (!existsSync(mountPoint))
|
|
8527
|
+
continue;
|
|
8528
|
+
try {
|
|
8529
|
+
const mountDev = statSync(mountPoint).dev;
|
|
8530
|
+
if (mountDev !== rootDev && isWritable(mountPoint)) {
|
|
8531
|
+
return mountPoint;
|
|
8532
|
+
}
|
|
8533
|
+
} catch {
|
|
8534
|
+
continue;
|
|
8535
|
+
}
|
|
8536
|
+
}
|
|
8537
|
+
return null;
|
|
8538
|
+
};
|
|
8539
|
+
var findVolume = () => {
|
|
8540
|
+
if (!existsSync("/proc/mounts"))
|
|
8541
|
+
return null;
|
|
8542
|
+
try {
|
|
8543
|
+
const rootDev = statSync("/").dev;
|
|
8544
|
+
const mounts = readFileSync("/proc/mounts", "utf-8");
|
|
8545
|
+
return parseVolume(mounts, rootDev);
|
|
8546
|
+
} catch {
|
|
8547
|
+
return null;
|
|
8548
|
+
}
|
|
8549
|
+
};
|
|
8550
|
+
var resolvePath = () => {
|
|
8551
|
+
if (process.env.SURRGE_DB_PATH)
|
|
8552
|
+
return process.env.SURRGE_DB_PATH;
|
|
8553
|
+
const volume = findVolume();
|
|
8554
|
+
if (volume)
|
|
8555
|
+
return `${volume}/surrge.db`;
|
|
8556
|
+
return "surrge.db";
|
|
8557
|
+
};
|
|
8558
|
+
var warnIfEphemeral = () => {
|
|
8559
|
+
if (inDocker() && !findVolume() && !process.env.SURRGE_DB_PATH) {
|
|
8560
|
+
console.warn("[surrge] Running in Docker without persistent storage. Mount a volume at /data to persist data.");
|
|
8561
|
+
}
|
|
8562
|
+
};
|
|
8497
8563
|
var client = null;
|
|
8498
|
-
var init = (path =
|
|
8564
|
+
var init = (path = resolvePath()) => {
|
|
8499
8565
|
if (client)
|
|
8500
8566
|
return client;
|
|
8501
8567
|
const url = path === ":memory:" ? ":memory:" : `file:${path}`;
|
|
@@ -10866,6 +10932,7 @@ var handleDashboard = async (req, res) => {
|
|
|
10866
10932
|
|
|
10867
10933
|
// src/register.ts
|
|
10868
10934
|
init();
|
|
10935
|
+
warnIfEphemeral();
|
|
10869
10936
|
start();
|
|
10870
10937
|
start2();
|
|
10871
10938
|
start3();
|
package/dist/storage/db.d.ts
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import { type Client } from "@libsql/client";
|
|
2
|
+
export declare const inDocker: () => boolean;
|
|
3
|
+
export declare const isWritable: (path: string) => boolean;
|
|
4
|
+
export declare const parseVolume: (mountsContent: string, rootDev: number) => string | null;
|
|
5
|
+
export declare const findVolume: () => string | null;
|
|
6
|
+
export declare const warnIfEphemeral: () => void;
|
|
2
7
|
export type Log = {
|
|
3
8
|
id: number;
|
|
4
9
|
timestamp: number;
|
package/dist/storage/db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/storage/db.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/storage/db.ts"],"names":[],"mappings":"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"}
|