@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/dist/paths.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export declare function uptimeHome(): string;
2
2
  export declare function uptimeDbPath(): string;
3
+ export declare function uptimeHostedFallbackDbPath(): string;
3
4
  export declare function ensureUptimeHome(): string;
4
5
  //# sourceMappingURL=paths.d.ts.map
@@ -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
@@ -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 === "http" ? item.monitor.url ?? "" : `${item.monitor.host}:${item.monitor.port}`;
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 { UptimeStore, type UptimeStoreOptions } from "./store.js";
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?: UptimeStore;
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: UptimeStore;
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 {
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyB,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACzF,OAAO,EAAuC,KAAK,wBAAwB,EAAE,KAAK,uBAAuB,EAAE,KAAK,YAAY,EAAE,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAC7K,OAAO,KAAK,EACV,kBAAkB,EAClB,WAAW,EACX,kBAAkB,EAClB,QAAQ,EACR,kBAAkB,EAClB,OAAO,EACP,eAAe,EACf,kBAAkB,EAClB,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,oBAAqB,SAAQ,kBAAkB;IAC9D,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACjE;AAED,qBAAa,aAAa;IACxB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoD;IAChF,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAwD;IACnF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;gBAExC,OAAO,GAAE,oBAAyB;IAK9C,KAAK,IAAI,IAAI;IAIb,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO;IAIjD,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO;IAInE,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIxC,YAAY,CAAC,OAAO,GAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,EAAE;IAIpE,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAI5C,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,WAAW,EAAE;IAI5D,aAAa,CAAC,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,QAAQ,EAAE;IAI3G,OAAO,IAAI,aAAa;IAIxB,WAAW,CAAC,OAAO,GAAE,wBAA6B,GAAG,YAAY;IAI3D,UAAU,CAAC,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAIlF,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAkCpD,QAAQ,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IASxC,cAAc,CAAC,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,eAAe;IAY5D,YAAY,CAAC,GAAG,GAAE,IAAiB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAgBlE,OAAO,CAAC,KAAK;CAOd;AAED,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,oBAAyB,GAAG,aAAa,CAEpF;AAED,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI5B"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}