Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
"workspaces": {
"packages": [
"packages/dev-server",
"packages/editor-preview-protocol",
"packages/terre2",
"packages/origine2"
],
Expand Down
1 change: 1 addition & 0 deletions packages/editor-preview-protocol/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
dist/
16 changes: 16 additions & 0 deletions packages/editor-preview-protocol/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"name": "@webgal/editor-preview-protocol",
"private": true,
"version": "1.0.0",
"license": "MPL-2.0",
"main": "dist/cjs/index.js",
"module": "dist/esm/index.js",
"types": "dist/types/index.d.ts",
"files": [
"dist"
],
"scripts": {
"prebuild": "rimraf dist",
"build": "tsc -p tsconfig.esm.json && tsc -p tsconfig.cjs.json"
}
}
263 changes: 263 additions & 0 deletions packages/editor-preview-protocol/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,263 @@
import type { Transform } from './stage'

export const EDITOR_PREVIEW_PROTOCOL_V1_SUBPROTOCOL =
'webgal-editor-preview-sync.v1' as const;

type EmptyObject = Record<string, never>;

export interface SyncScenePayload {
sceneName: string;
sentenceId: number;
syncMode: 'stable' | 'fast';
}

export interface RunSceneContentPayload {
sceneContent: string;
}

export interface RunSnippetPayload {
snippet: string;
}

export type ReloadTemplatesPayload = EmptyObject;

export interface SetEffectPayload {
target: string;
transform?: Transform;
}

export type SetComponentVisibilityPayload = {
showStarter?: boolean;
showTitle?: boolean;
showMenuPanel?: boolean;
showTextBox?: boolean;
showControls?: boolean;
controlsVisibility?: boolean;
showBacklog?: boolean;
showExtra?: boolean;
showGlobalDialog?: boolean;
showPanicOverlay?: boolean;
isEnterGame?: boolean;
isShowLogo?: boolean;
enableAppreciationMode?: boolean;
fontOptimization?: boolean;
};

export interface SetFontOptimizationPayload {
enabled: boolean;
}

interface PreviewCommandPayloadByType {
'preview.command.sync-scene': SyncScenePayload;
'preview.command.run-scene-content': RunSceneContentPayload;
'preview.command.run-snippet': RunSnippetPayload;
'preview.command.reload-templates': ReloadTemplatesPayload;
'preview.command.set-effect': SetEffectPayload;
'preview.command.set-component-visibility': SetComponentVisibilityPayload;
'preview.command.set-font-optimization': SetFontOptimizationPayload;
}

export type PreviewCommandType = keyof PreviewCommandPayloadByType;

export const PREVIEW_COMMAND_TYPES = [
'preview.command.sync-scene',
'preview.command.run-scene-content',
'preview.command.run-snippet',
'preview.command.reload-templates',
'preview.command.set-effect',
'preview.command.set-component-visibility',
'preview.command.set-font-optimization',
] as const;

export interface PreviewRequestPayloadByType extends PreviewCommandPayloadByType {}

export type PreviewRequestType = keyof PreviewRequestPayloadByType;

const PREVIEW_REQUEST_TYPES = PREVIEW_COMMAND_TYPES;

type JsonPrimitive = string | number | boolean | null;
type JsonValue = JsonPrimitive | JsonObject | JsonValue[];

interface JsonObject {
[key: string]: JsonValue;
}

export interface PreviewReadyUpdatedPayload {
ready: boolean;
}

export interface StageSnapshotUpdatedPayload {
sceneName: string;
sentenceId: number;
stageState: JsonObject;
}

export interface EventPayloadByType {
'preview.ready.updated': PreviewReadyUpdatedPayload;
'stage.snapshot.updated': StageSnapshotUpdatedPayload;
}

export type HostEventType = keyof EventPayloadByType;

export const HOST_EVENT_TYPES = [
'preview.ready.updated',
'stage.snapshot.updated',
] as const;

export interface RegisterPreviewRequestPayload {
gameId?: string;
embeddedLaunchId?: string;
}

export interface SessionRequestPayloadByType {
'session.register-preview': RegisterPreviewRequestPayload;
}

export interface RequestPayloadByType extends SessionRequestPayloadByType, PreviewRequestPayloadByType {}

export interface PreviewCommandResponsePayloadByType extends Record<PreviewCommandType, EmptyObject> {}

export interface PreviewResponsePayloadByType extends PreviewCommandResponsePayloadByType {}

export interface SessionResponsePayloadByType {
'session.register-preview': EmptyObject;
}

export interface ResponsePayloadByType extends SessionResponsePayloadByType, PreviewResponsePayloadByType {}

export interface EventEnvelope<TPayload = unknown, TType extends string = string> {
kind: 'event';
type: TType;
payload: TPayload;
}

export interface RequestEnvelope<TPayload = unknown, TType extends string = string> {
kind: 'request';
type: TType;
requestId: string;
payload: TPayload;
}

export interface ResponseEnvelope<
TPayload = unknown,
TType extends string = string,
> {
kind: 'response';
type: TType;
requestId: string;
payload: TPayload;
}

type EventEnvelopeByType<TType extends keyof EventPayloadByType = keyof EventPayloadByType> = {
[K in TType]: EventEnvelope<EventPayloadByType[K], K>;
}[TType];

type RequestEnvelopeByType<TType extends keyof RequestPayloadByType = keyof RequestPayloadByType> = {
[K in TType]: RequestEnvelope<RequestPayloadByType[K], K>;
}[TType];

