ugly-app 0.1.606 → 0.1.607
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/cli/version.d.ts +1 -1
- package/dist/cli/version.js +1 -1
- package/dist/client/index.d.ts +2 -2
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/webPush.d.ts +34 -19
- package/dist/client/webPush.d.ts.map +1 -1
- package/dist/client/webPush.js +65 -52
- package/dist/client/webPush.js.map +1 -1
- package/dist/server/adapter/workers/wrapWithAssets.d.ts.map +1 -1
- package/dist/server/adapter/workers/wrapWithAssets.js +41 -17
- package/dist/server/adapter/workers/wrapWithAssets.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/version.ts +1 -1
- package/src/client/index.ts +2 -2
- package/src/client/webPush.ts +95 -56
- package/src/server/adapter/workers/wrapWithAssets.ts +41 -17
package/dist/cli/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const CLI_VERSION = "0.1.
|
|
1
|
+
export declare const CLI_VERSION = "0.1.607";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/cli/version.js
CHANGED
package/dist/client/index.d.ts
CHANGED
|
@@ -45,8 +45,8 @@ export type { UglyBotSocket } from './uglyBotSocket.js';
|
|
|
45
45
|
export { initAppApi } from './AppApi.js';
|
|
46
46
|
export { bootstrapApp } from './bootstrapApp.js';
|
|
47
47
|
export { captureClientError } from './ErrorLog.js';
|
|
48
|
-
export {
|
|
49
|
-
export type { WebPushResult, WebPushPermission } from './webPush.js';
|
|
48
|
+
export { registerFirebaseWebPush, getWebPushPermission } from './webPush.js';
|
|
49
|
+
export type { WebPushResult, WebPushPermission, FirebaseWebConfig, RegisterFirebaseWebPushOptions } from './webPush.js';
|
|
50
50
|
export { clearFeedbackContext, getFeedbackContext, setFeedbackContext, } from './FeedbackContext.js';
|
|
51
51
|
export { getConsoleBuffer, initClientLogger } from './Logger.js';
|
|
52
52
|
export { LoginPopup } from './LoginPopup.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
|
package/dist/client/index.js
CHANGED
|
@@ -28,7 +28,7 @@ export { createUglyBotSocket } from './uglyBotSocket.js';
|
|
|
28
28
|
export { initAppApi } from './AppApi.js';
|
|
29
29
|
export { bootstrapApp } from './bootstrapApp.js';
|
|
30
30
|
export { captureClientError } from './ErrorLog.js';
|
|
31
|
-
export {
|
|
31
|
+
export { registerFirebaseWebPush, getWebPushPermission } from './webPush.js';
|
|
32
32
|
export { clearFeedbackContext, getFeedbackContext, setFeedbackContext, } from './FeedbackContext.js';
|
|
33
33
|
export { getConsoleBuffer, initClientLogger } from './Logger.js';
|
|
34
34
|
export { LoginPopup } from './LoginPopup.js';
|
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEnD,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,8BAA8B,CAAC;AAMtC,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAEzH,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAE5F,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErF,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,OAAO,EACP,UAAU,GACX,MAAM,sBAAsB,CAAC;AAK9B,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,0BAA0B,EAC1B,WAAW,EACX,QAAQ,GACT,MAAM,sBAAsB,CAAC;AAS9B,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAK3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE1E,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAKzD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
|
package/dist/client/webPush.d.ts
CHANGED
|
@@ -1,32 +1,47 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* FCM web push registration (the single push mechanism — matches native FCM).
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
4
|
+
* Loads the Firebase compat SDK from the CDN on demand (no npm dependency / no
|
|
5
|
+
* bundle bloat — only fetched when a user actually registers), registers the
|
|
6
|
+
* framework's Firebase service worker (`/ugly-push-sw.js`, served by
|
|
7
|
+
* `wrapWithAssets`), and returns an FCM web token via `getToken`. The caller
|
|
8
|
+
* stores that token server-side (e.g. ugly.bot `userPrivateAddSubscription` →
|
|
9
|
+
* `userPrivate.gcmTokens`) so `deliverPushToUserDevices` can reach this browser.
|
|
9
10
|
*
|
|
10
|
-
*
|
|
11
|
-
* `
|
|
12
|
-
*
|
|
13
|
-
*
|
|
11
|
+
* Behaviors ported from the monolith:
|
|
12
|
+
* • Foreground `onMessage` SUPPRESSES the notification when you're already on
|
|
13
|
+
* the target page (the chat you're looking at) — otherwise shows it with an
|
|
14
|
+
* in-place-navigate click handler.
|
|
15
|
+
* • The SW's `notificationclick` reuses an already-open page (see wrapWithAssets).
|
|
14
16
|
*
|
|
15
|
-
* SSR-safe:
|
|
16
|
-
* thread or where the APIs are missing.
|
|
17
|
+
* SSR-safe: no-ops off the main thread / where the APIs are missing.
|
|
17
18
|
*/
|
|
18
19
|
export type WebPushPermission = 'granted' | 'denied' | 'default' | 'unsupported';
|
|
19
|
-
export
|
|
20
|
+
export interface FirebaseWebConfig {
|
|
21
|
+
apiKey: string;
|
|
22
|
+
authDomain?: string;
|
|
23
|
+
projectId: string;
|
|
24
|
+
messagingSenderId: string;
|
|
25
|
+
appId: string;
|
|
26
|
+
storageBucket?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface RegisterFirebaseWebPushOptions {
|
|
29
|
+
config: FirebaseWebConfig;
|
|
30
|
+
/** Firebase "Web Push certificate" key (the VAPID public key from the console). */
|
|
31
|
+
vapidKey: string;
|
|
32
|
+
/** Optional: navigate in-place when a foreground notification is clicked. */
|
|
33
|
+
onNavigate?: (url: string) => void;
|
|
34
|
+
}
|
|
20
35
|
export interface WebPushResult {
|
|
21
|
-
/**
|
|
22
|
-
|
|
36
|
+
/** FCM web token to store server-side (gcmTokens), or null. */
|
|
37
|
+
token: string | null;
|
|
23
38
|
permission: WebPushPermission;
|
|
24
39
|
error?: string;
|
|
25
40
|
}
|
|
41
|
+
export declare function getWebPushPermission(): WebPushPermission;
|
|
26
42
|
/**
|
|
27
|
-
* Register
|
|
28
|
-
*
|
|
29
|
-
* permission prompt to show on most browsers.
|
|
43
|
+
* Register for FCM web push. Must be called from a user gesture for the
|
|
44
|
+
* permission prompt to show. Returns the FCM web token (store it in gcmTokens).
|
|
30
45
|
*/
|
|
31
|
-
export declare function
|
|
46
|
+
export declare function registerFirebaseWebPush(opts: RegisterFirebaseWebPushOptions): Promise<WebPushResult>;
|
|
32
47
|
//# sourceMappingURL=webPush.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webPush.d.ts","sourceRoot":"","sources":["../../src/client/webPush.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"webPush.d.ts","sourceRoot":"","sources":["../../src/client/webPush.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,aAAa,CAAC;AAEjF,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,8BAA8B;IAC7C,MAAM,EAAE,iBAAiB,CAAC;IAC1B,mFAAmF;IACnF,QAAQ,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,aAAa;IAC5B,+DAA+D;IAC/D,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAaD,wBAAgB,oBAAoB,IAAI,iBAAiB,CAGxD;AAiCD;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,8BAA8B,GAAG,OAAO,CAAC,aAAa,CAAC,CAyC1G"}
|
package/dist/client/webPush.js
CHANGED
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* FCM web push registration (the single push mechanism — matches native FCM).
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
4
|
+
* Loads the Firebase compat SDK from the CDN on demand (no npm dependency / no
|
|
5
|
+
* bundle bloat — only fetched when a user actually registers), registers the
|
|
6
|
+
* framework's Firebase service worker (`/ugly-push-sw.js`, served by
|
|
7
|
+
* `wrapWithAssets`), and returns an FCM web token via `getToken`. The caller
|
|
8
|
+
* stores that token server-side (e.g. ugly.bot `userPrivateAddSubscription` →
|
|
9
|
+
* `userPrivate.gcmTokens`) so `deliverPushToUserDevices` can reach this browser.
|
|
9
10
|
*
|
|
10
|
-
*
|
|
11
|
-
* `
|
|
12
|
-
*
|
|
13
|
-
*
|
|
11
|
+
* Behaviors ported from the monolith:
|
|
12
|
+
* • Foreground `onMessage` SUPPRESSES the notification when you're already on
|
|
13
|
+
* the target page (the chat you're looking at) — otherwise shows it with an
|
|
14
|
+
* in-place-navigate click handler.
|
|
15
|
+
* • The SW's `notificationclick` reuses an already-open page (see wrapWithAssets).
|
|
14
16
|
*
|
|
15
|
-
* SSR-safe:
|
|
16
|
-
* thread or where the APIs are missing.
|
|
17
|
+
* SSR-safe: no-ops off the main thread / where the APIs are missing.
|
|
17
18
|
*/
|
|
19
|
+
const FIREBASE_VERSION = '12.2.1';
|
|
18
20
|
function supported() {
|
|
19
21
|
return (typeof window !== 'undefined' &&
|
|
20
22
|
'serviceWorker' in navigator &&
|
|
@@ -26,36 +28,41 @@ export function getWebPushPermission() {
|
|
|
26
28
|
return 'unsupported';
|
|
27
29
|
return Notification.permission;
|
|
28
30
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
31
|
+
function loadScript(src) {
|
|
32
|
+
return new Promise((resolve, reject) => {
|
|
33
|
+
if (document.querySelector(`script[src="${src}"]`))
|
|
34
|
+
return resolve();
|
|
35
|
+
const s = document.createElement('script');
|
|
36
|
+
s.src = src;
|
|
37
|
+
s.onload = () => resolve();
|
|
38
|
+
s.onerror = () => reject(new Error('failed to load ' + src));
|
|
39
|
+
document.head.appendChild(s);
|
|
40
|
+
});
|
|
38
41
|
}
|
|
39
|
-
function
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
42
|
+
async function loadFirebase() {
|
|
43
|
+
const w = window;
|
|
44
|
+
if (w.firebase?.messaging)
|
|
45
|
+
return w.firebase;
|
|
46
|
+
await loadScript(`https://www.gstatic.com/firebasejs/${FIREBASE_VERSION}/firebase-app-compat.js`);
|
|
47
|
+
await loadScript(`https://www.gstatic.com/firebasejs/${FIREBASE_VERSION}/firebase-messaging-compat.js`);
|
|
48
|
+
if (!w.firebase)
|
|
49
|
+
throw new Error('firebase SDK failed to load');
|
|
50
|
+
return w.firebase;
|
|
47
51
|
}
|
|
48
52
|
/**
|
|
49
|
-
* Register
|
|
50
|
-
*
|
|
51
|
-
* permission prompt to show on most browsers.
|
|
53
|
+
* Register for FCM web push. Must be called from a user gesture for the
|
|
54
|
+
* permission prompt to show. Returns the FCM web token (store it in gcmTokens).
|
|
52
55
|
*/
|
|
53
|
-
export async function
|
|
56
|
+
export async function registerFirebaseWebPush(opts) {
|
|
54
57
|
if (!supported())
|
|
55
|
-
return {
|
|
56
|
-
if (!
|
|
57
|
-
return {
|
|
58
|
+
return { token: null, permission: 'unsupported', error: 'unsupported' };
|
|
59
|
+
if (!opts.config?.apiKey || !opts.vapidKey) {
|
|
60
|
+
return { token: null, permission: getWebPushPermission(), error: 'missing Firebase config / VAPID key' };
|
|
61
|
+
}
|
|
58
62
|
try {
|
|
63
|
+
const firebase = await loadFirebase();
|
|
64
|
+
if (!firebase.apps.length)
|
|
65
|
+
firebase.initializeApp(opts.config);
|
|
59
66
|
const reg = (await navigator.serviceWorker.getRegistration('/')) ??
|
|
60
67
|
(await navigator.serviceWorker.register('/ugly-push-sw.js', { scope: '/' }));
|
|
61
68
|
await navigator.serviceWorker.ready;
|
|
@@ -63,25 +70,31 @@ export async function webPushSubscribe(vapidPublicKey) {
|
|
|
63
70
|
if (permission === 'default')
|
|
64
71
|
permission = (await Notification.requestPermission());
|
|
65
72
|
if (permission !== 'granted')
|
|
66
|
-
return {
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
73
|
+
return { token: null, permission, error: 'permission ' + permission };
|
|
74
|
+
const messaging = firebase.messaging();
|
|
75
|
+
// Foreground: SUPPRESS for the page you're already on; else show + navigate.
|
|
76
|
+
messaging.onMessage((payload) => {
|
|
77
|
+
const data = payload.data ?? {};
|
|
78
|
+
const url = data['path'] || data['uri'] || data['url'] || '';
|
|
79
|
+
if (url && window.location.href === url)
|
|
80
|
+
return; // already viewing — skip
|
|
81
|
+
if (typeof Notification !== 'undefined' && payload.notification?.title) {
|
|
82
|
+
const n = new Notification(payload.notification.title, {
|
|
83
|
+
body: payload.notification.body ?? '',
|
|
84
|
+
data,
|
|
85
|
+
});
|
|
86
|
+
n.onclick = () => {
|
|
87
|
+
n.close();
|
|
88
|
+
if (url)
|
|
89
|
+
(opts.onNavigate ?? ((u) => { window.location.href = u; }))(url);
|
|
90
|
+
};
|
|
91
|
+
}
|
|
80
92
|
});
|
|
81
|
-
|
|
93
|
+
const token = await messaging.getToken({ vapidKey: opts.vapidKey, serviceWorkerRegistration: reg });
|
|
94
|
+
return { token: token || null, permission: 'granted' };
|
|
82
95
|
}
|
|
83
96
|
catch (err) {
|
|
84
|
-
return {
|
|
97
|
+
return { token: null, permission: getWebPushPermission(), error: err?.message ?? 'register failed' };
|
|
85
98
|
}
|
|
86
99
|
}
|
|
87
100
|
//# sourceMappingURL=webPush.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webPush.js","sourceRoot":"","sources":["../../src/client/webPush.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"webPush.js","sourceRoot":"","sources":["../../src/client/webPush.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrapWithAssets.d.ts","sourceRoot":"","sources":["../../../../src/server/adapter/workers/wrapWithAssets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGxD,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;CACjB;
|
|
1
|
+
{"version":3,"file":"wrapWithAssets.d.ts","sourceRoot":"","sources":["../../../../src/server/adapter/workers/wrapWithAssets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGxD,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;CACjB;AAsLD,wBAAgB,cAAc,CAC5B,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,YAAY,GACnB,UAAU,CAiJZ"}
|
|
@@ -32,31 +32,55 @@ import { getAppContext } from './createWorkersApp.js';
|
|
|
32
32
|
const ASSET_CACHE_CONTROL = 'public, max-age=31536000, immutable';
|
|
33
33
|
const HTML_CACHE_CONTROL = 'no-cache, no-store, must-revalidate';
|
|
34
34
|
// Web-push service worker, served same-origin at `/ugly-push-sw.js` with
|
|
35
|
-
// `Service-Worker-Allowed:
|
|
36
|
-
// (
|
|
37
|
-
//
|
|
38
|
-
//
|
|
39
|
-
|
|
35
|
+
// `Service-Worker-Allowed: /`. FCM web push (Firebase) — the single push
|
|
36
|
+
// mechanism (matches native FCM): the page registers it via `getToken`. The SW
|
|
37
|
+
// owns BACKGROUND behavior; the foreground page suppresses notifications for the
|
|
38
|
+
// chat you're already viewing (see the client `onMessage` handler).
|
|
39
|
+
//
|
|
40
|
+
// Two behaviors ported from the monolith service worker:
|
|
41
|
+
// • `notificationclick` REUSES an already-open page — focus the tab whose URL
|
|
42
|
+
// matches the deep link; else focus any open tab + postMessage so the SPA
|
|
43
|
+
// navigates in-place (no reload); else open a new window.
|
|
44
|
+
// • background messages show the notification (foreground suppression is the
|
|
45
|
+
// page's job — it knows which chat is on screen).
|
|
46
|
+
//
|
|
47
|
+
// Firebase web config (public) is injected from the worker's FIREBASE_* env.
|
|
48
|
+
function buildPushServiceWorker(env) {
|
|
49
|
+
const cfg = {
|
|
50
|
+
apiKey: env['FIREBASE_API_KEY'] ?? '',
|
|
51
|
+
authDomain: env['FIREBASE_AUTH_DOMAIN'] ?? '',
|
|
52
|
+
projectId: env['FIREBASE_PROJECT_ID'] ?? '',
|
|
53
|
+
storageBucket: env['FIREBASE_STORAGE_BUCKET'] ?? '',
|
|
54
|
+
messagingSenderId: env['FIREBASE_MESSAGING_SENDER_ID'] ?? '',
|
|
55
|
+
appId: env['FIREBASE_APP_ID'] ?? '',
|
|
56
|
+
};
|
|
57
|
+
return `importScripts('https://www.gstatic.com/firebasejs/12.2.1/firebase-app-compat.js');
|
|
58
|
+
importScripts('https://www.gstatic.com/firebasejs/12.2.1/firebase-messaging-compat.js');
|
|
40
59
|
self.addEventListener('install', function(){ self.skipWaiting(); });
|
|
41
60
|
self.addEventListener('activate', function(e){ e.waitUntil(self.clients.claim()); });
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
try { p = event.data ? event.data.json() : {}; } catch (e) { try { p = { body: event.data && event.data.text() }; } catch (e2) {} }
|
|
45
|
-
var title = p.title || 'Notification';
|
|
46
|
-
var opts = { body: p.body || '', data: p.data || {}, requireInteraction: true };
|
|
47
|
-
if (p.icon) opts.icon = p.icon;
|
|
48
|
-
event.waitUntil(self.registration.showNotification(title, opts));
|
|
49
|
-
});
|
|
61
|
+
|
|
62
|
+
// notificationclick — reuse an already-open page (monolith parity).
|
|
50
63
|
self.addEventListener('notificationclick', function(event){
|
|
51
|
-
var
|
|
52
|
-
var
|
|
64
|
+
var nd = event.notification.data || {};
|
|
65
|
+
var data = (nd.FCM_MSG && nd.FCM_MSG.data) ? nd.FCM_MSG.data : nd;
|
|
66
|
+
var url = data.path || data.uri || data.url || '/';
|
|
53
67
|
event.notification.close();
|
|
54
|
-
event.waitUntil(self.clients.matchAll({ type: 'window'
|
|
68
|
+
event.waitUntil(self.clients.matchAll({ includeUncontrolled: true, type: 'window' }).then(function(list){
|
|
55
69
|
for (var i = 0; i < list.length; i++) { if (list[i].url === url && 'focus' in list[i]) return list[i].focus(); }
|
|
70
|
+
var c = list[0];
|
|
71
|
+
if (c) { c.focus(); try { c.postMessage({ func: 'appNotificationClick', data: data }); } catch (e) {} return; }
|
|
56
72
|
if (self.clients.openWindow) return self.clients.openWindow(url);
|
|
57
73
|
}));
|
|
58
74
|
});
|
|
75
|
+
|
|
76
|
+
firebase.initializeApp(${JSON.stringify(cfg)});
|
|
77
|
+
firebase.messaging().onBackgroundMessage(function(payload){
|
|
78
|
+
var n = payload.notification || {};
|
|
79
|
+
var data = payload.data || {};
|
|
80
|
+
self.registration.showNotification(n.title || 'Notification', { body: n.body || '', data: data, requireInteraction: true });
|
|
81
|
+
});
|
|
59
82
|
`;
|
|
83
|
+
}
|
|
60
84
|
function guessContentType(path) {
|
|
61
85
|
const lower = path.toLowerCase();
|
|
62
86
|
if (lower.endsWith('.js') || lower.endsWith('.mjs')) {
|
|
@@ -192,7 +216,7 @@ export function wrapWithAssets(base, config) {
|
|
|
192
216
|
// ── 0. Web-push service worker (same-origin, root scope) ──────
|
|
193
217
|
// Served before the SPA fallback so it isn't shadowed by the HTML shell.
|
|
194
218
|
if (path === '/ugly-push-sw.js' && (method === 'GET' || method === 'HEAD')) {
|
|
195
|
-
return new Response(
|
|
219
|
+
return new Response(buildPushServiceWorker(env), {
|
|
196
220
|
status: 200,
|
|
197
221
|
headers: {
|
|
198
222
|
'content-type': 'application/javascript; charset=utf-8',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrapWithAssets.js","sourceRoot":"","sources":["../../../../src/server/adapter/workers/wrapWithAssets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAG9D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAgBtD,MAAM,mBAAmB,GAAG,qCAAqC,CAAC;AAClE,MAAM,kBAAkB,GAAG,qCAAqC,CAAC;AAEjE,yEAAyE;AACzE,
|
|
1
|
+
{"version":3,"file":"wrapWithAssets.js","sourceRoot":"","sources":["../../../../src/server/adapter/workers/wrapWithAssets.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ugly-app",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.607",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"comment:files": "Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.",
|
|
6
6
|
"files": [
|
package/src/cli/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Auto-generated by prebuild — do not edit manually
|
|
2
|
-
export const CLI_VERSION = "0.1.
|
|
2
|
+
export const CLI_VERSION = "0.1.607";
|
package/src/client/index.ts
CHANGED
|
@@ -106,8 +106,8 @@ export type { UglyBotSocket } from './uglyBotSocket.js';
|
|
|
106
106
|
export { initAppApi } from './AppApi.js';
|
|
107
107
|
export { bootstrapApp } from './bootstrapApp.js';
|
|
108
108
|
export { captureClientError } from './ErrorLog.js';
|
|
109
|
-
export {
|
|
110
|
-
export type { WebPushResult, WebPushPermission } from './webPush.js';
|
|
109
|
+
export { registerFirebaseWebPush, getWebPushPermission } from './webPush.js';
|
|
110
|
+
export type { WebPushResult, WebPushPermission, FirebaseWebConfig, RegisterFirebaseWebPushOptions } from './webPush.js';
|
|
111
111
|
export {
|
|
112
112
|
clearFeedbackContext,
|
|
113
113
|
getFeedbackContext,
|
package/src/client/webPush.ts
CHANGED
|
@@ -1,23 +1,50 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* FCM web push registration (the single push mechanism — matches native FCM).
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
4
|
+
* Loads the Firebase compat SDK from the CDN on demand (no npm dependency / no
|
|
5
|
+
* bundle bloat — only fetched when a user actually registers), registers the
|
|
6
|
+
* framework's Firebase service worker (`/ugly-push-sw.js`, served by
|
|
7
|
+
* `wrapWithAssets`), and returns an FCM web token via `getToken`. The caller
|
|
8
|
+
* stores that token server-side (e.g. ugly.bot `userPrivateAddSubscription` →
|
|
9
|
+
* `userPrivate.gcmTokens`) so `deliverPushToUserDevices` can reach this browser.
|
|
9
10
|
*
|
|
10
|
-
*
|
|
11
|
-
* `
|
|
12
|
-
*
|
|
13
|
-
*
|
|
11
|
+
* Behaviors ported from the monolith:
|
|
12
|
+
* • Foreground `onMessage` SUPPRESSES the notification when you're already on
|
|
13
|
+
* the target page (the chat you're looking at) — otherwise shows it with an
|
|
14
|
+
* in-place-navigate click handler.
|
|
15
|
+
* • The SW's `notificationclick` reuses an already-open page (see wrapWithAssets).
|
|
14
16
|
*
|
|
15
|
-
* SSR-safe:
|
|
16
|
-
* thread or where the APIs are missing.
|
|
17
|
+
* SSR-safe: no-ops off the main thread / where the APIs are missing.
|
|
17
18
|
*/
|
|
18
19
|
|
|
19
20
|
export type WebPushPermission = 'granted' | 'denied' | 'default' | 'unsupported';
|
|
20
21
|
|
|
22
|
+
export interface FirebaseWebConfig {
|
|
23
|
+
apiKey: string;
|
|
24
|
+
authDomain?: string;
|
|
25
|
+
projectId: string;
|
|
26
|
+
messagingSenderId: string;
|
|
27
|
+
appId: string;
|
|
28
|
+
storageBucket?: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface RegisterFirebaseWebPushOptions {
|
|
32
|
+
config: FirebaseWebConfig;
|
|
33
|
+
/** Firebase "Web Push certificate" key (the VAPID public key from the console). */
|
|
34
|
+
vapidKey: string;
|
|
35
|
+
/** Optional: navigate in-place when a foreground notification is clicked. */
|
|
36
|
+
onNavigate?: (url: string) => void;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface WebPushResult {
|
|
40
|
+
/** FCM web token to store server-side (gcmTokens), or null. */
|
|
41
|
+
token: string | null;
|
|
42
|
+
permission: WebPushPermission;
|
|
43
|
+
error?: string;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const FIREBASE_VERSION = '12.2.1';
|
|
47
|
+
|
|
21
48
|
function supported(): boolean {
|
|
22
49
|
return (
|
|
23
50
|
typeof window !== 'undefined' &&
|
|
@@ -32,41 +59,50 @@ export function getWebPushPermission(): WebPushPermission {
|
|
|
32
59
|
return Notification.permission as WebPushPermission;
|
|
33
60
|
}
|
|
34
61
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
62
|
+
function loadScript(src: string): Promise<void> {
|
|
63
|
+
return new Promise((resolve, reject) => {
|
|
64
|
+
if (document.querySelector(`script[src="${src}"]`)) return resolve();
|
|
65
|
+
const s = document.createElement('script');
|
|
66
|
+
s.src = src;
|
|
67
|
+
s.onload = () => resolve();
|
|
68
|
+
s.onerror = () => reject(new Error('failed to load ' + src));
|
|
69
|
+
document.head.appendChild(s);
|
|
70
|
+
});
|
|
43
71
|
}
|
|
44
72
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
73
|
+
// Firebase compat global (loaded from CDN). Loose typing — we only touch a small
|
|
74
|
+
// surface (initializeApp / messaging / getToken / onMessage).
|
|
75
|
+
interface FirebaseGlobal {
|
|
76
|
+
apps: unknown[];
|
|
77
|
+
initializeApp: (cfg: FirebaseWebConfig) => void;
|
|
78
|
+
messaging: () => {
|
|
79
|
+
getToken: (opts: { vapidKey: string; serviceWorkerRegistration: ServiceWorkerRegistration }) => Promise<string>;
|
|
80
|
+
onMessage: (cb: (payload: { notification?: { title?: string; body?: string }; data?: Record<string, string> }) => void) => void;
|
|
81
|
+
};
|
|
51
82
|
}
|
|
52
83
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
84
|
+
async function loadFirebase(): Promise<FirebaseGlobal> {
|
|
85
|
+
const w = window as unknown as { firebase?: FirebaseGlobal };
|
|
86
|
+
if (w.firebase?.messaging) return w.firebase;
|
|
87
|
+
await loadScript(`https://www.gstatic.com/firebasejs/${FIREBASE_VERSION}/firebase-app-compat.js`);
|
|
88
|
+
await loadScript(`https://www.gstatic.com/firebasejs/${FIREBASE_VERSION}/firebase-messaging-compat.js`);
|
|
89
|
+
if (!w.firebase) throw new Error('firebase SDK failed to load');
|
|
90
|
+
return w.firebase;
|
|
58
91
|
}
|
|
59
92
|
|
|
60
93
|
/**
|
|
61
|
-
* Register
|
|
62
|
-
*
|
|
63
|
-
* permission prompt to show on most browsers.
|
|
94
|
+
* Register for FCM web push. Must be called from a user gesture for the
|
|
95
|
+
* permission prompt to show. Returns the FCM web token (store it in gcmTokens).
|
|
64
96
|
*/
|
|
65
|
-
export async function
|
|
66
|
-
if (!supported()) return {
|
|
67
|
-
if (!
|
|
68
|
-
|
|
97
|
+
export async function registerFirebaseWebPush(opts: RegisterFirebaseWebPushOptions): Promise<WebPushResult> {
|
|
98
|
+
if (!supported()) return { token: null, permission: 'unsupported', error: 'unsupported' };
|
|
99
|
+
if (!opts.config?.apiKey || !opts.vapidKey) {
|
|
100
|
+
return { token: null, permission: getWebPushPermission(), error: 'missing Firebase config / VAPID key' };
|
|
101
|
+
}
|
|
69
102
|
try {
|
|
103
|
+
const firebase = await loadFirebase();
|
|
104
|
+
if (!firebase.apps.length) firebase.initializeApp(opts.config);
|
|
105
|
+
|
|
70
106
|
const reg =
|
|
71
107
|
(await navigator.serviceWorker.getRegistration('/')) ??
|
|
72
108
|
(await navigator.serviceWorker.register('/ugly-push-sw.js', { scope: '/' }));
|
|
@@ -74,26 +110,29 @@ export async function webPushSubscribe(vapidPublicKey: string): Promise<WebPushR
|
|
|
74
110
|
|
|
75
111
|
let permission = Notification.permission as WebPushPermission;
|
|
76
112
|
if (permission === 'default') permission = (await Notification.requestPermission()) as WebPushPermission;
|
|
77
|
-
if (permission !== 'granted') return {
|
|
113
|
+
if (permission !== 'granted') return { token: null, permission, error: 'permission ' + permission };
|
|
78
114
|
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
115
|
+
const messaging = firebase.messaging();
|
|
116
|
+
// Foreground: SUPPRESS for the page you're already on; else show + navigate.
|
|
117
|
+
messaging.onMessage((payload) => {
|
|
118
|
+
const data = payload.data ?? {};
|
|
119
|
+
const url = data['path'] || data['uri'] || data['url'] || '';
|
|
120
|
+
if (url && window.location.href === url) return; // already viewing — skip
|
|
121
|
+
if (typeof Notification !== 'undefined' && payload.notification?.title) {
|
|
122
|
+
const n = new Notification(payload.notification.title, {
|
|
123
|
+
body: payload.notification.body ?? '',
|
|
124
|
+
data,
|
|
125
|
+
});
|
|
126
|
+
n.onclick = () => {
|
|
127
|
+
n.close();
|
|
128
|
+
if (url) (opts.onNavigate ?? ((u: string) => { window.location.href = u; }))(url);
|
|
129
|
+
};
|
|
130
|
+
}
|
|
94
131
|
});
|
|
95
|
-
|
|
132
|
+
|
|
133
|
+
const token = await messaging.getToken({ vapidKey: opts.vapidKey, serviceWorkerRegistration: reg });
|
|
134
|
+
return { token: token || null, permission: 'granted' };
|
|
96
135
|
} catch (err) {
|
|
97
|
-
return {
|
|
136
|
+
return { token: null, permission: getWebPushPermission(), error: (err as Error)?.message ?? 'register failed' };
|
|
98
137
|
}
|
|
99
138
|
}
|
|
@@ -53,31 +53,55 @@ const ASSET_CACHE_CONTROL = 'public, max-age=31536000, immutable';
|
|
|
53
53
|
const HTML_CACHE_CONTROL = 'no-cache, no-store, must-revalidate';
|
|
54
54
|
|
|
55
55
|
// Web-push service worker, served same-origin at `/ugly-push-sw.js` with
|
|
56
|
-
// `Service-Worker-Allowed:
|
|
57
|
-
// (
|
|
58
|
-
//
|
|
59
|
-
//
|
|
60
|
-
|
|
56
|
+
// `Service-Worker-Allowed: /`. FCM web push (Firebase) — the single push
|
|
57
|
+
// mechanism (matches native FCM): the page registers it via `getToken`. The SW
|
|
58
|
+
// owns BACKGROUND behavior; the foreground page suppresses notifications for the
|
|
59
|
+
// chat you're already viewing (see the client `onMessage` handler).
|
|
60
|
+
//
|
|
61
|
+
// Two behaviors ported from the monolith service worker:
|
|
62
|
+
// • `notificationclick` REUSES an already-open page — focus the tab whose URL
|
|
63
|
+
// matches the deep link; else focus any open tab + postMessage so the SPA
|
|
64
|
+
// navigates in-place (no reload); else open a new window.
|
|
65
|
+
// • background messages show the notification (foreground suppression is the
|
|
66
|
+
// page's job — it knows which chat is on screen).
|
|
67
|
+
//
|
|
68
|
+
// Firebase web config (public) is injected from the worker's FIREBASE_* env.
|
|
69
|
+
function buildPushServiceWorker(env: Record<string, string | undefined>): string {
|
|
70
|
+
const cfg = {
|
|
71
|
+
apiKey: env['FIREBASE_API_KEY'] ?? '',
|
|
72
|
+
authDomain: env['FIREBASE_AUTH_DOMAIN'] ?? '',
|
|
73
|
+
projectId: env['FIREBASE_PROJECT_ID'] ?? '',
|
|
74
|
+
storageBucket: env['FIREBASE_STORAGE_BUCKET'] ?? '',
|
|
75
|
+
messagingSenderId: env['FIREBASE_MESSAGING_SENDER_ID'] ?? '',
|
|
76
|
+
appId: env['FIREBASE_APP_ID'] ?? '',
|
|
77
|
+
};
|
|
78
|
+
return `importScripts('https://www.gstatic.com/firebasejs/12.2.1/firebase-app-compat.js');
|
|
79
|
+
importScripts('https://www.gstatic.com/firebasejs/12.2.1/firebase-messaging-compat.js');
|
|
61
80
|
self.addEventListener('install', function(){ self.skipWaiting(); });
|
|
62
81
|
self.addEventListener('activate', function(e){ e.waitUntil(self.clients.claim()); });
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
try { p = event.data ? event.data.json() : {}; } catch (e) { try { p = { body: event.data && event.data.text() }; } catch (e2) {} }
|
|
66
|
-
var title = p.title || 'Notification';
|
|
67
|
-
var opts = { body: p.body || '', data: p.data || {}, requireInteraction: true };
|
|
68
|
-
if (p.icon) opts.icon = p.icon;
|
|
69
|
-
event.waitUntil(self.registration.showNotification(title, opts));
|
|
70
|
-
});
|
|
82
|
+
|
|
83
|
+
// notificationclick — reuse an already-open page (monolith parity).
|
|
71
84
|
self.addEventListener('notificationclick', function(event){
|
|
72
|
-
var
|
|
73
|
-
var
|
|
85
|
+
var nd = event.notification.data || {};
|
|
86
|
+
var data = (nd.FCM_MSG && nd.FCM_MSG.data) ? nd.FCM_MSG.data : nd;
|
|
87
|
+
var url = data.path || data.uri || data.url || '/';
|
|
74
88
|
event.notification.close();
|
|
75
|
-
event.waitUntil(self.clients.matchAll({ type: 'window'
|
|
89
|
+
event.waitUntil(self.clients.matchAll({ includeUncontrolled: true, type: 'window' }).then(function(list){
|
|
76
90
|
for (var i = 0; i < list.length; i++) { if (list[i].url === url && 'focus' in list[i]) return list[i].focus(); }
|
|
91
|
+
var c = list[0];
|
|
92
|
+
if (c) { c.focus(); try { c.postMessage({ func: 'appNotificationClick', data: data }); } catch (e) {} return; }
|
|
77
93
|
if (self.clients.openWindow) return self.clients.openWindow(url);
|
|
78
94
|
}));
|
|
79
95
|
});
|
|
96
|
+
|
|
97
|
+
firebase.initializeApp(${JSON.stringify(cfg)});
|
|
98
|
+
firebase.messaging().onBackgroundMessage(function(payload){
|
|
99
|
+
var n = payload.notification || {};
|
|
100
|
+
var data = payload.data || {};
|
|
101
|
+
self.registration.showNotification(n.title || 'Notification', { body: n.body || '', data: data, requireInteraction: true });
|
|
102
|
+
});
|
|
80
103
|
`;
|
|
104
|
+
}
|
|
81
105
|
|
|
82
106
|
function guessContentType(path: string): string {
|
|
83
107
|
const lower = path.toLowerCase();
|
|
@@ -225,7 +249,7 @@ export function wrapWithAssets(
|
|
|
225
249
|
// ── 0. Web-push service worker (same-origin, root scope) ──────
|
|
226
250
|
// Served before the SPA fallback so it isn't shadowed by the HTML shell.
|
|
227
251
|
if (path === '/ugly-push-sw.js' && (method === 'GET' || method === 'HEAD')) {
|
|
228
|
-
return new Response(
|
|
252
|
+
return new Response(buildPushServiceWorker(env as unknown as Record<string, string | undefined>), {
|
|
229
253
|
status: 200,
|
|
230
254
|
headers: {
|
|
231
255
|
'content-type': 'application/javascript; charset=utf-8',
|