@camstack/addon-advanced-notifier 0.1.33 → 0.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/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":["../src/outputs/webhook.ts","../src/outputs/home-assistant.ts","../src/batching/batcher.ts"],"sourcesContent":["import type { INotificationOutput, Notification } from '@camstack/types'\n\nexport class WebhookOutput implements INotificationOutput {\n readonly id = 'webhook'\n readonly name = 'Webhook'\n readonly icon = 'webhook'\n\n private readonly url: string\n\n constructor(url: string) {\n this.url = url\n }\n\n async send(notification: Notification): Promise<void> {\n await fetch(this.url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(notification),\n })\n }\n\n async sendTest(): Promise<{ success: boolean; error?: string }> {\n try {\n await this.send({\n title: 'Test Notification',\n message: 'This is a test from CamStack Advanced Notifier',\n severity: 'info',\n category: 'test',\n timestamp: Date.now(),\n })\n return { success: true }\n } catch (err) {\n return { success: false, error: String(err) }\n }\n }\n}\n","import type { INotificationOutput, Notification } from '@camstack/types'\n\nexport class HomeAssistantOutput implements INotificationOutput {\n readonly id = 'home-assistant'\n readonly name = 'Home Assistant'\n readonly icon = 'home'\n\n private readonly url: string\n private readonly token: string\n\n constructor(url: string, token: string) {\n this.url = url.replace(/\\/$/, '')\n this.token = token\n }\n\n async send(notification: Notification): Promise<void> {\n await fetch(`${this.url}/api/events/camstack_notification`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.token}`,\n },\n body: JSON.stringify({\n title: notification.title,\n message: notification.message,\n severity: notification.severity,\n category: notification.category,\n device_id: notification.deviceId,\n data: notification.data,\n }),\n })\n }\n\n async sendTest(): Promise<{ success: boolean; error?: string }> {\n try {\n await this.send({\n title: 'CamStack Test',\n message: 'Connection verified',\n severity: 'info',\n category: 'test',\n timestamp: Date.now(),\n })\n return { success: true }\n } catch (err) {\n return { success: false, error: String(err) }\n }\n }\n}\n","export class NotificationBatcher {\n private readonly windowMs: number\n private readonly handler: (frameKey: string, events: unknown[]) => void\n private readonly batches = new Map<\n string,\n { events: unknown[]; timer: ReturnType<typeof setTimeout> }\n >()\n\n constructor(windowMs: number, handler: (frameKey: string, events: unknown[]) => void) {\n this.windowMs = windowMs\n this.handler = handler\n }\n\n add(frameKey: string, event: unknown): void {\n let batch = this.batches.get(frameKey)\n if (!batch) {\n batch = {\n events: [],\n timer: setTimeout(() => this.flush(frameKey), this.windowMs),\n }\n this.batches.set(frameKey, batch)\n }\n batch.events.push(event)\n }\n\n private flush(frameKey: string): void {\n const batch = this.batches.get(frameKey)\n if (!batch) return\n this.batches.delete(frameKey)\n this.handler(frameKey, batch.events)\n }\n\n shutdown(): void {\n for (const [key, batch] of this.batches) {\n clearTimeout(batch.timer)\n this.handler(key, batch.events)\n }\n this.batches.clear()\n }\n}\n"],"names":[],"mappings":";;;AAEO,MAAM,cAA6C;AAAA,EAC/C,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AAAA,EAEC;AAAA,EAEjB,YAAY,KAAa;AACvB,SAAK,MAAM;AAAA,EACb;AAAA,EAEA,MAAM,KAAK,cAA2C;AACpD,UAAM,MAAM,KAAK,KAAK;AAAA,MACpB,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAA;AAAA,MAC3B,MAAM,KAAK,UAAU,YAAY;AAAA,IAAA,CAClC;AAAA,EACH;AAAA,EAEA,MAAM,WAA0D;AAC9D,QAAI;AACF,YAAM,KAAK,KAAK;AAAA,QACd,OAAO;AAAA,QACP,SAAS;AAAA,QACT,UAAU;AAAA,QACV,UAAU;AAAA,QACV,WAAW,KAAK,IAAA;AAAA,MAAI,CACrB;AACD,aAAO,EAAE,SAAS,KAAA;AAAA,IACpB,SAAS,KAAK;AACZ,aAAO,EAAE,SAAS,OAAO,OAAO,OAAO,GAAG,EAAA;AAAA,IAC5C;AAAA,EACF;AACF;ACjCO,MAAM,oBAAmD;AAAA,EACrD,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AAAA,EAEC;AAAA,EACA;AAAA,EAEjB,YAAY,KAAa,OAAe;AACtC,SAAK,MAAM,IAAI,QAAQ,OAAO,EAAE;AAChC,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,MAAM,KAAK,cAA2C;AACpD,UAAM,MAAM,GAAG,KAAK,GAAG,qCAAqC;AAAA,MAC1D,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,KAAK,KAAK;AAAA,MAAA;AAAA,MAErC,MAAM,KAAK,UAAU;AAAA,QACnB,OAAO,aAAa;AAAA,QACpB,SAAS,aAAa;AAAA,QACtB,UAAU,aAAa;AAAA,QACvB,UAAU,aAAa;AAAA,QACvB,WAAW,aAAa;AAAA,QACxB,MAAM,aAAa;AAAA,MAAA,CACpB;AAAA,IAAA,CACF;AAAA,EACH;AAAA,EAEA,MAAM,WAA0D;AAC9D,QAAI;AACF,YAAM,KAAK,KAAK;AAAA,QACd,OAAO;AAAA,QACP,SAAS;AAAA,QACT,UAAU;AAAA,QACV,UAAU;AAAA,QACV,WAAW,KAAK,IAAA;AAAA,MAAI,CACrB;AACD,aAAO,EAAE,SAAS,KAAA;AAAA,IACpB,SAAS,KAAK;AACZ,aAAO,EAAE,SAAS,OAAO,OAAO,OAAO,GAAG,EAAA;AAAA,IAC5C;AAAA,EACF;AACF;AC/CO,MAAM,oBAAoB;AAAA,EACd;AAAA,EACA;AAAA,EACA,8BAAc,IAAA;AAAA,EAK/B,YAAY,UAAkB,SAAwD;AACpF,SAAK,WAAW;AAChB,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,IAAI,UAAkB,OAAsB;AAC1C,QAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ;AACrC,QAAI,CAAC,OAAO;AACV,cAAQ;AAAA,QACN,QAAQ,CAAA;AAAA,QACR,OAAO,WAAW,MAAM,KAAK,MAAM,QAAQ,GAAG,KAAK,QAAQ;AAAA,MAAA;AAE7D,WAAK,QAAQ,IAAI,UAAU,KAAK;AAAA,IAClC;AACA,UAAM,OAAO,KAAK,KAAK;AAAA,EACzB;AAAA,EAEQ,MAAM,UAAwB;AACpC,UAAM,QAAQ,KAAK,QAAQ,IAAI,QAAQ;AACvC,QAAI,CAAC,MAAO;AACZ,SAAK,QAAQ,OAAO,QAAQ;AAC5B,SAAK,QAAQ,UAAU,MAAM,MAAM;AAAA,EACrC;AAAA,EAEA,WAAiB;AACf,eAAW,CAAC,KAAK,KAAK,KAAK,KAAK,SAAS;AACvC,mBAAa,MAAM,KAAK;AACxB,WAAK,QAAQ,KAAK,MAAM,MAAM;AAAA,IAChC;AACA,SAAK,QAAQ,MAAA;AAAA,EACf;AACF;;;;;;;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/outputs/webhook.ts","../src/outputs/home-assistant.ts","../src/batching/batcher.ts"],"sourcesContent":["import type { INotificationOutput, Notification } from '@camstack/types'\n\nexport class WebhookOutput implements INotificationOutput {\n readonly id = 'webhook'\n readonly name = 'Webhook'\n readonly icon = 'webhook'\n\n private readonly url: string\n\n constructor(url: string) {\n this.url = url\n }\n\n async send(notification: Notification): Promise<void> {\n await fetch(this.url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(notification),\n })\n }\n\n async sendTest(): Promise<{ success: boolean; error?: string }> {\n try {\n await this.send({\n title: 'Test Notification',\n message: 'This is a test from CamStack Advanced Notifier',\n severity: 'info',\n category: 'test',\n timestamp: Date.now(),\n })\n return { success: true }\n } catch (err) {\n return { success: false, error: String(err) }\n }\n }\n}\n","import type { INotificationOutput, Notification } from '@camstack/types'\n\nexport class HomeAssistantOutput implements INotificationOutput {\n readonly id = 'home-assistant'\n readonly name = 'Home Assistant'\n readonly icon = 'home'\n\n private readonly url: string\n private readonly token: string\n\n constructor(url: string, token: string) {\n this.url = url.replace(/\\/$/, '')\n this.token = token\n }\n\n async send(notification: Notification): Promise<void> {\n await fetch(`${this.url}/api/events/camstack_notification`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.token}`,\n },\n body: JSON.stringify({\n title: notification.title,\n message: notification.message,\n severity: notification.severity,\n category: notification.category,\n device_id: notification.deviceId,\n data: notification.data,\n }),\n })\n }\n\n async sendTest(): Promise<{ success: boolean; error?: string }> {\n try {\n await this.send({\n title: 'CamStack Test',\n message: 'Connection verified',\n severity: 'info',\n category: 'test',\n timestamp: Date.now(),\n })\n return { success: true }\n } catch (err) {\n return { success: false, error: String(err) }\n }\n }\n}\n","export class NotificationBatcher {\n private readonly windowMs: number\n private readonly handler: (frameKey: string, events: unknown[]) => void\n private readonly batches = new Map<\n string,\n { events: unknown[]; timer: ReturnType<typeof setTimeout> }\n >()\n\n constructor(windowMs: number, handler: (frameKey: string, events: unknown[]) => void) {\n this.windowMs = windowMs\n this.handler = handler\n }\n\n add(frameKey: string, event: unknown): void {\n let batch = this.batches.get(frameKey)\n if (!batch) {\n batch = {\n events: [],\n timer: setTimeout(() => this.flush(frameKey), this.windowMs),\n }\n this.batches.set(frameKey, batch)\n }\n batch.events.push(event)\n }\n\n private flush(frameKey: string): void {\n const batch = this.batches.get(frameKey)\n if (!batch) return\n this.batches.delete(frameKey)\n this.handler(frameKey, batch.events)\n }\n\n shutdown(): void {\n for (const [key, batch] of this.batches) {\n clearTimeout(batch.timer)\n this.handler(key, batch.events)\n }\n this.batches.clear()\n }\n}\n"],"names":[],"mappings":"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"}