Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
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