@omg-dev/protocol 0.6.149 → 0.6.151

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,43 @@
1
+ import type { ProjectPreview } from "./project-preview";
2
+ export type PreviewAppIdentity = {
3
+ appId: string;
4
+ projectId: string;
5
+ };
6
+ export type PreviewAuthContext = PreviewAppIdentity & {
7
+ previewUrl: string;
8
+ };
9
+ export type PreviewAppCredential = {
10
+ token: string;
11
+ previewUrl: string;
12
+ };
13
+ export declare const PREVIEW_AUTH_REQUEST = "omg:preview-auth:request";
14
+ export declare const PREVIEW_AUTH_RESPONSE = "omg:preview-auth:response";
15
+ /** Only the scoped app JWT travels to the frame. URL fragments are not sent
16
+ * to Metro, HTTP access logs, or referrers. Keep the metadata for reloads. */
17
+ export declare function authenticatedPreviewUrl(url: string, appId: string, token: string, parentOrigin?: string): string;
18
+ export declare function previewAuthRequest(value: unknown, appId: string): {
19
+ requestId: string;
20
+ appId: string;
21
+ } | null;
22
+ /** The platform's project permissions run before its session mints a token.
23
+ * The runtime checks the same owner/app boundary before accepting that JWT. */
24
+ export declare function mintPreviewAppToken(identity: PreviewAuthContext, options: {
25
+ getAccessToken(): Promise<string | null>;
26
+ fetch?: typeof fetch;
27
+ authOrigin?: string;
28
+ controlPlaneOrigin?: string;
29
+ requestOrigin?: string;
30
+ }): Promise<PreviewAppCredential | null>;
31
+ export declare function previewAppIdentity(preview: Pick<ProjectPreview, "appId" | "projectId">): PreviewAppIdentity | null;
32
+ /** Mint only for the current authenticated frame. A permission check may outlive
33
+ * logout, navigation or a project switch. Recheck authority after it finishes. */
34
+ export declare function renewPreviewAuth(request: {
35
+ requestId: string;
36
+ appId: string;
37
+ }, mint: () => Promise<PreviewAppCredential | null>, isCurrent: () => boolean): Promise<{
38
+ type: typeof PREVIEW_AUTH_RESPONSE;
39
+ requestId: string;
40
+ appId: string;
41
+ token: string | null;
42
+ } | null>;
43
+ //# sourceMappingURL=preview-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-auth.d.ts","sourceRoot":"","sources":["../src/preview-auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,MAAM,kBAAkB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AACtE,MAAM,MAAM,kBAAkB,GAAG,kBAAkB,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAC7E,MAAM,MAAM,oBAAoB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AACzE,eAAO,MAAM,oBAAoB,6BAA6B,CAAC;AAC/D,eAAO,MAAM,qBAAqB,8BAA8B,CAAC;AAEjE;8EAC8E;AAC9E,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,SAAwB,GAAG,MAAM,CAU/H;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAK7G;AAED;+EAC+E;AAC/E,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE;IACP,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GACA,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CA0BtC;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO,GAAG,WAAW,CAAC,GAAG,kBAAkB,GAAG,IAAI,CAElH;AAED;kFACkF;AAClF,wBAAsB,gBAAgB,CACpC,OAAO,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAC7C,IAAI,EAAE,MAAM,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,EAChD,SAAS,EAAE,MAAM,OAAO,GACvB,OAAO,CAAC;IAAE,IAAI,EAAE,OAAO,qBAAqB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAAC,CAKhH"}
@@ -0,0 +1,71 @@
1
+ export const PREVIEW_AUTH_REQUEST = "omg:preview-auth:request";
2
+ export const PREVIEW_AUTH_RESPONSE = "omg:preview-auth:response";
3
+ /** Only the scoped app JWT travels to the frame. URL fragments are not sent
4
+ * to Metro, HTTP access logs, or referrers. Keep the metadata for reloads. */
5
+ export function authenticatedPreviewUrl(url, appId, token, parentOrigin = "https://app.omg.dev") {
6
+ const target = new URL(url);
7
+ const match = /^([a-z0-9]+)-(\d+)(?:-[a-z0-9]+(?:-[a-f0-9]+)?)?\.preview\.(?:omg\.dev|omgs\.app)$/.exec(target.hostname);
8
+ if (target.protocol !== "https:" || target.username || target.password || target.port || !match || Number(match[2]) < 8081 || Number(match[2]) > 8099) {
9
+ throw new Error("App authentication requires a hosted Expo preview");
10
+ }
11
+ const hash = new URLSearchParams(target.hash.slice(1));
12
+ hash.set("__omg_preview_auth", JSON.stringify({ appId, token, parentOrigin }));
13
+ target.hash = hash.toString();
14
+ return target.toString();
15
+ }
16
+ export function previewAuthRequest(value, appId) {
17
+ if (!value || typeof value !== "object")
18
+ return null;
19
+ const data = value;
20
+ if (data.type !== PREVIEW_AUTH_REQUEST || data.appId !== appId || typeof data.requestId !== "string" || !data.requestId || data.requestId.length > 100)
21
+ return null;
22
+ return { requestId: data.requestId, appId };
23
+ }
24
+ /** The platform's project permissions run before its session mints a token.
25
+ * The runtime checks the same owner/app boundary before accepting that JWT. */
26
+ export async function mintPreviewAppToken(identity, options) {
27
+ const fetcher = options.fetch ?? fetch;
28
+ const accessToken = await options.getAccessToken();
29
+ if (!accessToken)
30
+ return null;
31
+ const permission = await fetcher(`${options.controlPlaneOrigin ?? "https://backend.omg.dev"}/api/projects/previewAuthContext`, {
32
+ method: "POST",
33
+ credentials: "omit",
34
+ headers: { "Content-Type": "application/json", Authorization: `Bearer ${accessToken}` },
35
+ body: JSON.stringify(identity),
36
+ });
37
+ if (!permission.ok)
38
+ return null;
39
+ const context = await permission.json();
40
+ if (context.appId !== identity.appId || typeof context.previewUrl !== "string")
41
+ return null;
42
+ // Check the server-selected destination before the scoped credential exists.
43
+ authenticatedPreviewUrl(context.previewUrl, identity.appId, "");
44
+ const source = new URL(identity.previewUrl).hostname.split("-").slice(0, 2).join("-");
45
+ if (new URL(context.previewUrl).hostname.split("-").slice(0, 2).join("-") !== source)
46
+ return null;
47
+ const response = await fetcher(`${options.authOrigin ?? "https://auth.omg.dev"}/token`, {
48
+ method: "POST",
49
+ credentials: "include",
50
+ headers: { "Content-Type": "application/json", ...(options.requestOrigin ? { Origin: options.requestOrigin } : {}) },
51
+ body: JSON.stringify({ appId: identity.appId }),
52
+ });
53
+ if (!response.ok)
54
+ return null;
55
+ const data = await response.json();
56
+ return typeof data.token === "string" ? { token: data.token, previewUrl: context.previewUrl } : null;
57
+ }
58
+ export function previewAppIdentity(preview) {
59
+ return preview.appId && preview.projectId ? { appId: preview.appId, projectId: preview.projectId } : null;
60
+ }
61
+ /** Mint only for the current authenticated frame. A permission check may outlive
62
+ * logout, navigation or a project switch. Recheck authority after it finishes. */
63
+ export async function renewPreviewAuth(request, mint, isCurrent) {
64
+ if (!isCurrent())
65
+ return null;
66
+ const credential = await mint().catch(() => null);
67
+ if (!isCurrent())
68
+ return null;
69
+ return { type: PREVIEW_AUTH_RESPONSE, ...request, token: credential?.token ?? null };
70
+ }
71
+ //# sourceMappingURL=preview-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-auth.js","sourceRoot":"","sources":["../src/preview-auth.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,10 @@ export interface ProjectPreview {
7
7
  visibility: "owner";
