@groundbrick/push-service 1.0.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.
@@ -0,0 +1,16 @@
1
+ import type { PushConfig, PushMessage, PushResult, PushSubscriptionTarget } from './interfaces/IPushProvider.js';
2
+ /**
3
+ * Fronteira do canal de push, na mesma forma do `SmsService`: quem chama fala
4
+ * com isto e nunca com a biblioteca.
5
+ *
6
+ * Não sabe o que é um salão, uma conta ou uma marcação. Recebe um destino e uma
7
+ * mensagem, devolve o resultado, e é a app que decide o que fazer com o `gone`.
8
+ */
9
+ export declare class PushService {
10
+ private static instance;
11
+ private provider;
12
+ private constructor();
13
+ static getInstance(config?: PushConfig): PushService;
14
+ send(target: PushSubscriptionTarget, message: PushMessage): Promise<PushResult>;
15
+ }
16
+ //# sourceMappingURL=PushService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PushService.d.ts","sourceRoot":"","sources":["../src/PushService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAER,UAAU,EACV,WAAW,EACX,UAAU,EACV,sBAAsB,EACzB,MAAM,+BAA+B,CAAC;AAGvC;;;;;;GAMG;AACH,qBAAa,WAAW;IACpB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAgB;IAEhC,OAAO;WAKO,WAAW,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,WAAW;IAUrD,IAAI,CAAC,MAAM,EAAE,sBAAsB,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAGxF"}
@@ -0,0 +1,29 @@
1
+ import { PushServiceFactory } from './PushServiceFactory.js';
2
+ /**
3
+ * Fronteira do canal de push, na mesma forma do `SmsService`: quem chama fala
4
+ * com isto e nunca com a biblioteca.
5
+ *
6
+ * Não sabe o que é um salão, uma conta ou uma marcação. Recebe um destino e uma
7
+ * mensagem, devolve o resultado, e é a app que decide o que fazer com o `gone`.
8
+ */
9
+ export class PushService {
10
+ static instance;
11
+ provider;
12
+ constructor(config) {
13
+ this.provider = PushServiceFactory.create(config);
14
+ console.log(`🔔 Push Service initialized with provider: ${config.provider}`);
15
+ }
16
+ static getInstance(config) {
17
+ if (!PushService.instance) {
18
+ if (!config) {
19
+ throw new Error('Config is required on first initialization');
20
+ }
21
+ PushService.instance = new PushService(config);
22
+ }
23
+ return PushService.instance;
24
+ }
25
+ async send(target, message) {
26
+ return this.provider.send(target, message);
27
+ }
28
+ }
29
+ //# sourceMappingURL=PushService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PushService.js","sourceRoot":"","sources":["../src/PushService.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D;;;;;;GAMG;AACH,MAAM,OAAO,WAAW;IACZ,MAAM,CAAC,QAAQ,CAAc;IAC7B,QAAQ,CAAgB;IAEhC,YAAoB,MAAkB;QAClC,IAAI,CAAC,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,8CAA8C,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACjF,CAAC;IAEM,MAAM,CAAC,WAAW,CAAC,MAAmB;QACzC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAClE,CAAC;YACD,WAAW,CAAC,QAAQ,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,WAAW,CAAC,QAAQ,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAA8B,EAAE,OAAoB;QAC3D,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;CACJ"}
@@ -0,0 +1,5 @@
1
+ import type { IPushProvider, PushConfig } from './interfaces/IPushProvider.js';
2
+ export declare class PushServiceFactory {
3
+ static create(config: PushConfig): IPushProvider;
4
+ }
5
+ //# sourceMappingURL=PushServiceFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PushServiceFactory.d.ts","sourceRoot":"","sources":["../src/PushServiceFactory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAI/E,qBAAa,kBAAkB;IAC3B,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,aAAa;CAUnD"}
@@ -0,0 +1,15 @@
1
+ import { MockPushProvider } from './providers/MockPushProvider.js';
2
+ import { WebPushProvider } from './providers/WebPushProvider.js';
3
+ export class PushServiceFactory {
4
+ static create(config) {
5
+ switch (config.provider) {
6
+ case 'webpush':
7
+ return new WebPushProvider(config.config);
8
+ case 'mock':
9
+ return new MockPushProvider();
10
+ default:
11
+ throw new Error(`Unknown push provider: ${config.provider}`);
12
+ }
13
+ }
14
+ }
15
+ //# sourceMappingURL=PushServiceFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PushServiceFactory.js","sourceRoot":"","sources":["../src/PushServiceFactory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,MAAM,OAAO,kBAAkB;IAC3B,MAAM,CAAC,MAAM,CAAC,MAAkB;QAC5B,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtB,KAAK,SAAS;gBACV,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC9C,KAAK,MAAM;gBACP,OAAO,IAAI,gBAAgB,EAAE,CAAC;YAClC;gBACI,MAAM,IAAI,KAAK,CAAC,0BAA2B,MAAqB,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrF,CAAC;IACL,CAAC;CACJ"}
@@ -0,0 +1,5 @@
1
+ export { PushService } from './PushService.js';
2
+ export { PushServiceFactory } from './PushServiceFactory.js';
3
+ export * from './interfaces/IPushProvider.js';
4
+ export * from './providers/index.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export { PushService } from './PushService.js';
2
+ export { PushServiceFactory } from './PushServiceFactory.js';
3
+ export * from './interfaces/IPushProvider.js';
4
+ export * from './providers/index.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Contrato de um transporte de Web Push.
3
+ *
4
+ * Ao contrário do SMS, aqui não há relatório de entrega nem webhook de retorno:
5
+ * o serviço de push do fabricante aceita ou recusa a mensagem e acaba aí. É por
6
+ * isso que `PushResult` carrega o `gone`, que é a única informação com valor
7
+ * operacional que este canal devolve.
8
+ */
9
+ /** Uma subscrição tal como o browser a entrega. */
10
+ export interface PushSubscriptionTarget {
11
+ endpoint: string;
12
+ keys: {
13
+ p256dh: string;
14
+ auth: string;
15
+ };
16
+ }
17
+ /**
18
+ * O que se manda. O `navigate` é para onde a notificação abre, e sai sempre de
19
+ * quem chama: a origem por onde o dispositivo se subscreveu é a única que o
20
+ * serviço de push vai aceitar, e uma variável de ambiente errada aqui não dá
21
+ * erro nenhum, a notificação apenas não aparece.
22
+ */
23
+ export interface PushMessage {
24
+ title: string;
25
+ body: string;
26
+ navigate: string;
27
+ /** Junta notificações do mesmo assunto em vez de empilhar. */
28
+ tag?: string;
29
+ lang?: string;
30
+ }
31
+ export interface PushResult {
32
+ success: boolean;
33
+ statusCode: number | null;
34
+ /**
35
+ * O serviço de push respondeu 404 ou 410: esta subscrição morreu e nunca
36
+ * mais vai entregar nada. Quem chama tem de a podar.
37
+ *
38
+ * É o sinal mais importante deste canal. Sem o tratar, um dono que apagou a
39
+ * app do ecrã principal fica em silêncio para sempre e ninguém dá por isso,
40
+ * que é exactamente a falha que o spike andou a medir.
41
+ */
42
+ gone: boolean;
43
+ error?: string;
44
+ }
45
+ export interface IPushProvider {
46
+ send(target: PushSubscriptionTarget, message: PushMessage): Promise<PushResult>;
47
+ }
48
+ export type PushProviderType = 'webpush' | 'mock';
49
+ export interface VapidConfig {
50
+ publicKey: string;
51
+ privateKey: string;
52
+ /** O RFC 8030 exige um contacto no JWT VAPID: `mailto:` ou `https:`. */
53
+ subject: string;
54
+ /** Segundos que o serviço de push guarda a mensagem. Por omissão, um dia. */
55
+ ttlSeconds?: number;
56
+ }
57
+ export interface PushConfig {
58
+ provider: PushProviderType;
59
+ config: VapidConfig;
60
+ }
61
+ //# sourceMappingURL=IPushProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IPushProvider.d.ts","sourceRoot":"","sources":["../../src/interfaces/IPushProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,mDAAmD;AACnD,MAAM,WAAW,sBAAsB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE;QACF,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;KAChB,CAAC;CACL;AAED;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;;;;;;;OAOG;IACH,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC1B,IAAI,CAAC,MAAM,EAAE,sBAAsB,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACnF;AAED,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,MAAM,CAAC;AAElD,MAAM,WAAW,WAAW;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACvB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,MAAM,EAAE,WAAW,CAAC;CACvB"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Contrato de um transporte de Web Push.
3
+ *
4
+ * Ao contrário do SMS, aqui não há relatório de entrega nem webhook de retorno:
5
+ * o serviço de push do fabricante aceita ou recusa a mensagem e acaba aí. É por
6
+ * isso que `PushResult` carrega o `gone`, que é a única informação com valor
7
+ * operacional que este canal devolve.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=IPushProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IPushProvider.js","sourceRoot":"","sources":["../../src/interfaces/IPushProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,9 @@
1
+ import type { IPushProvider, PushMessage, PushResult, PushSubscriptionTarget } from '../interfaces/IPushProvider.js';
2
+ /**
3
+ * Aceita tudo e não fala com ninguém. Serve o desenvolvimento local, onde não há
4
+ * HTTPS nem chaves VAPID, e os testes, que não podem depender da Apple.
5
+ */
6
+ export declare class MockPushProvider implements IPushProvider {
7
+ send(target: PushSubscriptionTarget, message: PushMessage): Promise<PushResult>;
8
+ }
9
+ //# sourceMappingURL=MockPushProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MockPushProvider.d.ts","sourceRoot":"","sources":["../../src/providers/MockPushProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,aAAa,EACb,WAAW,EACX,UAAU,EACV,sBAAsB,EACzB,MAAM,gCAAgC,CAAC;AAExC;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,aAAa;IAC5C,IAAI,CAAC,MAAM,EAAE,sBAAsB,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAIxF"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Aceita tudo e não fala com ninguém. Serve o desenvolvimento local, onde não há
3
+ * HTTPS nem chaves VAPID, e os testes, que não podem depender da Apple.
4
+ */
5
+ export class MockPushProvider {
6
+ async send(target, message) {
7
+ console.log(`🔔 [mock push] ${message.title} -> ${target.endpoint.slice(0, 40)}...`);
8
+ return { success: true, statusCode: 201, gone: false };
9
+ }
10
+ }
11
+ //# sourceMappingURL=MockPushProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MockPushProvider.js","sourceRoot":"","sources":["../../src/providers/MockPushProvider.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,MAAM,OAAO,gBAAgB;IACzB,KAAK,CAAC,IAAI,CAAC,MAA8B,EAAE,OAAoB;QAC3D,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,CAAC,KAAK,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;QACrF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC3D,CAAC;CACJ"}
@@ -0,0 +1,27 @@
1
+ import type { IPushProvider, PushMessage, PushResult, PushSubscriptionTarget, VapidConfig } from '../interfaces/IPushProvider.js';
2
+ /**
3
+ * Envio VAPID sobre a biblioteca `web-push`.
4
+ *
5
+ * Graduado do spike `spike/web-push-ios`, que correu cinco dias em homologação
6
+ * com dois iPhones e um Android: nenhuma subscrição perdida, através de um
7
+ * reinício e de uma actualização menor do iOS.
8
+ */
9
+ export declare class WebPushProvider implements IPushProvider {
10
+ private config;
11
+ constructor(config: VapidConfig);
12
+ /**
13
+ * Payload declarativo (`web_push: 8030`, RFC 8030 + Declarative Web Push).
14
+ *
15
+ * Desde o iOS 18.4 o sistema desenha a notificação a partir deste JSON sem
16
+ * depender de o service worker acordar, que é o cenário que interessa: dias
17
+ * depois, com a app fechada. É retrocompatível, portanto no Chrome e no
18
+ * Firefox o mesmo payload continua a cair no caminho clássico do worker.
19
+ *
20
+ * O `Content-Type: application/notification+json` fica de fora de propósito:
21
+ * a biblioteca põe os cabeçalhos que o aes128gcm exige e trocá-los arrisca a
22
+ * entrega em si. O número mágico chega para activar o caminho declarativo.
23
+ */
24
+ private buildPayload;
25
+ send(target: PushSubscriptionTarget, message: PushMessage): Promise<PushResult>;
26
+ }
27
+ //# sourceMappingURL=WebPushProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebPushProvider.d.ts","sourceRoot":"","sources":["../../src/providers/WebPushProvider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACR,aAAa,EACb,WAAW,EACX,UAAU,EACV,sBAAsB,EACtB,WAAW,EACd,MAAM,gCAAgC,CAAC;AAIxC;;;;;;GAMG;AACH,qBAAa,eAAgB,YAAW,aAAa;IACrC,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAEvC;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,YAAY;IAcd,IAAI,CAAC,MAAM,EAAE,sBAAsB,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CA+BxF"}
@@ -0,0 +1,67 @@
1
+ import webpush from 'web-push';
2
+ const DEFAULT_TTL_SECONDS = 60 * 60 * 24;
3
+ /**
4
+ * Envio VAPID sobre a biblioteca `web-push`.
5
+ *
6
+ * Graduado do spike `spike/web-push-ios`, que correu cinco dias em homologação
7
+ * com dois iPhones e um Android: nenhuma subscrição perdida, através de um
8
+ * reinício e de uma actualização menor do iOS.
9
+ */
10
+ export class WebPushProvider {
11
+ config;
12
+ constructor(config) {
13
+ this.config = config;
14
+ }
15
+ /**
16
+ * Payload declarativo (`web_push: 8030`, RFC 8030 + Declarative Web Push).
17
+ *
18
+ * Desde o iOS 18.4 o sistema desenha a notificação a partir deste JSON sem
19
+ * depender de o service worker acordar, que é o cenário que interessa: dias
20
+ * depois, com a app fechada. É retrocompatível, portanto no Chrome e no
21
+ * Firefox o mesmo payload continua a cair no caminho clássico do worker.
22
+ *
23
+ * O `Content-Type: application/notification+json` fica de fora de propósito:
24
+ * a biblioteca põe os cabeçalhos que o aes128gcm exige e trocá-los arrisca a
25
+ * entrega em si. O número mágico chega para activar o caminho declarativo.
26
+ */
27
+ buildPayload(message) {
28
+ return JSON.stringify({
29
+ web_push: 8030,
30
+ notification: {
31
+ title: message.title,
32
+ body: message.body,
33
+ navigate: message.navigate,
34
+ lang: message.lang ?? 'pt-PT',
35
+ ...(message.tag ? { tag: message.tag } : {}),
36
+ silent: false
37
+ }
38
+ });
39
+ }
40
+ async send(target, message) {
41
+ try {
42
+ const response = await webpush.sendNotification({ endpoint: target.endpoint, keys: target.keys }, this.buildPayload(message), {
43
+ vapidDetails: {
44
+ subject: this.config.subject,
45
+ publicKey: this.config.publicKey,
46
+ privateKey: this.config.privateKey
47
+ },
48
+ TTL: this.config.ttlSeconds ?? DEFAULT_TTL_SECONDS
49
+ });
50
+ return { success: true, statusCode: response.statusCode, gone: false };
51
+ }
52
+ catch (error) {
53
+ const pushError = error;
54
+ const statusCode = pushError?.statusCode ?? null;
55
+ return {
56
+ success: false,
57
+ statusCode,
58
+ // 404 e 410 são as duas formas de o serviço de push dizer "esta
59
+ // subscrição morreu". Qualquer outro código é uma falha
60
+ // passageira e a subscrição fica onde está.
61
+ gone: statusCode === 404 || statusCode === 410,
62
+ error: pushError?.body || pushError?.message || 'erro desconhecido'
63
+ };
64
+ }
65
+ }
66
+ }
67
+ //# sourceMappingURL=WebPushProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebPushProvider.js","sourceRoot":"","sources":["../../src/providers/WebPushProvider.ts"],"names":[],"mappings":"AAAA,OAAO,OAAyB,MAAM,UAAU,CAAC;AASjD,MAAM,mBAAmB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAEzC;;;;;;GAMG;AACH,MAAM,OAAO,eAAe;IACJ;IAApB,YAAoB,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAE3C;;;;;;;;;;;OAWG;IACK,YAAY,CAAC,OAAoB;QACrC,OAAO,IAAI,CAAC,SAAS,CAAC;YAClB,QAAQ,EAAE,IAAI;YACd,YAAY,EAAE;gBACV,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,OAAO;gBAC7B,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5C,MAAM,EAAE,KAAK;aAChB;SACJ,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAA8B,EAAE,OAAoB;QAC3D,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAC3C,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAChD,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAC1B;gBACI,YAAY,EAAE;oBACV,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;oBAC5B,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;oBAChC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;iBACrC;gBACD,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,mBAAmB;aACrD,CACJ,CAAC;YAEF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QAC3E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,SAAS,GAAG,KAAqB,CAAC;YACxC,MAAM,UAAU,GAAG,SAAS,EAAE,UAAU,IAAI,IAAI,CAAC;YAEjD,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,UAAU;gBACV,gEAAgE;gBAChE,wDAAwD;gBACxD,4CAA4C;gBAC5C,IAAI,EAAE,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG;gBAC9C,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,SAAS,EAAE,OAAO,IAAI,mBAAmB;aACtE,CAAC;QACN,CAAC;IACL,CAAC;CACJ"}
@@ -0,0 +1,3 @@
1
+ export { WebPushProvider } from './WebPushProvider.js';
2
+ export { MockPushProvider } from './MockPushProvider.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { WebPushProvider } from './WebPushProvider.js';
2
+ export { MockPushProvider } from './MockPushProvider.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@groundbrick/push-service",
3
+ "version": "1.0.1",
4
+ "description": "Serviço de Web Push (VAPID) plugável, com poda das subscrições mortas",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "files": [
9
+ "dist",
10
+ "README.md",
11
+ "LICENSE"
12
+ ],
13
+ "exports": {
14
+ ".": {
15
+ "import": "./dist/index.js",
16
+ "require": "./dist/index.js",
17
+ "types": "./dist/index.d.ts"
18
+ }
19
+ },
20
+ "scripts": {
21
+ "build": "tsc",
22
+ "dev": "tsc --watch",
23
+ "clean": "rm -rf dist *.tsbuildinfo",
24
+ "prepublishOnly": "npm run clean && npm run build",
25
+ "lint": "eslint src/**/*.ts",
26
+ "lint:fix": "eslint src/**/*.ts --fix"
27
+ },
28
+ "keywords": [
29
+ "web-push",
30
+ "vapid",
31
+ "notifications",
32
+ "ios",
33
+ "typescript"
34
+ ],
35
+ "author": "GroundBrick",
36
+ "license": "MIT",
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "https://github.com/groundbrick/push-service.git"
40
+ },
41
+ "bugs": {
42
+ "url": "https://github.com/groundbrick/push-service/issues"
43
+ },
44
+ "homepage": "https://github.com/groundbrick/push-service#readme",
45
+ "publishConfig": {
46
+ "access": "public"
47
+ },
48
+ "devDependencies": {
49
+ "@types/node": "^20.19.9",
50
+ "@types/web-push": "^3.6.4",
51
+ "typescript": "^5.3.3"
52
+ },
53
+ "dependencies": {
54
+ "web-push": "^3.6.7"
55
+ },
56
+ "engines": {
57
+ "node": ">=16.0.0"
58
+ }
59
+ }