@procedures/notify 0.55.1 → 0.56.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/CHANGELOG.md +22 -0
- package/README.md +63 -2
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/procedures.d.ts +1 -0
- package/dist/procedures.d.ts.map +1 -1
- package/dist/procedures.js +3 -1
- package/dist/procedures.js.map +1 -1
- package/dist/pushover-procedures.d.ts +20 -0
- package/dist/pushover-procedures.d.ts.map +1 -0
- package/dist/pushover-procedures.js +169 -0
- package/dist/pushover-procedures.js.map +1 -0
- package/dist/pushover.d.ts +247 -0
- package/dist/pushover.d.ts.map +1 -0
- package/dist/pushover.js +350 -0
- package/dist/pushover.js.map +1 -0
- package/package.json +18 -6
- package/src/index.ts +2 -0
- package/src/procedures.ts +3 -1
- package/src/pushover-procedures.ts +229 -0
- package/src/pushover.ts +530 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pushover.d.ts","sourceRoot":"","sources":["../src/pushover.ts"],"names":[],"mappings":"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"}
|
package/dist/pushover.js
ADDED
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pushover (https://pushover.net) as pure functions. A request builder gives the URL, the method,
|
|
3
|
+
* the headers and the body of one call. An extractor reads the HTTP status, the headers and the
|
|
4
|
+
* body text of the response into a typed result. Neither function sends a request, so the caller
|
|
5
|
+
* gives the fetch: `globalThis.fetch`, a polite client or a fake server of a test.
|
|
6
|
+
*
|
|
7
|
+
* This entry imports no Node built-in, so a browser can also use it.
|
|
8
|
+
*
|
|
9
|
+
* Each time in this file is in milliseconds. The builders change a time to the whole seconds of
|
|
10
|
+
* Pushover, and the extractors change the seconds of Pushover to milliseconds.
|
|
11
|
+
*
|
|
12
|
+
* A request holds the API token of the application: in the body of a POST, or in the query of a
|
|
13
|
+
* GET. Do not log a request or its URL.
|
|
14
|
+
*/
|
|
15
|
+
/** The base of the Pushover API. */
|
|
16
|
+
export const PUSHOVER_API = "https://api.pushover.net/1";
|
|
17
|
+
/** The limits of the Pushover API, in characters (Unicode code points). */
|
|
18
|
+
export const PUSHOVER_LIMITS = { message: 1024, title: 250, url: 512, urlTitle: 100, device: 25, users: 50 };
|
|
19
|
+
/** The shortest time between two repeats of an emergency message: 30 seconds. */
|
|
20
|
+
export const PUSHOVER_RETRY_MIN_MS = 30_000;
|
|
21
|
+
/** The longest time that Pushover repeats an emergency message: 3 hours. */
|
|
22
|
+
export const PUSHOVER_EXPIRE_MAX_MS = 10_800_000;
|
|
23
|
+
/**
|
|
24
|
+
* The shortest wait before a call goes again after a server error or no answer: 5 seconds. It is
|
|
25
|
+
* also the shortest time between two reads of one receipt.
|
|
26
|
+
*/
|
|
27
|
+
export const PUSHOVER_MIN_WAIT_MS = 5_000;
|
|
28
|
+
// =============================================================================
|
|
29
|
+
// Request builders
|
|
30
|
+
// =============================================================================
|
|
31
|
+
/** The form of an API token, a user key, a group key and a receipt: 30 letters and digits. */
|
|
32
|
+
export const PUSHOVER_KEY = /^[A-Za-z0-9]{30}$/;
|
|
33
|
+
const KEY = PUSHOVER_KEY;
|
|
34
|
+
const DEVICE = /^[A-Za-z0-9_-]{1,25}$/;
|
|
35
|
+
const FORM = "application/x-www-form-urlencoded";
|
|
36
|
+
const chars = (value) => [...value].length;
|
|
37
|
+
function assertKey(value, what) {
|
|
38
|
+
if (!KEY.test(value))
|
|
39
|
+
throw new Error(`The ${what} is not 30 letters and digits.`);
|
|
40
|
+
}
|
|
41
|
+
function assertMax(text, max, what) {
|
|
42
|
+
if (text !== undefined && chars(text) > max)
|
|
43
|
+
throw new Error(`The ${what} has more than ${max} characters.`);
|
|
44
|
+
}
|
|
45
|
+
function assertTag(tag) {
|
|
46
|
+
if (tag === "" || tag.includes(","))
|
|
47
|
+
throw new Error(`The tag "${tag}" is empty or has a comma.`);
|
|
48
|
+
}
|
|
49
|
+
const seconds = (ms, round) => String(round(ms / 1000));
|
|
50
|
+
function post(path, fields) {
|
|
51
|
+
return { url: `${PUSHOVER_API}${path}`, method: "POST", headers: { "content-type": FORM, accept: "application/json" }, body: new URLSearchParams(fields).toString() };
|
|
52
|
+
}
|
|
53
|
+
function get(path, token) {
|
|
54
|
+
return { url: `${PUSHOVER_API}${path}?${new URLSearchParams({ token }).toString()}`, method: "GET", headers: { accept: "application/json" } };
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* This function gives the request that sends one message. It throws an error when the input
|
|
58
|
+
* breaks a rule of the API. Pushover refuses such a request, and many refusals can block the
|
|
59
|
+
* address of the caller.
|
|
60
|
+
*/
|
|
61
|
+
export function pushoverSendRequest(token, message) {
|
|
62
|
+
assertKey(token, "API token");
|
|
63
|
+
const users = message.user.split(",");
|
|
64
|
+
if (users.length > PUSHOVER_LIMITS.users)
|
|
65
|
+
throw new Error(`A message goes to ${PUSHOVER_LIMITS.users} users at most.`);
|
|
66
|
+
for (const user of users)
|
|
67
|
+
assertKey(user, "user key");
|
|
68
|
+
if (message.message.trim() === "")
|
|
69
|
+
throw new Error("The message is empty.");
|
|
70
|
+
assertMax(message.message, PUSHOVER_LIMITS.message, "message");
|
|
71
|
+
assertMax(message.title, PUSHOVER_LIMITS.title, "title");
|
|
72
|
+
assertMax(message.url, PUSHOVER_LIMITS.url, "URL");
|
|
73
|
+
assertMax(message.urlTitle, PUSHOVER_LIMITS.urlTitle, "URL title");
|
|
74
|
+
const priority = message.priority ?? 0;
|
|
75
|
+
if (![-2, -1, 0, 1, 2].includes(priority))
|
|
76
|
+
throw new Error(`${String(priority)} is not a priority of Pushover.`);
|
|
77
|
+
const fields = { token, user: message.user, message: message.message };
|
|
78
|
+
if (message.title !== undefined)
|
|
79
|
+
fields["title"] = message.title;
|
|
80
|
+
if (message.url !== undefined)
|
|
81
|
+
fields["url"] = message.url;
|
|
82
|
+
if (message.urlTitle !== undefined)
|
|
83
|
+
fields["url_title"] = message.urlTitle;
|
|
84
|
+
if (priority !== 0)
|
|
85
|
+
fields["priority"] = String(priority);
|
|
86
|
+
const emergency = message.emergency;
|
|
87
|
+
if (priority === 2) {
|
|
88
|
+
if (emergency === undefined)
|
|
89
|
+
throw new Error("Priority 2 needs the emergency repeats: retryMs and expireMs.");
|
|
90
|
+
if (!(emergency.retryMs >= PUSHOVER_RETRY_MIN_MS))
|
|
91
|
+
throw new Error("The time between two repeats is less than 30 seconds.");
|
|
92
|
+
if (!(emergency.expireMs > 0 && emergency.expireMs <= PUSHOVER_EXPIRE_MAX_MS))
|
|
93
|
+
throw new Error("The repeats do not stop in 3 hours or less.");
|
|
94
|
+
fields["retry"] = seconds(emergency.retryMs, Math.ceil);
|
|
95
|
+
fields["expire"] = seconds(emergency.expireMs, Math.floor);
|
|
96
|
+
if (emergency.callback !== undefined) {
|
|
97
|
+
if (!/^https?:\/\//.test(emergency.callback))
|
|
98
|
+
throw new Error("The callback is not an http or https address.");
|
|
99
|
+
fields["callback"] = emergency.callback;
|
|
100
|
+
}
|
|
101
|
+
if (emergency.tags !== undefined && emergency.tags.length > 0) {
|
|
102
|
+
emergency.tags.forEach(assertTag);
|
|
103
|
+
fields["tags"] = emergency.tags.join(",");
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
else if (emergency !== undefined) {
|
|
107
|
+
throw new Error("Only priority 2 takes the emergency repeats.");
|
|
108
|
+
}
|
|
109
|
+
if (message.sound !== undefined) {
|
|
110
|
+
if (!/^[A-Za-z0-9_-]{1,64}$/.test(message.sound))
|
|
111
|
+
throw new Error(`"${message.sound}" is not the name of a sound.`);
|
|
112
|
+
fields["sound"] = message.sound;
|
|
113
|
+
}
|
|
114
|
+
if (message.devices !== undefined && message.devices.length > 0) {
|
|
115
|
+
for (const device of message.devices)
|
|
116
|
+
if (!DEVICE.test(device))
|
|
117
|
+
throw new Error(`"${device}" is not the name of a device.`);
|
|
118
|
+
fields["device"] = message.devices.join(",");
|
|
119
|
+
}
|
|
120
|
+
if (message.timestampMs !== undefined)
|
|
121
|
+
fields["timestamp"] = seconds(message.timestampMs, Math.floor);
|
|
122
|
+
if (message.format === "html")
|
|
123
|
+
fields["html"] = "1";
|
|
124
|
+
if (message.format === "monospace")
|
|
125
|
+
fields["monospace"] = "1";
|
|
126
|
+
if (message.ttlMs !== undefined && priority !== 2) {
|
|
127
|
+
if (!(message.ttlMs >= 1000))
|
|
128
|
+
throw new Error("The time to live is less than 1 second.");
|
|
129
|
+
fields["ttl"] = seconds(message.ttlMs, Math.floor);
|
|
130
|
+
}
|
|
131
|
+
return post("/messages.json", fields);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* This function gives the request that reads the receipt of an emergency message. Read one receipt
|
|
135
|
+
* at most once in 5 seconds (`PUSHOVER_MIN_WAIT_MS`). Pushover keeps a receipt for one week.
|
|
136
|
+
*/
|
|
137
|
+
export function pushoverReceiptRequest(token, receipt) {
|
|
138
|
+
assertKey(token, "API token");
|
|
139
|
+
assertKey(receipt, "receipt");
|
|
140
|
+
return get(`/receipts/${receipt}.json`, token);
|
|
141
|
+
}
|
|
142
|
+
/** This function gives the request that stops the repeats of one emergency message. A second cancel has no effect. */
|
|
143
|
+
export function pushoverCancelRequest(token, receipt) {
|
|
144
|
+
assertKey(token, "API token");
|
|
145
|
+
assertKey(receipt, "receipt");
|
|
146
|
+
return post(`/receipts/${receipt}/cancel.json`, { token });
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* This function gives the request that stops the repeats of each emergency message of the
|
|
150
|
+
* application with the tag. A copy of a system that did not send the message can stop it.
|
|
151
|
+
*/
|
|
152
|
+
export function pushoverCancelByTagRequest(token, tag) {
|
|
153
|
+
assertKey(token, "API token");
|
|
154
|
+
assertTag(tag);
|
|
155
|
+
return post(`/receipts/cancel_by_tag/${encodeURIComponent(tag)}.json`, { token });
|
|
156
|
+
}
|
|
157
|
+
/** This function gives the request that examines a user key, and one device of the user when `device` names it. */
|
|
158
|
+
export function pushoverValidateRequest(token, user, device) {
|
|
159
|
+
assertKey(token, "API token");
|
|
160
|
+
assertKey(user, "user key");
|
|
161
|
+
if (device !== undefined && !DEVICE.test(device))
|
|
162
|
+
throw new Error(`"${device}" is not the name of a device.`);
|
|
163
|
+
return post("/users/validate.json", device === undefined ? { token, user } : { token, user, device });
|
|
164
|
+
}
|
|
165
|
+
/** This function gives the request that reads the monthly limit of the application. */
|
|
166
|
+
export function pushoverLimitsRequest(token) {
|
|
167
|
+
assertKey(token, "API token");
|
|
168
|
+
return get("/apps/limits.json", token);
|
|
169
|
+
}
|
|
170
|
+
function parse(text) {
|
|
171
|
+
try {
|
|
172
|
+
const value = JSON.parse(text);
|
|
173
|
+
return typeof value === "object" && value !== null && !Array.isArray(value) ? value : undefined;
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return undefined;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
const text = (value) => (typeof value === "string" && value !== "" ? value : undefined);
|
|
180
|
+
const count = (value) => (typeof value === "number" && Number.isInteger(value) && value >= 0 ? value : undefined);
|
|
181
|
+
/** Pushover gives `0` for a time that did not occur. */
|
|
182
|
+
const instant = (value) => {
|
|
183
|
+
const at = count(value);
|
|
184
|
+
return at === undefined || at === 0 ? undefined : at * 1000;
|
|
185
|
+
};
|
|
186
|
+
const flag = (value) => value === 1 || value === true;
|
|
187
|
+
/** This function gives `{ [key]: value }`, or an empty object when the value is undefined. */
|
|
188
|
+
const some = (key, value) => (value === undefined ? {} : { [key]: value });
|
|
189
|
+
function headerNumber(response, name) {
|
|
190
|
+
const value = response.headers?.get(name);
|
|
191
|
+
return value === null || value === undefined || !/^\d+$/.test(value.trim()) ? undefined : Number(value.trim());
|
|
192
|
+
}
|
|
193
|
+
function limitsOf(response) {
|
|
194
|
+
const limit = headerNumber(response, "x-limit-app-limit");
|
|
195
|
+
const remaining = headerNumber(response, "x-limit-app-remaining");
|
|
196
|
+
const reset = headerNumber(response, "x-limit-app-reset");
|
|
197
|
+
return limit === undefined || remaining === undefined || reset === undefined ? undefined : { limit, remaining, resetAt: reset * 1000 };
|
|
198
|
+
}
|
|
199
|
+
function errorsOf(body, fallback) {
|
|
200
|
+
const errors = body?.["errors"];
|
|
201
|
+
const list = Array.isArray(errors) ? errors.filter((error) => typeof error === "string") : [];
|
|
202
|
+
return list.length > 0 ? list : [fallback];
|
|
203
|
+
}
|
|
204
|
+
function failure(kind, response, body, fallback) {
|
|
205
|
+
const request = text(body?.["request"]);
|
|
206
|
+
const reset = kind === "rate-limited" ? limitsOf(response)?.resetAt : undefined;
|
|
207
|
+
return {
|
|
208
|
+
ok: false,
|
|
209
|
+
kind,
|
|
210
|
+
status: response.status,
|
|
211
|
+
errors: errorsOf(body, fallback),
|
|
212
|
+
...some("request", request),
|
|
213
|
+
...some("retryAfterMs", kind === "server" ? PUSHOVER_MIN_WAIT_MS : undefined),
|
|
214
|
+
...some("resetAt", reset),
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* This function sorts a response. It gives the body of a success, or a failure. Pushover has
|
|
219
|
+
* accepted a call only for an HTTP status 2xx with `status: 1` in the body.
|
|
220
|
+
*/
|
|
221
|
+
function sort(response) {
|
|
222
|
+
const body = parse(response.text);
|
|
223
|
+
const status = response.status;
|
|
224
|
+
if (status === 429)
|
|
225
|
+
return failure("rate-limited", response, body, "The application sent its messages of the month.");
|
|
226
|
+
if (status === 401 || status === 403 || body?.["token"] === "invalid")
|
|
227
|
+
return failure("auth", response, body, "Pushover refused the API token.");
|
|
228
|
+
if (status >= 400 && status < 500)
|
|
229
|
+
return failure("refused", response, body, `Pushover refused the request with HTTP ${status}.`);
|
|
230
|
+
if (status < 200 || status >= 300)
|
|
231
|
+
return failure("server", response, body, `Pushover gave HTTP ${status}.`);
|
|
232
|
+
// A 2xx answer that is not JSON tells nothing. Thus the same request can go again.
|
|
233
|
+
if (body === undefined)
|
|
234
|
+
return failure("server", response, body, "The answer of Pushover is not a JSON object.");
|
|
235
|
+
if (body["status"] !== 1)
|
|
236
|
+
return failure("refused", response, body, "Pushover did not accept the request.");
|
|
237
|
+
return { ok: true, body };
|
|
238
|
+
}
|
|
239
|
+
/** This function reads the response of `pushoverSendRequest`. It does not throw. */
|
|
240
|
+
export function extractPushoverSent(response) {
|
|
241
|
+
const sorted = sort(response);
|
|
242
|
+
if (!sorted.ok)
|
|
243
|
+
return sorted;
|
|
244
|
+
const request = text(sorted.body["request"]);
|
|
245
|
+
if (request === undefined)
|
|
246
|
+
return failure("server", response, sorted.body, "The answer of Pushover has no request id.");
|
|
247
|
+
const receipt = text(sorted.body["receipt"]);
|
|
248
|
+
const limits = limitsOf(response);
|
|
249
|
+
return { ok: true, request, ...some("receipt", receipt), ...some("limits", limits) };
|
|
250
|
+
}
|
|
251
|
+
/** This function reads the response of `pushoverReceiptRequest`. It does not throw. */
|
|
252
|
+
export function extractPushoverReceipt(response) {
|
|
253
|
+
const sorted = sort(response);
|
|
254
|
+
if (!sorted.ok)
|
|
255
|
+
return sorted;
|
|
256
|
+
const body = sorted.body;
|
|
257
|
+
const expiresAt = instant(body["expires_at"]);
|
|
258
|
+
if (expiresAt === undefined)
|
|
259
|
+
return failure("server", response, body, "The receipt has no expiry time.");
|
|
260
|
+
return {
|
|
261
|
+
ok: true,
|
|
262
|
+
acknowledged: flag(body["acknowledged"]),
|
|
263
|
+
...some("acknowledgedAt", instant(body["acknowledged_at"])),
|
|
264
|
+
...some("acknowledgedBy", text(body["acknowledged_by"])),
|
|
265
|
+
...some("acknowledgedByDevice", text(body["acknowledged_by_device"])),
|
|
266
|
+
...some("lastDeliveredAt", instant(body["last_delivered_at"])),
|
|
267
|
+
expired: flag(body["expired"]),
|
|
268
|
+
expiresAt,
|
|
269
|
+
calledBack: flag(body["called_back"]),
|
|
270
|
+
...some("calledBackAt", instant(body["called_back_at"])),
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
/** This function reads the response of `pushoverCancelRequest` or `pushoverCancelByTagRequest`. It does not throw. */
|
|
274
|
+
export function extractPushoverCancelled(response) {
|
|
275
|
+
const sorted = sort(response);
|
|
276
|
+
if (!sorted.ok)
|
|
277
|
+
return sorted;
|
|
278
|
+
const request = text(sorted.body["request"]);
|
|
279
|
+
const cancelled = count(sorted.body["canceled"]);
|
|
280
|
+
return { ok: true, ...some("request", request), ...some("cancelled", cancelled) };
|
|
281
|
+
}
|
|
282
|
+
/** This function reads the response of `pushoverValidateRequest`. A user key that Pushover does not know is a `refused` failure. */
|
|
283
|
+
export function extractPushoverValidated(response) {
|
|
284
|
+
const sorted = sort(response);
|
|
285
|
+
if (!sorted.ok)
|
|
286
|
+
return sorted;
|
|
287
|
+
const strings = (value) => (Array.isArray(value) ? value.filter((item) => typeof item === "string") : []);
|
|
288
|
+
return { ok: true, group: flag(sorted.body["group"]), devices: strings(sorted.body["devices"]), licenses: strings(sorted.body["licenses"]) };
|
|
289
|
+
}
|
|
290
|
+
/** This function reads the response of `pushoverLimitsRequest`. It does not throw. */
|
|
291
|
+
export function extractPushoverLimits(response) {
|
|
292
|
+
const sorted = sort(response);
|
|
293
|
+
if (!sorted.ok)
|
|
294
|
+
return sorted;
|
|
295
|
+
const limit = count(sorted.body["limit"]);
|
|
296
|
+
const remaining = count(sorted.body["remaining"]);
|
|
297
|
+
const reset = count(sorted.body["reset"]);
|
|
298
|
+
if (limit === undefined || remaining === undefined || reset === undefined)
|
|
299
|
+
return failure("server", response, sorted.body, "The answer has no limit, remaining or reset.");
|
|
300
|
+
return { ok: true, limits: { limit, remaining, resetAt: reset * 1000 } };
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* This function reads the form body that Pushover posts to the `callback` address when a user
|
|
304
|
+
* acknowledges an emergency message. It gives `undefined` for another body. Pushover sends the post
|
|
305
|
+
* again each minute until the address answers 2xx.
|
|
306
|
+
*/
|
|
307
|
+
export function extractPushoverCallback(body) {
|
|
308
|
+
const form = new URLSearchParams(body);
|
|
309
|
+
const receipt = form.get("receipt") ?? "";
|
|
310
|
+
const at = form.get("acknowledged_at") ?? "";
|
|
311
|
+
if (!KEY.test(receipt) || form.get("acknowledged") !== "1" || !/^\d+$/.test(at) || at === "0")
|
|
312
|
+
return undefined;
|
|
313
|
+
return {
|
|
314
|
+
receipt,
|
|
315
|
+
acknowledgedAt: Number(at) * 1000,
|
|
316
|
+
...some("acknowledgedBy", text(form.get("acknowledged_by"))),
|
|
317
|
+
...some("acknowledgedByDevice", text(form.get("acknowledged_by_device"))),
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* This function sends one request through the fetch and reads the response with the extractor. It
|
|
322
|
+
* does not throw for a failure of the network or a time limit: it gives a failure of the kind
|
|
323
|
+
* `network` or `timeout`. It throws only the reason of `signal`, when the caller aborts. It does not
|
|
324
|
+
* send a request again: the caller keeps the pace and the retries.
|
|
325
|
+
*/
|
|
326
|
+
export async function callPushover(fetch, request, extract, options) {
|
|
327
|
+
const signals = [AbortSignal.timeout(options.timeoutMs), ...(options.signal ? [options.signal] : [])];
|
|
328
|
+
try {
|
|
329
|
+
const response = await fetch(request.url, {
|
|
330
|
+
method: request.method,
|
|
331
|
+
headers: { ...request.headers },
|
|
332
|
+
...(request.body === undefined ? {} : { body: request.body }),
|
|
333
|
+
signal: AbortSignal.any(signals),
|
|
334
|
+
});
|
|
335
|
+
return extract({ status: response.status, text: await response.text(), headers: response.headers });
|
|
336
|
+
}
|
|
337
|
+
catch (error) {
|
|
338
|
+
if (options.signal?.aborted)
|
|
339
|
+
throw options.signal.reason;
|
|
340
|
+
const timedOut = error?.name === "TimeoutError";
|
|
341
|
+
return {
|
|
342
|
+
ok: false,
|
|
343
|
+
kind: timedOut ? "timeout" : "network",
|
|
344
|
+
status: 0,
|
|
345
|
+
errors: [timedOut ? `Pushover did not answer in ${options.timeoutMs} ms.` : "The request did not reach Pushover."],
|
|
346
|
+
retryAfterMs: PUSHOVER_MIN_WAIT_MS,
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
//# sourceMappingURL=pushover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pushover.js","sourceRoot":"","sources":["../src/pushover.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package",
|
|
3
3
|
"name": "@procedures/notify",
|
|
4
|
-
"version": "0.
|
|
5
|
-
"description": "Push notifications through ntfy
|
|
4
|
+
"version": "0.56.0",
|
|
5
|
+
"description": "Push notifications through ntfy (the public server or your own) and Pushover, with emergency messages that repeat until acknowledged.",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"notification",
|
|
8
8
|
"push",
|
|
9
9
|
"ntfy",
|
|
10
|
+
"pushover",
|
|
10
11
|
"procedures"
|
|
11
12
|
],
|
|
12
13
|
"homepage": "https://mark1russell7.github.io/client/",
|
|
@@ -26,15 +27,23 @@
|
|
|
26
27
|
"exports": {
|
|
27
28
|
".": {
|
|
28
29
|
"types": "./dist/index.d.ts",
|
|
29
|
-
"import": "./dist/index.js"
|
|
30
|
+
"import": "./dist/index.js",
|
|
31
|
+
"default": "./dist/index.js"
|
|
32
|
+
},
|
|
33
|
+
"./pushover": {
|
|
34
|
+
"types": "./dist/pushover.d.ts",
|
|
35
|
+
"import": "./dist/pushover.js",
|
|
36
|
+
"default": "./dist/pushover.js"
|
|
30
37
|
},
|
|
31
38
|
"./module": {
|
|
32
39
|
"types": "./dist/module.d.ts",
|
|
33
|
-
"import": "./dist/module.js"
|
|
40
|
+
"import": "./dist/module.js",
|
|
41
|
+
"default": "./dist/module.js"
|
|
34
42
|
},
|
|
35
43
|
"./register": {
|
|
36
44
|
"types": "./dist/register.d.ts",
|
|
37
|
-
"import": "./dist/register.js"
|
|
45
|
+
"import": "./dist/register.js",
|
|
46
|
+
"default": "./dist/register.js"
|
|
38
47
|
}
|
|
39
48
|
},
|
|
40
49
|
"files": [
|
|
@@ -57,7 +66,7 @@
|
|
|
57
66
|
"provenance": true
|
|
58
67
|
},
|
|
59
68
|
"dependencies": {
|
|
60
|
-
"@procedures/client": "0.
|
|
69
|
+
"@procedures/client": "0.56.0",
|
|
61
70
|
"zod": "^4.6.5"
|
|
62
71
|
},
|
|
63
72
|
"devDependencies": {
|
|
@@ -67,6 +76,9 @@
|
|
|
67
76
|
"vitest": "^5.0.3"
|
|
68
77
|
},
|
|
69
78
|
"client": {
|
|
79
|
+
"browser": [
|
|
80
|
+
"./pushover"
|
|
81
|
+
],
|
|
70
82
|
"procedures": "./dist/register.js"
|
|
71
83
|
},
|
|
72
84
|
"scripts": {
|
package/src/index.ts
CHANGED
package/src/procedures.ts
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { createProcedure, type AnyProcedure, type ProcedureContext } from "@procedures/client";
|
|
6
6
|
import * as z from "zod";
|
|
7
7
|
import { sendNotification } from "./notify.js";
|
|
8
|
+
import { pushoverProcedures } from "./pushover-procedures.js";
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* The names of the variables that `tokenEnv` of `notify.send` can name: `NTFY_` or `NOTIFY_`,
|
|
@@ -57,4 +58,5 @@ export const notifySendProcedure: AnyProcedure = createProcedure()
|
|
|
57
58
|
})
|
|
58
59
|
.build();
|
|
59
60
|
|
|
60
|
-
|
|
61
|
+
/** The procedures of the package: `notify.send` (ntfy) and the Pushover procedures. */
|
|
62
|
+
export const notifyProcedures: AnyProcedure[] = [notifySendProcedure, ...pushoverProcedures];
|