@netless/fastboard-core 0.2.11 → 0.3.0-canary.0
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.
- package/README.md +9 -0
- package/dist/index.d.ts +291 -3
- package/dist/index.js +257 -216
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +579 -14
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -12
- package/src/behaviors/{register-apps.ts → index.ts} +12 -7
- package/src/impl/{app.ts → FastboardApp.ts} +177 -50
- package/src/impl/FastboardPlayer.ts +201 -0
- package/src/impl/index.ts +4 -0
- package/src/index.ts +2 -3
- package/src/internal.ts +14 -0
- package/src/utils/index.ts +4 -0
- package/src/utils/misc.ts +49 -0
- package/src/utils/store.ts +87 -0
- package/src/utils/uid.ts +12 -0
- package/src/utils/warn.ts +11 -0
- package/dist/chunk-IHDHV4XE.mjs +0 -538
- package/dist/chunk-IHDHV4XE.mjs.map +0 -1
- package/dist/minimal.d.ts +0 -286
- package/dist/minimal.js +0 -559
- package/dist/minimal.js.map +0 -1
- package/dist/minimal.mjs +0 -13
- package/dist/minimal.mjs.map +0 -1
- package/minimal.mjs +0 -1
- package/src/behaviors/register-slide.ts +0 -11
- package/src/helpers/emitter.ts +0 -21
- package/src/helpers/utils.ts +0 -78
- package/src/helpers/value.ts +0 -84
- package/src/impl/player.ts +0 -122
- package/src/minimal.ts +0 -163
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/behaviors/register-slide.ts"],"sourcesContent":["import { WindowManager } from \"@netless/window-manager\";\nimport AppSlide from \"@netless/app-slide\";\n\nWindowManager.register({\n kind: \"Slide\",\n appOptions: {\n // turn on to show debug controller\n debug: false,\n },\n src: AppSlide,\n});\n"],"mappings":";;;;;;;;AAAA;AACA;AAEA,cAAc,SAAS;AAAA,EACrB,MAAM;AAAA,EACN,YAAY;AAAA,IAEV,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AACP,CAAC;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/store.ts","../src/utils/misc.ts","../src/utils/uid.ts","../src/utils/warn.ts","../src/impl/FastboardApp.ts","../src/internal.ts","../src/impl/FastboardPlayer.ts","../src/behaviors/index.ts"],"sourcesContent":["// This is a simple mimic of svelte/store.\nexport type Subscriber<T> = (value: T) => void;\nexport type Unsubscriber = () => void;\nexport type Updater<T> = (value: T) => T;\nexport type StartStopNotifier<T> = (set: Subscriber<T>) => Unsubscriber | void;\n\nexport interface Readable<T> {\n readonly value: T;\n subscribe(this: void, run: Subscriber<T>): Unsubscriber;\n reaction(this: void, run: Subscriber<T>): Unsubscriber;\n}\n\nexport interface Writable<T> extends Readable<T> {\n set(this: void, value: T): void;\n update(this: void, updater: Updater<T>): void;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nfunction noop() {}\n\nfunction safe_not_equal(a: unknown, b: unknown) {\n return a != a ? b == b : a !== b || (a && typeof a === \"object\") || typeof a === \"function\";\n}\n\nexport function readable<T>(value: T, start: StartStopNotifier<T> = noop): Readable<T> {\n let stop: Unsubscriber | undefined;\n const subscribers = new Set<Subscriber<T>>();\n function set(new_value: T) {\n if (safe_not_equal(value, new_value)) {\n value = new_value;\n if (stop) {\n for (const run of subscribers) {\n run(value);\n }\n }\n }\n }\n function subscribe(run: Subscriber<T>) {\n subscribers.add(run);\n if (subscribers.size === 1) {\n stop = start(set) || noop;\n }\n run(value);\n return () => {\n subscribers.delete(run);\n if (subscribers.size === 0) {\n stop && stop();\n stop = undefined;\n }\n };\n }\n function reaction(run: Subscriber<T>) {\n subscribers.add(run);\n if (subscribers.size === 1) {\n stop = start(set) || noop;\n }\n return () => {\n subscribers.delete(run);\n if (subscribers.size === 0) {\n stop && stop();\n stop = undefined;\n }\n };\n }\n return {\n get value() {\n return value;\n },\n subscribe,\n reaction,\n };\n}\n\nexport function writable<T>(value: T, start: StartStopNotifier<T> = noop, set: Subscriber<T>): Writable<T> {\n const internal = readable(value, start);\n return {\n get value() {\n return internal.value;\n },\n subscribe: internal.subscribe,\n reaction: internal.reaction,\n set,\n update(fn: Updater<T>) {\n set(fn(value));\n },\n };\n}\n","import type { ConvertedFile, SceneDefinition, Size } from \"white-web-sdk\";\n\nexport function getImageSize(url: string, fallback: Size) {\n return new Promise<Size>(resolve => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = () => resolve(fallback);\n img.src = url;\n });\n}\n\nexport function makeSlideParams(scenes: SceneDefinition[]) {\n const emptyScenes: SceneDefinition[] = [];\n let taskId = \"\";\n let url = \"\";\n\n // e.g. \"ppt(x)://cdn/prefix/dynamicConvert/{taskId}/1.slide\"\n const pptSrcRE = /^pptx?(?<prefix>:\\/\\/\\S+?dynamicConvert)\\/(?<taskId>\\w+)\\//;\n\n for (const { name, ppt } of scenes) {\n // make sure scenesWithoutPPT.length === scenes.length\n emptyScenes.push({ name });\n\n if (!ppt || !ppt.src.startsWith(\"ppt\")) {\n continue;\n }\n const match = pptSrcRE.exec(ppt.src);\n if (!match || !match.groups) {\n continue;\n }\n taskId = match.groups.taskId;\n url = \"https\" + match.groups.prefix;\n break;\n }\n\n return { scenes: emptyScenes, taskId, url };\n}\n\nexport function convertedFileToScene(f: ConvertedFile, i: number): SceneDefinition {\n return {\n name: String(i + 1),\n ppt: {\n src: f.conversionFileUrl,\n width: f.width,\n height: f.height,\n previewURL: f.preview,\n },\n };\n}\n","// Copy from https://github.com/crimx/side-effect-manager/blob/main/src/gen-uid.ts\nconst SOUP = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\nconst SOUP_LEN = 62; // SOUP.length\nconst ID_LEN = 20;\nconst reusedIdCarrier = /* @__PURE__ */ Array(ID_LEN);\n\nexport function genUID() {\n for (let i = 0; i < ID_LEN; i++) {\n reusedIdCarrier[i] = SOUP.charAt(Math.random() * SOUP_LEN);\n }\n return reusedIdCarrier.join(\"\");\n}\n","const warnings = {\n \"no-ppt-in-scenes\":\n \"You're probably inserting the slide app in a wrong way, there shouldn't exist `scenes[0].ppt`.\",\n} as const;\nconst warned = new Set<string>();\n\nexport function warn(id: keyof typeof warnings) {\n if (warned.has(id)) return;\n warned.add(id);\n console.warn(warnings[id]);\n}\n","import type { AddPageParams, PublicEvent, MountParams } from \"@netless/window-manager\";\nimport type {\n AnimationMode,\n ApplianceNames,\n Camera,\n Color,\n ConversionResponse,\n HotKey,\n HotKeys,\n JoinRoomParams,\n MemberState,\n Rectangle,\n Room,\n RoomPhase as RoomPhaseEnum,\n RoomCallbacks,\n RoomState,\n SceneDefinition,\n ShapeType,\n ViewCallbacks,\n WhiteWebSdkConfiguration,\n} from \"white-web-sdk\";\n\nimport { DefaultHotKeys, WhiteWebSdk, contentModeScale } from \"white-web-sdk\";\nimport { BuiltinApps, WindowManager } from \"@netless/window-manager\";\nimport {\n getImageSize,\n genUID,\n convertedFileToScene,\n makeSlideParams,\n readable,\n writable,\n warn,\n} from \"../utils\";\nimport { ensure_window_manager, transform_app_status } from \"../internal\";\n\nclass FastboardAppBase {\n public constructor(\n readonly sdk: WhiteWebSdk,\n readonly room: Room,\n readonly manager: WindowManager,\n readonly hotKeys: Partial<HotKeys>\n ) {}\n\n protected _destroyed = false;\n protected _assertNotDestroyed() {\n if (this._destroyed) {\n throw new Error(\"FastboardApp has been destroyed\");\n }\n }\n\n protected _addRoomListener<K extends keyof RoomCallbacks>(name: K, listener: RoomCallbacks[K]) {\n this._assertNotDestroyed();\n this.room.callbacks.on(name, listener);\n return () => this.room.callbacks.off(name, listener);\n }\n\n protected _addManagerListener<K extends keyof PublicEvent>(\n name: K,\n listener: (value: PublicEvent[K]) => void\n ) {\n this._assertNotDestroyed();\n this.manager.emitter.on(name, listener);\n return () => this.manager.emitter.off(name, listener);\n }\n\n protected _addMainViewListener<K extends keyof ViewCallbacks>(name: K, listener: ViewCallbacks[K]) {\n this._assertNotDestroyed();\n this.manager.mainView.callbacks.on(name, listener);\n return () => this.manager.mainView.callbacks.off(name, listener);\n }\n\n public destroy() {\n this._destroyed = true;\n this.manager.destroy();\n return this.room.disconnect();\n }\n}\n\ntype RoomPhase = `${RoomPhaseEnum}`;\n\nexport type {\n AddPageParams,\n AnimationMode,\n ApplianceNames,\n Camera,\n Color,\n ConversionResponse,\n HotKey,\n HotKeys,\n JoinRoomParams,\n MemberState,\n MountParams,\n PublicEvent,\n Rectangle,\n Room,\n RoomPhase,\n RoomCallbacks,\n RoomState,\n SceneDefinition,\n ShapeType,\n ViewCallbacks,\n WhiteWebSdk,\n WhiteWebSdkConfiguration,\n WindowManager,\n};\n\nexport type Appliance = `${ApplianceNames}`;\nexport type Shape = `${ShapeType}`;\n\nexport interface InsertDocsStatic {\n readonly fileType: \"pdf\";\n readonly scenePath: string;\n readonly scenes: SceneDefinition[];\n readonly title?: string;\n}\n\nexport interface InsertDocsDynamic {\n readonly fileType: \"pptx\";\n readonly scenePath: string;\n readonly taskId: string;\n readonly title?: string;\n readonly url?: string;\n /** @example [{ name: '1' }, { name: '2' }, { name: '3' }] */\n readonly scenes?: SceneDefinition[];\n}\n\nexport type InsertDocsParams = InsertDocsStatic | InsertDocsDynamic;\n\nexport type SetMemberStateFn = (partialMemberState: Partial<MemberState>) => void;\n\nexport type RoomStateChanged = (diff: Partial<RoomState>) => void;\n\nexport interface AppsStatus {\n [kind: string]: {\n status: \"idle\" | \"loading\" | \"failed\";\n reason?: string;\n };\n}\n\nexport class FastboardApp extends FastboardAppBase {\n /**\n * Render this app to some DOM.\n */\n bindContainer(container: HTMLElement) {\n this._assertNotDestroyed();\n this.manager.bindContainer(container);\n }\n\n /**\n * Move window-manager's collector to some place.\n */\n bindCollector(container: HTMLElement) {\n this._assertNotDestroyed();\n this.manager.bindCollectorContainer(container);\n }\n\n /**\n * Is current room writable?\n */\n readonly writable = writable(\n this.room.isWritable,\n set => this._addRoomListener(\"onEnableWriteNowChanged\", () => set(this.room.isWritable)),\n this.room.setWritable.bind(this.room)\n );\n\n /**\n * Current window-manager's windows' state (is it maximized?).\n */\n readonly boxState = readable(this.manager.boxState, set => this._addManagerListener(\"boxStateChange\", set));\n\n /**\n * Current window-manager's focused app's id.\n * @example \"HelloWorld-1A2b3C4d\"\n */\n readonly focusedApp = readable(this.manager.focused, set => this._addManagerListener(\"focusedChange\", set));\n\n /**\n * How many times can I call `app.redo()`?\n */\n readonly canRedoSteps = readable(this.manager.canRedoSteps, set =>\n this._addManagerListener(\"canRedoStepsChange\", set)\n );\n\n /**\n * How many times can I call `app.undo()`?\n */\n readonly canUndoSteps = readable(this.manager.canUndoSteps, set =>\n this._addManagerListener(\"canUndoStepsChange\", set)\n );\n\n /**\n * Current camera information of main view.\n *\n * Change the camera position by `app.moveCamera()`.\n */\n readonly camera = readable(this.manager.mainView.camera, set =>\n this._addMainViewListener(\"onCameraUpdated\", set)\n );\n\n /**\n * Current tool's info, like \"is using pencil?\", \"what color?\".\n *\n * Change the tool by `app.setAppliance()`.\n */\n readonly memberState = readable(this.room.state.memberState, set =>\n this._addRoomListener(\"onRoomStateChanged\", ({ memberState: m }) => m && set(m))\n );\n\n /**\n * 0..n-1, current index of main view scenes.\n */\n readonly sceneIndex = writable(\n this.manager.mainViewSceneIndex,\n set => this._addManagerListener(\"mainViewSceneIndexChange\", set),\n this.manager.setMainViewSceneIndex.bind(this.manager)\n );\n\n /**\n * How many pages are in the main view?\n */\n readonly sceneLength = readable(this.manager.mainViewScenesLength, set =>\n this._addManagerListener(\"mainViewScenesLengthChange\", set)\n );\n\n private _appsStatus: AppsStatus = {};\n /**\n * Apps status.\n */\n readonly appsStatus = readable<AppsStatus>({}, set =>\n this._addManagerListener(\"loadApp\", ({ kind, status, reason }) => {\n this._appsStatus[kind] = { status: transform_app_status(status), reason };\n set(this._appsStatus);\n })\n );\n\n /**\n * Undo a step on main view.\n */\n undo() {\n this._assertNotDestroyed();\n this.manager.undo();\n }\n\n /**\n * Redo a step on main view.\n */\n redo() {\n this._assertNotDestroyed();\n this.manager.redo();\n }\n\n /**\n * Move current main view's camera position.\n */\n moveCamera(camera: Partial<Camera> & { animationMode?: AnimationMode | undefined }) {\n this._assertNotDestroyed();\n this.manager.moveCamera(camera);\n }\n\n /**\n * Move current main view's camera to include a rectangle.\n */\n moveCameraToContain(rectangle: Rectangle & { animationMode?: AnimationMode }) {\n this._assertNotDestroyed();\n this.manager.moveCameraToContain(rectangle);\n }\n\n /**\n * Delete all things on the main view.\n */\n cleanCurrentScene() {\n this._assertNotDestroyed();\n this.manager.cleanCurrentScene();\n }\n\n /**\n * Set current tool, like \"pencil\".\n */\n setAppliance(appliance: ApplianceNames | Appliance, shape?: ShapeType | Shape) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({\n currentApplianceName: appliance as ApplianceNames,\n shapeType: shape as ShapeType,\n });\n }\n\n setStrokeWidth(strokeWidth: number) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ strokeWidth });\n }\n\n setStrokeColor(strokeColor: Color) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ strokeColor });\n }\n\n prevPage() {\n this._assertNotDestroyed();\n return this.manager.prevPage();\n }\n\n nextPage() {\n this._assertNotDestroyed();\n return this.manager.nextPage();\n }\n\n addPage(params?: AddPageParams) {\n this._assertNotDestroyed();\n return this.manager.addPage(params);\n }\n\n /**\n * Insert an image to the main view.\n */\n async insertImage(url: string) {\n this._assertNotDestroyed();\n await this.manager.switchMainViewToWriter();\n\n const { divElement } = this.manager.mainView;\n const containerSize = {\n width: divElement?.scrollWidth || window.innerWidth,\n height: divElement?.scrollHeight || window.innerHeight,\n };\n\n // 1. shrink the image a little to fit container **width**\n const maxWidth = containerSize.width * 0.8;\n let { width, height } = await getImageSize(url, containerSize);\n const scale = Math.min(maxWidth / width, 1);\n const uuid = genUID();\n const { centerX, centerY } = this.manager.camera;\n width *= scale;\n height *= scale;\n this.manager.mainView.insertImage({ uuid, centerX, centerY, width, height, locked: false });\n this.manager.mainView.completeImageUpload(uuid, url);\n\n // 2. move camera to fit image **height**\n width /= 0.8;\n height /= 0.8;\n const originX = centerX - width / 2;\n const originY = centerY - height / 2;\n this.manager.moveCameraToContain({ originX, originY, width, height });\n }\n\n /**\n * Insert PDF/PPTX from conversion result.\n * @param status https://developer.netless.link/server-en/home/server-conversion#get-query-task-conversion-progress\n */\n insertDocs(filename: string, status: ConversionResponse): Promise<string | undefined>;\n\n /**\n * Manual way.\n * @example\n * app.insertDocs({\n * fileType: 'pptx',\n * scenePath: `/pptx/${conversion.taskId}`,\n * taskId: conversion.taskId,\n * title: 'Title',\n * })\n */\n insertDocs(params: InsertDocsParams): Promise<string | undefined>;\n\n insertDocs(arg1: string | InsertDocsParams, arg2?: ConversionResponse) {\n this._assertNotDestroyed();\n if (typeof arg1 === \"object\" && \"fileType\" in arg1) {\n return this._insertDocsImpl(arg1);\n } else if (arg2 && arg2.status !== \"Finished\") {\n throw new Error(\"FastboardApp cannot insert a converting doc.\");\n } else if (arg2 && arg2.progress) {\n const title = arg1;\n const scenePath = `/${arg2.uuid}/${genUID()}`;\n const scenes1 = arg2.progress.convertedFileList.map(convertedFileToScene);\n const { scenes, taskId, url } = makeSlideParams(scenes1);\n if (taskId && url) {\n return this._insertDocsImpl({ fileType: \"pptx\", scenePath, scenes, title, taskId, url });\n } else {\n return this._insertDocsImpl({ fileType: \"pdf\", scenePath, scenes: scenes1, title });\n }\n }\n }\n\n private _insertDocsImpl({ fileType, scenePath, title, scenes, ...attributes }: InsertDocsParams) {\n this._assertNotDestroyed();\n switch (fileType) {\n case \"pdf\":\n return this.manager.addApp({\n kind: \"DocsViewer\",\n options: { scenePath, title, scenes },\n });\n case \"pptx\":\n if (scenes && scenes[0].ppt) {\n warn(\"no-ppt-in-scenes\");\n }\n return this.manager.addApp({\n kind: \"Slide\",\n options: { scenePath, title, scenes },\n attributes,\n });\n }\n }\n\n /**\n * Insert the Monaco Code Editor app.\n */\n insertCodeEditor() {\n this._assertNotDestroyed();\n return this.manager.addApp({\n kind: \"Monaco\",\n options: { title: \"Code Editor\" },\n });\n }\n\n /**\n * Insert the Countdown app.\n */\n insertCountdown() {\n this._assertNotDestroyed();\n return this.manager.addApp({\n kind: \"Countdown\",\n options: { title: \"Countdown\" },\n });\n }\n\n /**\n * Insert the Media Player app.\n */\n insertMedia(title: string, src: string) {\n this._assertNotDestroyed();\n return this.manager.addApp({\n kind: BuiltinApps.MediaPlayer,\n options: { title },\n attributes: { src },\n });\n }\n\n /**\n * Insert the GeoGebra app.\n */\n insertGeoGebra() {\n this._assertNotDestroyed();\n return this.manager.addApp({\n kind: \"GeoGebra\",\n options: { title: \"GeoGebra\" },\n });\n }\n}\n\nexport interface FastboardOptions {\n sdkConfig: Omit<WhiteWebSdkConfiguration, \"useMobXState\">;\n joinRoom: Omit<JoinRoomParams, \"useMultiViews\" | \"disableNewPencil\" | \"disableMagixEventDispatchLimit\"> & {\n callbacks?: Partial<RoomCallbacks>;\n };\n managerConfig?: Omit<MountParams, \"room\">;\n}\n\n/**\n * Create a FastboardApp instance.\n * @example\n * let app = await createFastboard({\n * sdkConfig: {\n * appIdentifier: import.meta.env.VITE_APPID,\n * region: 'cn-hz',\n * },\n * joinRoom: {\n * uid: unique_id,\n * uuid: import.meta.env.VITE_ROOM_UUID,\n * roomToken: import.meta.env.VITE_ROOM_TOKEN,\n * },\n * })\n */\nexport async function createFastboard({\n sdkConfig,\n joinRoom: { callbacks, ...joinRoomParams },\n managerConfig,\n}: FastboardOptions) {\n const sdk = new WhiteWebSdk({\n ...sdkConfig,\n useMobXState: true,\n });\n\n const hotKeys: Partial<HotKeys> = {\n ...DefaultHotKeys,\n changeToSelector: \"s\",\n changeToLaserPointer: \"z\",\n changeToPencil: \"p\",\n changeToRectangle: \"r\",\n changeToEllipse: \"c\",\n changeToEraser: \"e\",\n changeToText: \"t\",\n changeToStraight: \"l\",\n changeToArrow: \"a\",\n changeToHand: \"h\",\n };\n\n const room = await sdk.joinRoom(\n {\n floatBar: true,\n hotKeys,\n ...ensure_window_manager(joinRoomParams),\n useMultiViews: true,\n disableNewPencil: false,\n disableMagixEventDispatchLimit: true,\n },\n callbacks\n );\n\n const manager = await WindowManager.mount({\n cursor: true,\n ...managerConfig,\n room,\n });\n\n manager.mainView.setCameraBound({\n minContentMode: contentModeScale(0.3),\n maxContentMode: contentModeScale(3),\n });\n\n return new FastboardApp(sdk, room, manager, hotKeys);\n}\n","import type { JoinRoomParams, ReplayRoomParams } from \"white-web-sdk\";\nimport type { PublicEvent } from \"@netless/window-manager\";\nimport { WindowManager } from \"@netless/window-manager\";\n\nexport function ensure_window_manager<T extends JoinRoomParams | ReplayRoomParams>(joinRoom: T): T {\n if (!joinRoom.invisiblePlugins || !joinRoom.invisiblePlugins.includes(WindowManager)) {\n joinRoom.invisiblePlugins = [...(joinRoom.invisiblePlugins || []), WindowManager];\n }\n return joinRoom;\n}\n\nexport function transform_app_status(status: PublicEvent[\"loadApp\"][\"status\"]) {\n return status === \"start\" ? \"loading\" : status === \"failed\" ? \"failed\" : \"idle\";\n}\n","import type { MountParams, PublicEvent } from \"@netless/window-manager\";\nimport type {\n Player,\n PlayerPhase as PlayerPhaseEnum,\n PlayerCallbacks,\n PlayerState,\n PlayerSeekingResult,\n ReplayRoomParams,\n ViewCallbacks,\n WhiteWebSdkConfiguration,\n} from \"white-web-sdk\";\n\nimport { WhiteWebSdk } from \"white-web-sdk\";\nimport { WindowManager } from \"@netless/window-manager\";\nimport { readable, writable } from \"../utils\";\nimport { ensure_window_manager } from \"../internal\";\n\nclass FastboardPlayerBase {\n public constructor(readonly sdk: WhiteWebSdk, readonly player: Player, readonly manager: WindowManager) {}\n\n protected _destroyed = false;\n protected _assertNotDestroyed() {\n if (this._destroyed) {\n throw new Error(\"FastboardApp has been destroyed\");\n }\n }\n\n protected _addPlayerListener<K extends keyof PlayerCallbacks>(name: K, listener: PlayerCallbacks[K]) {\n this._assertNotDestroyed();\n this.player.callbacks.on(name, listener);\n return () => this.player.callbacks.off(name, listener);\n }\n\n protected _addManagerListener<K extends keyof PublicEvent>(\n name: K,\n listener: (value: PublicEvent[K]) => void\n ) {\n this._assertNotDestroyed();\n this.manager.emitter.on(name, listener);\n return () => this.manager.emitter.off(name, listener);\n }\n\n protected _addMainViewListener<K extends keyof ViewCallbacks>(name: K, listener: ViewCallbacks[K]) {\n this._assertNotDestroyed();\n this.manager.mainView.callbacks.on(name, listener);\n return () => this.manager.mainView.callbacks.off(name, listener);\n }\n\n public destroy() {\n this._destroyed = true;\n this.manager.destroy();\n return this.player.callbacks.off();\n }\n}\n\ntype PlayerPhase = `${PlayerPhaseEnum}`;\n\nexport type { PlayerPhase, PlayerSeekingResult };\n\nexport class FastboardPlayer extends FastboardPlayerBase {\n /**\n * Render this player to some DOM.\n */\n bindContainer(container: HTMLElement) {\n this._assertNotDestroyed();\n this.manager.bindContainer(container);\n }\n\n /**\n * Move window-manager's collector to some place.\n */\n bindCollector(container: HTMLElement) {\n this._assertNotDestroyed();\n this.manager.bindCollectorContainer(container);\n }\n\n readonly currentTime = writable(\n this.player.progressTime,\n set => this._addPlayerListener(\"onProgressTimeChanged\", set),\n this.player.seekToProgressTime.bind(this.player)\n );\n\n readonly phase = readable<PlayerPhase>(this.player.phase, set =>\n this._addPlayerListener(\"onPhaseChanged\", set)\n );\n\n readonly canplay = readable(this.player.isPlayable, set =>\n this._addPlayerListener(\"onIsPlayableChanged\", set)\n );\n\n private _setSpeed!: (value: number) => void;\n readonly speed = writable(\n this.player.playbackSpeed,\n set => {\n this._setSpeed = set;\n },\n value => {\n this.player.playbackSpeed = value;\n this._setSpeed(value);\n }\n );\n\n private _setReady!: (value: boolean) => void;\n readonly ready = readable(false, set => {\n this._setReady = set;\n });\n\n private _setDuration!: (value: number) => void;\n readonly duration = readable(0, set => {\n this._setDuration = set;\n });\n\n readonly state = readable<PlayerState | null>(null, set => {\n const update = () => set(this.player.state);\n this.player.callbacks.once(\"onLoadFirstFrame\", () => {\n this._setDuration(this.player.timeDuration);\n this._setReady(true);\n update();\n });\n return this._addPlayerListener(\"onPlayerStateChanged\", update);\n });\n\n seek(timestamp: number) {\n this._assertNotDestroyed();\n return this.player.seekToProgressTime(timestamp);\n }\n\n play() {\n this._assertNotDestroyed();\n this.player.play();\n }\n\n pause() {\n this._assertNotDestroyed();\n this.player.pause();\n }\n\n stop() {\n this._assertNotDestroyed();\n this.player.stop();\n }\n\n setSpeed(value: number) {\n this._assertNotDestroyed();\n this.speed.set(value);\n }\n}\n\nexport interface FastboardReplayOptions {\n sdkConfig: Omit<WhiteWebSdkConfiguration, \"useMobXState\">;\n replayRoom: Omit<ReplayRoomParams, \"useMultiViews\"> & {\n callbacks?: Partial<PlayerCallbacks>;\n };\n managerConfig?: Omit<MountParams, \"room\">;\n}\n\n/**\n * Create a FastboardApp instance.\n * @example\n * let player = await replayFastboard({\n * sdkConfig: {\n * appIdentifier: import.meta.env.VITE_APPID,\n * region: 'cn-hz',\n * },\n * replayRoom: {\n * uid: unique_id,\n * uuid: import.meta.env.VITE_ROOM_UUID,\n * roomToken: import.meta.env.VITE_ROOM_TOKEN,\n * },\n * })\n */\nexport async function replayFastboard({\n sdkConfig,\n replayRoom: { callbacks, ...replayRoomParams },\n managerConfig,\n}: FastboardReplayOptions) {\n const sdk = new WhiteWebSdk({\n ...sdkConfig,\n useMobXState: true,\n });\n\n const player = await sdk.replayRoom(\n {\n ...ensure_window_manager(replayRoomParams),\n useMultiViews: true,\n },\n callbacks\n );\n\n const managerPromise = WindowManager.mount({\n cursor: true,\n ...managerConfig,\n room: player,\n });\n\n player.play();\n const manager = await managerPromise;\n player.pause();\n\n return new FastboardPlayer(sdk, player, manager);\n}\n","import type { RegisterParams } from \"@netless/window-manager\";\nimport { WindowManager } from \"@netless/window-manager\";\nimport AppSlide from \"@netless/app-slide\";\n\nexport interface AppsConfig {\n [kind: string]: Omit<RegisterParams, \"kind\">;\n}\n\nconst DefaultApps: AppsConfig = {\n Monaco: {\n src: \"https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-monaco/0.1.12/dist/main.iife.js\",\n },\n Countdown: {\n src: \"https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-countdown/0.0.2/dist/main.iife.js\",\n },\n GeoGebra: {\n src: \"https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-geogebra/0.0.4/dist/main.iife.js\",\n appOptions: {\n HTML5Codebase: \"https://flat-storage-cn-hz.whiteboard.agora.io/GeoGebra/HTML5/5.0/web3d\",\n },\n },\n EmbeddedPage: {\n src: \"https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-embedded-page/0.1.1/dist/main.iife.js\",\n },\n Player: {\n name: \"NetlessAppMediaPlayer\",\n src: \"https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-media-player/0.1.1/dist/main.iife.js\",\n },\n};\n\nWindowManager.register({\n kind: \"Slide\",\n appOptions: { debug: false },\n src: AppSlide,\n});\n\nfor (const kind in DefaultApps) {\n if (Object.prototype.hasOwnProperty.call(DefaultApps, kind)) {\n const options = DefaultApps[kind];\n WindowManager.register({ kind, ...options });\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@netless/fastboard-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0-canary.0",
|
|
4
4
|
"description": "A tiny wrapper of white-web-sdk and @netless/window-manager.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"files": [
|
|
7
7
|
"src",
|
|
8
|
-
"dist"
|
|
9
|
-
"minimal.mjs",
|
|
10
|
-
"minimal.ts"
|
|
8
|
+
"dist"
|
|
11
9
|
],
|
|
12
10
|
"dependencies": {
|
|
13
11
|
"@netless/app-slide": "^0.0.56"
|
|
@@ -16,16 +14,12 @@
|
|
|
16
14
|
"@netless/window-manager": ">=0.4.0",
|
|
17
15
|
"white-web-sdk": ">=2.16.0"
|
|
18
16
|
},
|
|
19
|
-
"devDependencies": {
|
|
20
|
-
"@netless/window-manager": "^0.4.10",
|
|
21
|
-
"tsup": "^5.12.0",
|
|
22
|
-
"white-web-sdk": "^2.16.10"
|
|
23
|
-
},
|
|
24
17
|
"scripts": {
|
|
25
|
-
"build": "tsup",
|
|
26
18
|
"cleanup": "rimraf dist",
|
|
27
|
-
"check": "tsc --noEmit"
|
|
19
|
+
"check": "tsc --noEmit",
|
|
20
|
+
"build": "tsup"
|
|
28
21
|
},
|
|
29
22
|
"module": "dist/index.mjs",
|
|
30
|
-
"types": "dist/index.d.ts"
|
|
23
|
+
"types": "dist/index.d.ts",
|
|
24
|
+
"readme": "## @netless/fastboard-core\n\nA tiny wrapper of white-web-sdk and @netless/window-manager.\n\nUsed by [@netless/fastboard-ui](https://github.com/netless-io/fastboard/tree/main/packages/fastboard-ui).\n\n### License\n\nMIT @ [netless](https://github.com/netless-io)\n"
|
|
31
25
|
}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import type { RegisterParams } from "@netless/window-manager";
|
|
2
2
|
import { WindowManager } from "@netless/window-manager";
|
|
3
|
+
import AppSlide from "@netless/app-slide";
|
|
3
4
|
|
|
4
5
|
export interface AppsConfig {
|
|
5
6
|
[kind: string]: Omit<RegisterParams, "kind">;
|
|
6
7
|
}
|
|
7
8
|
|
|
8
|
-
|
|
9
|
+
const DefaultApps: AppsConfig = {
|
|
9
10
|
Monaco: {
|
|
10
11
|
src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-monaco/0.1.12/dist/main.iife.js",
|
|
11
12
|
},
|
|
@@ -27,11 +28,15 @@ export const DefaultApps: AppsConfig = {
|
|
|
27
28
|
},
|
|
28
29
|
};
|
|
29
30
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
31
|
+
WindowManager.register({
|
|
32
|
+
kind: "Slide",
|
|
33
|
+
appOptions: { debug: false },
|
|
34
|
+
src: AppSlide,
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
for (const kind in DefaultApps) {
|
|
38
|
+
if (Object.prototype.hasOwnProperty.call(DefaultApps, kind)) {
|
|
39
|
+
const options = DefaultApps[kind];
|
|
40
|
+
WindowManager.register({ kind, ...options });
|
|
36
41
|
}
|
|
37
42
|
}
|
|
@@ -1,26 +1,37 @@
|
|
|
1
|
-
import type { PublicEvent,
|
|
1
|
+
import type { AddPageParams, PublicEvent, MountParams } from "@netless/window-manager";
|
|
2
2
|
import type {
|
|
3
3
|
AnimationMode,
|
|
4
4
|
ApplianceNames,
|
|
5
5
|
Camera,
|
|
6
6
|
Color,
|
|
7
7
|
ConversionResponse,
|
|
8
|
+
HotKey,
|
|
8
9
|
HotKeys,
|
|
10
|
+
JoinRoomParams,
|
|
9
11
|
MemberState,
|
|
10
12
|
Rectangle,
|
|
11
13
|
Room,
|
|
14
|
+
RoomPhase as RoomPhaseEnum,
|
|
12
15
|
RoomCallbacks,
|
|
13
16
|
RoomState,
|
|
14
17
|
SceneDefinition,
|
|
15
18
|
ShapeType,
|
|
16
19
|
ViewCallbacks,
|
|
17
|
-
|
|
20
|
+
WhiteWebSdkConfiguration,
|
|
18
21
|
} from "white-web-sdk";
|
|
19
|
-
import type { FastboardDisposer, FastboardInternalValue } from "../helpers/value";
|
|
20
22
|
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
23
|
+
import { DefaultHotKeys, WhiteWebSdk, contentModeScale } from "white-web-sdk";
|
|
24
|
+
import { BuiltinApps, WindowManager } from "@netless/window-manager";
|
|
25
|
+
import {
|
|
26
|
+
getImageSize,
|
|
27
|
+
genUID,
|
|
28
|
+
convertedFileToScene,
|
|
29
|
+
makeSlideParams,
|
|
30
|
+
readable,
|
|
31
|
+
writable,
|
|
32
|
+
warn,
|
|
33
|
+
} from "../utils";
|
|
34
|
+
import { ensure_window_manager, transform_app_status } from "../internal";
|
|
24
35
|
|
|
25
36
|
class FastboardAppBase {
|
|
26
37
|
public constructor(
|
|
@@ -30,48 +41,72 @@ class FastboardAppBase {
|
|
|
30
41
|
readonly hotKeys: Partial<HotKeys>
|
|
31
42
|
) {}
|
|
32
43
|
|
|
33
|
-
protected readonly _disposers: FastboardDisposer[] = [];
|
|
34
44
|
protected _destroyed = false;
|
|
35
45
|
protected _assertNotDestroyed() {
|
|
36
46
|
if (this._destroyed) {
|
|
37
|
-
throw new Error("
|
|
47
|
+
throw new Error("FastboardApp has been destroyed");
|
|
38
48
|
}
|
|
39
49
|
}
|
|
40
50
|
|
|
41
|
-
|
|
42
|
-
protected createValue: typeof createValue = (...args: [any, any]): any => {
|
|
43
|
-
const value = createValue(...args);
|
|
44
|
-
this._disposers.push((value as FastboardInternalValue<unknown>).dispose);
|
|
45
|
-
return value;
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
protected _addRoomListener<K extends keyof RoomCallbacks, T = RoomCallbacks[K]>(name: K, listener: T) {
|
|
51
|
+
protected _addRoomListener<K extends keyof RoomCallbacks>(name: K, listener: RoomCallbacks[K]) {
|
|
49
52
|
this._assertNotDestroyed();
|
|
50
53
|
this.room.callbacks.on(name, listener);
|
|
51
54
|
return () => this.room.callbacks.off(name, listener);
|
|
52
55
|
}
|
|
53
56
|
|
|
54
|
-
protected _addManagerListener<K extends keyof PublicEvent>(
|
|
57
|
+
protected _addManagerListener<K extends keyof PublicEvent>(
|
|
58
|
+
name: K,
|
|
59
|
+
listener: (value: PublicEvent[K]) => void
|
|
60
|
+
) {
|
|
55
61
|
this._assertNotDestroyed();
|
|
56
|
-
this.manager.emitter.on(name,
|
|
57
|
-
return () => this.manager.emitter.off(name,
|
|
62
|
+
this.manager.emitter.on(name, listener);
|
|
63
|
+
return () => this.manager.emitter.off(name, listener);
|
|
58
64
|
}
|
|
59
65
|
|
|
60
|
-
protected _addMainViewListener<K extends keyof ViewCallbacks
|
|
66
|
+
protected _addMainViewListener<K extends keyof ViewCallbacks>(name: K, listener: ViewCallbacks[K]) {
|
|
61
67
|
this._assertNotDestroyed();
|
|
62
68
|
this.manager.mainView.callbacks.on(name, listener);
|
|
63
69
|
return () => this.manager.mainView.callbacks.off(name, listener);
|
|
64
70
|
}
|
|
65
71
|
|
|
66
72
|
public destroy() {
|
|
67
|
-
this._disposers.forEach(dispose => dispose());
|
|
68
|
-
this._disposers.length = 0;
|
|
69
73
|
this._destroyed = true;
|
|
70
74
|
this.manager.destroy();
|
|
71
75
|
return this.room.disconnect();
|
|
72
76
|
}
|
|
73
77
|
}
|
|
74
78
|
|
|
79
|
+
type RoomPhase = `${RoomPhaseEnum}`;
|
|
80
|
+
|
|
81
|
+
export type {
|
|
82
|
+
AddPageParams,
|
|
83
|
+
AnimationMode,
|
|
84
|
+
ApplianceNames,
|
|
85
|
+
Camera,
|
|
86
|
+
Color,
|
|
87
|
+
ConversionResponse,
|
|
88
|
+
HotKey,
|
|
89
|
+
HotKeys,
|
|
90
|
+
JoinRoomParams,
|
|
91
|
+
MemberState,
|
|
92
|
+
MountParams,
|
|
93
|
+
PublicEvent,
|
|
94
|
+
Rectangle,
|
|
95
|
+
Room,
|
|
96
|
+
RoomPhase,
|
|
97
|
+
RoomCallbacks,
|
|
98
|
+
RoomState,
|
|
99
|
+
SceneDefinition,
|
|
100
|
+
ShapeType,
|
|
101
|
+
ViewCallbacks,
|
|
102
|
+
WhiteWebSdk,
|
|
103
|
+
WhiteWebSdkConfiguration,
|
|
104
|
+
WindowManager,
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
export type Appliance = `${ApplianceNames}`;
|
|
108
|
+
export type Shape = `${ShapeType}`;
|
|
109
|
+
|
|
75
110
|
export interface InsertDocsStatic {
|
|
76
111
|
readonly fileType: "pdf";
|
|
77
112
|
readonly scenePath: string;
|
|
@@ -122,7 +157,7 @@ export class FastboardApp extends FastboardAppBase {
|
|
|
122
157
|
/**
|
|
123
158
|
* Is current room writable?
|
|
124
159
|
*/
|
|
125
|
-
readonly writable =
|
|
160
|
+
readonly writable = writable(
|
|
126
161
|
this.room.isWritable,
|
|
127
162
|
set => this._addRoomListener("onEnableWriteNowChanged", () => set(this.room.isWritable)),
|
|
128
163
|
this.room.setWritable.bind(this.room)
|
|
@@ -131,50 +166,50 @@ export class FastboardApp extends FastboardAppBase {
|
|
|
131
166
|
/**
|
|
132
167
|
* Current window-manager's windows' state (is it maximized?).
|
|
133
168
|
*/
|
|
134
|
-
readonly boxState =
|
|
135
|
-
this._addManagerListener("boxStateChange", set)
|
|
136
|
-
);
|
|
169
|
+
readonly boxState = readable(this.manager.boxState, set => this._addManagerListener("boxStateChange", set));
|
|
137
170
|
|
|
138
171
|
/**
|
|
139
172
|
* Current window-manager's focused app's id.
|
|
140
173
|
* @example "HelloWorld-1A2b3C4d"
|
|
141
174
|
*/
|
|
142
|
-
readonly focusedApp =
|
|
143
|
-
this._addManagerListener("focusedChange", set)
|
|
144
|
-
);
|
|
175
|
+
readonly focusedApp = readable(this.manager.focused, set => this._addManagerListener("focusedChange", set));
|
|
145
176
|
|
|
146
177
|
/**
|
|
147
178
|
* How many times can I call `app.redo()`?
|
|
148
179
|
*/
|
|
149
|
-
readonly canRedoSteps =
|
|
180
|
+
readonly canRedoSteps = readable(this.manager.canRedoSteps, set =>
|
|
150
181
|
this._addManagerListener("canRedoStepsChange", set)
|
|
151
182
|
);
|
|
152
183
|
|
|
153
184
|
/**
|
|
154
185
|
* How many times can I call `app.undo()`?
|
|
155
186
|
*/
|
|
156
|
-
readonly canUndoSteps =
|
|
187
|
+
readonly canUndoSteps = readable(this.manager.canUndoSteps, set =>
|
|
157
188
|
this._addManagerListener("canUndoStepsChange", set)
|
|
158
189
|
);
|
|
159
190
|
|
|
160
191
|
/**
|
|
161
192
|
* Current camera information of main view.
|
|
193
|
+
*
|
|
194
|
+
* Change the camera position by `app.moveCamera()`.
|
|
162
195
|
*/
|
|
163
|
-
readonly camera =
|
|
196
|
+
readonly camera = readable(this.manager.mainView.camera, set =>
|
|
164
197
|
this._addMainViewListener("onCameraUpdated", set)
|
|
165
198
|
);
|
|
166
199
|
|
|
167
200
|
/**
|
|
168
201
|
* Current tool's info, like "is using pencil?", "what color?".
|
|
202
|
+
*
|
|
203
|
+
* Change the tool by `app.setAppliance()`.
|
|
169
204
|
*/
|
|
170
|
-
readonly memberState =
|
|
205
|
+
readonly memberState = readable(this.room.state.memberState, set =>
|
|
171
206
|
this._addRoomListener("onRoomStateChanged", ({ memberState: m }) => m && set(m))
|
|
172
207
|
);
|
|
173
208
|
|
|
174
209
|
/**
|
|
175
210
|
* 0..n-1, current index of main view scenes.
|
|
176
211
|
*/
|
|
177
|
-
readonly sceneIndex =
|
|
212
|
+
readonly sceneIndex = writable(
|
|
178
213
|
this.manager.mainViewSceneIndex,
|
|
179
214
|
set => this._addManagerListener("mainViewSceneIndexChange", set),
|
|
180
215
|
this.manager.setMainViewSceneIndex.bind(this.manager)
|
|
@@ -183,7 +218,7 @@ export class FastboardApp extends FastboardAppBase {
|
|
|
183
218
|
/**
|
|
184
219
|
* How many pages are in the main view?
|
|
185
220
|
*/
|
|
186
|
-
readonly sceneLength =
|
|
221
|
+
readonly sceneLength = readable(this.manager.mainViewScenesLength, set =>
|
|
187
222
|
this._addManagerListener("mainViewScenesLengthChange", set)
|
|
188
223
|
);
|
|
189
224
|
|
|
@@ -191,12 +226,9 @@ export class FastboardApp extends FastboardAppBase {
|
|
|
191
226
|
/**
|
|
192
227
|
* Apps status.
|
|
193
228
|
*/
|
|
194
|
-
readonly appsStatus =
|
|
229
|
+
readonly appsStatus = readable<AppsStatus>({}, set =>
|
|
195
230
|
this._addManagerListener("loadApp", ({ kind, status, reason }) => {
|
|
196
|
-
this._appsStatus[kind] = {
|
|
197
|
-
status: status === "start" ? "loading" : status === "failed" ? "failed" : "idle",
|
|
198
|
-
reason,
|
|
199
|
-
};
|
|
231
|
+
this._appsStatus[kind] = { status: transform_app_status(status), reason };
|
|
200
232
|
set(this._appsStatus);
|
|
201
233
|
})
|
|
202
234
|
);
|
|
@@ -206,7 +238,7 @@ export class FastboardApp extends FastboardAppBase {
|
|
|
206
238
|
*/
|
|
207
239
|
undo() {
|
|
208
240
|
this._assertNotDestroyed();
|
|
209
|
-
this.manager.
|
|
241
|
+
this.manager.undo();
|
|
210
242
|
}
|
|
211
243
|
|
|
212
244
|
/**
|
|
@@ -214,7 +246,7 @@ export class FastboardApp extends FastboardAppBase {
|
|
|
214
246
|
*/
|
|
215
247
|
redo() {
|
|
216
248
|
this._assertNotDestroyed();
|
|
217
|
-
this.manager.
|
|
249
|
+
this.manager.redo();
|
|
218
250
|
}
|
|
219
251
|
|
|
220
252
|
/**
|
|
@@ -244,9 +276,12 @@ export class FastboardApp extends FastboardAppBase {
|
|
|
244
276
|
/**
|
|
245
277
|
* Set current tool, like "pencil".
|
|
246
278
|
*/
|
|
247
|
-
setAppliance(appliance: ApplianceNames, shape?: ShapeType) {
|
|
279
|
+
setAppliance(appliance: ApplianceNames | Appliance, shape?: ShapeType | Shape) {
|
|
248
280
|
this._assertNotDestroyed();
|
|
249
|
-
this.manager.mainView.setMemberState({
|
|
281
|
+
this.manager.mainView.setMemberState({
|
|
282
|
+
currentApplianceName: appliance as ApplianceNames,
|
|
283
|
+
shapeType: shape as ShapeType,
|
|
284
|
+
});
|
|
250
285
|
}
|
|
251
286
|
|
|
252
287
|
setStrokeWidth(strokeWidth: number) {
|
|
@@ -259,6 +294,21 @@ export class FastboardApp extends FastboardAppBase {
|
|
|
259
294
|
this.manager.mainView.setMemberState({ strokeColor });
|
|
260
295
|
}
|
|
261
296
|
|
|
297
|
+
prevPage() {
|
|
298
|
+
this._assertNotDestroyed();
|
|
299
|
+
return this.manager.prevPage();
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
nextPage() {
|
|
303
|
+
this._assertNotDestroyed();
|
|
304
|
+
return this.manager.nextPage();
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
addPage(params?: AddPageParams) {
|
|
308
|
+
this._assertNotDestroyed();
|
|
309
|
+
return this.manager.addPage(params);
|
|
310
|
+
}
|
|
311
|
+
|
|
262
312
|
/**
|
|
263
313
|
* Insert an image to the main view.
|
|
264
314
|
*/
|
|
@@ -310,19 +360,20 @@ export class FastboardApp extends FastboardAppBase {
|
|
|
310
360
|
insertDocs(params: InsertDocsParams): Promise<string | undefined>;
|
|
311
361
|
|
|
312
362
|
insertDocs(arg1: string | InsertDocsParams, arg2?: ConversionResponse) {
|
|
363
|
+
this._assertNotDestroyed();
|
|
313
364
|
if (typeof arg1 === "object" && "fileType" in arg1) {
|
|
314
365
|
return this._insertDocsImpl(arg1);
|
|
315
366
|
} else if (arg2 && arg2.status !== "Finished") {
|
|
316
|
-
throw new Error("
|
|
367
|
+
throw new Error("FastboardApp cannot insert a converting doc.");
|
|
317
368
|
} else if (arg2 && arg2.progress) {
|
|
318
|
-
const
|
|
369
|
+
const title = arg1;
|
|
319
370
|
const scenePath = `/${arg2.uuid}/${genUID()}`;
|
|
320
|
-
const
|
|
371
|
+
const scenes1 = arg2.progress.convertedFileList.map(convertedFileToScene);
|
|
372
|
+
const { scenes, taskId, url } = makeSlideParams(scenes1);
|
|
321
373
|
if (taskId && url) {
|
|
322
|
-
|
|
323
|
-
return this._insertDocsImpl({ fileType: "pptx", scenePath, taskId, title, url, scenes: emptyScenes });
|
|
374
|
+
return this._insertDocsImpl({ fileType: "pptx", scenePath, scenes, title, taskId, url });
|
|
324
375
|
} else {
|
|
325
|
-
return this._insertDocsImpl({ fileType: "pdf", scenePath, scenes, title
|
|
376
|
+
return this._insertDocsImpl({ fileType: "pdf", scenePath, scenes: scenes1, title });
|
|
326
377
|
}
|
|
327
378
|
}
|
|
328
379
|
}
|
|
@@ -336,6 +387,9 @@ export class FastboardApp extends FastboardAppBase {
|
|
|
336
387
|
options: { scenePath, title, scenes },
|
|
337
388
|
});
|
|
338
389
|
case "pptx":
|
|
390
|
+
if (scenes && scenes[0].ppt) {
|
|
391
|
+
warn("no-ppt-in-scenes");
|
|
392
|
+
}
|
|
339
393
|
return this.manager.addApp({
|
|
340
394
|
kind: "Slide",
|
|
341
395
|
options: { scenePath, title, scenes },
|
|
@@ -389,3 +443,76 @@ export class FastboardApp extends FastboardAppBase {
|
|
|
389
443
|
});
|
|
390
444
|
}
|
|
391
445
|
}
|
|
446
|
+
|
|
447
|
+
export interface FastboardOptions {
|
|
448
|
+
sdkConfig: Omit<WhiteWebSdkConfiguration, "useMobXState">;
|
|
449
|
+
joinRoom: Omit<JoinRoomParams, "useMultiViews" | "disableNewPencil" | "disableMagixEventDispatchLimit"> & {
|
|
450
|
+
callbacks?: Partial<RoomCallbacks>;
|
|
451
|
+
};
|
|
452
|
+
managerConfig?: Omit<MountParams, "room">;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
/**
|
|
456
|
+
* Create a FastboardApp instance.
|
|
457
|
+
* @example
|
|
458
|
+
* let app = await createFastboard({
|
|
459
|
+
* sdkConfig: {
|
|
460
|
+
* appIdentifier: import.meta.env.VITE_APPID,
|
|
461
|
+
* region: 'cn-hz',
|
|
462
|
+
* },
|
|
463
|
+
* joinRoom: {
|
|
464
|
+
* uid: unique_id,
|
|
465
|
+
* uuid: import.meta.env.VITE_ROOM_UUID,
|
|
466
|
+
* roomToken: import.meta.env.VITE_ROOM_TOKEN,
|
|
467
|
+
* },
|
|
468
|
+
* })
|
|
469
|
+
*/
|
|
470
|
+
export async function createFastboard({
|
|
471
|
+
sdkConfig,
|
|
472
|
+
joinRoom: { callbacks, ...joinRoomParams },
|
|
473
|
+
managerConfig,
|
|
474
|
+
}: FastboardOptions) {
|
|
475
|
+
const sdk = new WhiteWebSdk({
|
|
476
|
+
...sdkConfig,
|
|
477
|
+
useMobXState: true,
|
|
478
|
+
});
|
|
479
|
+
|
|
480
|
+
const hotKeys: Partial<HotKeys> = {
|
|
481
|
+
...DefaultHotKeys,
|
|
482
|
+
changeToSelector: "s",
|
|
483
|
+
changeToLaserPointer: "z",
|
|
484
|
+
changeToPencil: "p",
|
|
485
|
+
changeToRectangle: "r",
|
|
486
|
+
changeToEllipse: "c",
|
|
487
|
+
changeToEraser: "e",
|
|
488
|
+
changeToText: "t",
|
|
489
|
+
changeToStraight: "l",
|
|
490
|
+
changeToArrow: "a",
|
|
491
|
+
changeToHand: "h",
|
|
492
|
+
};
|
|
493
|
+
|
|
494
|
+
const room = await sdk.joinRoom(
|
|
495
|
+
{
|
|
496
|
+
floatBar: true,
|
|
497
|
+
hotKeys,
|
|
498
|
+
...ensure_window_manager(joinRoomParams),
|
|
499
|
+
useMultiViews: true,
|
|
500
|
+
disableNewPencil: false,
|
|
501
|
+
disableMagixEventDispatchLimit: true,
|
|
502
|
+
},
|
|
503
|
+
callbacks
|
|
504
|
+
);
|
|
505
|
+
|
|
506
|
+
const manager = await WindowManager.mount({
|
|
507
|
+
cursor: true,
|
|
508
|
+
...managerConfig,
|
|
509
|
+
room,
|
|
510
|
+
});
|
|
511
|
+
|
|
512
|
+
manager.mainView.setCameraBound({
|
|
513
|
+
minContentMode: contentModeScale(0.3),
|
|
514
|
+
maxContentMode: contentModeScale(3),
|
|
515
|
+
});
|
|
516
|
+
|
|
517
|
+
return new FastboardApp(sdk, room, manager, hotKeys);
|
|
518
|
+
}
|