@openstatus/health-qstash 0.1.4-dev.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/README.md ADDED
@@ -0,0 +1,72 @@
1
+ # @openstatus/health-qstash
2
+
3
+ [Upstash QStash](https://upstash.com/docs/qstash) probe for
4
+ [`@openstatus/health`](https://jsr.io/@openstatus/health). Sends
5
+ `GET {baseUrl}/v2/queues` with your token as a bearer header, so it proves
6
+ both that QStash answers and that the token is valid — with `fetch` alone,
7
+ on every runtime.
8
+
9
+ ```sh
10
+ deno add jsr:@openstatus/health jsr:@openstatus/health-qstash
11
+ npm install @openstatus/health @openstatus/health-qstash
12
+ ```
13
+
14
+ ```ts
15
+ import { createHealthHandler, readEnv } from "@openstatus/health";
16
+ import { qstashProbe } from "@openstatus/health-qstash";
17
+
18
+ const token = readEnv("QSTASH_TOKEN");
19
+
20
+ Deno.serve(
21
+ createHealthHandler({
22
+ probes: [
23
+ // the factory validates `token` at construction, so pass a
24
+ // placeholder and let `skip` keep the unconfigured check from running.
25
+ qstashProbe({ token: token ?? "unconfigured", skip: () => token == null }),
26
+ ],
27
+ }),
28
+ );
29
+ ```
30
+
31
+ `token` is the `QSTASH_TOKEN` the Upstash console gives you; `baseUrl`
32
+ defaults to `https://qstash.upstash.io` and takes the `QSTASH_URL` of a
33
+ regional or local development server. Like every probe here, this one never
34
+ reads the environment itself — pass the values in, and use `skip` for
35
+ environments where QStash is not configured.
36
+
37
+ Listing queues is a cheap read that needs no queue to exist and publishes
38
+ nothing, so the probe can run on every health request without side effects.
39
+
40
+ ```ts
41
+ qstashProbe({
42
+ token,
43
+ baseUrl: "http://localhost:8080",
44
+ // optional overrides from the Probe contract
45
+ name: "queue",
46
+ critical: true,
47
+ timeoutMs: 2000,
48
+ skip: () => token == null,
49
+ });
50
+ ```
51
+
52
+ Non-critical by default: QStash usually carries background work, so an
53
+ outage degrades the report instead of taking the service out of rotation.
54
+ Set `critical: true` when requests cannot complete without enqueuing.
55
+
56
+ ## About openstatus
57
+
58
+ [openstatus](https://www.openstatus.dev/) is the open-source uptime monitoring
59
+ and status page platform. This package is part of
60
+ [`@openstatus/health`](https://github.com/openstatusHQ/health), the `/health`
61
+ endpoints behind openstatus's own services, extracted so any JavaScript server
62
+ can expose one. Point an
63
+ [openstatus monitor](https://www.openstatus.dev/docs/reference/http-monitor)
64
+ at the endpoint and assert on `status` in the body to be alerted on
65
+ `degraded` before it becomes `unhealthy`.
66
+
67
+ Source: [github.com/openstatusHQ/health](https://github.com/openstatusHQ/health).
68
+ Issues and PRs welcome.
69
+
70
+ ## License
71
+
72
+ [MIT](https://github.com/openstatusHQ/health/blob/main/LICENSE)
@@ -0,0 +1,30 @@
1
+ //#region rolldown:runtime
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
10
+ key = keys[i];
11
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
12
+ get: ((k) => from[k]).bind(null, key),
13
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
14
+ });
15
+ }
16
+ return to;
17
+ };
18
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
19
+ value: mod,
20
+ enumerable: true
21
+ }) : target, mod));
22
+
23
+ //#endregion
24
+
25
+ Object.defineProperty(exports, '__toESM', {
26
+ enumerable: true,
27
+ get: function () {
28
+ return __toESM;
29
+ }
30
+ });
package/dist/mod.cjs ADDED
@@ -0,0 +1,36 @@
1
+ const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
2
+ const __openstatus_health = require_rolldown_runtime.__toESM(require("@openstatus/health"));
3
+
4
+ //#region src/mod.ts
5
+ /** API base URL when `baseUrl` is unset. */
6
+ const qstashDefaultBaseUrl = "https://qstash.upstash.io";
7
+ /** Probe name when `name` is unset. */
8
+ const qstashDefaultName = "qstash";
9
+ /** A probe that expects 2xx from `GET {baseUrl}/v2/queues` with `token` as a bearer token; non-critical by default. Throws `ProbeConfigError` for an empty `token` or an invalid `baseUrl`. */
10
+ function qstashProbe(options) {
11
+ const doFetch = options.fetch ?? globalThis.fetch;
12
+ const url = (0, __openstatus_health.probeUrl)({
13
+ probe: "qstashProbe",
14
+ field: "baseUrl",
15
+ value: options.baseUrl ?? qstashDefaultBaseUrl,
16
+ path: "/v2/queues"
17
+ });
18
+ if (typeof options.token !== "string" || options.token.length === 0) throw new __openstatus_health.ProbeConfigError("qstashProbe", "token", typeof options.token !== "string" ? `must be a string, got ${String(options.token)}` : "must not be empty");
19
+ const headers = { authorization: `Bearer ${options.token}` };
20
+ return {
21
+ name: options.name ?? qstashDefaultName,
22
+ critical: options.critical ?? false,
23
+ timeoutMs: options.timeoutMs,
24
+ skip: options.skip,
25
+ run: (signal) => (0, __openstatus_health.expectOk)(doFetch(url, {
26
+ method: "GET",
27
+ headers,
28
+ signal
29
+ }))
30
+ };
31
+ }
32
+
33
+ //#endregion
34
+ exports.qstashDefaultBaseUrl = qstashDefaultBaseUrl;
35
+ exports.qstashDefaultName = qstashDefaultName;
36
+ exports.qstashProbe = qstashProbe;
package/dist/mod.d.cts ADDED
@@ -0,0 +1,23 @@
1
+ import { Probe, ProbeOverrides } from "@openstatus/health";
2
+
3
+ //#region src/mod.d.ts
4
+
5
+ /** API base URL when `baseUrl` is unset. */
6
+ declare const qstashDefaultBaseUrl = "https://qstash.upstash.io";
7
+ /** Probe name when `name` is unset. */
8
+ declare const qstashDefaultName = "qstash";
9
+ /** Options for `qstashProbe()`. */
10
+ interface QstashProbeOptions extends ProbeOverrides {
11
+ /** The `QSTASH_TOKEN` from the Upstash console. */
12
+ readonly token: string;
13
+ /** API host. Default `qstashDefaultBaseUrl`. */
14
+ readonly baseUrl?: string | URL;
15
+ /** Replacement `fetch`, for tests. */
16
+ readonly fetch?: typeof fetch;
17
+ }
18
+ /** A probe that expects 2xx from `GET {baseUrl}/v2/queues` with `token` as a bearer token; non-critical by default. Throws `ProbeConfigError` for an empty `token` or an invalid `baseUrl`. */
19
+ declare function qstashProbe(options: QstashProbeOptions): Probe;
20
+ //# sourceMappingURL=mod.d.ts.map
21
+ //#endregion
22
+ export { QstashProbeOptions, qstashDefaultBaseUrl, qstashDefaultName, qstashProbe };
23
+ //# sourceMappingURL=mod.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.d.cts","names":[],"sources":["../src/mod.ts"],"sourcesContent":[],"mappings":";;;;;AAoCqC,cAfxB,oBAAA,GAewB,2BAAA;;AAA0B,cAblD,iBAAA,GAakD,QAAA;;UAV9C,kBAAA,SAA2B;;;;8BAId;;0BAEJ;;;iBAIV,WAAA,UAAqB,qBAAqB"}
package/dist/mod.d.ts ADDED
@@ -0,0 +1,23 @@
1
+ import { Probe, ProbeOverrides } from "@openstatus/health";
2
+
3
+ //#region src/mod.d.ts
4
+
5
+ /** API base URL when `baseUrl` is unset. */
6
+ declare const qstashDefaultBaseUrl = "https://qstash.upstash.io";
7
+ /** Probe name when `name` is unset. */
8
+ declare const qstashDefaultName = "qstash";
9
+ /** Options for `qstashProbe()`. */
10
+ interface QstashProbeOptions extends ProbeOverrides {
11
+ /** The `QSTASH_TOKEN` from the Upstash console. */
12
+ readonly token: string;
13
+ /** API host. Default `qstashDefaultBaseUrl`. */
14
+ readonly baseUrl?: string | URL;
15
+ /** Replacement `fetch`, for tests. */
16
+ readonly fetch?: typeof fetch;
17
+ }
18
+ /** A probe that expects 2xx from `GET {baseUrl}/v2/queues` with `token` as a bearer token; non-critical by default. Throws `ProbeConfigError` for an empty `token` or an invalid `baseUrl`. */
19
+ declare function qstashProbe(options: QstashProbeOptions): Probe;
20
+ //# sourceMappingURL=mod.d.ts.map
21
+ //#endregion
22
+ export { QstashProbeOptions, qstashDefaultBaseUrl, qstashDefaultName, qstashProbe };
23
+ //# sourceMappingURL=mod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.d.ts","names":[],"sources":["../src/mod.ts"],"sourcesContent":[],"mappings":";;;;;AAoCqC,cAfxB,oBAAA,GAewB,2BAAA;;AAA0B,cAblD,iBAAA,GAakD,QAAA;;UAV9C,kBAAA,SAA2B;;;;8BAId;;0BAEJ;;;iBAIV,WAAA,UAAqB,qBAAqB"}
package/dist/mod.js ADDED
@@ -0,0 +1,34 @@
1
+ import { ProbeConfigError, expectOk, probeUrl } from "@openstatus/health";
2
+
3
+ //#region src/mod.ts
4
+ /** API base URL when `baseUrl` is unset. */
5
+ const qstashDefaultBaseUrl = "https://qstash.upstash.io";
6
+ /** Probe name when `name` is unset. */
7
+ const qstashDefaultName = "qstash";
8
+ /** A probe that expects 2xx from `GET {baseUrl}/v2/queues` with `token` as a bearer token; non-critical by default. Throws `ProbeConfigError` for an empty `token` or an invalid `baseUrl`. */
9
+ function qstashProbe(options) {
10
+ const doFetch = options.fetch ?? globalThis.fetch;
11
+ const url = probeUrl({
12
+ probe: "qstashProbe",
13
+ field: "baseUrl",
14
+ value: options.baseUrl ?? qstashDefaultBaseUrl,
15
+ path: "/v2/queues"
16
+ });
17
+ if (typeof options.token !== "string" || options.token.length === 0) throw new ProbeConfigError("qstashProbe", "token", typeof options.token !== "string" ? `must be a string, got ${String(options.token)}` : "must not be empty");
18
+ const headers = { authorization: `Bearer ${options.token}` };
19
+ return {
20
+ name: options.name ?? qstashDefaultName,
21
+ critical: options.critical ?? false,
22
+ timeoutMs: options.timeoutMs,
23
+ skip: options.skip,
24
+ run: (signal) => expectOk(doFetch(url, {
25
+ method: "GET",
26
+ headers,
27
+ signal
28
+ }))
29
+ };
30
+ }
31
+
32
+ //#endregion
33
+ export { qstashDefaultBaseUrl, qstashDefaultName, qstashProbe };
34
+ //# sourceMappingURL=mod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.js","names":["options: QstashProbeOptions"],"sources":["../src/mod.ts"],"sourcesContent":["/**\n * Upstash QStash reachability probe for `@openstatus/health`, against `/v2/queues`.\n *\n * ```ts\n * import { qstashProbe } from \"@openstatus/health-qstash\";\n *\n * const probe = qstashProbe({ token: env.QSTASH_TOKEN });\n * ```\n *\n * @module\n */\n\nimport {\n expectOk,\n type Probe,\n ProbeConfigError,\n type ProbeOverrides,\n probeUrl,\n} from \"@openstatus/health\";\n\n/** API base URL when `baseUrl` is unset. */\nexport const qstashDefaultBaseUrl = \"https://qstash.upstash.io\";\n/** Probe name when `name` is unset. */\nexport const qstashDefaultName = \"qstash\";\n\n/** Options for `qstashProbe()`. */\nexport interface QstashProbeOptions extends ProbeOverrides {\n /** The `QSTASH_TOKEN` from the Upstash console. */\n readonly token: string;\n /** API host. Default `qstashDefaultBaseUrl`. */\n readonly baseUrl?: string | URL;\n /** Replacement `fetch`, for tests. */\n readonly fetch?: typeof fetch;\n}\n\n/** A probe that expects 2xx from `GET {baseUrl}/v2/queues` with `token` as a bearer token; non-critical by default. Throws `ProbeConfigError` for an empty `token` or an invalid `baseUrl`. */\nexport function qstashProbe(options: QstashProbeOptions): Probe {\n const doFetch = options.fetch ?? globalThis.fetch;\n const url = probeUrl({\n probe: \"qstashProbe\",\n field: \"baseUrl\",\n value: options.baseUrl ?? qstashDefaultBaseUrl,\n path: \"/v2/queues\",\n });\n if (typeof options.token !== \"string\" || options.token.length === 0) {\n throw new ProbeConfigError(\n \"qstashProbe\",\n \"token\",\n typeof options.token !== \"string\"\n ? `must be a string, got ${String(options.token)}`\n : \"must not be empty\",\n );\n }\n const headers = { authorization: `Bearer ${options.token}` };\n return {\n name: options.name ?? qstashDefaultName,\n critical: options.critical ?? false,\n timeoutMs: options.timeoutMs,\n skip: options.skip,\n run: (signal) => expectOk(doFetch(url, { method: \"GET\", headers, signal })),\n };\n}\n"],"mappings":";;;;AAqBA,MAAa,uBAAuB;;AAEpC,MAAa,oBAAoB;;AAajC,SAAgB,YAAYA,SAAoC;CAC9D,MAAM,UAAU,QAAQ,SAAS,WAAW;CAC5C,MAAM,MAAM,SAAS;EACnB,OAAO;EACP,OAAO;EACP,OAAO,QAAQ,WAAW;EAC1B,MAAM;CACP,EAAC;AACF,YAAW,QAAQ,UAAU,YAAY,QAAQ,MAAM,WAAW,EAChE,OAAM,IAAI,iBACR,eACA,gBACO,QAAQ,UAAU,YACpB,wBAAwB,OAAO,QAAQ,MAAM,CAAC,IAC/C;CAGR,MAAM,UAAU,EAAE,gBAAgB,SAAS,QAAQ,MAAM,EAAG;AAC5D,QAAO;EACL,MAAM,QAAQ,QAAQ;EACtB,UAAU,QAAQ,YAAY;EAC9B,WAAW,QAAQ;EACnB,MAAM,QAAQ;EACd,KAAK,CAAC,WAAW,SAAS,QAAQ,KAAK;GAAE,QAAQ;GAAO;GAAS;EAAQ,EAAC,CAAC;CAC5E;AACF"}
package/package.json ADDED
@@ -0,0 +1,62 @@
1
+ {
2
+ "name": "@openstatus/health-qstash",
3
+ "version": "0.1.4-dev.0",
4
+ "description": "Upstash QStash probe for @openstatus/health",
5
+ "keywords": [
6
+ "openstatus",
7
+ "health",
8
+ "healthcheck",
9
+ "upstash",
10
+ "qstash",
11
+ "queue",
12
+ "messaging"
13
+ ],
14
+ "license": "MIT",
15
+ "author": {
16
+ "name": "openstatus",
17
+ "url": "https://www.openstatus.dev/"
18
+ },
19
+ "homepage": "https://github.com/openstatusHQ/health",
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://github.com/openstatusHQ/health.git",
23
+ "directory": "packages/qstash/"
24
+ },
25
+ "bugs": {
26
+ "url": "https://github.com/openstatusHQ/health/issues"
27
+ },
28
+ "type": "module",
29
+ "module": "./dist/mod.js",
30
+ "main": "./dist/mod.cjs",
31
+ "types": "./dist/mod.d.ts",
32
+ "exports": {
33
+ ".": {
34
+ "types": {
35
+ "import": "./dist/mod.d.ts",
36
+ "require": "./dist/mod.d.cts"
37
+ },
38
+ "import": "./dist/mod.js",
39
+ "require": "./dist/mod.cjs"
40
+ },
41
+ "./package.json": "./package.json"
42
+ },
43
+ "sideEffects": false,
44
+ "files": [
45
+ "dist/"
46
+ ],
47
+ "engines": {
48
+ "node": ">=22"
49
+ },
50
+ "peerDependencies": {
51
+ "@openstatus/health": "^0.1.4-dev.0"
52
+ },
53
+ "devDependencies": {
54
+ "tsdown": "^0.12.7",
55
+ "typescript": "^5.8.3"
56
+ },
57
+ "scripts": {
58
+ "build": "tsdown",
59
+ "prepack": "tsdown",
60
+ "test": "node --experimental-transform-types --test"
61
+ }
62
+ }