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/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 */
@@ -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,ECxBhC,KDwBgC,EAAA;CAON;AAAQ,cC5B9B,YD4B8B,EAAA,CAAA,OAAA,EC5BL,gBD4BK,EAAA,GC5BW,gBD4BX;AAOJ,cC/B1B,GD+B0B,EAAA,CAAA,OAAA,EC/BJ,UD+BI,CAAA,OC/Bc,YD+Bd,CAAA,EAAA,GC/B2B,OD+B3B,CAAA,IAAA,CAAA"}
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
- res.on("data", () => {
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 baseUrl = options.baseUrl ?? schema$6.servers?.[0]?.url;
28355
- if (!baseUrl) throw new Error("No base URL found in OpenAPI spec and no baseUrl option provided.");
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
- if (schema$6.paths) for (const path$2 of Object.keys(schema$6.paths)) {
28358
- const pathItem = schema$6.paths[path$2];
28359
- if (!pathItem) continue;
28360
- if (!pathItem.get) continue;
28361
- const url$2 = new URL(path$2, baseUrl);
28362
- let _path = path$2;
28363
- if ("200" in (pathItem.get?.responses ?? {}) && "text/event-stream" in (pathItem.get.responses?.["200"]?.content ?? {})) continue;
28364
- for (const param of pathItem.get.parameters || []) {
28365
- let exampleValue = options.getExampleValue?.(param.name, path$2) ?? param.example ?? param.examples?.[0] ?? param.schema?.example ?? param.schema?.examples?.[0];
28366
- if (!exampleValue && (param.required || param.in === "path") && "enum" in param.schema) {
28367
- const enumValues = param.schema.enum;
28368
- if (Array.isArray(enumValues) && enumValues.length > 0) exampleValue = enumValues[0];
28369
- }
28370
- if (!exampleValue && param.required) {
28371
- debug$1(`No example value for parameter ${param.name} in ${path$2}`);
28372
- continue;
28373
- }
28374
- if (param.in === "path") {
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
- const placeholder = `{${param.name}}`;
28380
- _path = _path.replace(placeholder, exampleValue);
28381
- url$2.pathname = _path;
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
- if (!exampleValue) continue;
28384
- if (param.in === "query") url$2.searchParams.set(param.name, exampleValue);
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
- if (options.getStatus) status = options.getStatus(statusCode, path$2, durationMs);
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,