@thewhateverapp/tile-sdk 0.3.1 → 0.3.3
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.
|
@@ -33,6 +33,10 @@ export declare class TileBridge {
|
|
|
33
33
|
private handleResponse;
|
|
34
34
|
private handleEvent;
|
|
35
35
|
private handleNavigate;
|
|
36
|
+
/**
|
|
37
|
+
* Notify parent that navigation has completed
|
|
38
|
+
*/
|
|
39
|
+
private notifyNavigationComplete;
|
|
36
40
|
private sendToParent;
|
|
37
41
|
/**
|
|
38
42
|
* Request to navigate to full page view
|
|
@@ -107,6 +111,7 @@ export declare class TileBridge {
|
|
|
107
111
|
private isDevelopment;
|
|
108
112
|
private isPreview;
|
|
109
113
|
private isInIframe;
|
|
114
|
+
private isValidOrigin;
|
|
110
115
|
}
|
|
111
116
|
export declare function getTileBridge(): TileBridge;
|
|
112
117
|
//# sourceMappingURL=TileBridge.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TileBridge.d.ts","sourceRoot":"","sources":["../../src/bridge/TileBridge.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,gBAAgB,CAAmD;IAC3E,OAAO,CAAC,aAAa,CAAoD;IACzE,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,YAAY,CAAS;gBAEjB,cAAc,GAAE,MAAkC;IA4B9D,OAAO,CAAC,UAAU;IAuBlB,OAAO,CAAC,aAAa;IAyCrB,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,cAAc;
|
|
1
|
+
{"version":3,"file":"TileBridge.d.ts","sourceRoot":"","sources":["../../src/bridge/TileBridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -53,7 +53,7 @@ export class TileBridge {
|
|
|
53
53
|
}
|
|
54
54
|
handleMessage(event) {
|
|
55
55
|
// Validate origin (skip validation in dev and preview)
|
|
56
|
-
if (event.origin
|
|
56
|
+
if (!this.isValidOrigin(event.origin) && !this.isDevelopment() && !this.isPreview()) {
|
|
57
57
|
console.warn('[TileBridge] Received message from untrusted origin:', event.origin, 'expected:', this.parentOrigin);
|
|
58
58
|
return;
|
|
59
59
|
}
|
|
@@ -128,6 +128,25 @@ export class TileBridge {
|
|
|
128
128
|
// Trigger a popstate event to notify the app
|
|
129
129
|
window.dispatchEvent(new PopStateEvent('popstate', { state: {} }));
|
|
130
130
|
}
|
|
131
|
+
// Wait for navigation to complete, then notify parent
|
|
132
|
+
// Use requestAnimationFrame + timeout to ensure DOM has updated
|
|
133
|
+
requestAnimationFrame(() => {
|
|
134
|
+
setTimeout(() => {
|
|
135
|
+
this.notifyNavigationComplete(route);
|
|
136
|
+
}, 50); // Small delay to ensure Next.js has finished mounting
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Notify parent that navigation has completed
|
|
141
|
+
*/
|
|
142
|
+
notifyNavigationComplete(route) {
|
|
143
|
+
if (this.isDevelopment() || this.isPreview()) {
|
|
144
|
+
console.log('[TileBridge] 📍 Navigation complete:', route);
|
|
145
|
+
}
|
|
146
|
+
this.sendToParent({
|
|
147
|
+
type: 'tile:navigation-complete',
|
|
148
|
+
payload: { route },
|
|
149
|
+
});
|
|
131
150
|
}
|
|
132
151
|
sendToParent(message) {
|
|
133
152
|
if (typeof window === 'undefined' || !window.parent)
|
|
@@ -463,6 +482,36 @@ export class TileBridge {
|
|
|
463
482
|
isInIframe() {
|
|
464
483
|
return typeof window !== 'undefined' && window.self !== window.top;
|
|
465
484
|
}
|
|
485
|
+
isValidOrigin(origin) {
|
|
486
|
+
// Accept exact parent origin match
|
|
487
|
+
if (origin === this.parentOrigin) {
|
|
488
|
+
return true;
|
|
489
|
+
}
|
|
490
|
+
// Accept localhost origins (for local development with deployed tiles)
|
|
491
|
+
try {
|
|
492
|
+
const url = new URL(origin);
|
|
493
|
+
if (url.hostname === 'localhost' || url.hostname === '127.0.0.1') {
|
|
494
|
+
return true;
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
catch (e) {
|
|
498
|
+
// Invalid URL, reject
|
|
499
|
+
}
|
|
500
|
+
// Accept messages from deployed apps on Cloudflare Pages (*.pages.dev)
|
|
501
|
+
// This allows apps to communicate with the parent when embedded in iframes
|
|
502
|
+
// TODO: Once all apps are on *.wtvr.app, restrict this to that domain only
|
|
503
|
+
try {
|
|
504
|
+
const url = new URL(origin);
|
|
505
|
+
if (url.hostname.endsWith('.pages.dev')) {
|
|
506
|
+
return true;
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
catch (e) {
|
|
510
|
+
// Invalid URL, reject
|
|
511
|
+
return false;
|
|
512
|
+
}
|
|
513
|
+
return false;
|
|
514
|
+
}
|
|
466
515
|
}
|
|
467
516
|
// Singleton instance
|
|
468
517
|
let bridgeInstance = null;
|