8
8
  temporary: true;
9
9
  createdAt: number;
10
+ /** Hosted project identity. Read from .omg/project.json in the session's
11
+ * project. The platform verifies ownership before any token handoff. */
12
+ appId?: string;
13
+ projectId?: string;
10
14
  /** `exps://` link that opens the same live Metro server in Expo Go. */
11
15
  expoGoUrl?: string;
12
16
  /** When the Expo Go link stops working, in epoch milliseconds. */
@@ -120,6 +124,8 @@ export interface SimulatorStreamProvider {
120
124
  export declare const PROJECT_PREVIEW_SIMULATOR_PATH = "/api/project-preview/simulator";
121
125
  /** Message a preview card sends to ask the session agent to start the preview again. */
122
126
  export declare const PROJECT_PREVIEW_RESTART_MESSAGE = "The preview stopped. Restart it: start the development server again and expose it with omg_expose_port. For an Expo app, request a new Expo Go link.";
127
+ /** A rough wait for the card: seconds under 90 s, then whole minutes. */
128
+ export declare function formatWait(ms: number): string;
123
129
  /** One line for the card while level 2 is not ready. Null when the stream shows. */
124
130
  export declare function simulatorStatusText(stream: SimulatorStream): string | null;
125
131
  /** The levels a card offers, in order. "simulator" only when the Computer sends its state. */
@@ -1 +1 @@
1
- {"version":3,"file":"project-preview.d.ts","sourceRoot":"","sources":["../src/project-preview.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project-preview.d.ts","sourceRoot":"","sources":["../src/project-preview.ts"],"names":[],"mappings":"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"}
@@ -8,9 +8,17 @@ const SIMULATOR_PHASE_TEXT = {
8
8
  opening: "Opening your app…",
9
9
  loading_bundle: "Loading your app…",
10
10
  };
11
+ /** A rough wait for the card: seconds under 90 s, then whole minutes. */
12
+ export function formatWait(ms) {
13
+ const s = Math.max(1, Math.round(ms / 1000));
14
+ if (s < 90)
15
+ return `${s} s`;
16
+ const m = Math.round(s / 60);
17
+ return m === 1 ? "1 min" : `${m} min`;
18
+ }
11
19
  /** One line for the card while level 2 is not ready. Null when the stream shows. */
12
20
  export function simulatorStatusText(stream) {
13
- const eta = stream.etaMs && stream.etaMs > 0 ? ` About ${Math.max(1, Math.round(stream.etaMs / 1000))} s.` : "";
21
+ const eta = stream.etaMs && stream.etaMs > 0 ? ` About ${formatWait(stream.etaMs)}.` : "";
14
22
  switch (stream.state) {
15
23
  case "ready": return stream.streamUrl ? null : "Opening the simulator…";
16
24
  case "idle": return "See your app on an iPhone simulator.";
@@ -1 +1 @@
1
- {"version":3,"file":"project-preview.js","sourceRoot":"","sources":["../src/project-preview.ts"],"names":[],"mappings":"AA2HA,oHAAoH;AACpH,MAAM,CAAC,MAAM,8BAA8B,GAAG,gCAAgC,CAAC;AAE/E,wFAAwF;AACxF,MAAM,CAAC,MAAM,+BAA+B,GAC1C,sJAAsJ,CAAC;AAEzJ,MAAM,oBAAoB,GAA0D;IAClF,UAAU,EAAE,kCAAkC;IAC9C,OAAO,EAAE,gCAAgC;IACzC,OAAO,EAAE,mBAAmB;IAC5B,cAAc,EAAE,mBAAmB;CACpC,CAAC;AAEF,oFAAoF;AACpF,MAAM,UAAU,mBAAmB,CAAC,MAAuB;IACzD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAChH,QAAQ,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,KAAK,OAAO,EAAE,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB,CAAC;QACxE,KAAK,MAAM,EAAE,OAAO,sCAAsC,CAAC;QAC3D,KAAK,QAAQ,EAAE,OAAO,2CAA2C,MAAM,CAAC,aAAa,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QAC5G,KAAK,UAAU,EAAE,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,gCAAgC,GAAG,GAAG,EAAE,CAAC;QACxH,KAAK,aAAa,EAAE,OAAO,MAAM,CAAC,OAAO,IAAI,qCAAqC,CAAC;QACnF,KAAK,OAAO,EAAE,OAAO,MAAM,CAAC,OAAO,IAAI,8BAA8B,CAAC;IACxE,CAAC;AACH,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,aAAa,CAAC,QAAmD;IAC/E,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AACjF,CAAC;AAED,sDAAsD;AACtD,MAAM,CAAC,MAAM,mBAAmB,GAAiC;IAC/D,GAAG,EAAE,KAAK;IACV,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,YAAY;CACrB,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAkD;IACjF,OAAO,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;AACzH,CAAC"}
1
+ {"version":3,"file":"project-preview.js","sourceRoot":"","sources":["../src/project-preview.ts"],"names":[],"mappings":"AA+HA,oHAAoH;AACpH,MAAM,CAAC,MAAM,8BAA8B,GAAG,gCAAgC,CAAC;AAE/E,wFAAwF;AACxF,MAAM,CAAC,MAAM,+BAA+B,GAC1C,sJAAsJ,CAAC;AAEzJ,MAAM,oBAAoB,GAA0D;IAClF,UAAU,EAAE,kCAAkC;IAC9C,OAAO,EAAE,gCAAgC;IACzC,OAAO,EAAE,mBAAmB;IAC5B,cAAc,EAAE,mBAAmB;CACpC,CAAC;AAEF,yEAAyE;AACzE,MAAM,UAAU,UAAU,CAAC,EAAU;IACnC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IAC7C,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,GAAG,CAAC,IAAI,CAAC;IAC5B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7B,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;AACxC,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,mBAAmB,CAAC,MAAuB;IACzD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1F,QAAQ,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,KAAK,OAAO,EAAE,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB,CAAC;QACxE,KAAK,MAAM,EAAE,OAAO,sCAAsC,CAAC;QAC3D,KAAK,QAAQ,EAAE,OAAO,2CAA2C,MAAM,CAAC,aAAa,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QAC5G,KAAK,UAAU,EAAE,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,gCAAgC,GAAG,GAAG,EAAE,CAAC;QACxH,KAAK,aAAa,EAAE,OAAO,MAAM,CAAC,OAAO,IAAI,qCAAqC,CAAC;QACnF,KAAK,OAAO,EAAE,OAAO,MAAM,CAAC,OAAO,IAAI,8BAA8B,CAAC;IACxE,CAAC;AACH,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,aAAa,CAAC,QAAmD;IAC/E,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AACjF,CAAC;AAED,sDAAsD;AACtD,MAAM,CAAC,MAAM,mBAAmB,GAAiC;IAC/D,GAAG,EAAE,KAAK;IACV,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,YAAY;CACrB,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAkD;IACjF,OAAO,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;AACzH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@omg-dev/protocol",
3
- "version": "0.6.149",
3
+ "version": "0.6.151",
4
4
  "description": "Typed public protocol for OMG sessions and live streams.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://omg.dev",