@hasna/uptime 0.1.2 → 0.1.3
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/CHANGELOG.md +24 -0
- package/README.md +40 -1
- package/dist/api.d.ts +12 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +1788 -106
- package/dist/checks.d.ts +23 -1
- package/dist/checks.d.ts.map +1 -1
- package/dist/checks.js +131 -2
- package/dist/cli/index.js +2018 -114
- package/dist/dashboard.js +1 -1
- package/dist/imports.d.ts +90 -0
- package/dist/imports.d.ts.map +1 -0
- package/dist/imports.js +556 -0
- package/dist/index.d.ts +9 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1798 -106
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +1646 -48
- package/dist/paths.d.ts +1 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +4 -0
- package/dist/probes.d.ts +13 -0
- package/dist/probes.d.ts.map +1 -0
- package/dist/probes.js +62 -0
- package/dist/report.js +1 -1
- package/dist/service.d.ts +112 -4
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +1567 -46
- package/dist/store.d.ts +109 -3
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +663 -18
- package/dist/target-policy.d.ts +7 -0
- package/dist/target-policy.d.ts.map +1 -0
- package/dist/types.d.ts +97 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +6 -2
package/dist/paths.d.ts
CHANGED
package/dist/paths.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAIA,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAIzC"}
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAIA,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,0BAA0B,IAAI,MAAM,CAEnD;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAIzC"}
|
package/dist/paths.js
CHANGED
|
@@ -9,12 +9,16 @@ function uptimeHome() {
|
|
|
9
9
|
function uptimeDbPath() {
|
|
10
10
|
return process.env.HASNA_UPTIME_DB || join(uptimeHome(), "uptime.db");
|
|
11
11
|
}
|
|
12
|
+
function uptimeHostedFallbackDbPath() {
|
|
13
|
+
return process.env.HASNA_UPTIME_HOSTED_FALLBACK_DB || join(uptimeHome(), "hosted-fallback", "uptime.db");
|
|
14
|
+
}
|
|
12
15
|
function ensureUptimeHome() {
|
|
13
16
|
const home = uptimeHome();
|
|
14
17
|
mkdirSync(home, { recursive: true });
|
|
15
18
|
return home;
|
|
16
19
|
}
|
|
17
20
|
export {
|
|
21
|
+
uptimeHostedFallbackDbPath,
|
|
18
22
|
uptimeHome,
|
|
19
23
|
uptimeDbPath,
|
|
20
24
|
ensureUptimeHome
|
package/dist/probes.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ProbeResultSubmission } from "./types.js";
|
|
2
|
+
export interface ProbeKeyPair {
|
|
3
|
+
publicKeyPem: string;
|
|
4
|
+
privateKeyPem: string;
|
|
5
|
+
publicKeyFingerprint: string;
|
|
6
|
+
}
|
|
7
|
+
export type ProbeSigningInput = Omit<ProbeResultSubmission, "signature">;
|
|
8
|
+
export declare function generateProbeKeyPair(): ProbeKeyPair;
|
|
9
|
+
export declare function probePublicKeyFingerprint(publicKeyPem: string): string;
|
|
10
|
+
export declare function signProbeResult(input: ProbeSigningInput, privateKeyPem: string): string;
|
|
11
|
+
export declare function verifyProbeResultSignature(input: ProbeResultSubmission, publicKeyPem: string): boolean;
|
|
12
|
+
export declare function probeResultSigningPayload(input: ProbeSigningInput): string;
|
|
13
|
+
//# sourceMappingURL=probes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"probes.d.ts","sourceRoot":"","sources":["../src/probes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,qBAAqB,EAAE,WAAW,CAAC,CAAC;AAEzE,wBAAgB,oBAAoB,IAAI,YAAY,CASnD;AAED,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAEvF;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAWtG;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAkB1E"}
|
package/dist/probes.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// src/probes.ts
|
|
3
|
+
import { createHash, generateKeyPairSync, sign, verify } from "crypto";
|
|
4
|
+
function generateProbeKeyPair() {
|
|
5
|
+
const { publicKey, privateKey } = generateKeyPairSync("ed25519");
|
|
6
|
+
const publicKeyPem = publicKey.export({ format: "pem", type: "spki" }).toString();
|
|
7
|
+
const privateKeyPem = privateKey.export({ format: "pem", type: "pkcs8" }).toString();
|
|
8
|
+
return {
|
|
9
|
+
publicKeyPem,
|
|
10
|
+
privateKeyPem,
|
|
11
|
+
publicKeyFingerprint: probePublicKeyFingerprint(publicKeyPem)
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function probePublicKeyFingerprint(publicKeyPem) {
|
|
15
|
+
return createHash("sha256").update(publicKeyPem.trim()).digest("hex");
|
|
16
|
+
}
|
|
17
|
+
function signProbeResult(input, privateKeyPem) {
|
|
18
|
+
return sign(null, Buffer.from(probeResultSigningPayload(input)), privateKeyPem).toString("base64url");
|
|
19
|
+
}
|
|
20
|
+
function verifyProbeResultSignature(input, publicKeyPem) {
|
|
21
|
+
try {
|
|
22
|
+
return verify(null, Buffer.from(probeResultSigningPayload(input)), publicKeyPem, Buffer.from(input.signature, "base64url"));
|
|
23
|
+
} catch {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function probeResultSigningPayload(input) {
|
|
28
|
+
return stableJson({
|
|
29
|
+
version: "open-uptime.probe-result.v1",
|
|
30
|
+
probeId: input.probeId,
|
|
31
|
+
jobId: input.jobId,
|
|
32
|
+
scheduleSlot: input.scheduleSlot,
|
|
33
|
+
fencingToken: input.fencingToken,
|
|
34
|
+
monitorId: input.monitorId,
|
|
35
|
+
nonce: input.nonce,
|
|
36
|
+
checkedAt: input.checkedAt,
|
|
37
|
+
status: input.status,
|
|
38
|
+
latencyMs: input.latencyMs,
|
|
39
|
+
statusCode: input.statusCode ?? null,
|
|
40
|
+
error: input.error ?? null,
|
|
41
|
+
attemptCount: input.attemptCount ?? 1,
|
|
42
|
+
monitorRevision: input.monitorRevision,
|
|
43
|
+
evidenceSha256: createHash("sha256").update(stableJson(input.evidence ?? null)).digest("hex")
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
function stableJson(value) {
|
|
47
|
+
if (value === undefined)
|
|
48
|
+
return "null";
|
|
49
|
+
if (value === null || typeof value !== "object")
|
|
50
|
+
return JSON.stringify(value);
|
|
51
|
+
if (Array.isArray(value))
|
|
52
|
+
return `[${value.map(stableJson).join(",")}]`;
|
|
53
|
+
const entries = Object.entries(value).filter(([, entryValue]) => entryValue !== undefined).sort(([left], [right]) => left.localeCompare(right));
|
|
54
|
+
return `{${entries.map(([key, entryValue]) => `${JSON.stringify(key)}:${stableJson(entryValue)}`).join(",")}}`;
|
|
55
|
+
}
|
|
56
|
+
export {
|
|
57
|
+
verifyProbeResultSignature,
|
|
58
|
+
signProbeResult,
|
|
59
|
+
probeResultSigningPayload,
|
|
60
|
+
probePublicKeyFingerprint,
|
|
61
|
+
generateProbeKeyPair
|
|
62
|
+
};
|
package/dist/report.js
CHANGED
|
@@ -68,7 +68,7 @@ function renderMonitorLine(item) {
|
|
|
68
68
|
return `- ${item.monitor.status.toUpperCase()} ${item.monitor.name} (${targetLabel(item)}): uptime ${uptime}, latency ${latency}${incident}`;
|
|
69
69
|
}
|
|
70
70
|
function targetLabel(item) {
|
|
71
|
-
return item.monitor.kind === "
|
|
71
|
+
return item.monitor.kind === "tcp" ? `${item.monitor.host}:${item.monitor.port}` : item.monitor.url ?? "";
|
|
72
72
|
}
|
|
73
73
|
function resolveEmailTarget(value) {
|
|
74
74
|
const target = typeof value === "boolean" ? {} : value;
|
package/dist/service.d.ts
CHANGED
|
@@ -1,12 +1,89 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type ImportApplyResult, type ImportPreview, type ImportRequest, type ImportRollbackResult } from "./imports.js";
|
|
2
|
+
import { type MonitorProvenance, type SaveImportBatchInput, type StoredImportBatch, type UpsertMonitorProvenanceInput, type UptimeBackup, type UptimeBackupCheck, type UptimeStoreOptions } from "./store.js";
|
|
2
3
|
import { type BuildUptimeReportOptions, type SendUptimeReportOptions, type UptimeReport, type UptimeReportDelivery } from "./report.js";
|
|
3
|
-
import type { CheckAttemptResult, CheckResult, CreateMonitorInput, Incident, ListResultsOptions, Monitor, SchedulerHandle, UpdateMonitorInput, UptimeSummary } from "./types.js";
|
|
4
|
+
import type { CheckAttemptResult, CheckResult, CreateProbeInput, CreateProbeResult, CreateMonitorInput, Incident, ImportedMonitorInput, ImportedUpdateMonitorInput, ListResultsOptions, Monitor, ProbeCheckJob, ProbeIdentity, ProbeResultSubmission, ProbeSubmissionReceipt, SchedulerHandle, UpdateMonitorInput, UptimeSummary } from "./types.js";
|
|
4
5
|
export interface UptimeServiceOptions extends UptimeStoreOptions {
|
|
5
|
-
store?:
|
|
6
|
+
store?: UptimeStoreLike;
|
|
6
7
|
checkRunner?: (monitor: Monitor) => Promise<CheckAttemptResult>;
|
|
7
8
|
}
|
|
9
|
+
export interface UptimeStoreLike {
|
|
10
|
+
readonly dbPath: string;
|
|
11
|
+
readonly mode: "local" | "hosted";
|
|
12
|
+
readonly dataMode: "local-sqlite" | "hosted-local-sqlite";
|
|
13
|
+
close(): void;
|
|
14
|
+
createMonitor(input: ImportedMonitorInput, options?: {
|
|
15
|
+
allowBrowserPage?: boolean;
|
|
16
|
+
}): Monitor;
|
|
17
|
+
updateMonitor(idOrName: string, input: ImportedUpdateMonitorInput, options?: {
|
|
18
|
+
allowBrowserPage?: boolean;
|
|
19
|
+
}): Monitor;
|
|
20
|
+
deleteMonitor(idOrName: string): boolean;
|
|
21
|
+
listMonitors(options?: {
|
|
22
|
+
includeDisabled?: boolean;
|
|
23
|
+
}): Monitor[];
|
|
24
|
+
getMonitor(idOrName: string): Monitor | null;
|
|
25
|
+
getCheckResult?(id: string): CheckResult | null;
|
|
26
|
+
listResults(options?: ListResultsOptions): CheckResult[];
|
|
27
|
+
listIncidents(options?: {
|
|
28
|
+
status?: "open" | "closed";
|
|
29
|
+
monitorId?: string;
|
|
30
|
+
limit?: number;
|
|
31
|
+
}): Incident[];
|
|
32
|
+
summary(): UptimeSummary;
|
|
33
|
+
backup(destinationPath?: string): UptimeBackup;
|
|
34
|
+
verifyBackup(backupPath: string): UptimeBackupCheck;
|
|
35
|
+
acquireCheckLease(monitorId: string, owner: string, ttlMs: number): boolean;
|
|
36
|
+
releaseCheckLease(monitorId: string, owner: string): void;
|
|
37
|
+
recordCheckResult(input: Omit<CheckResult, "id" | "checkedAt"> & {
|
|
38
|
+
checkedAt?: string;
|
|
39
|
+
expectedMonitorRevision?: number;
|
|
40
|
+
}): CheckResult;
|
|
41
|
+
getProvenance(source: string, sourceId: string): MonitorProvenance | null;
|
|
42
|
+
upsertMonitorProvenance(input: UpsertMonitorProvenanceInput): MonitorProvenance;
|
|
43
|
+
saveImportBatch(input: SaveImportBatchInput): StoredImportBatch;
|
|
44
|
+
getImportBatch(batchId: string): StoredImportBatch | null;
|
|
45
|
+
markImportBatchRolledBack(batchId: string): StoredImportBatch;
|
|
46
|
+
createProbeIdentity?(input: {
|
|
47
|
+
name: string;
|
|
48
|
+
publicKeyPem: string;
|
|
49
|
+
publicKeyFingerprint: string;
|
|
50
|
+
enabled?: boolean;
|
|
51
|
+
}): ProbeIdentity;
|
|
52
|
+
listProbeIdentities?(options?: {
|
|
53
|
+
includeDisabled?: boolean;
|
|
54
|
+
}): ProbeIdentity[];
|
|
55
|
+
getProbeIdentity?(idOrName: string): ProbeIdentity | null;
|
|
56
|
+
updateProbeIdentity?(idOrName: string, input: {
|
|
57
|
+
enabled?: boolean;
|
|
58
|
+
name?: string;
|
|
59
|
+
}): ProbeIdentity;
|
|
60
|
+
touchProbeIdentity?(idOrName: string, seenAt?: string): void;
|
|
61
|
+
createProbeCheckJob?(input: {
|
|
62
|
+
monitorId: string;
|
|
63
|
+
scheduleSlot: string;
|
|
64
|
+
dueAt?: string;
|
|
65
|
+
}): ProbeCheckJob;
|
|
66
|
+
getProbeCheckJob?(id: string): ProbeCheckJob | null;
|
|
67
|
+
claimProbeCheckJob?(input: {
|
|
68
|
+
jobId: string;
|
|
69
|
+
probeId: string;
|
|
70
|
+
leaseTtlMs?: number;
|
|
71
|
+
}): ProbeCheckJob;
|
|
72
|
+
completeProbeCheckJob?(input: {
|
|
73
|
+
jobId: string;
|
|
74
|
+
probeId: string;
|
|
75
|
+
fencingToken: string;
|
|
76
|
+
checkResultId: string;
|
|
77
|
+
submittedAt?: string;
|
|
78
|
+
}): ProbeCheckJob;
|
|
79
|
+
getProbeSubmission?(probeId: string, nonce: string): ProbeSubmissionReceipt | null;
|
|
80
|
+
recordProbeSubmission?(input: Omit<ProbeSubmissionReceipt, "id" | "submittedAt"> & {
|
|
81
|
+
submittedAt?: string;
|
|
82
|
+
}): ProbeSubmissionReceipt;
|
|
83
|
+
runInTransaction?<T>(fn: () => T): T;
|
|
84
|
+
}
|
|
8
85
|
export declare class UptimeService {
|
|
9
|
-
readonly store:
|
|
86
|
+
readonly store: UptimeStoreLike;
|
|
10
87
|
private readonly checkRunner;
|
|
11
88
|
private readonly leaseOwner;
|
|
12
89
|
private readonly inFlightChecks;
|
|
@@ -26,6 +103,35 @@ export declare class UptimeService {
|
|
|
26
103
|
limit?: number;
|
|
27
104
|
}): Incident[];
|
|
28
105
|
summary(): UptimeSummary;
|
|
106
|
+
createProbe(input: CreateProbeInput): CreateProbeResult;
|
|
107
|
+
listProbes(options?: {
|
|
108
|
+
includeDisabled?: boolean;
|
|
109
|
+
}): ProbeIdentity[];
|
|
110
|
+
getProbe(idOrName: string): ProbeIdentity | null;
|
|
111
|
+
updateProbe(idOrName: string, input: {
|
|
112
|
+
enabled?: boolean;
|
|
113
|
+
name?: string;
|
|
114
|
+
}): ProbeIdentity;
|
|
115
|
+
createProbeCheckJob(input: {
|
|
116
|
+
monitorId: string;
|
|
117
|
+
scheduleSlot: string;
|
|
118
|
+
dueAt?: string;
|
|
119
|
+
}): ProbeCheckJob;
|
|
120
|
+
getProbeCheckJob(id: string): ProbeCheckJob | null;
|
|
121
|
+
claimProbeCheckJob(input: {
|
|
122
|
+
jobId: string;
|
|
123
|
+
probeId: string;
|
|
124
|
+
leaseTtlMs?: number;
|
|
125
|
+
}): ProbeCheckJob;
|
|
126
|
+
submitProbeResult(input: ProbeResultSubmission): {
|
|
127
|
+
result: CheckResult;
|
|
128
|
+
receipt: ProbeSubmissionReceipt;
|
|
129
|
+
};
|
|
130
|
+
previewImport(request: ImportRequest): ImportPreview;
|
|
131
|
+
applyImport(request: ImportRequest): ImportApplyResult;
|
|
132
|
+
rollbackImport(batchId: string): ImportRollbackResult;
|
|
133
|
+
backup(destinationPath?: string): UptimeBackup;
|
|
134
|
+
verifyBackup(backupPath: string): UptimeBackupCheck;
|
|
29
135
|
buildReport(options?: BuildUptimeReportOptions): UptimeReport;
|
|
30
136
|
sendReport(options?: SendUptimeReportOptions): Promise<UptimeReportDelivery[]>;
|
|
31
137
|
checkMonitor(idOrName: string): Promise<CheckResult>;
|
|
@@ -35,6 +141,8 @@ export declare class UptimeService {
|
|
|
35
141
|
}): SchedulerHandle;
|
|
36
142
|
runDueChecks(now?: Date): Promise<CheckResult[]>;
|
|
37
143
|
private isDue;
|
|
144
|
+
private probeStore;
|
|
145
|
+
private submitProbeResultInTransaction;
|
|
38
146
|
}
|
|
39
147
|
export declare function createUptimeClient(options?: UptimeServiceOptions): UptimeService;
|
|
40
148
|
export declare class MonitorCheckBusyError extends Error {
|
package/dist/service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|