type ResponseEnvelopeByType<TType extends keyof ResponsePayloadByType = keyof ResponsePayloadByType> = {
[K in TType]: ResponseEnvelope<ResponsePayloadByType[K], K>;
}[TType];

export type ProtocolEnvelope = EventEnvelopeByType | RequestEnvelopeByType | ResponseEnvelopeByType;

export function createEventEnvelope<TType extends keyof EventPayloadByType>(
type: TType,
payload: EventPayloadByType[TType],
): EventEnvelopeByType<TType> {
return {
kind: 'event',
type,
payload,
};
}

export function createRequestEnvelope<TType extends keyof RequestPayloadByType>(
type: TType,
requestId: string,
payload: RequestPayloadByType[TType],
): RequestEnvelopeByType<TType> {
return {
kind: 'request',
type,
requestId,
payload,
};
}

export function createResponseEnvelope<
TType extends keyof ResponsePayloadByType,
>(
type: TType,
requestId: string,
payload: ResponsePayloadByType[TType],
): ResponseEnvelopeByType<TType> {
return {
kind: 'response',
type,
requestId,
payload,
};
}

function isRecord(value: unknown): value is Record<string, unknown> {
return typeof value === 'object' && value !== null;
}

function hasEnvelopeShape(
value: unknown,
kind: ProtocolEnvelope['kind'],
): value is Record<string, unknown> {
return (
isRecord(value) &&
value.kind === kind &&
typeof value.type === 'string' &&
'payload' in value &&
(kind === 'event' || typeof value.requestId === 'string')
);
}

function isMessageType<TType extends string>(value: unknown, acceptedTypes: readonly TType[]): value is TType {
return typeof value === 'string' && acceptedTypes.includes(value as TType);
}

export function isEventEnvelope(value: unknown): value is EventEnvelope {
return hasEnvelopeShape(value, 'event');
}

export function isRequestEnvelope(value: unknown): value is RequestEnvelope {
return hasEnvelopeShape(value, 'request');
}

export function isResponseEnvelope(value: unknown): value is ResponseEnvelope {
return hasEnvelopeShape(value, 'response');
}

export function isProtocolEnvelope(value: unknown): value is ProtocolEnvelope {
return isEventEnvelope(value) || isRequestEnvelope(value) || isResponseEnvelope(value);
}

export function isPreviewCommandType(value: unknown): value is PreviewCommandType {
return isMessageType(value, PREVIEW_COMMAND_TYPES);
}

export function isPreviewRequestType(value: unknown): value is PreviewRequestType {
return isMessageType(value, PREVIEW_REQUEST_TYPES);
}

export function isHostEventType(value: unknown): value is HostEventType {
return isMessageType(value, HOST_EVENT_TYPES);
}

export function isHostEventEnvelope(value: unknown): value is EventEnvelopeByType<HostEventType> {
return isEventEnvelope(value) && isHostEventType(value.type);
}

export function isPreviewCommandRequestEnvelope(value: unknown): value is RequestEnvelopeByType<PreviewCommandType> {
return isRequestEnvelope(value) && isPreviewCommandType(value.type);
}

export function isPreviewRequestEnvelope(value: unknown): value is RequestEnvelopeByType<PreviewRequestType> {
return isRequestEnvelope(value) && isPreviewRequestType(value.type);
}
46 changes: 46 additions & 0 deletions packages/editor-preview-protocol/src/stage.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
export interface Point2D {
x?: number
y?: number
}

export type FilterFlag = 0 | 1

export interface Transform {
position?: Point2D
scale?: Point2D
rotation?: number

alpha?: number
blur?: number

brightness?: number
contrast?: number
saturation?: number
gamma?: number
colorRed?: number
colorGreen?: number
colorBlue?: number

bloom?: number
bloomBrightness?: number
bloomBlur?: number
bloomThreshold?: number

bevel?: number
bevelThickness?: number
bevelRotation?: number
bevelSoftness?: number
bevelRed?: number
bevelGreen?: number
bevelBlue?: number

oldFilm?: FilterFlag
dotFilm?: FilterFlag
reflectionFilm?: FilterFlag
glitchFilm?: FilterFlag
rgbFilm?: FilterFlag
godrayFilm?: FilterFlag

shockwaveFilter?: number
radiusAlphaFilter?: number
}
8 changes: 8 additions & 0 deletions packages/editor-preview-protocol/tsconfig.cjs.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"module": "commonjs",
"declaration": false,
"outDir": "./dist/cjs"
}
}
10 changes: 10 additions & 0 deletions packages/editor-preview-protocol/tsconfig.esm.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"module": "ESNext",
"declaration": true,
"declarationMap": true,
"outDir": "./dist/esm",
"declarationDir": "./dist/types"
}
}
13 changes: 13 additions & 0 deletions packages/editor-preview-protocol/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"compilerOptions": {
"target": "ES2019",
"strict": true,
"esModuleInterop": false,
"allowSyntheticDefaultImports": true,
"moduleResolution": "node",
"skipLibCheck": true,
"types": [],
"rootDir": "./src"
},
"include": ["src/**/*.ts"]
}
1 change: 1 addition & 0 deletions packages/origine2/.eslintrc.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
module.exports = {
extends: ['alloy', 'alloy/react', 'alloy/typescript'],
ignorePatterns: ['package.json'],
env: {
// 你的环境变量(包含多个预定义的全局变量)
//
Expand Down
Loading
Loading