dowwntime 1.3.9 → 1.5.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/dist/cli.mjs +48 -31
- package/dist/cli.mjs.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +48 -31
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -42,7 +42,7 @@ type DowwntimeOptions = {
|
|
|
42
42
|
/** Function to get example values for parameters */
|
|
43
43
|
getExampleValue?: (paramName: string, path: string) => string | undefined;
|
|
44
44
|
/** Function to determine status based on response */
|
|
45
|
-
getStatus?: (statusCode: number, path: string, durationMs: number) => "up" | "down" | "degraded";
|
|
45
|
+
getStatus?: (statusCode: number, path: string, durationMs: number, body?: unknown) => "up" | "down" | "degraded";
|
|
46
46
|
/** Request timeout in milliseconds */
|
|
47
47
|
timeoutMs?: number;
|
|
48
48
|
/** Maximum storage space usage in bytes */
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/alert.ts","../src/index.ts"],"sourcesContent":[],"mappings":";KAEK,KAAA;EAAA,SAAK,EAAA,MAAA;EAOO,MAAA,EAAK,IAAA,GAAA,MAAA,GAAA,UAAA;EAEO,UAAA,EAAA,MAAA;EAAU,GAAA,EAAA,MAAA;CACR;AAAU,UAHxB,KAAA,CAGwB;EACN,IAAA,EAAA,MAAA;EAAU,IAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAFhB,KAEgB,EAAA,GAFN,OAEM,CAAA,IAAA,CAAA,GAAA,IAAA;EAAO,MAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EADrB,KACqB,EAAA,GADX,OACW,CAAA,IAAA,CAAA,GAAA,IAAA;EAGvC,UAAA,EAAA,CAAA,IAAa,EAAA,MAAA,EAAA,KAAA,EAHS,KAGT,EAAA,GAHmB,OAGnB,CAAA,IAAA,CAAA,GAAA,IAAA;;AAGe,cAH5B,YAAA,YAAwB,KAGI,CAAA;EAKN,IAAA,EAAA,MAAA;EAAQ,IAAA,CAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EALV,KAKU,CAAA,EALF,OAKE,CAAA,IAAA,CAAA;EAOJ,MAAA,CAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAPJ,KAOI,CAAA,EAPI,OAOJ,CAAA,IAAA,CAAA;EAAQ,UAAA,CAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAAR,KAAQ,CAAA,EAAA,OAAA,CAAA,IAAA,CAAA;;AAfL,cAuB7B,UAAA,YAAsB,KAvBO,CAAA;EAuB7B,IAAA,EAAA,MAAA;EAwBoB,QAAA,OAAA;EAAQ,WAAA,CAAA,UAAA,EAAA,MAAA;EAON,QAAA,gBAAA;EAAQ,IAAA,CAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAPV,KAOU,CAAA,EAPF,OAOE,CAAA,IAAA,CAAA;EAOJ,MAAA,CAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAPJ,KAOI,CAAA,EAPI,OAOJ,CAAA,IAAA,CAAA;EAAQ,UAAA,CAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAAR,KAAQ,CAAA,EAAA,OAAA,CAAA,IAAA,CAAA;;;;AA3E1C,KCaO,gBAAA,GDbF;EAOO;EAEY,cAAA,EAAA,MAAA;EAAU;EACR,WAAA,EAAA,MAAA;EAAU;EACN,WAAA,CAAA,EAAA,MAAA;EAAU;EAAO,OAAA,CAAA,EAAA,MAAA;EAGvC;EAGoB,OAAA,CAAA,EAAA,MAAA;EAAQ;EAKN,eAAA,CAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,GAAA,MAAA,GAAA,SAAA;EAAQ;EAOJ,SAAA,CAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,GAAA,IAAA,GAAA,MAAA,GAAA,UAAA;EAAQ;EAfV,SAAA,CAAA,EAAA,MAAA;EAAK;EAuB7B,kBAAW,CAAA,EAAA,MAAA;EAwBS;EAAQ,MAAA,
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/alert.ts","../src/index.ts"],"sourcesContent":[],"mappings":";KAEK,KAAA;EAAA,SAAK,EAAA,MAAA;EAOO,MAAA,EAAK,IAAA,GAAA,MAAA,GAAA,UAAA;EAEO,UAAA,EAAA,MAAA;EAAU,GAAA,EAAA,MAAA;CACR;AAAU,UAHxB,KAAA,CAGwB;EACN,IAAA,EAAA,MAAA;EAAU,IAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAFhB,KAEgB,EAAA,GAFN,OAEM,CAAA,IAAA,CAAA,GAAA,IAAA;EAAO,MAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EADrB,KACqB,EAAA,GADX,OACW,CAAA,IAAA,CAAA,GAAA,IAAA;EAGvC,UAAA,EAAA,CAAA,IAAa,EAAA,MAAA,EAAA,KAAA,EAHS,KAGT,EAAA,GAHmB,OAGnB,CAAA,IAAA,CAAA,GAAA,IAAA;;AAGe,cAH5B,YAAA,YAAwB,KAGI,CAAA;EAKN,IAAA,EAAA,MAAA;EAAQ,IAAA,CAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EALV,KAKU,CAAA,EALF,OAKE,CAAA,IAAA,CAAA;EAOJ,MAAA,CAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAPJ,KAOI,CAAA,EAPI,OAOJ,CAAA,IAAA,CAAA;EAAQ,UAAA,CAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAAR,KAAQ,CAAA,EAAA,OAAA,CAAA,IAAA,CAAA;;AAfL,cAuB7B,UAAA,YAAsB,KAvBO,CAAA;EAuB7B,IAAA,EAAA,MAAA;EAwBoB,QAAA,OAAA;EAAQ,WAAA,CAAA,UAAA,EAAA,MAAA;EAON,QAAA,gBAAA;EAAQ,IAAA,CAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAPV,KAOU,CAAA,EAPF,OAOE,CAAA,IAAA,CAAA;EAOJ,MAAA,CAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAPJ,KAOI,CAAA,EAPI,OAOJ,CAAA,IAAA,CAAA;EAAQ,UAAA,CAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAAR,KAAQ,CAAA,EAAA,OAAA,CAAA,IAAA,CAAA;;;;AA3E1C,KCaO,gBAAA,GDbF;EAOO;EAEY,cAAA,EAAA,MAAA;EAAU;EACR,WAAA,EAAA,MAAA;EAAU;EACN,WAAA,CAAA,EAAA,MAAA;EAAU;EAAO,OAAA,CAAA,EAAA,MAAA;EAGvC;EAGoB,OAAA,CAAA,EAAA,MAAA;EAAQ;EAKN,eAAA,CAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,GAAA,MAAA,GAAA,SAAA;EAAQ;EAOJ,SAAA,CAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EAAA,OAAA,EAAA,GAAA,IAAA,GAAA,MAAA,GAAA,UAAA;EAAQ;EAfV,SAAA,CAAA,EAAA,MAAA;EAAK;EAuB7B,kBAAW,CAAA,EAAA,MAAA;EAwBS;EAAQ,MAAA,ECvBhC,KDuBgC,EAAA;CAON;AAAQ,cC3B9B,YD2B8B,EAAA,CAAA,OAAA,EC3BL,gBD2BK,EAAA,GC3BW,gBD2BX;AAOJ,cC9B1B,GD8B0B,EAAA,CAAA,OAAA,EC9BJ,UD8BI,CAAA,OC9Bc,YD8Bd,CAAA,EAAA,GC9B2B,OD8B3B,CAAA,IAAA,CAAA"}
|
package/dist/index.mjs
CHANGED
|
@@ -14888,14 +14888,23 @@ const measureRequest = async (url$2, options) => {
|
|
|
14888
14888
|
let tlsHandshakeAt;
|
|
14889
14889
|
let firstByteAt;
|
|
14890
14890
|
const req = ((typeof url$2 === "string" ? new URL(url$2) : url$2).protocol === "https:" ? https : http).request(url$2, options, (res) => {
|
|
14891
|
-
|
|
14891
|
+
const chunks = [];
|
|
14892
|
+
res.on("data", (chunk) => {
|
|
14892
14893
|
if (!firstByteAt) firstByteAt = Date.now();
|
|
14894
|
+
chunks.push(chunk);
|
|
14893
14895
|
});
|
|
14894
14896
|
res.on("end", () => {
|
|
14895
14897
|
const durationMs = (firstByteAt ? firstByteAt - startAt : 0) - (tlsHandshakeAt ? tlsHandshakeAt - startAt : 0);
|
|
14898
|
+
let body;
|
|
14899
|
+
try {
|
|
14900
|
+
body = JSON.parse(Buffer.concat(chunks).toString());
|
|
14901
|
+
} catch {
|
|
14902
|
+
body = void 0;
|
|
14903
|
+
}
|
|
14896
14904
|
resolve$1({
|
|
14897
14905
|
statusCode: res.statusCode || 0,
|
|
14898
|
-
durationMs: Math.max(0, durationMs)
|
|
14906
|
+
durationMs: Math.max(0, durationMs),
|
|
14907
|
+
body
|
|
14899
14908
|
});
|
|
14900
14909
|
});
|
|
14901
14910
|
});
|
|
@@ -28351,39 +28360,45 @@ const run = async (options) => {
|
|
|
28351
28360
|
}));
|
|
28352
28361
|
if (dereferenceResult.errors?.[0] || !dereferenceResult.schema) throw new Error("Failed to dereference OpenAPI spec.", { cause: dereferenceResult.errors?.[0] });
|
|
28353
28362
|
const schema$6 = dereferenceResult.schema;
|
|
28354
|
-
const
|
|
28355
|
-
if (
|
|
28363
|
+
const servers = options.baseUrl ? [{ url: options.baseUrl }] : schema$6.servers ?? [];
|
|
28364
|
+
if (servers.length === 0) throw new Error("No base URL found in OpenAPI spec and no baseUrl option provided.");
|
|
28365
|
+
const multipleServers = servers.length > 1;
|
|
28356
28366
|
const fetchConfigurations = /* @__PURE__ */ new Map();
|
|
28357
|
-
|
|
28358
|
-
const
|
|
28359
|
-
|
|
28360
|
-
if (
|
|
28361
|
-
|
|
28362
|
-
|
|
28363
|
-
|
|
28364
|
-
|
|
28365
|
-
let
|
|
28366
|
-
if (
|
|
28367
|
-
|
|
28368
|
-
|
|
28369
|
-
|
|
28370
|
-
|
|
28371
|
-
|
|
28372
|
-
|
|
28373
|
-
|
|
28374
|
-
|
|
28375
|
-
if (!exampleValue) {
|
|
28376
|
-
debug$1(`No example value for path parameter ${param.name} in ${path$2}`);
|
|
28367
|
+
for (const server of servers) {
|
|
28368
|
+
const baseUrl = server.url;
|
|
28369
|
+
const serverLabel = server.description ?? new URL(baseUrl).host;
|
|
28370
|
+
if (schema$6.paths) for (const path$2 of Object.keys(schema$6.paths)) {
|
|
28371
|
+
const pathItem = schema$6.paths[path$2];
|
|
28372
|
+
if (!pathItem) continue;
|
|
28373
|
+
if (!pathItem.get) continue;
|
|
28374
|
+
const url$2 = new URL(path$2, baseUrl);
|
|
28375
|
+
let _path = path$2;
|
|
28376
|
+
if ("200" in (pathItem.get?.responses ?? {}) && "text/event-stream" in (pathItem.get.responses?.["200"]?.content ?? {})) continue;
|
|
28377
|
+
for (const param of pathItem.get.parameters || []) {
|
|
28378
|
+
let exampleValue = options.getExampleValue?.(param.name, path$2) ?? param.example ?? param.examples?.[0] ?? param.schema?.example ?? param.schema?.examples?.[0];
|
|
28379
|
+
if (!exampleValue && (param.required || param.in === "path") && "enum" in param.schema) {
|
|
28380
|
+
const enumValues = param.schema.enum;
|
|
28381
|
+
if (Array.isArray(enumValues) && enumValues.length > 0) exampleValue = enumValues[0];
|
|
28382
|
+
}
|
|
28383
|
+
if (!exampleValue && param.required) {
|
|
28384
|
+
debug$1(`No example value for parameter ${param.name} in ${path$2}`);
|
|
28377
28385
|
continue;
|
|
28378
28386
|
}
|
|
28379
|
-
|
|
28380
|
-
|
|
28381
|
-
|
|
28387
|
+
if (param.in === "path") {
|
|
28388
|
+
if (!exampleValue) {
|
|
28389
|
+
debug$1(`No example value for path parameter ${param.name} in ${path$2}`);
|
|
28390
|
+
continue;
|
|
28391
|
+
}
|
|
28392
|
+
const placeholder = `{${param.name}}`;
|
|
28393
|
+
_path = _path.replace(placeholder, exampleValue);
|
|
28394
|
+
url$2.pathname = _path;
|
|
28395
|
+
}
|
|
28396
|
+
if (!exampleValue) continue;
|
|
28397
|
+
if (param.in === "query") url$2.searchParams.set(param.name, exampleValue);
|
|
28382
28398
|
}
|
|
28383
|
-
|
|
28384
|
-
|
|
28399
|
+
const key = multipleServers ? `[${serverLabel}] ${path$2}` : path$2;
|
|
28400
|
+
fetchConfigurations.set(key, url$2);
|
|
28385
28401
|
}
|
|
28386
|
-
fetchConfigurations.set(path$2, url$2);
|
|
28387
28402
|
}
|
|
28388
28403
|
const measurements = new Storage(options.storagePath, options.maxSpaceUsageBytes ?? 262144 * .95);
|
|
28389
28404
|
const measure = async (path$2) => {
|
|
@@ -28406,6 +28421,7 @@ const run = async (options) => {
|
|
|
28406
28421
|
return {
|
|
28407
28422
|
statusCode: 0,
|
|
28408
28423
|
durationMs: Date.now() - start,
|
|
28424
|
+
body: void 0,
|
|
28409
28425
|
url: url$2.toString(),
|
|
28410
28426
|
timestamp: start
|
|
28411
28427
|
};
|
|
@@ -28420,7 +28436,8 @@ const run = async (options) => {
|
|
|
28420
28436
|
const durationMs = Math.round(results.reduce((acc, curr) => acc + (curr?.durationMs ?? 0), 0) / results.length);
|
|
28421
28437
|
let status = "down";
|
|
28422
28438
|
const statusCode = Math.max(...results.map((r) => r?.statusCode ?? 0));
|
|
28423
|
-
|
|
28439
|
+
const lastBody = results.findLast((r) => r?.body !== void 0)?.body;
|
|
28440
|
+
if (options.getStatus) status = options.getStatus(statusCode, path$2, durationMs, lastBody);
|
|
28424
28441
|
else status = statusCode >= 200 && statusCode < 300 ? "up" : "down";
|
|
28425
28442
|
const measurement = {
|
|
28426
28443
|
status,
|