@xeonr/renderer-sdk 1.0.4

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,132 @@
1
+ import type { InitPayload, RendererApiAdapter, RendererConfig, RendererScope, RenderingType } from './types.js';
2
+ export interface RendererClientOptions {
3
+ /**
4
+ * Expected origin of the host application.
5
+ * If set, messages from other origins are silently ignored.
6
+ * If omitted, all origins are accepted (suitable for local dev).
7
+ */
8
+ targetOrigin?: string;
9
+ }
10
+ type InitCallback = (payload: InitPayload) => void;
11
+ type ThemeCallback = (theme: 'light' | 'dark') => void;
12
+ type TokenCallback = (token: string, expiresAt: number) => void;
13
+ type NavigateCallback = (path: string) => void;
14
+ /**
15
+ * Client SDK for custom renderers running inside a sandboxed iframe.
16
+ *
17
+ * Usage:
18
+ * ```ts
19
+ * import { RendererClient } from '@xeonr/renderer-sdk';
20
+ *
21
+ * const client = new RendererClient();
22
+ *
23
+ * client.onInit((payload) => {
24
+ * console.log('Received scope:', payload.scope);
25
+ * console.log('Token:', payload.token);
26
+ * // Bootstrap your app here
27
+ * });
28
+ *
29
+ * client.onThemeChange((theme) => {
30
+ * document.documentElement.setAttribute('data-theme', theme);
31
+ * });
32
+ * ```
33
+ */
34
+ export declare class RendererClient {
35
+ private targetOrigin;
36
+ private initCallbacks;
37
+ private themeCallbacks;
38
+ private tokenCallbacks;
39
+ private navigateCallbacks;
40
+ private currentToken;
41
+ private currentTokenExpiresAt;
42
+ private currentScope;
43
+ private currentRenderingType;
44
+ private currentConfig;
45
+ private currentTheme;
46
+ private currentApiBaseUrl;
47
+ private currentPath;
48
+ private listener;
49
+ private hashChangeListener;
50
+ private historyPatched;
51
+ private originalPushState;
52
+ private originalReplaceState;
53
+ private destroyed;
54
+ private suppressHashChange;
55
+ private pendingTokenResolvers;
56
+ private pendingGenerateTokenResolvers;
57
+ private apiAdapter;
58
+ constructor(options?: RendererClientOptions);
59
+ /** Register a callback for when the host sends the init message. */
60
+ onInit(cb: InitCallback): () => void;
61
+ /** Register a callback for host theme changes. */
62
+ onThemeChange(cb: ThemeCallback): () => void;
63
+ /** Register a callback for token refreshes from the host. */
64
+ onTokenRefresh(cb: TokenCallback): () => void;
65
+ /** Register a callback for hash-based navigation changes. */
66
+ onNavigate(cb: NavigateCallback): () => void;
67
+ /** Request the host to open a specific upload. */
68
+ openUpload(uploadId: string): void;
69
+ /** Request a fresh integration access token from the host. */
70
+ requestToken(): void;
71
+ /** Request a fresh token and wait for the response. */
72
+ requestTokenAsync(): Promise<{
73
+ token: string;
74
+ expiresAt: number;
75
+ }>;
76
+ /** Request the host to close this renderer (modal mode). */
77
+ close(): void;
78
+ /**
79
+ * Request the host to prompt the user to generate a long-lived token.
80
+ * The token is displayed to the user but never returned to the renderer.
81
+ * Resolves with `{ accepted: true }` if the user accepts, or `{ accepted: false }` if rejected.
82
+ */
83
+ generateToken(opts: {
84
+ reason: string;
85
+ duration: 'forever' | string;
86
+ }): Promise<{
87
+ accepted: boolean;
88
+ }>;
89
+ /** Get the current integration access token. */
90
+ getToken(): string | null;
91
+ /** Get the token expiry as a Unix timestamp (ms). */
92
+ getTokenExpiresAt(): number | null;
93
+ /** Check if the current token is expired or about to expire (within 30s). */
94
+ isTokenExpired(): boolean;
95
+ /** Get the current scope. */
96
+ getScope(): RendererScope | null;
97
+ /** Get the current rendering type. */
98
+ getRenderingType(): RenderingType | null;
99
+ /** Get the renderer config from config.json. */
100
+ getConfig(): RendererConfig | null;
101
+ /** Get the current theme. */
102
+ getTheme(): 'light' | 'dark';
103
+ /** Get the current hash path (e.g. '/settings/advanced'). */
104
+ getPath(): string;
105
+ /**
106
+ * Returns an API adapter compatible with `getUploadClientWithEnv()` from `@xeonr/uploads-sdk`.
107
+ * Handles authentication and automatic token refresh via the host bridge.
108
+ *
109
+ * ```ts
110
+ * import { getUploadClientWithEnv } from '@xeonr/uploads-sdk/api/base';
111
+ * import { BucketUploadsService } from '@xeonr/uploads-protocol/uplim/api/v1/uploads_pb';
112
+ *
113
+ * const adapter = client.getApiAdapter();
114
+ * const uploadsClient = getUploadClientWithEnv(BucketUploadsService, adapter);
115
+ * ```
116
+ */
117
+ getApiAdapter(): RendererApiAdapter;
118
+ /** Remove all listeners and stop the client. */
119
+ destroy(): void;
120
+ private setup;
121
+ private handleMessage;
122
+ private handleInit;
123
+ private handleThemeUpdate;
124
+ private handleTokenRefresh;
125
+ private handleGenerateTokenResult;
126
+ private getHashPath;
127
+ private onHashChanged;
128
+ private setupHashTracking;
129
+ private postToHost;
130
+ }
131
+ export {};
132
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js ADDED
@@ -0,0 +1,360 @@
1
+ import { isHostMessage } from './protocol.js';
2
+ /**
3
+ * Client SDK for custom renderers running inside a sandboxed iframe.
4
+ *
5
+ * Usage:
6
+ * ```ts
7
+ * import { RendererClient } from '@xeonr/renderer-sdk';
8
+ *
9
+ * const client = new RendererClient();
10
+ *
11
+ * client.onInit((payload) => {
12
+ * console.log('Received scope:', payload.scope);
13
+ * console.log('Token:', payload.token);
14
+ * // Bootstrap your app here
15
+ * });
16
+ *
17
+ * client.onThemeChange((theme) => {
18
+ * document.documentElement.setAttribute('data-theme', theme);
19
+ * });
20
+ * ```
21
+ */
22
+ export class RendererClient {
23
+ targetOrigin;
24
+ initCallbacks = [];
25
+ themeCallbacks = [];
26
+ tokenCallbacks = [];
27
+ navigateCallbacks = [];
28
+ currentToken = null;
29
+ currentTokenExpiresAt = null;
30
+ currentScope = null;
31
+ currentRenderingType = null;
32
+ currentConfig = null;
33
+ currentTheme = 'light';
34
+ currentApiBaseUrl = null;
35
+ currentPath = '/';
36
+ listener = null;
37
+ hashChangeListener = null;
38
+ historyPatched = false;
39
+ originalPushState = null;
40
+ originalReplaceState = null;
41
+ destroyed = false;
42
+ suppressHashChange = false;
43
+ pendingTokenResolvers = [];
44
+ pendingGenerateTokenResolvers = new Map();
45
+ apiAdapter = null;
46
+ constructor(options) {
47
+ this.targetOrigin = options?.targetOrigin ?? '*';
48
+ this.setup();
49
+ }
50
+ // ---------------------------------------------------------------------------
51
+ // Lifecycle
52
+ // ---------------------------------------------------------------------------
53
+ /** Register a callback for when the host sends the init message. */
54
+ onInit(cb) {
55
+ this.initCallbacks.push(cb);
56
+ return () => {
57
+ this.initCallbacks = this.initCallbacks.filter(c => c !== cb);
58
+ };
59
+ }
60
+ // ---------------------------------------------------------------------------
61
+ // Receive from host
62
+ // ---------------------------------------------------------------------------
63
+ /** Register a callback for host theme changes. */
64
+ onThemeChange(cb) {
65
+ this.themeCallbacks.push(cb);
66
+ return () => {
67
+ this.themeCallbacks = this.themeCallbacks.filter(c => c !== cb);
68
+ };
69
+ }
70
+ /** Register a callback for token refreshes from the host. */
71
+ onTokenRefresh(cb) {
72
+ this.tokenCallbacks.push(cb);
73
+ return () => {
74
+ this.tokenCallbacks = this.tokenCallbacks.filter(c => c !== cb);
75
+ };
76
+ }
77
+ /** Register a callback for hash-based navigation changes. */
78
+ onNavigate(cb) {
79
+ this.navigateCallbacks.push(cb);
80
+ return () => {
81
+ this.navigateCallbacks = this.navigateCallbacks.filter(c => c !== cb);
82
+ };
83
+ }
84
+ // ---------------------------------------------------------------------------
85
+ // Send to host
86
+ // ---------------------------------------------------------------------------
87
+ /** Request the host to open a specific upload. */
88
+ openUpload(uploadId) {
89
+ this.postToHost({ type: 'uplim:openUpload', uploadId });
90
+ }
91
+ /** Request a fresh integration access token from the host. */
92
+ requestToken() {
93
+ this.postToHost({ type: 'uplim:tokenRequest' });
94
+ }
95
+ /** Request a fresh token and wait for the response. */
96
+ requestTokenAsync() {
97
+ return new Promise((resolve) => {
98
+ this.pendingTokenResolvers.push(resolve);
99
+ this.postToHost({ type: 'uplim:tokenRequest' });
100
+ });
101
+ }
102
+ /** Request the host to close this renderer (modal mode). */
103
+ close() {
104
+ this.postToHost({ type: 'uplim:close' });
105
+ }
106
+ /**
107
+ * Request the host to prompt the user to generate a long-lived token.
108
+ * The token is displayed to the user but never returned to the renderer.
109
+ * Resolves with `{ accepted: true }` if the user accepts, or `{ accepted: false }` if rejected.
110
+ */
111
+ generateToken(opts) {
112
+ const requestId = crypto.randomUUID();
113
+ return new Promise((resolve, reject) => {
114
+ this.pendingGenerateTokenResolvers.set(requestId, { resolve, reject });
115
+ this.postToHost({
116
+ type: 'uplim:generateToken',
117
+ requestId,
118
+ reason: opts.reason,
119
+ duration: opts.duration,
120
+ });
121
+ });
122
+ }
123
+ // ---------------------------------------------------------------------------
124
+ // Getters
125
+ // ---------------------------------------------------------------------------
126
+ /** Get the current integration access token. */
127
+ getToken() {
128
+ return this.currentToken;
129
+ }
130
+ /** Get the token expiry as a Unix timestamp (ms). */
131
+ getTokenExpiresAt() {
132
+ return this.currentTokenExpiresAt;
133
+ }
134
+ /** Check if the current token is expired or about to expire (within 30s). */
135
+ isTokenExpired() {
136
+ if (!this.currentTokenExpiresAt)
137
+ return true;
138
+ return Date.now() >= this.currentTokenExpiresAt - 30_000;
139
+ }
140
+ /** Get the current scope. */
141
+ getScope() {
142
+ return this.currentScope;
143
+ }
144
+ /** Get the current rendering type. */
145
+ getRenderingType() {
146
+ return this.currentRenderingType;
147
+ }
148
+ /** Get the renderer config from config.json. */
149
+ getConfig() {
150
+ return this.currentConfig;
151
+ }
152
+ /** Get the current theme. */
153
+ getTheme() {
154
+ return this.currentTheme;
155
+ }
156
+ /** Get the current hash path (e.g. '/settings/advanced'). */
157
+ getPath() {
158
+ return this.currentPath;
159
+ }
160
+ /**
161
+ * Returns an API adapter compatible with `getUploadClientWithEnv()` from `@xeonr/uploads-sdk`.
162
+ * Handles authentication and automatic token refresh via the host bridge.
163
+ *
164
+ * ```ts
165
+ * import { getUploadClientWithEnv } from '@xeonr/uploads-sdk/api/base';
166
+ * import { BucketUploadsService } from '@xeonr/uploads-protocol/uplim/api/v1/uploads_pb';
167
+ *
168
+ * const adapter = client.getApiAdapter();
169
+ * const uploadsClient = getUploadClientWithEnv(BucketUploadsService, adapter);
170
+ * ```
171
+ */
172
+ getApiAdapter() {
173
+ if (this.apiAdapter)
174
+ return this.apiAdapter;
175
+ // Use a getter so hostname reflects the latest apiBaseUrl (set on init)
176
+ const self = this;
177
+ this.apiAdapter = {
178
+ get hostname() { return self.currentApiBaseUrl ?? undefined; },
179
+ tokenHelper: async () => this.currentToken,
180
+ onAuthenticationExpired: async (retryCount) => {
181
+ if (retryCount > 0)
182
+ return false;
183
+ const result = await this.requestTokenAsync();
184
+ return !!result.token;
185
+ },
186
+ };
187
+ return this.apiAdapter;
188
+ }
189
+ // ---------------------------------------------------------------------------
190
+ // Cleanup
191
+ // ---------------------------------------------------------------------------
192
+ /** Remove all listeners and stop the client. */
193
+ destroy() {
194
+ this.destroyed = true;
195
+ if (this.listener) {
196
+ window.removeEventListener('message', this.listener);
197
+ this.listener = null;
198
+ }
199
+ if (this.hashChangeListener) {
200
+ window.removeEventListener('hashchange', this.hashChangeListener);
201
+ this.hashChangeListener = null;
202
+ }
203
+ if (this.historyPatched) {
204
+ if (this.originalPushState)
205
+ window.history.pushState = this.originalPushState;
206
+ if (this.originalReplaceState)
207
+ window.history.replaceState = this.originalReplaceState;
208
+ this.historyPatched = false;
209
+ }
210
+ this.initCallbacks = [];
211
+ this.themeCallbacks = [];
212
+ this.tokenCallbacks = [];
213
+ this.navigateCallbacks = [];
214
+ for (const [, pending] of this.pendingGenerateTokenResolvers) {
215
+ pending.reject(new Error('Client destroyed'));
216
+ }
217
+ this.pendingGenerateTokenResolvers.clear();
218
+ }
219
+ // ---------------------------------------------------------------------------
220
+ // Internal
221
+ // ---------------------------------------------------------------------------
222
+ setup() {
223
+ this.listener = (event) => {
224
+ if (this.destroyed)
225
+ return;
226
+ if (this.targetOrigin !== '*' && event.origin !== this.targetOrigin)
227
+ return;
228
+ if (!isHostMessage(event.data))
229
+ return;
230
+ this.handleMessage(event.data);
231
+ };
232
+ window.addEventListener('message', this.listener);
233
+ // Tell the host we're ready
234
+ this.postToHost({ type: 'uplim:ready' });
235
+ }
236
+ handleMessage(message) {
237
+ switch (message.type) {
238
+ case 'uplim:init':
239
+ this.handleInit(message);
240
+ break;
241
+ case 'uplim:theme':
242
+ this.handleThemeUpdate(message);
243
+ break;
244
+ case 'uplim:token':
245
+ this.handleTokenRefresh(message);
246
+ break;
247
+ case 'uplim:generateTokenResult':
248
+ this.handleGenerateTokenResult(message);
249
+ break;
250
+ case 'uplim:historyBack':
251
+ window.history.back();
252
+ break;
253
+ case 'uplim:historyForward':
254
+ window.history.forward();
255
+ break;
256
+ }
257
+ }
258
+ handleInit(message) {
259
+ const { payload } = message;
260
+ this.currentToken = payload.token;
261
+ this.currentTokenExpiresAt = payload.tokenExpiresAt;
262
+ this.currentScope = payload.scope;
263
+ this.currentRenderingType = payload.renderingType;
264
+ this.currentConfig = payload.config;
265
+ this.currentTheme = payload.theme;
266
+ this.currentApiBaseUrl = payload.apiBaseUrl;
267
+ // Apply initial path from host URL fragment
268
+ if (payload.initialPath) {
269
+ this.suppressHashChange = true;
270
+ window.location.hash = payload.initialPath;
271
+ this.currentPath = payload.initialPath;
272
+ this.suppressHashChange = false;
273
+ }
274
+ else {
275
+ this.currentPath = this.getHashPath();
276
+ }
277
+ // Start observing hash changes
278
+ this.setupHashTracking();
279
+ for (const cb of this.initCallbacks) {
280
+ cb(payload);
281
+ }
282
+ // Tell the host we've processed init and are ready to be displayed
283
+ this.postToHost({ type: 'uplim:ack' });
284
+ }
285
+ handleThemeUpdate(message) {
286
+ this.currentTheme = message.theme;
287
+ for (const cb of this.themeCallbacks) {
288
+ cb(message.theme);
289
+ }
290
+ }
291
+ handleTokenRefresh(message) {
292
+ this.currentToken = message.token;
293
+ this.currentTokenExpiresAt = message.tokenExpiresAt;
294
+ // Resolve any pending requestTokenAsync() calls
295
+ const resolvers = this.pendingTokenResolvers;
296
+ this.pendingTokenResolvers = [];
297
+ for (const resolve of resolvers) {
298
+ resolve({ token: message.token, expiresAt: message.tokenExpiresAt });
299
+ }
300
+ for (const cb of this.tokenCallbacks) {
301
+ cb(message.token, message.tokenExpiresAt);
302
+ }
303
+ }
304
+ handleGenerateTokenResult(message) {
305
+ const pending = this.pendingGenerateTokenResolvers.get(message.requestId);
306
+ if (pending) {
307
+ this.pendingGenerateTokenResolvers.delete(message.requestId);
308
+ pending.resolve({ accepted: message.accepted });
309
+ }
310
+ }
311
+ getHashPath() {
312
+ const hash = window.location.hash;
313
+ if (!hash || hash === '#')
314
+ return '/';
315
+ // Strip leading '#' (and optional leading '#/')
316
+ return hash.startsWith('#/') ? hash.slice(1) : hash.slice(1);
317
+ }
318
+ onHashChanged(isPush) {
319
+ if (this.destroyed || this.suppressHashChange)
320
+ return;
321
+ const newPath = this.getHashPath();
322
+ if (newPath === this.currentPath)
323
+ return;
324
+ this.currentPath = newPath;
325
+ const msg = isPush
326
+ ? { type: 'uplim:historyPush', path: newPath }
327
+ : { type: 'uplim:historyReplace', path: newPath };
328
+ this.postToHost(msg);
329
+ for (const cb of this.navigateCallbacks) {
330
+ cb(newPath);
331
+ }
332
+ }
333
+ setupHashTracking() {
334
+ if (this.hashChangeListener)
335
+ return;
336
+ // Listen for direct hash changes (e.g. window.location.hash = '...' or <a href="#...">)
337
+ this.hashChangeListener = () => this.onHashChanged(true);
338
+ window.addEventListener('hashchange', this.hashChangeListener);
339
+ // Patch pushState/replaceState — hash routers use these instead of setting
340
+ // window.location.hash directly, and they don't fire hashchange.
341
+ this.originalPushState = window.history.pushState.bind(window.history);
342
+ this.originalReplaceState = window.history.replaceState.bind(window.history);
343
+ const self = this;
344
+ window.history.pushState = function (...args) {
345
+ self.originalPushState(...args);
346
+ self.onHashChanged(true);
347
+ };
348
+ window.history.replaceState = function (...args) {
349
+ self.originalReplaceState(...args);
350
+ self.onHashChanged(false);
351
+ };
352
+ this.historyPatched = true;
353
+ }
354
+ postToHost(message) {
355
+ if (this.destroyed)
356
+ return;
357
+ window.parent.postMessage(message, this.targetOrigin);
358
+ }
359
+ }
360
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { RendererClient } from './client.js';
2
+ export type { RendererClientOptions } from './client.js';
3
+ export type { RendererConfig, RendererPermission, RendererScope, RendererBucketScope, RendererFolderScope, RendererUploadScope, RendererVirtualFileScope, RenderingType, InitPayload, RendererApiAdapter, } from './types.js';
4
+ export { MESSAGE_PREFIX, PROTOCOL_VERSION, isRendererMessage, isHostMessage, isIframeMessage, } from './protocol.js';
5
+ export type { HostMessage, HostInitMessage, HostThemeUpdateMessage, HostTokenRefreshMessage, HostGenerateTokenResultMessage, HostHistoryBackMessage, HostHistoryForwardMessage, IframeMessage, IframeReadyMessage, IframeOpenUploadMessage, IframeTokenRequestMessage, IframeCloseMessage, IframeInitAckMessage, IframeGenerateTokenMessage, IframeHistoryPushMessage, IframeHistoryReplaceMessage, RendererMessage, } from './protocol.js';
6
+ //# 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,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAY,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD,YAAY,EACX,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,EACxB,aAAa,EACb,WAAW,EACX,kBAAkB,GAClB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACN,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,eAAe,GACf,MAAM,eAAe,CAAC;AAEvB,YAAY,EACX,WAAW,EACX,eAAe,EACf,sBAAsB,EACtB,uBAAuB,EACvB,8BAA8B,EAC9B,sBAAsB,EACtB,yBAAyB,EACzB,aAAa,EACb,kBAAkB,EAClB,uBAAuB,EACvB,yBAAyB,EACzB,kBAAkB,EAClB,oBAAoB,EACpB,0BAA0B,EAC1B,wBAAwB,EACxB,2BAA2B,EAC3B,eAAe,GACf,MAAM,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { RendererClient } from './client.js';
2
+ export { MESSAGE_PREFIX, PROTOCOL_VERSION, isRendererMessage, isHostMessage, isIframeMessage, } from './protocol.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAgB7C,OAAO,EACN,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,eAAe,GACf,MAAM,eAAe,CAAC"}
@@ -0,0 +1,78 @@
1
+ import type { InitPayload } from './types.js';
2
+ export declare const MESSAGE_PREFIX: "uplim:";
3
+ export declare const PROTOCOL_VERSION: 1;
4
+ /** Sent after the iframe reports 'ready'. Contains everything the renderer needs to bootstrap. */
5
+ export interface HostInitMessage {
6
+ type: 'uplim:init';
7
+ payload: InitPayload;
8
+ }
9
+ /** Sent when the host theme changes. */
10
+ export interface HostThemeUpdateMessage {
11
+ type: 'uplim:theme';
12
+ theme: 'light' | 'dark';
13
+ }
14
+ /** Sent proactively or in response to a token request. */
15
+ export interface HostTokenRefreshMessage {
16
+ type: 'uplim:token';
17
+ token: string;
18
+ tokenExpiresAt: number;
19
+ }
20
+ /** Sent in response to a generateToken request from the iframe. */
21
+ export interface HostGenerateTokenResultMessage {
22
+ type: 'uplim:generateTokenResult';
23
+ requestId: string;
24
+ accepted: boolean;
25
+ }
26
+ /** Tell the iframe to go back in its history. */
27
+ export interface HostHistoryBackMessage {
28
+ type: 'uplim:historyBack';
29
+ }
30
+ /** Tell the iframe to go forward in its history. */
31
+ export interface HostHistoryForwardMessage {
32
+ type: 'uplim:historyForward';
33
+ }
34
+ export type HostMessage = HostInitMessage | HostThemeUpdateMessage | HostTokenRefreshMessage | HostGenerateTokenResultMessage | HostHistoryBackMessage | HostHistoryForwardMessage;
35
+ /** Iframe is loaded and ready to receive the init message. */
36
+ export interface IframeReadyMessage {
37
+ type: 'uplim:ready';
38
+ }
39
+ /** Request the host to open a specific upload (e.g. in a preview modal). */
40
+ export interface IframeOpenUploadMessage {
41
+ type: 'uplim:openUpload';
42
+ uploadId: string;
43
+ }
44
+ /** Request a fresh delegated token. Host responds with HostTokenRefreshMessage. */
45
+ export interface IframeTokenRequestMessage {
46
+ type: 'uplim:tokenRequest';
47
+ }
48
+ /** Request the host to close the renderer (relevant for modal mode). */
49
+ export interface IframeCloseMessage {
50
+ type: 'uplim:close';
51
+ }
52
+ /** Acknowledge that init has been processed and the renderer is ready to be displayed. */
53
+ export interface IframeInitAckMessage {
54
+ type: 'uplim:ack';
55
+ }
56
+ /** Request the host to prompt the user to generate a long-lived token. */
57
+ export interface IframeGenerateTokenMessage {
58
+ type: 'uplim:generateToken';
59
+ requestId: string;
60
+ reason: string;
61
+ duration: 'forever' | string;
62
+ }
63
+ /** Notify the host that the renderer navigated to a new hash path. */
64
+ export interface IframeHistoryPushMessage {
65
+ type: 'uplim:historyPush';
66
+ path: string;
67
+ }
68
+ /** Notify the host that the renderer replaced the current hash path. */
69
+ export interface IframeHistoryReplaceMessage {
70
+ type: 'uplim:historyReplace';
71
+ path: string;
72
+ }
73
+ export type IframeMessage = IframeReadyMessage | IframeOpenUploadMessage | IframeTokenRequestMessage | IframeCloseMessage | IframeInitAckMessage | IframeGenerateTokenMessage | IframeHistoryPushMessage | IframeHistoryReplaceMessage;
74
+ export type RendererMessage = HostMessage | IframeMessage;
75
+ export declare function isRendererMessage(data: unknown): data is RendererMessage;
76
+ export declare function isHostMessage(data: unknown): data is HostMessage;
77
+ export declare function isIframeMessage(data: unknown): data is IframeMessage;
78
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK9C,eAAO,MAAM,cAAc,EAAG,QAAiB,CAAC;AAChD,eAAO,MAAM,gBAAgB,EAAG,CAAU,CAAC;AAM3C,kGAAkG;AAClG,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,WAAW,CAAC;CACrB;AAED,wCAAwC;AACxC,MAAM,WAAW,sBAAsB;IACtC,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;CACxB;AAED,0DAA0D;AAC1D,MAAM,WAAW,uBAAuB;IACvC,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;CACvB;AAED,mEAAmE;AACnE,MAAM,WAAW,8BAA8B;IAC9C,IAAI,EAAE,2BAA2B,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED,iDAAiD;AACjD,MAAM,WAAW,sBAAsB;IACtC,IAAI,EAAE,mBAAmB,CAAC;CAC1B;AAED,oDAAoD;AACpD,MAAM,WAAW,yBAAyB;IACzC,IAAI,EAAE,sBAAsB,CAAC;CAC7B;AAED,MAAM,MAAM,WAAW,GACpB,eAAe,GACf,sBAAsB,GACtB,uBAAuB,GACvB,8BAA8B,GAC9B,sBAAsB,GACtB,yBAAyB,CAAC;AAM7B,8DAA8D;AAC9D,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,aAAa,CAAC;CACpB;AAED,4EAA4E;AAC5E,MAAM,WAAW,uBAAuB;IACvC,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,mFAAmF;AACnF,MAAM,WAAW,yBAAyB;IACzC,IAAI,EAAE,oBAAoB,CAAC;CAC3B;AAED,wEAAwE;AACxE,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,aAAa,CAAC;CACpB;AAED,0FAA0F;AAC1F,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,WAAW,CAAC;CAClB;AAED,0EAA0E;AAC1E,MAAM,WAAW,0BAA0B;IAC1C,IAAI,EAAE,qBAAqB,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,SAAS,GAAG,MAAM,CAAC;CAC7B;AAED,sEAAsE;AACtE,MAAM,WAAW,wBAAwB;IACxC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;CACb;AAED,wEAAwE;AACxE,MAAM,WAAW,2BAA2B;IAC3C,IAAI,EAAE,sBAAsB,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,aAAa,GACtB,kBAAkB,GAClB,uBAAuB,GACvB,yBAAyB,GACzB,kBAAkB,GAClB,oBAAoB,GACpB,0BAA0B,GAC1B,wBAAwB,GACxB,2BAA2B,CAAC;AAK/B,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,aAAa,CAAC;AAK1D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,eAAe,CAQxE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,WAAW,CAIhE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,aAAa,CAGpE"}
@@ -0,0 +1,27 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Message namespace — all messages use this prefix
3
+ // ---------------------------------------------------------------------------
4
+ export const MESSAGE_PREFIX = 'uplim:';
5
+ export const PROTOCOL_VERSION = 1;
6
+ // ---------------------------------------------------------------------------
7
+ // Type guard helpers
8
+ // ---------------------------------------------------------------------------
9
+ export function isRendererMessage(data) {
10
+ return (typeof data === 'object' &&
11
+ data !== null &&
12
+ 'type' in data &&
13
+ typeof data.type === 'string' &&
14
+ data.type.startsWith(MESSAGE_PREFIX));
15
+ }
16
+ export function isHostMessage(data) {
17
+ if (!isRendererMessage(data))
18
+ return false;
19
+ const t = data.type;
20
+ return t === 'uplim:init' || t === 'uplim:theme' || t === 'uplim:token' || t === 'uplim:generateTokenResult' || t === 'uplim:historyBack' || t === 'uplim:historyForward';
21
+ }
22
+ export function isIframeMessage(data) {
23
+ if (!isRendererMessage(data))
24
+ return false;
25
+ return !isHostMessage(data);
26
+ }
27
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAEA,8EAA8E;AAC9E,mDAAmD;AACnD,8EAA8E;AAC9E,MAAM,CAAC,MAAM,cAAc,GAAG,QAAiB,CAAC;AAChD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAU,CAAC;AAmH3C,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAC9E,MAAM,UAAU,iBAAiB,CAAC,IAAa;IAC9C,OAAO,CACN,OAAO,IAAI,KAAK,QAAQ;QACxB,IAAI,KAAK,IAAI;QACb,MAAM,IAAI,IAAI;QACd,OAAQ,IAA0B,CAAC,IAAI,KAAK,QAAQ;QACnD,IAAyB,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAC1D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAa;IAC1C,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;IACpB,OAAO,CAAC,KAAK,YAAY,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,KAAK,2BAA2B,IAAI,CAAC,KAAK,mBAAmB,IAAI,CAAC,KAAK,sBAAsB,CAAC;AAC3K,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAa;IAC5C,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { useRendererClient } from './useRendererClient.js';
2
+ export type { UseRendererClientOptions, UseRendererClientResult } from './useRendererClient.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { useRendererClient } from './useRendererClient.js';
2
+ //# sourceMappingURL=index.js.map