@eribbey/homebridge-ntfy 1.2.0 → 1.2.1
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/config.schema.json +2 -1
- package/dist/ntfy-client.d.ts +16 -1
- package/dist/ntfy-client.js +36 -7
- package/dist/ntfy-client.js.map +1 -1
- package/dist/platform.js +11 -1
- package/dist/platform.js.map +1 -1
- package/dist/switch-accessory.d.ts +2 -0
- package/dist/switch-accessory.js +9 -2
- package/dist/switch-accessory.js.map +1 -1
- package/package.json +2 -2
package/config.schema.json
CHANGED
|
@@ -85,9 +85,10 @@
|
|
|
85
85
|
},
|
|
86
86
|
"topic": {
|
|
87
87
|
"title": "Topic <strong><font color=\"red\" class=\"text-danger\">*</font></strong>",
|
|
88
|
-
"description": "Topic to publish message to. <strong>Important:</strong> Topics are public on ntfy's server and can be read by anyone, so pick a name that is hard for others to guess.",
|
|
88
|
+
"description": "Topic to publish message to. <strong>Important:</strong> Topics are public on ntfy's server and can be read by anyone, so pick a name that is hard for others to guess. Letters, numbers, '-' and '_' only, up to 64 characters.",
|
|
89
89
|
"placeholder": "my-topic-2fd8cffa",
|
|
90
90
|
"type": "string",
|
|
91
|
+
"pattern": "^[-_A-Za-z0-9]{1,64}$",
|
|
91
92
|
"condition": {
|
|
92
93
|
"functionBody": "return !model.messages[arrayIndices].useJson;"
|
|
93
94
|
}
|
package/dist/ntfy-client.d.ts
CHANGED
|
@@ -7,11 +7,26 @@ export interface MessageRequest {
|
|
|
7
7
|
tags?: string;
|
|
8
8
|
priority?: string | number;
|
|
9
9
|
}
|
|
10
|
+
/**
|
|
11
|
+
* How long to wait for the ntfy server before giving up. Without a limit a
|
|
12
|
+
* server that accepts the connection but never answers leaves the request
|
|
13
|
+
* pending forever.
|
|
14
|
+
*/
|
|
15
|
+
export declare const REQUEST_TIMEOUT_MS = 10000;
|
|
16
|
+
/**
|
|
17
|
+
* Node only allows latin-1 in header values: anything beyond it (emoji, most
|
|
18
|
+
* scripts) makes the request throw, and latin-1 accents arrive at ntfy as
|
|
19
|
+
* invalid UTF-8. ntfy decodes RFC 2047 encoded words on every header, so
|
|
20
|
+
* non-ASCII values are sent as a base64 UTF-8 encoded word. Line breaks are
|
|
21
|
+
* folded to spaces, matching what ntfy does with them anyway.
|
|
22
|
+
*/
|
|
23
|
+
export declare const encodeHeaderValue: (value: string) => string;
|
|
10
24
|
export declare class NtfyClient {
|
|
11
25
|
private readonly log;
|
|
12
26
|
private readonly serverAddress;
|
|
27
|
+
private readonly timeoutMs;
|
|
13
28
|
private readonly authHeader?;
|
|
14
|
-
constructor(log: Logging, serverAddress: string, auth?: NtfyAuth);
|
|
29
|
+
constructor(log: Logging, serverAddress: string, auth?: NtfyAuth, timeoutMs?: number);
|
|
15
30
|
/**
|
|
16
31
|
* Publishes a message. Resolves to true when the server accepted it, and to
|
|
17
32
|
* false when it did not - failures are logged here rather than thrown, so
|
package/dist/ntfy-client.js
CHANGED
|
@@ -1,11 +1,33 @@
|
|
|
1
1
|
import axios from 'axios';
|
|
2
|
+
/**
|
|
3
|
+
* How long to wait for the ntfy server before giving up. Without a limit a
|
|
4
|
+
* server that accepts the connection but never answers leaves the request
|
|
5
|
+
* pending forever.
|
|
6
|
+
*/
|
|
7
|
+
export const REQUEST_TIMEOUT_MS = 10_000;
|
|
8
|
+
/**
|
|
9
|
+
* Node only allows latin-1 in header values: anything beyond it (emoji, most
|
|
10
|
+
* scripts) makes the request throw, and latin-1 accents arrive at ntfy as
|
|
11
|
+
* invalid UTF-8. ntfy decodes RFC 2047 encoded words on every header, so
|
|
12
|
+
* non-ASCII values are sent as a base64 UTF-8 encoded word. Line breaks are
|
|
13
|
+
* folded to spaces, matching what ntfy does with them anyway.
|
|
14
|
+
*/
|
|
15
|
+
export const encodeHeaderValue = (value) => {
|
|
16
|
+
const singleLine = value.replace(/[\r\n]+/g, ' ');
|
|
17
|
+
if (/^[\x20-\x7e]*$/.test(singleLine)) {
|
|
18
|
+
return singleLine;
|
|
19
|
+
}
|
|
20
|
+
return `=?UTF-8?B?${Buffer.from(singleLine, 'utf8').toString('base64')}?=`;
|
|
21
|
+
};
|
|
2
22
|
export class NtfyClient {
|
|
3
23
|
log;
|
|
4
24
|
serverAddress;
|
|
25
|
+
timeoutMs;
|
|
5
26
|
authHeader;
|
|
6
|
-
constructor(log, serverAddress, auth) {
|
|
27
|
+
constructor(log, serverAddress, auth, timeoutMs = REQUEST_TIMEOUT_MS) {
|
|
7
28
|
this.log = log;
|
|
8
29
|
this.serverAddress = serverAddress;
|
|
30
|
+
this.timeoutMs = timeoutMs;
|
|
9
31
|
this.authHeader = this.buildAuthHeader(auth);
|
|
10
32
|
}
|
|
11
33
|
/**
|
|
@@ -25,20 +47,21 @@ export class NtfyClient {
|
|
|
25
47
|
}
|
|
26
48
|
async sendMessageRequest(request) {
|
|
27
49
|
this.log.debug('Sending ntfy request:', request);
|
|
28
|
-
|
|
50
|
+
// Encoded so a stray '?', '#' or '/' cannot truncate or redirect the path
|
|
51
|
+
const url = `${this.serverAddress}/${encodeURIComponent(request.topic)}`;
|
|
29
52
|
const body = request.message;
|
|
30
53
|
const headers = this.baseHeaders();
|
|
31
54
|
if (request.title) {
|
|
32
|
-
headers.Title = request.title;
|
|
55
|
+
headers.Title = encodeHeaderValue(request.title);
|
|
33
56
|
}
|
|
34
57
|
if (request.priority !== undefined && request.priority !== '') {
|
|
35
|
-
headers.Priority = request.priority.toString();
|
|
58
|
+
headers.Priority = encodeHeaderValue(request.priority.toString());
|
|
36
59
|
}
|
|
37
60
|
if (request.tags) {
|
|
38
|
-
headers.Tags = request.tags;
|
|
61
|
+
headers.Tags = encodeHeaderValue(request.tags);
|
|
39
62
|
}
|
|
40
63
|
try {
|
|
41
|
-
const response = await axios.post(url, body, { headers });
|
|
64
|
+
const response = await axios.post(url, body, { headers, timeout: this.timeoutMs });
|
|
42
65
|
this.log.debug('Success! Result:', response.data);
|
|
43
66
|
return true;
|
|
44
67
|
}
|
|
@@ -50,7 +73,13 @@ export class NtfyClient {
|
|
|
50
73
|
async sendMessageJson(json) {
|
|
51
74
|
this.log.debug('Sending ntfy JSON request:', json);
|
|
52
75
|
try {
|
|
53
|
-
|
|
76
|
+
// ntfy takes JSON publishes at its root path. The trailing slash keeps a
|
|
77
|
+
// base path like https://host/ntfy pointing at /ntfy/ - without it a
|
|
78
|
+
// reverse proxy may redirect, and redirected POSTs turn into GETs.
|
|
79
|
+
const response = await axios.post(`${this.serverAddress}/`, json, {
|
|
80
|
+
headers: this.baseHeaders(),
|
|
81
|
+
timeout: this.timeoutMs,
|
|
82
|
+
});
|
|
54
83
|
this.log.debug('Success! Result:', response.data);
|
|
55
84
|
return true;
|
|
56
85
|
}
|
package/dist/ntfy-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ntfy-client.js","sourceRoot":"","sources":["../src/ntfy-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAY1B,MAAM,OAAO,UAAU;IAIF;IACA;
|
|
1
|
+
{"version":3,"file":"ntfy-client.js","sourceRoot":"","sources":["../src/ntfy-client.ts"],"names":[],"mappings":"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"}
|
package/dist/platform.js
CHANGED
|
@@ -2,6 +2,8 @@ import { SwitchAccessory } from './switch-accessory.js';
|
|
|
2
2
|
import { DEFAULT_SERVER_URL, PLATFORM_NAME, PLUGIN_NAME } from './const.js';
|
|
3
3
|
import { NtfyClient } from './ntfy-client.js';
|
|
4
4
|
import { isValidJson, normalizeServerUrl } from './utils.js';
|
|
5
|
+
/** ntfy's own rule for topic names: https://docs.ntfy.sh/publish/#picking-a-topic */
|
|
6
|
+
const TOPIC_PATTERN = /^[-_A-Za-z0-9]{1,64}$/;
|
|
5
7
|
export class NtfyPlatform {
|
|
6
8
|
log;
|
|
7
9
|
config;
|
|
@@ -30,7 +32,12 @@ export class NtfyPlatform {
|
|
|
30
32
|
const config = this.config;
|
|
31
33
|
const serverUrl = this.resolveServerUrl(config);
|
|
32
34
|
this.log.info('Using ntfy server:', serverUrl);
|
|
33
|
-
const
|
|
35
|
+
const auth = this.resolveAuth(config);
|
|
36
|
+
if (auth && serverUrl.startsWith('http://')) {
|
|
37
|
+
this.log.warn('Credentials are configured for a plain http:// server, so they are sent unencrypted with every message. '
|
|
38
|
+
+ 'Use https:// unless the server is only reachable on a trusted network.');
|
|
39
|
+
}
|
|
40
|
+
const ntfyClient = new NtfyClient(this.log, serverUrl, auth);
|
|
34
41
|
const configuredNames = new Set();
|
|
35
42
|
if (config.messages) {
|
|
36
43
|
for (const message of config.messages) {
|
|
@@ -107,6 +114,9 @@ export class NtfyPlatform {
|
|
|
107
114
|
if (!message.topic) {
|
|
108
115
|
error = 'Invalid message config - \'topic\' is missing:';
|
|
109
116
|
}
|
|
117
|
+
else if (!TOPIC_PATTERN.test(message.topic)) {
|
|
118
|
+
error = 'Invalid message config - \'topic\' may only contain letters, numbers, \'-\' and \'_\' (max 64):';
|
|
119
|
+
}
|
|
110
120
|
}
|
|
111
121
|
if (error) {
|
|
112
122
|
this.log.error(error, message.name);
|
package/dist/platform.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE5E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE7D,MAAM,OAAO,YAAY;IAQZ;IACA;IACA;IATF,OAAO,CAAiB;IACxB,cAAc,CAAwB;IAE9B,WAAW,GAAmC,IAAI,GAAG,EAAE,CAAC;IACxD,oBAAoB,GAAa,EAAE,CAAC;IAErD,YACW,GAAY,EACZ,MAAsB,EACtB,GAAQ;QAFR,QAAG,GAAH,GAAG,CAAS;QACZ,WAAM,GAAN,MAAM,CAAgB;QACtB,QAAG,GAAH,GAAG,CAAK;QAEjB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC;QAE7C,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iCAAiC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAE/D,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;YACrC,GAAG,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YACxC,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,kBAAkB,CAAC,SAA4B;QAC7C,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,+BAA+B,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;QAEvE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAClD,CAAC;IAEO,mBAAmB;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,MAA4B,CAAC;QAEjD,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAEhD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,CAAC;QAE/C,MAAM,
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,8 @@ export declare class SwitchAccessory {
|
|
|
12
12
|
private onCharacteristic;
|
|
13
13
|
private isOn;
|
|
14
14
|
private inCooldown;
|
|
15
|
+
/** The send started by the most recent trigger, exposed for tests. */
|
|
16
|
+
pendingSend: Promise<void>;
|
|
15
17
|
constructor(platform: NtfyPlatform, accessory: PlatformAccessory, ntfyClient: NtfyClient, message: Message);
|
|
16
18
|
private setOn;
|
|
17
19
|
private getOn;
|
package/dist/switch-accessory.js
CHANGED
|
@@ -9,6 +9,8 @@ export class SwitchAccessory {
|
|
|
9
9
|
onCharacteristic;
|
|
10
10
|
isOn = false;
|
|
11
11
|
inCooldown = false;
|
|
12
|
+
/** The send started by the most recent trigger, exposed for tests. */
|
|
13
|
+
pendingSend = Promise.resolve();
|
|
12
14
|
constructor(platform, accessory, ntfyClient, message) {
|
|
13
15
|
this.platform = platform;
|
|
14
16
|
this.accessory = accessory;
|
|
@@ -43,8 +45,13 @@ export class SwitchAccessory {
|
|
|
43
45
|
}
|
|
44
46
|
if (this.isOn) {
|
|
45
47
|
void this.triggerCooldown(this.message.cooldownTime);
|
|
46
|
-
|
|
47
|
-
|
|
48
|
+
// Not awaited: HomeKit expects onSet to return promptly, and a slow or
|
|
49
|
+
// unreachable ntfy server would otherwise leave the switch unresponsive
|
|
50
|
+
// and trip Homebridge's slow-plugin warnings. The switch stays on while
|
|
51
|
+
// the message is in flight, then resets.
|
|
52
|
+
this.pendingSend = this.sendMessage()
|
|
53
|
+
.catch((error) => this.log.error('Failed to send message:', this.message.name, error))
|
|
54
|
+
.finally(() => this.resetSwitch());
|
|
48
55
|
}
|
|
49
56
|
}
|
|
50
57
|
async getOn() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"switch-accessory.js","sourceRoot":"","sources":["../src/switch-accessory.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,MAAM,OAAO,eAAe;
|
|
1
|
+
{"version":3,"file":"switch-accessory.js","sourceRoot":"","sources":["../src/switch-accessory.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@eribbey/homebridge-ntfy",
|
|
3
3
|
"displayName": "Homebridge Ntfy",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"version": "1.2.
|
|
5
|
+
"version": "1.2.1",
|
|
6
6
|
"description": "Homebridge plugin to send notifications through ntfy from HomeKit, with support for custom self-hosted servers and authentication",
|
|
7
7
|
"author": "Evan Ribbey",
|
|
8
8
|
"contributors": [
|
|
@@ -62,6 +62,6 @@
|
|
|
62
62
|
"vitest": "^4.1.11"
|
|
63
63
|
},
|
|
64
64
|
"dependencies": {
|
|
65
|
-
"axios": "^1.
|
|
65
|
+
"axios": "^1.21.0"
|
|
66
66
|
}
|
|
67
67
|
}
|