ntfy-reverse-proxy 0.0.0 → 2.0.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 +48 -0
- package/build/src/cli/commands/config-io.d.ts +5 -0
- package/build/src/cli/commands/config-io.d.ts.map +1 -0
- package/build/src/cli/commands/config-io.js +19 -0
- package/build/src/cli/commands/config-io.js.map +1 -0
- package/build/src/cli/commands/context.d.ts +9 -0
- package/build/src/cli/commands/context.d.ts.map +1 -0
- package/build/src/cli/commands/context.js +108 -0
- package/build/src/cli/commands/context.js.map +1 -0
- package/build/src/cli/commands/deploy.d.ts +4 -0
- package/build/src/cli/commands/deploy.d.ts.map +1 -0
- package/build/src/cli/commands/deploy.js +496 -0
- package/build/src/cli/commands/deploy.js.map +1 -0
- package/build/src/cli/commands/generate.d.ts +4 -0
- package/build/src/cli/commands/generate.d.ts.map +1 -0
- package/build/src/cli/commands/generate.js +68 -0
- package/build/src/cli/commands/generate.js.map +1 -0
- package/build/src/cli/commands/server.d.ts +7 -0
- package/build/src/cli/commands/server.d.ts.map +1 -0
- package/build/src/cli/commands/server.js +43 -0
- package/build/src/cli/commands/server.js.map +1 -0
- package/build/src/cli/commands/settings.d.ts +5 -0
- package/build/src/cli/commands/settings.d.ts.map +1 -0
- package/build/src/cli/commands/settings.js +16 -0
- package/build/src/cli/commands/settings.js.map +1 -0
- package/build/src/cli/commands/validate.d.ts +4 -0
- package/build/src/cli/commands/validate.d.ts.map +1 -0
- package/build/src/cli/commands/validate.js +45 -0
- package/build/src/cli/commands/validate.js.map +1 -0
- package/build/src/cli/index.d.ts +5 -0
- package/build/src/cli/index.d.ts.map +1 -0
- package/build/src/cli/index.js +118 -0
- package/build/src/cli/index.js.map +1 -0
- package/build/src/cli/menu/interactive.d.ts +4 -0
- package/build/src/cli/menu/interactive.d.ts.map +1 -0
- package/build/src/cli/menu/interactive.js +902 -0
- package/build/src/cli/menu/interactive.js.map +1 -0
- package/build/src/lib/item.d.ts +3 -0
- package/build/src/lib/item.d.ts.map +1 -0
- package/build/src/lib/item.js +3 -0
- package/build/src/lib/item.js.map +1 -0
- package/build/src/lib/regex.d.ts +30 -0
- package/build/src/lib/regex.d.ts.map +1 -0
- package/build/src/lib/regex.js +30 -0
- package/build/src/lib/regex.js.map +1 -0
- package/build/src/lib/schema.d.ts +167 -0
- package/build/src/lib/schema.d.ts.map +1 -0
- package/build/src/lib/schema.js +70 -0
- package/build/src/lib/schema.js.map +1 -0
- package/build/src/lib/utility.d.ts +4 -0
- package/build/src/lib/utility.d.ts.map +1 -0
- package/build/src/lib/utility.js +14 -0
- package/build/src/lib/utility.js.map +1 -0
- package/build/src/types/cli/commands/config-io.d.ts +38 -0
- package/build/src/types/cli/commands/context.d.ts +131 -0
- package/build/src/types/cli/commands/deploy.d.ts +622 -0
- package/build/src/types/cli/commands/generate.d.ts +51 -0
- package/build/src/types/cli/commands/server.d.ts +65 -0
- package/build/src/types/cli/commands/settings.d.ts +25 -0
- package/build/src/types/cli/commands/validate.d.ts +37 -0
- package/build/src/types/cli/index.d.ts +55 -0
- package/build/src/types/cli/menu/interactive.d.ts +381 -0
- package/build/src/types/fetch-response.d.ts +11 -0
- package/build/src/types/lib/schema.d.ts +134 -0
- package/build/src/types/lib/utility.d.ts +8 -0
- package/build/src/types/tests/cli/commands/context.test.d.ts +57 -0
- package/build/src/types/tests/cli/commands/generate.test.d.ts +12 -0
- package/build/src/types/tests/cli/commands/server.test.d.ts +45 -0
- package/build/src/types/tests/cli/commands/settings.test.d.ts +40 -0
- package/build/src/types/tests/cli/commands/validate.test.d.ts +19 -0
- package/build/src/types/tests/cli/menu/interactive.test.d.ts +6 -0
- package/build/src/types/tests/lib/schema.test.d.ts +10 -0
- package/build/src/types/tests/type-declarations.test.d.ts +173 -0
- package/build/src/types/tests/worker/index.test.d.ts +20 -0
- package/build/src/types/tests/worker/interpreters/ntfy-json.test.d.ts +19 -0
- package/build/src/types/tests/worker/interpreters/pfsense.test.d.ts +10 -0
- package/build/src/types/tests/worker/interpreters/plain-text.test.d.ts +10 -0
- package/build/src/types/tests/worker/interpreters/seerr.test.d.ts +8 -0
- package/build/src/types/tests/worker/interpreters/statuspage.test.d.ts +58 -0
- package/build/src/types/tests/worker/interpreters/synology.test.d.ts +8 -0
- package/build/src/types/tests/worker/interpreters/unifi.test.d.ts +8 -0
- package/build/src/types/tests/worker/landing/page.test.d.ts +55 -0
- package/build/src/types/tests/worker/pipeline/accumulate.test.d.ts +28 -0
- package/build/src/types/tests/worker/pipeline/authenticate.test.d.ts +9 -0
- package/build/src/types/tests/worker/pipeline/email.test.d.ts +15 -0
- package/build/src/types/tests/worker/pipeline/format.test.d.ts +38 -0
- package/build/src/types/tests/worker/pipeline/interpret.test.d.ts +43 -0
- package/build/src/types/tests/worker/pipeline/parse.test.d.ts +17 -0
- package/build/src/types/tests/worker/pipeline/receive.test.d.ts +23 -0
- package/build/src/types/tests/worker/pipeline/respond.test.d.ts +20 -0
- package/build/src/types/tests/worker/pipeline/route.test.d.ts +80 -0
- package/build/src/types/tests/worker/pipeline/send.test.d.ts +37 -0
- package/build/src/types/tests/worker/pipeline/split.test.d.ts +17 -0
- package/build/src/types/worker/index.d.ts +232 -0
- package/build/src/types/worker/interpreters/ntfy-json.d.ts +28 -0
- package/build/src/types/worker/interpreters/pfsense.d.ts +97 -0
- package/build/src/types/worker/interpreters/plain-text.d.ts +24 -0
- package/build/src/types/worker/interpreters/seerr.d.ts +124 -0
- package/build/src/types/worker/interpreters/statuspage.d.ts +239 -0
- package/build/src/types/worker/interpreters/synology.d.ts +99 -0
- package/build/src/types/worker/interpreters/unifi.d.ts +111 -0
- package/build/src/types/worker/landing/page.d.ts +44 -0
- package/build/src/types/worker/pipeline/accumulate.d.ts +79 -0
- package/build/src/types/worker/pipeline/authenticate.d.ts +68 -0
- package/build/src/types/worker/pipeline/email.d.ts +108 -0
- package/build/src/types/worker/pipeline/format.d.ts +47 -0
- package/build/src/types/worker/pipeline/interpret.d.ts +63 -0
- package/build/src/types/worker/pipeline/parse.d.ts +39 -0
- package/build/src/types/worker/pipeline/receive.d.ts +64 -0
- package/build/src/types/worker/pipeline/respond.d.ts +113 -0
- package/build/src/types/worker/pipeline/route.d.ts +34 -0
- package/build/src/types/worker/pipeline/send.d.ts +143 -0
- package/build/src/types/worker/pipeline/shared.d.ts +85 -0
- package/build/src/types/worker/pipeline/split.d.ts +35 -0
- package/build/src/worker/handlers.d.ts +5 -0
- package/build/src/worker/handlers.d.ts.map +1 -0
- package/build/src/worker/handlers.js +360 -0
- package/build/src/worker/handlers.js.map +1 -0
- package/build/src/worker/index.d.ts +4 -0
- package/build/src/worker/index.d.ts.map +1 -0
- package/build/src/worker/index.js +52 -0
- package/build/src/worker/index.js.map +1 -0
- package/build/src/worker/interpreters/ntfy-json.d.ts +4 -0
- package/build/src/worker/interpreters/ntfy-json.d.ts.map +1 -0
- package/build/src/worker/interpreters/ntfy-json.js +49 -0
- package/build/src/worker/interpreters/ntfy-json.js.map +1 -0
- package/build/src/worker/interpreters/pfsense.d.ts +4 -0
- package/build/src/worker/interpreters/pfsense.d.ts.map +1 -0
- package/build/src/worker/interpreters/pfsense.js +150 -0
- package/build/src/worker/interpreters/pfsense.js.map +1 -0
- package/build/src/worker/interpreters/plain-text.d.ts +4 -0
- package/build/src/worker/interpreters/plain-text.d.ts.map +1 -0
- package/build/src/worker/interpreters/plain-text.js +18 -0
- package/build/src/worker/interpreters/plain-text.js.map +1 -0
- package/build/src/worker/interpreters/seerr.d.ts +4 -0
- package/build/src/worker/interpreters/seerr.d.ts.map +1 -0
- package/build/src/worker/interpreters/seerr.js +173 -0
- package/build/src/worker/interpreters/seerr.js.map +1 -0
- package/build/src/worker/interpreters/statuspage.d.ts +4 -0
- package/build/src/worker/interpreters/statuspage.d.ts.map +1 -0
- package/build/src/worker/interpreters/statuspage.js +266 -0
- package/build/src/worker/interpreters/statuspage.js.map +1 -0
- package/build/src/worker/interpreters/synology.d.ts +4 -0
- package/build/src/worker/interpreters/synology.d.ts.map +1 -0
- package/build/src/worker/interpreters/synology.js +177 -0
- package/build/src/worker/interpreters/synology.js.map +1 -0
- package/build/src/worker/interpreters/unifi.d.ts +4 -0
- package/build/src/worker/interpreters/unifi.d.ts.map +1 -0
- package/build/src/worker/interpreters/unifi.js +152 -0
- package/build/src/worker/interpreters/unifi.js.map +1 -0
- package/build/src/worker/landing/page.d.ts +4 -0
- package/build/src/worker/landing/page.d.ts.map +1 -0
- package/build/src/worker/landing/page.js +260 -0
- package/build/src/worker/landing/page.js.map +1 -0
- package/build/src/worker/pipeline/accumulate.d.ts +7 -0
- package/build/src/worker/pipeline/accumulate.d.ts.map +1 -0
- package/build/src/worker/pipeline/accumulate.js +53 -0
- package/build/src/worker/pipeline/accumulate.js.map +1 -0
- package/build/src/worker/pipeline/authenticate.d.ts +4 -0
- package/build/src/worker/pipeline/authenticate.d.ts.map +1 -0
- package/build/src/worker/pipeline/authenticate.js +53 -0
- package/build/src/worker/pipeline/authenticate.js.map +1 -0
- package/build/src/worker/pipeline/email.d.ts +4 -0
- package/build/src/worker/pipeline/email.d.ts.map +1 -0
- package/build/src/worker/pipeline/email.js +149 -0
- package/build/src/worker/pipeline/email.js.map +1 -0
- package/build/src/worker/pipeline/format.d.ts +5 -0
- package/build/src/worker/pipeline/format.d.ts.map +1 -0
- package/build/src/worker/pipeline/format.js +48 -0
- package/build/src/worker/pipeline/format.js.map +1 -0
- package/build/src/worker/pipeline/interpret.d.ts +4 -0
- package/build/src/worker/pipeline/interpret.d.ts.map +1 -0
- package/build/src/worker/pipeline/interpret.js +30 -0
- package/build/src/worker/pipeline/interpret.js.map +1 -0
- package/build/src/worker/pipeline/parse.d.ts +4 -0
- package/build/src/worker/pipeline/parse.d.ts.map +1 -0
- package/build/src/worker/pipeline/parse.js +59 -0
- package/build/src/worker/pipeline/parse.js.map +1 -0
- package/build/src/worker/pipeline/receive.d.ts +4 -0
- package/build/src/worker/pipeline/receive.d.ts.map +1 -0
- package/build/src/worker/pipeline/receive.js +52 -0
- package/build/src/worker/pipeline/receive.js.map +1 -0
- package/build/src/worker/pipeline/respond.d.ts +4 -0
- package/build/src/worker/pipeline/respond.d.ts.map +1 -0
- package/build/src/worker/pipeline/respond.js +48 -0
- package/build/src/worker/pipeline/respond.js.map +1 -0
- package/build/src/worker/pipeline/route.d.ts +5 -0
- package/build/src/worker/pipeline/route.d.ts.map +1 -0
- package/build/src/worker/pipeline/route.js +23 -0
- package/build/src/worker/pipeline/route.js.map +1 -0
- package/build/src/worker/pipeline/send.d.ts +4 -0
- package/build/src/worker/pipeline/send.d.ts.map +1 -0
- package/build/src/worker/pipeline/send.js +156 -0
- package/build/src/worker/pipeline/send.js.map +1 -0
- package/build/src/worker/pipeline/split.d.ts +4 -0
- package/build/src/worker/pipeline/split.d.ts.map +1 -0
- package/build/src/worker/pipeline/split.js +40 -0
- package/build/src/worker/pipeline/split.js.map +1 -0
- package/package.json +95 -2
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { LIB_REGEX_STATUSPAGE_LEADING_WWW } from '../../lib/regex.js';
|
|
2
|
+
import { diffComponents, formatComponentLines, readState, writeState, } from '../pipeline/accumulate.js';
|
|
3
|
+
const mapImpactToPriority = (impact) => {
|
|
4
|
+
switch (impact.toLowerCase()) {
|
|
5
|
+
case 'critical': {
|
|
6
|
+
return 5;
|
|
7
|
+
}
|
|
8
|
+
case 'major': {
|
|
9
|
+
return 4;
|
|
10
|
+
}
|
|
11
|
+
case 'minor': {
|
|
12
|
+
return 3;
|
|
13
|
+
}
|
|
14
|
+
case 'none':
|
|
15
|
+
default: {
|
|
16
|
+
return 2;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
const mapStatusToEmojiTag = (status) => {
|
|
21
|
+
switch (status.toLowerCase()) {
|
|
22
|
+
case 'investigating': {
|
|
23
|
+
return 'mag';
|
|
24
|
+
}
|
|
25
|
+
case 'identified': {
|
|
26
|
+
return 'dart';
|
|
27
|
+
}
|
|
28
|
+
case 'monitoring': {
|
|
29
|
+
return 'eyes';
|
|
30
|
+
}
|
|
31
|
+
case 'resolved': {
|
|
32
|
+
return 'white_check_mark';
|
|
33
|
+
}
|
|
34
|
+
case 'scheduled': {
|
|
35
|
+
return 'calendar';
|
|
36
|
+
}
|
|
37
|
+
case 'in_progress': {
|
|
38
|
+
return 'hammer_and_wrench';
|
|
39
|
+
}
|
|
40
|
+
case 'verifying': {
|
|
41
|
+
return 'rotating_light';
|
|
42
|
+
}
|
|
43
|
+
case 'completed': {
|
|
44
|
+
return 'tada';
|
|
45
|
+
}
|
|
46
|
+
default: {
|
|
47
|
+
return 'bell';
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
const isTerminalStatus = (status) => {
|
|
52
|
+
const terminal = [
|
|
53
|
+
'resolved',
|
|
54
|
+
'completed',
|
|
55
|
+
'postmortem',
|
|
56
|
+
];
|
|
57
|
+
const lowered = status.toLowerCase();
|
|
58
|
+
return terminal.includes(lowered);
|
|
59
|
+
};
|
|
60
|
+
const humanizeSlug = (slug) => {
|
|
61
|
+
const parts = slug.split('_');
|
|
62
|
+
const capitalized = parts.map((word) => word.charAt(0).toUpperCase() + word.slice(1));
|
|
63
|
+
return capitalized.join(' ');
|
|
64
|
+
};
|
|
65
|
+
const extractServiceName = (unsubscribeUrl) => {
|
|
66
|
+
let serviceName = 'Statuspage';
|
|
67
|
+
if (unsubscribeUrl !== undefined) {
|
|
68
|
+
try {
|
|
69
|
+
const parsedUrl = new URL(unsubscribeUrl);
|
|
70
|
+
const hostname = parsedUrl['hostname'];
|
|
71
|
+
serviceName = hostname.replace(LIB_REGEX_STATUSPAGE_LEADING_WWW, '');
|
|
72
|
+
}
|
|
73
|
+
catch { }
|
|
74
|
+
}
|
|
75
|
+
return serviceName;
|
|
76
|
+
};
|
|
77
|
+
const buildIncidentNotification = (serviceName, incidentName, status, impact, latestBody, shortlink, unsubscribeUrl, componentLines) => {
|
|
78
|
+
const isTerminal = isTerminalStatus(status);
|
|
79
|
+
const priority = (isTerminal === true) ? 2 : mapImpactToPriority(impact);
|
|
80
|
+
const humanizedStatus = humanizeSlug(status);
|
|
81
|
+
const humanizedImpact = humanizeSlug(impact);
|
|
82
|
+
const emojiTag = mapStatusToEmojiTag(status);
|
|
83
|
+
const tags = [
|
|
84
|
+
'statuspage',
|
|
85
|
+
status.toLowerCase(),
|
|
86
|
+
emojiTag,
|
|
87
|
+
];
|
|
88
|
+
const bodyLines = [
|
|
89
|
+
`**Status:** ${humanizedStatus}`,
|
|
90
|
+
`**Impact:** ${humanizedImpact}`,
|
|
91
|
+
];
|
|
92
|
+
if (latestBody !== undefined) {
|
|
93
|
+
const latestBodyJoined = [
|
|
94
|
+
'',
|
|
95
|
+
`> ${latestBody}`,
|
|
96
|
+
].join('\n');
|
|
97
|
+
bodyLines.push(latestBodyJoined);
|
|
98
|
+
}
|
|
99
|
+
if (componentLines.length > 0) {
|
|
100
|
+
const componentLinesJoined = [
|
|
101
|
+
'',
|
|
102
|
+
'**Affected:**',
|
|
103
|
+
componentLines.join('\n'),
|
|
104
|
+
].join('\n');
|
|
105
|
+
bodyLines.push(componentLinesJoined);
|
|
106
|
+
}
|
|
107
|
+
const body = bodyLines.join('\n');
|
|
108
|
+
const actions = [];
|
|
109
|
+
if (shortlink !== undefined) {
|
|
110
|
+
actions.push(`view, View Incident, ${shortlink}`);
|
|
111
|
+
}
|
|
112
|
+
if (unsubscribeUrl !== undefined) {
|
|
113
|
+
actions.push(`view, Unsubscribe, ${unsubscribeUrl}`);
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
notification: {
|
|
117
|
+
title: `[${serviceName}] ${incidentName}`, body, priority, tags, markdown: true, ...(actions.length > 0 ? { actions: actions.join('; ') } : {}),
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
};
|
|
121
|
+
const statuspageInterpreter = async (input, context) => {
|
|
122
|
+
let parsed = undefined;
|
|
123
|
+
if (typeof input === 'string') {
|
|
124
|
+
try {
|
|
125
|
+
parsed = JSON.parse(input);
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else if (input instanceof ArrayBuffer) {
|
|
132
|
+
const decoder = new TextDecoder('utf-8');
|
|
133
|
+
const decodedBody = decoder.decode(input);
|
|
134
|
+
try {
|
|
135
|
+
parsed = JSON.parse(decodedBody);
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
parsed = input;
|
|
143
|
+
}
|
|
144
|
+
const data = parsed;
|
|
145
|
+
const metaDefault = {};
|
|
146
|
+
const metaRaw = data['meta'];
|
|
147
|
+
const meta = (metaRaw !== undefined && metaRaw !== null) ? metaRaw : metaDefault;
|
|
148
|
+
const unsubscribeUrl = (typeof meta['unsubscribe'] === 'string') ? meta['unsubscribe'] : undefined;
|
|
149
|
+
const serviceName = extractServiceName(unsubscribeUrl);
|
|
150
|
+
const page = data['page'];
|
|
151
|
+
const pageIdAvailable = page !== undefined && typeof page['id'] === 'string';
|
|
152
|
+
const pageId = (pageIdAvailable === true && page !== undefined) ? page['id'] : undefined;
|
|
153
|
+
const kvAvailable = context !== undefined && context !== null;
|
|
154
|
+
const kv = (kvAvailable === true && context !== undefined) ? context['kv'] : undefined;
|
|
155
|
+
const hasKv = kv !== undefined && pageId !== undefined;
|
|
156
|
+
if ('component_update' in data && !('incident' in data)) {
|
|
157
|
+
const kvMissing = hasKv === false
|
|
158
|
+
|| kv === undefined
|
|
159
|
+
|| pageId === undefined;
|
|
160
|
+
if (kvMissing === true) {
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
if (kv === undefined || pageId === undefined) {
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
const existingState = await readState(kv, pageId);
|
|
167
|
+
const components = (existingState !== null) ? { ...existingState['components'] } : {};
|
|
168
|
+
const componentUpdate = data['component_update'];
|
|
169
|
+
const component = data['component'];
|
|
170
|
+
const componentId = (component !== undefined && typeof component['id'] === 'string') ? component['id'] : undefined;
|
|
171
|
+
const componentName = (component !== undefined && typeof component['name'] === 'string') ? component['name'] : undefined;
|
|
172
|
+
const hasUpdateStatus = componentUpdate !== undefined && typeof componentUpdate['new_status'] === 'string';
|
|
173
|
+
const hasComponentStatus = component !== undefined && typeof component['status'] === 'string';
|
|
174
|
+
let componentStatus = undefined;
|
|
175
|
+
if (hasUpdateStatus === true && componentUpdate !== undefined) {
|
|
176
|
+
componentStatus = componentUpdate['new_status'];
|
|
177
|
+
}
|
|
178
|
+
else if (hasComponentStatus === true && component !== undefined) {
|
|
179
|
+
componentStatus = component['status'];
|
|
180
|
+
}
|
|
181
|
+
const canUpdate = componentId !== undefined
|
|
182
|
+
&& componentName !== undefined
|
|
183
|
+
&& componentStatus !== undefined;
|
|
184
|
+
if (canUpdate === true
|
|
185
|
+
&& componentId !== undefined
|
|
186
|
+
&& componentName !== undefined
|
|
187
|
+
&& componentStatus !== undefined) {
|
|
188
|
+
Reflect.set(components, componentId, {
|
|
189
|
+
name: componentName, status: componentStatus,
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
const updatedState = (existingState !== null) ? {
|
|
193
|
+
...existingState, components,
|
|
194
|
+
} : {
|
|
195
|
+
incidentId: undefined, incidentName: undefined, status: undefined, impact: undefined, body: undefined, shortlink: undefined, serviceName, unsubscribeUrl, updateId: undefined, components,
|
|
196
|
+
};
|
|
197
|
+
await writeState(kv, pageId, updatedState);
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
if ('incident' in data) {
|
|
201
|
+
const incident = data['incident'];
|
|
202
|
+
const incidentName = (typeof incident['name'] === 'string') ? incident['name'] : 'Incident';
|
|
203
|
+
const status = (typeof incident['status'] === 'string') ? incident['status'] : 'unknown';
|
|
204
|
+
const impact = (typeof incident['impact'] === 'string') ? incident['impact'] : 'none';
|
|
205
|
+
const shortlink = (typeof incident['shortlink'] === 'string') ? incident['shortlink'] : undefined;
|
|
206
|
+
const rawUpdates = incident['incident_updates'];
|
|
207
|
+
const isUpdatesArray = Array.isArray(rawUpdates);
|
|
208
|
+
const updates = (isUpdatesArray === true) ? rawUpdates : [];
|
|
209
|
+
const latestUpdate = updates[0];
|
|
210
|
+
const latestBody = (latestUpdate !== undefined && typeof latestUpdate['body'] === 'string') ? latestUpdate['body'] : undefined;
|
|
211
|
+
const updateId = (latestUpdate !== undefined && typeof latestUpdate['id'] === 'string') ? latestUpdate['id'] : undefined;
|
|
212
|
+
const kvMissing = hasKv === false
|
|
213
|
+
|| kv === undefined
|
|
214
|
+
|| pageId === undefined;
|
|
215
|
+
if (kvMissing === true) {
|
|
216
|
+
const componentLines = [];
|
|
217
|
+
return buildIncidentNotification(serviceName, incidentName, status, impact, latestBody, shortlink, unsubscribeUrl, componentLines);
|
|
218
|
+
}
|
|
219
|
+
if (kv === undefined || pageId === undefined) {
|
|
220
|
+
const componentLines = [];
|
|
221
|
+
return buildIncidentNotification(serviceName, incidentName, status, impact, latestBody, shortlink, unsubscribeUrl, componentLines);
|
|
222
|
+
}
|
|
223
|
+
const existingState = await readState(kv, pageId);
|
|
224
|
+
const isDuplicate = existingState !== null
|
|
225
|
+
&& updateId !== undefined
|
|
226
|
+
&& existingState['updateId'] === updateId;
|
|
227
|
+
if (isDuplicate === true) {
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
const previousComponents = (existingState !== null) ? { ...existingState['components'] } : {};
|
|
231
|
+
const currentComponents = { ...previousComponents };
|
|
232
|
+
if (latestUpdate !== undefined) {
|
|
233
|
+
const affectedComponents = latestUpdate['affected_components'];
|
|
234
|
+
const isAffectedArray = Array.isArray(affectedComponents);
|
|
235
|
+
if (isAffectedArray === true && affectedComponents !== undefined) {
|
|
236
|
+
for (const affected of affectedComponents) {
|
|
237
|
+
const code = (typeof affected['code'] === 'string') ? affected['code'] : undefined;
|
|
238
|
+
const name = (typeof affected['name'] === 'string') ? affected['name'] : undefined;
|
|
239
|
+
const newStatus = (typeof affected['new_status'] === 'string') ? affected['new_status'] : undefined;
|
|
240
|
+
const canUpdateAffected = code !== undefined
|
|
241
|
+
&& name !== undefined
|
|
242
|
+
&& newStatus !== undefined;
|
|
243
|
+
if (canUpdateAffected === true
|
|
244
|
+
&& code !== undefined
|
|
245
|
+
&& name !== undefined
|
|
246
|
+
&& newStatus !== undefined) {
|
|
247
|
+
Reflect.set(currentComponents, code, {
|
|
248
|
+
name, status: newStatus,
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
const diff = diffComponents(previousComponents, currentComponents);
|
|
255
|
+
const componentLines = formatComponentLines(diff);
|
|
256
|
+
const incidentId = (typeof incident['id'] === 'string') ? incident['id'] : undefined;
|
|
257
|
+
const newState = {
|
|
258
|
+
incidentId, incidentName, status, impact, body: latestBody, shortlink, serviceName, unsubscribeUrl, updateId, components: currentComponents,
|
|
259
|
+
};
|
|
260
|
+
await writeState(kv, pageId, newState);
|
|
261
|
+
return buildIncidentNotification(serviceName, incidentName, status, impact, latestBody, shortlink, unsubscribeUrl, componentLines);
|
|
262
|
+
}
|
|
263
|
+
throw new Error('Unrecognized Statuspage.io payload: expected "incident" field');
|
|
264
|
+
};
|
|
265
|
+
export { statuspageInterpreter, };
|
|
266
|
+
//# sourceMappingURL=statuspage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statuspage.js","sourceRoot":"","sources":["../../../../src/worker/interpreters/statuspage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synology.d.ts","sourceRoot":"","sources":["../../../../src/worker/interpreters/synology.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,qCAAqC,EAoCtC,MAAM,+CAA+C,CAAC;AAqEvD,QAAA,MAAM,mBAAmB,EAAE,qCAoN1B,CAAC;AAEF,OAAO,EACL,mBAAmB,GACpB,CAAC"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { LIB_REGEX_NON_LOWERCASE_ALPHANUMERIC } from '../../lib/regex.js';
|
|
2
|
+
const mapSeverityToPriority = (severity) => {
|
|
3
|
+
switch (severity.toLowerCase()) {
|
|
4
|
+
case 'critical': {
|
|
5
|
+
return 5;
|
|
6
|
+
}
|
|
7
|
+
case 'error': {
|
|
8
|
+
return 4;
|
|
9
|
+
}
|
|
10
|
+
case 'warning': {
|
|
11
|
+
return 3;
|
|
12
|
+
}
|
|
13
|
+
case 'info':
|
|
14
|
+
default: {
|
|
15
|
+
return 2;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
const validateUrl = (rawUrl) => {
|
|
20
|
+
try {
|
|
21
|
+
const url = new URL(rawUrl);
|
|
22
|
+
return url.href;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
const synologyInterpreter = (input) => {
|
|
29
|
+
if (typeof input === 'string' || input instanceof ArrayBuffer) {
|
|
30
|
+
let body = undefined;
|
|
31
|
+
if (input instanceof ArrayBuffer) {
|
|
32
|
+
const decoder = new TextDecoder('utf-8');
|
|
33
|
+
body = decoder.decode(input);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
body = input;
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
notification: {
|
|
40
|
+
title: 'Synology DSM',
|
|
41
|
+
body,
|
|
42
|
+
priority: 3,
|
|
43
|
+
tags: ['synology'],
|
|
44
|
+
markdown: true,
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const data = input;
|
|
49
|
+
let rawMessage = data['text'];
|
|
50
|
+
if (rawMessage === undefined) {
|
|
51
|
+
rawMessage = data['message'];
|
|
52
|
+
}
|
|
53
|
+
if (rawMessage === undefined) {
|
|
54
|
+
rawMessage = data['body'];
|
|
55
|
+
}
|
|
56
|
+
if (rawMessage === undefined) {
|
|
57
|
+
rawMessage = data['content'];
|
|
58
|
+
}
|
|
59
|
+
if (rawMessage === undefined) {
|
|
60
|
+
rawMessage = data['description'];
|
|
61
|
+
}
|
|
62
|
+
let message = (typeof rawMessage === 'string') ? rawMessage : JSON.stringify(data);
|
|
63
|
+
const rawPrefix = data['prefix'];
|
|
64
|
+
let hostname = undefined;
|
|
65
|
+
let timestamp = undefined;
|
|
66
|
+
if (typeof rawPrefix === 'string' && rawPrefix.trim() !== '') {
|
|
67
|
+
const prefixParts = rawPrefix.split('|').map((part) => part.trim());
|
|
68
|
+
if (prefixParts.length >= 2) {
|
|
69
|
+
hostname = (prefixParts[0] !== '') ? prefixParts[0] : undefined;
|
|
70
|
+
timestamp = (prefixParts[1] !== '') ? prefixParts[1] : undefined;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
hostname = (rawPrefix.trim() !== '') ? rawPrefix.trim() : undefined;
|
|
74
|
+
}
|
|
75
|
+
if (message.startsWith(rawPrefix) === true) {
|
|
76
|
+
message = message.slice(rawPrefix.length).trim();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (hostname === undefined) {
|
|
80
|
+
let rawHostname = data['hostname'];
|
|
81
|
+
if (rawHostname === undefined) {
|
|
82
|
+
rawHostname = data['host'];
|
|
83
|
+
}
|
|
84
|
+
if (rawHostname === undefined) {
|
|
85
|
+
rawHostname = data['device'];
|
|
86
|
+
}
|
|
87
|
+
hostname = (typeof rawHostname === 'string') ? rawHostname : undefined;
|
|
88
|
+
}
|
|
89
|
+
if (timestamp === undefined) {
|
|
90
|
+
const rawDate = data['date'];
|
|
91
|
+
const rawTime = data['time'];
|
|
92
|
+
const date = (typeof rawDate === 'string') ? rawDate : undefined;
|
|
93
|
+
const time = (typeof rawTime === 'string') ? rawTime : undefined;
|
|
94
|
+
const parts = [
|
|
95
|
+
date,
|
|
96
|
+
time,
|
|
97
|
+
].filter(Boolean).join(' ');
|
|
98
|
+
timestamp = (parts !== '') ? parts : undefined;
|
|
99
|
+
}
|
|
100
|
+
const rawSeverity = (data['severity'] !== undefined) ? data['severity'] : data['level'];
|
|
101
|
+
const severity = (typeof rawSeverity === 'string') ? rawSeverity : 'info';
|
|
102
|
+
let rawEvent = data['event'];
|
|
103
|
+
if (rawEvent === undefined) {
|
|
104
|
+
rawEvent = data['category'];
|
|
105
|
+
}
|
|
106
|
+
if (rawEvent === undefined) {
|
|
107
|
+
rawEvent = data['type'];
|
|
108
|
+
}
|
|
109
|
+
const event = (typeof rawEvent === 'string') ? rawEvent : undefined;
|
|
110
|
+
const title = (hostname !== undefined) ? hostname : 'Synology DSM';
|
|
111
|
+
let priority = mapSeverityToPriority(severity);
|
|
112
|
+
if (rawSeverity === undefined) {
|
|
113
|
+
const lowerMessage = message.toLowerCase();
|
|
114
|
+
if (lowerMessage.includes('is down') === true
|
|
115
|
+
|| lowerMessage.includes('lost link') === true
|
|
116
|
+
|| lowerMessage.includes('unreachable') === true) {
|
|
117
|
+
priority = 5;
|
|
118
|
+
}
|
|
119
|
+
else if (lowerMessage.includes('error') === true
|
|
120
|
+
|| lowerMessage.includes('bad sector') === true
|
|
121
|
+
|| lowerMessage.includes('failure') === true) {
|
|
122
|
+
priority = 4;
|
|
123
|
+
}
|
|
124
|
+
else if (lowerMessage.includes('warning') === true
|
|
125
|
+
|| lowerMessage.includes('packet loss') === true
|
|
126
|
+
|| lowerMessage.includes('high latency') === true
|
|
127
|
+
|| lowerMessage.includes('running out') === true) {
|
|
128
|
+
priority = 3;
|
|
129
|
+
}
|
|
130
|
+
else if (lowerMessage.includes('is available') === true
|
|
131
|
+
|| lowerMessage.includes('restored') === true
|
|
132
|
+
|| lowerMessage.includes('completed successfully') === true) {
|
|
133
|
+
priority = 2;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const tags = ['synology'];
|
|
137
|
+
if (event !== undefined) {
|
|
138
|
+
const sanitizedEvent = event.toLowerCase().replace(new RegExp(LIB_REGEX_NON_LOWERCASE_ALPHANUMERIC, 'g'), '');
|
|
139
|
+
tags.push(sanitizedEvent);
|
|
140
|
+
}
|
|
141
|
+
if (severity !== 'info' && rawSeverity !== undefined) {
|
|
142
|
+
tags.push(severity);
|
|
143
|
+
}
|
|
144
|
+
if (priority === 5) {
|
|
145
|
+
tags.push('rotating_light');
|
|
146
|
+
}
|
|
147
|
+
else if (priority === 4) {
|
|
148
|
+
tags.push('warning');
|
|
149
|
+
}
|
|
150
|
+
else if (priority === 2) {
|
|
151
|
+
tags.push('white_check_mark');
|
|
152
|
+
}
|
|
153
|
+
const bodyLines = [];
|
|
154
|
+
if (timestamp !== undefined) {
|
|
155
|
+
bodyLines.push(`**${timestamp}**`);
|
|
156
|
+
}
|
|
157
|
+
bodyLines.push(message);
|
|
158
|
+
const rawProxyConfigDefault = {};
|
|
159
|
+
const proxyConfig = (typeof data['ntfy-reverse-proxy'] === 'object' && data['ntfy-reverse-proxy'] !== null) ? data['ntfy-reverse-proxy'] : rawProxyConfigDefault;
|
|
160
|
+
const rawUrl = proxyConfig['url'];
|
|
161
|
+
let dsmUrl = undefined;
|
|
162
|
+
if (typeof rawUrl === 'string') {
|
|
163
|
+
dsmUrl = validateUrl(rawUrl);
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
notification: {
|
|
167
|
+
title,
|
|
168
|
+
body: bodyLines.join('\n'),
|
|
169
|
+
priority,
|
|
170
|
+
tags,
|
|
171
|
+
markdown: true,
|
|
172
|
+
...(dsmUrl !== undefined ? { actions: `view, Open DSM, ${dsmUrl}, clear=true` } : {}),
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
};
|
|
176
|
+
export { synologyInterpreter, };
|
|
177
|
+
//# sourceMappingURL=synology.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synology.js","sourceRoot":"","sources":["../../../../src/worker/interpreters/synology.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unifi.d.ts","sourceRoot":"","sources":["../../../../src/worker/interpreters/unifi.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAMV,kCAAkC,EAiCnC,MAAM,4CAA4C,CAAC;AAoJpD,QAAA,MAAM,gBAAgB,EAAE,kCAoHvB,CAAC;AAEF,OAAO,EACL,gBAAgB,GACjB,CAAC"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { LIB_REGEX_UNIFI_ALERT_LINE, LIB_REGEX_UNIFI_DEVICE_NAME_LINE, LIB_REGEX_UNIFI_DEVICE_URL_LINE, LIB_REGEX_UNIFI_SUBJECT_PREFIX, LIB_REGEX_UNIFI_TIME_LINE, } from '../../lib/regex.js';
|
|
2
|
+
const stripSubjectPrefix = (subject) => {
|
|
3
|
+
const stripped = subject.replace(new RegExp(LIB_REGEX_UNIFI_SUBJECT_PREFIX), '');
|
|
4
|
+
return (stripped.trim() !== '') ? stripped.trim() : subject;
|
|
5
|
+
};
|
|
6
|
+
const mapEventToPriority = (text) => {
|
|
7
|
+
const lower = text.toLowerCase();
|
|
8
|
+
if (lower.includes('ids') === true
|
|
9
|
+
|| lower.includes('ips') === true
|
|
10
|
+
|| lower.includes('threat') === true
|
|
11
|
+
|| lower.includes('security') === true) {
|
|
12
|
+
return 5;
|
|
13
|
+
}
|
|
14
|
+
if (lower.includes('disconnect') === true
|
|
15
|
+
|| lower.includes('down') === true
|
|
16
|
+
|| lower.includes('failover') === true
|
|
17
|
+
|| lower.includes('lost') === true) {
|
|
18
|
+
return 4;
|
|
19
|
+
}
|
|
20
|
+
if (lower.includes('connect') === true
|
|
21
|
+
|| lower.includes('reconnect') === true
|
|
22
|
+
|| lower.includes('up') === true
|
|
23
|
+
|| lower.includes('restored') === true) {
|
|
24
|
+
return 2;
|
|
25
|
+
}
|
|
26
|
+
return 3;
|
|
27
|
+
};
|
|
28
|
+
const mapPriorityToEmojiTag = (priority) => {
|
|
29
|
+
switch (priority) {
|
|
30
|
+
case 5: {
|
|
31
|
+
return 'rotating_light';
|
|
32
|
+
}
|
|
33
|
+
case 4: {
|
|
34
|
+
return 'warning';
|
|
35
|
+
}
|
|
36
|
+
case 2: {
|
|
37
|
+
return 'white_check_mark';
|
|
38
|
+
}
|
|
39
|
+
default: {
|
|
40
|
+
return 'bell';
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
const extractDeviceTags = (text) => {
|
|
45
|
+
const lower = text.toLowerCase();
|
|
46
|
+
const tags = [];
|
|
47
|
+
if (lower.includes('ap') === true
|
|
48
|
+
|| lower.includes('access point') === true) {
|
|
49
|
+
tags.push('ap');
|
|
50
|
+
}
|
|
51
|
+
if (lower.includes('switch') === true) {
|
|
52
|
+
tags.push('switch');
|
|
53
|
+
}
|
|
54
|
+
if (lower.includes('gateway') === true
|
|
55
|
+
|| lower.includes('wan') === true
|
|
56
|
+
|| lower.includes('usg') === true
|
|
57
|
+
|| lower.includes('udm') === true) {
|
|
58
|
+
tags.push('gateway');
|
|
59
|
+
}
|
|
60
|
+
return tags;
|
|
61
|
+
};
|
|
62
|
+
const unifiInterpreter = (input) => {
|
|
63
|
+
if (typeof input === 'string') {
|
|
64
|
+
const priority = mapEventToPriority(input);
|
|
65
|
+
const emojiTag = mapPriorityToEmojiTag(priority);
|
|
66
|
+
return {
|
|
67
|
+
notification: {
|
|
68
|
+
title: 'UniFi',
|
|
69
|
+
body: input,
|
|
70
|
+
priority,
|
|
71
|
+
tags: [
|
|
72
|
+
'unifi',
|
|
73
|
+
...extractDeviceTags(input),
|
|
74
|
+
emojiTag,
|
|
75
|
+
],
|
|
76
|
+
markdown: true,
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
if (input instanceof ArrayBuffer) {
|
|
81
|
+
const decoder = new TextDecoder('utf-8');
|
|
82
|
+
const body = decoder.decode(input);
|
|
83
|
+
const priority = mapEventToPriority(body);
|
|
84
|
+
const emojiTag = mapPriorityToEmojiTag(priority);
|
|
85
|
+
return {
|
|
86
|
+
notification: {
|
|
87
|
+
title: 'UniFi',
|
|
88
|
+
body,
|
|
89
|
+
priority,
|
|
90
|
+
tags: [
|
|
91
|
+
'unifi',
|
|
92
|
+
...extractDeviceTags(body),
|
|
93
|
+
emojiTag,
|
|
94
|
+
],
|
|
95
|
+
markdown: true,
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
const data = input;
|
|
100
|
+
const rawSubject = data['subject'];
|
|
101
|
+
const subject = (typeof rawSubject === 'string') ? rawSubject : '';
|
|
102
|
+
const rawTextBody = data['textBody'];
|
|
103
|
+
const textBody = (typeof rawTextBody === 'string') ? rawTextBody : JSON.stringify(data);
|
|
104
|
+
const eventType = (subject !== '') ? stripSubjectPrefix(subject) : 'UniFi';
|
|
105
|
+
const combinedText = `${subject} ${textBody}`;
|
|
106
|
+
const priority = mapEventToPriority(combinedText);
|
|
107
|
+
const deviceTags = extractDeviceTags(combinedText);
|
|
108
|
+
const emojiTag = mapPriorityToEmojiTag(priority);
|
|
109
|
+
const tags = [
|
|
110
|
+
'unifi',
|
|
111
|
+
...deviceTags,
|
|
112
|
+
emojiTag,
|
|
113
|
+
];
|
|
114
|
+
const alertMatch = textBody.match(new RegExp(LIB_REGEX_UNIFI_ALERT_LINE, 'i'));
|
|
115
|
+
const deviceNameMatch = textBody.match(new RegExp(LIB_REGEX_UNIFI_DEVICE_NAME_LINE, 'i'));
|
|
116
|
+
const timeMatch = textBody.match(new RegExp(LIB_REGEX_UNIFI_TIME_LINE, 'i'));
|
|
117
|
+
const deviceUrlMatch = textBody.match(new RegExp(LIB_REGEX_UNIFI_DEVICE_URL_LINE, 'i'));
|
|
118
|
+
const alert = (alertMatch !== null && alertMatch[1] !== undefined) ? alertMatch[1].trim() : undefined;
|
|
119
|
+
const deviceName = (deviceNameMatch !== null && deviceNameMatch[1] !== undefined) ? deviceNameMatch[1].trim() : undefined;
|
|
120
|
+
const time = (timeMatch !== null && timeMatch[1] !== undefined) ? timeMatch[1].trim() : undefined;
|
|
121
|
+
const deviceUrl = (deviceUrlMatch !== null && deviceUrlMatch[1] !== undefined) ? deviceUrlMatch[1] : undefined;
|
|
122
|
+
const bodyLines = [];
|
|
123
|
+
if (alert !== undefined) {
|
|
124
|
+
bodyLines.push(alert);
|
|
125
|
+
}
|
|
126
|
+
const details = [];
|
|
127
|
+
if (deviceName !== undefined) {
|
|
128
|
+
details.push(`**Device:** ${deviceName}`);
|
|
129
|
+
}
|
|
130
|
+
if (time !== undefined) {
|
|
131
|
+
details.push(`**Time:** ${time}`);
|
|
132
|
+
}
|
|
133
|
+
if (details.length > 0) {
|
|
134
|
+
if (bodyLines.length > 0) {
|
|
135
|
+
bodyLines.push('');
|
|
136
|
+
}
|
|
137
|
+
bodyLines.push(...details);
|
|
138
|
+
}
|
|
139
|
+
const body = (bodyLines.length > 0) ? bodyLines.join('\n') : textBody;
|
|
140
|
+
return {
|
|
141
|
+
notification: {
|
|
142
|
+
title: eventType,
|
|
143
|
+
body,
|
|
144
|
+
priority,
|
|
145
|
+
tags,
|
|
146
|
+
markdown: true,
|
|
147
|
+
...(deviceUrl !== undefined ? { actions: `view, Open UniFi, ${deviceUrl}, clear=true` } : {}),
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
};
|
|
151
|
+
export { unifiInterpreter, };
|
|
152
|
+
//# sourceMappingURL=unifi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unifi.js","sourceRoot":"","sources":["../../../../src/worker/interpreters/unifi.ts"],"names":[],"mappings":"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"}
|