Add public invite session protocol
This commit is contained in:
+152
-3
@@ -20,6 +20,9 @@ export const CONTROL_PLANE_ROUTES = {
|
|||||||
deviceRemove: "/devices/remove",
|
deviceRemove: "/devices/remove",
|
||||||
deviceSession: "/device/session",
|
deviceSession: "/device/session",
|
||||||
deviceSocket: "/device-ws",
|
deviceSocket: "/device-ws",
|
||||||
|
publicInvite: "/public-invite",
|
||||||
|
publicSession: "/public-session",
|
||||||
|
surfaceSession: "/surface-session",
|
||||||
replEval: "/repl/eval",
|
replEval: "/repl/eval",
|
||||||
replClose: "/repl/close",
|
replClose: "/repl/close",
|
||||||
browserSocket: "/ws",
|
browserSocket: "/ws",
|
||||||
@@ -123,6 +126,7 @@ export type ControlPlaneDeviceIdentifyRequest = {
|
|||||||
|
|
||||||
export type ControlPlaneDeviceSessionRequest = {
|
export type ControlPlaneDeviceSessionRequest = {
|
||||||
deviceId: string;
|
deviceId: string;
|
||||||
|
sessionToken: string;
|
||||||
requestedTarget?: ControlPlaneDeviceTarget | null;
|
requestedTarget?: ControlPlaneDeviceTarget | null;
|
||||||
userAgent?: string | null;
|
userAgent?: string | null;
|
||||||
viewport?: ControlPlaneDeviceViewport | null;
|
viewport?: ControlPlaneDeviceViewport | null;
|
||||||
@@ -132,6 +136,56 @@ export type ControlPlaneDeviceSessionResponse = {
|
|||||||
device: ControlPlaneDevice;
|
device: ControlPlaneDevice;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type ControlPlanePublicAccessTarget =
|
||||||
|
| {
|
||||||
|
kind: "device";
|
||||||
|
target?: ControlPlaneDeviceTarget | null;
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
kind: "browser-surface";
|
||||||
|
packageName?: string;
|
||||||
|
stateContextId: string;
|
||||||
|
surfaceId: string;
|
||||||
|
requestFullscreen?: boolean;
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
kind: "remote-dom";
|
||||||
|
packageName?: string;
|
||||||
|
stateContextId: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type ControlPlanePublicInviteRequest = {
|
||||||
|
target: ControlPlanePublicAccessTarget;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type ControlPlanePublicInviteResponse = {
|
||||||
|
inviteToken: string;
|
||||||
|
target: ControlPlanePublicAccessTarget;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type ControlPlanePublicSessionRequest = {
|
||||||
|
inviteToken: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type ControlPlanePublicSessionResponse = {
|
||||||
|
sessionToken: string;
|
||||||
|
target: ControlPlanePublicAccessTarget;
|
||||||
|
expiresAt: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type ControlPlaneSurfaceSessionRequest = {
|
||||||
|
target: Extract<
|
||||||
|
ControlPlanePublicAccessTarget,
|
||||||
|
{ kind: "browser-surface" | "remote-dom" }
|
||||||
|
>;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type ControlPlaneSurfaceSessionResponse = {
|
||||||
|
sessionToken: string;
|
||||||
|
target: ControlPlaneSurfaceSessionRequest["target"];
|
||||||
|
expiresAt: string;
|
||||||
|
};
|
||||||
|
|
||||||
export type ControlPlaneWorkspacePackage = {
|
export type ControlPlaneWorkspacePackage = {
|
||||||
packageName: string;
|
packageName: string;
|
||||||
headCommit: string;
|
headCommit: string;
|
||||||
@@ -290,6 +344,7 @@ export type ControlPlaneBrowserStatusInvalidatedMessage = {
|
|||||||
export type ControlPlaneDeviceSocketConnectMessage = {
|
export type ControlPlaneDeviceSocketConnectMessage = {
|
||||||
type: "device-connect";
|
type: "device-connect";
|
||||||
deviceId: string;
|
deviceId: string;
|
||||||
|
sessionToken: string;
|
||||||
requestedTarget?: ControlPlaneDeviceTarget | null;
|
requestedTarget?: ControlPlaneDeviceTarget | null;
|
||||||
userAgent?: string | null;
|
userAgent?: string | null;
|
||||||
viewport?: ControlPlaneDeviceViewport | null;
|
viewport?: ControlPlaneDeviceViewport | null;
|
||||||
@@ -537,6 +592,9 @@ const isRecord = (value: unknown): value is Record<string, unknown> =>
|
|||||||
|
|
||||||
const isString = (value: unknown): value is string => typeof value === "string";
|
const isString = (value: unknown): value is string => typeof value === "string";
|
||||||
|
|
||||||
|
const isNonEmptyString = (value: unknown): value is string =>
|
||||||
|
typeof value === "string" && value.length > 0;
|
||||||
|
|
||||||
const isNullableString = (value: unknown): value is string | null =>
|
const isNullableString = (value: unknown): value is string | null =>
|
||||||
value === null || typeof value === "string";
|
value === null || typeof value === "string";
|
||||||
|
|
||||||
@@ -629,6 +687,65 @@ export const parseControlPlaneDeviceTarget = (
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const parseControlPlanePublicAccessTarget = (
|
||||||
|
value: unknown,
|
||||||
|
): ControlPlanePublicAccessTarget | null => {
|
||||||
|
if (!isRecord(value) || !isNonEmptyString(value.kind)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (value.kind === "device") {
|
||||||
|
const target =
|
||||||
|
value.target === undefined
|
||||||
|
? undefined
|
||||||
|
: value.target === null
|
||||||
|
? null
|
||||||
|
: parseControlPlaneDeviceTarget(value.target);
|
||||||
|
if (value.target !== undefined && value.target !== null && !target) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
kind: "device",
|
||||||
|
...(target !== undefined ? { target } : {}),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if (value.kind === "browser-surface") {
|
||||||
|
if (
|
||||||
|
!isNonEmptyString(value.stateContextId) ||
|
||||||
|
!isNonEmptyString(value.surfaceId) ||
|
||||||
|
!(value.packageName === undefined || isNonEmptyString(value.packageName)) ||
|
||||||
|
!(
|
||||||
|
value.requestFullscreen === undefined ||
|
||||||
|
typeof value.requestFullscreen === "boolean"
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
kind: "browser-surface",
|
||||||
|
...(value.packageName ? { packageName: value.packageName } : {}),
|
||||||
|
stateContextId: value.stateContextId,
|
||||||
|
surfaceId: value.surfaceId,
|
||||||
|
...(value.requestFullscreen !== undefined
|
||||||
|
? { requestFullscreen: value.requestFullscreen }
|
||||||
|
: {}),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if (value.kind === "remote-dom") {
|
||||||
|
if (
|
||||||
|
!isNonEmptyString(value.stateContextId) ||
|
||||||
|
!(value.packageName === undefined || isNonEmptyString(value.packageName))
|
||||||
|
) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
kind: "remote-dom",
|
||||||
|
...(value.packageName ? { packageName: value.packageName } : {}),
|
||||||
|
stateContextId: value.stateContextId,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
export const parseControlPlaneDevice = (
|
export const parseControlPlaneDevice = (
|
||||||
value: unknown,
|
value: unknown,
|
||||||
): ControlPlaneDevice | null => {
|
): ControlPlaneDevice | null => {
|
||||||
@@ -907,6 +1024,7 @@ export const parseControlPlaneDeviceSessionRequest = (
|
|||||||
if (
|
if (
|
||||||
!isRecord(value) ||
|
!isRecord(value) ||
|
||||||
!isNonEmptyString(value.deviceId) ||
|
!isNonEmptyString(value.deviceId) ||
|
||||||
|
!isNonEmptyString(value.sessionToken) ||
|
||||||
!(
|
!(
|
||||||
value.userAgent === undefined ||
|
value.userAgent === undefined ||
|
||||||
value.userAgent === null ||
|
value.userAgent === null ||
|
||||||
@@ -937,12 +1055,45 @@ export const parseControlPlaneDeviceSessionRequest = (
|
|||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
deviceId: value.deviceId,
|
deviceId: value.deviceId,
|
||||||
|
sessionToken: value.sessionToken,
|
||||||
...(requestedTarget !== undefined ? { requestedTarget } : {}),
|
...(requestedTarget !== undefined ? { requestedTarget } : {}),
|
||||||
userAgent: value.userAgent ?? null,
|
userAgent: value.userAgent ?? null,
|
||||||
viewport,
|
viewport,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const parseControlPlanePublicInviteRequest = (
|
||||||
|
value: unknown,
|
||||||
|
): ControlPlanePublicInviteRequest | null => {
|
||||||
|
if (!isRecord(value)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
const target = parseControlPlanePublicAccessTarget(value.target);
|
||||||
|
return target ? { target } : null;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const parseControlPlanePublicSessionRequest = (
|
||||||
|
value: unknown,
|
||||||
|
): ControlPlanePublicSessionRequest | null => {
|
||||||
|
if (!isRecord(value) || !isNonEmptyString(value.inviteToken)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return { inviteToken: value.inviteToken };
|
||||||
|
};
|
||||||
|
|
||||||
|
export const parseControlPlaneSurfaceSessionRequest = (
|
||||||
|
value: unknown,
|
||||||
|
): ControlPlaneSurfaceSessionRequest | null => {
|
||||||
|
if (!isRecord(value)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
const target = parseControlPlanePublicAccessTarget(value.target);
|
||||||
|
if (!target || target.kind === "device") {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return { target };
|
||||||
|
};
|
||||||
|
|
||||||
export const parseControlPlaneReplEvalRequest = (
|
export const parseControlPlaneReplEvalRequest = (
|
||||||
value: unknown,
|
value: unknown,
|
||||||
): ControlPlaneReplEvalRequest | null => {
|
): ControlPlaneReplEvalRequest | null => {
|
||||||
@@ -985,9 +1136,6 @@ export const parseControlPlaneReplCloseRequest = (
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
const isNonEmptyString = (value: unknown): value is string =>
|
|
||||||
typeof value === "string" && value.length > 0;
|
|
||||||
|
|
||||||
const parseBrowserSubscribeParams = (
|
const parseBrowserSubscribeParams = (
|
||||||
value: unknown,
|
value: unknown,
|
||||||
): ControlPlaneBrowserSubscribeParams | null => {
|
): ControlPlaneBrowserSubscribeParams | null => {
|
||||||
@@ -1027,6 +1175,7 @@ export const parseControlPlaneDeviceSocketClientMessage = (
|
|||||||
return {
|
return {
|
||||||
type: "device-connect",
|
type: "device-connect",
|
||||||
deviceId: parsed.deviceId,
|
deviceId: parsed.deviceId,
|
||||||
|
sessionToken: parsed.sessionToken,
|
||||||
...(parsed.requestedTarget !== undefined
|
...(parsed.requestedTarget !== undefined
|
||||||
? { requestedTarget: parsed.requestedTarget }
|
? { requestedTarget: parsed.requestedTarget }
|
||||||
: {}),
|
: {}),
|
||||||
|
|||||||
Reference in New Issue
Block a user