@netless/fastboard-core 0.3.6 → 0.3.7
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/dist/index.d.ts +25 -20
- package/dist/index.js +167 -144
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +114 -68
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
- package/src/behaviors/index.ts +1 -1
- package/src/helpers/index.ts +37 -0
- package/src/impl/FastboardApp.ts +4 -4
- package/src/impl/FastboardPlayer.ts +5 -3
- package/src/index.ts +1 -0
- package/src/utils/misc.ts +5 -7
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/utils/store.ts","../src/utils/misc.ts","../src/utils/uid.ts","../src/utils/warn.ts","../src/impl/FastboardApp.ts","../src/internal.ts","../src/behaviors/index.ts","../src/impl/FastboardPlayer.ts"],"names":[],"mappings":"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","sourcesContent":["export * from \"./utils\";\nexport * from \"./impl\";\nexport * from \"./behaviors\";\n","// 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, NetlessApp } 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\";\nimport type { SyncedStore, Storage, Diff, DiffOne } from \"@netless/synced-store\";\n\nimport { DefaultHotKeys, WhiteWebSdk, contentModeScale } from \"white-web-sdk\";\nimport { BuiltinApps, WindowManager } from \"@netless/window-manager\";\nimport { SyncedStorePlugin } from \"@netless/synced-store\";\nimport {\n getImageSize,\n genUID,\n convertedFileToScene,\n makeSlideParams,\n readable,\n writable,\n warn,\n} from \"../utils\";\nimport { ensure_official_plugins, transform_app_status } from \"../internal\";\nimport { register } from \"../behaviors\";\n\nclass FastboardAppBase<TEventData = any> {\n public constructor(\n readonly sdk: WhiteWebSdk,\n readonly room: Room,\n readonly manager: WindowManager,\n readonly hotKeys: Partial<HotKeys>,\n readonly syncedStore: SyncedStore<TEventData>\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 /**\n * Destroy fastboard (disconnect from the whiteboard room).\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 NetlessApp,\n PublicEvent,\n Rectangle,\n Room,\n RoomPhase,\n RoomCallbacks,\n RoomState,\n SceneDefinition,\n ShapeType,\n SyncedStore,\n Storage,\n Diff,\n DiffOne,\n ViewCallbacks,\n WhiteWebSdk,\n WhiteWebSdkConfiguration,\n WindowManager,\n};\n\n/** pencil, eraser, rectangle... */\nexport type Appliance = `${ApplianceNames}`;\n/** triangle, star... */\nexport type Shape = `${ShapeType}`;\n\n/** Params for static docs, they are rendered as many images. */\nexport interface InsertDocsStatic {\n readonly fileType: \"pdf\";\n /** Unique string for binding whiteboard view to the doc. Must start with `/`. */\n readonly scenePath: string;\n /** @example [{ name: '1', ppt: { src: 'url/to/ppt/1.png' } }] */\n readonly scenes: SceneDefinition[];\n /** Window title. */\n readonly title?: string;\n}\n\n/** Params for slides, they are rendered in @netless/app-slide with animations. */\nexport interface InsertDocsDynamic {\n readonly fileType: \"pptx\";\n /** Unique string for binding whiteboard view to the doc. Must start with `/`. */\n readonly scenePath: string;\n /** Conversion task id, see https://developer.netless.link/server-en/home/server-conversion#get-query-task-conversion-progress. */\n readonly taskId: string;\n /** Window title. */\n readonly title?: string;\n /** Where the slide resource placed. @default `https://convertcdn.netless.link/dynamicConvert` */\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\n/** App download progress. */\nexport interface AppsStatus {\n [kind: string]: {\n status: \"idle\" | \"loading\" | \"failed\";\n /** Exist if status is `failed`. */\n reason?: string;\n };\n}\n\nexport class FastboardApp<TEventData = any> extends FastboardAppBase<TEventData> {\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 => {\n set(this.room.isWritable);\n return this._addRoomListener(\"onEnableWriteNowChanged\", () => set(this.room.isWritable));\n },\n this.room.setWritable.bind(this.room)\n );\n\n /**\n * Is current room online?\n */\n readonly phase = readable<RoomPhase>(this.room.phase, set => {\n set(this.room.phase);\n return this._addRoomListener(\"onPhaseChanged\", set);\n });\n\n /**\n * Current window-manager's windows' state (is it maximized?).\n */\n readonly boxState = readable(this.manager.boxState, set => {\n set(this.manager.boxState);\n return this._addManagerListener(\"boxStateChange\", set);\n });\n\n /**\n * Current window-manager's focused app's id.\n * @example \"HelloWorld-1A2b3C4d\"\n */\n readonly focusedApp = readable(this.manager.focused, set => {\n set(this.manager.focused);\n return this._addManagerListener(\"focusedChange\", set);\n });\n\n /**\n * How many times can I call `app.redo()`?\n */\n readonly canRedoSteps = readable(this.manager.canRedoSteps, set => {\n set(this.manager.canRedoSteps);\n return 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 set(this.manager.canUndoSteps);\n return 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.camera, set => {\n set(this.manager.camera);\n return 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 set(this.room.state.memberState);\n return 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 => {\n set(this.manager.mainViewSceneIndex);\n return this._addManagerListener(\"mainViewSceneIndexChange\", set);\n },\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 set(this.manager.mainViewScenesLength);\n return 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 /**\n * Set pencil and shape's thickness.\n */\n setStrokeWidth(strokeWidth: number) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ strokeWidth });\n }\n\n /**\n * Set pencil and shape's color.\n */\n setStrokeColor(strokeColor: Color) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ strokeColor });\n }\n\n /**\n * Set text size. Default is 16.\n */\n setTextSize(textSize: number) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ textSize });\n }\n\n /**\n * Set text color.\n *\n * @example\n * setTextColor([0x66, 0xcc, 0xff])\n */\n setTextColor(textColor: Color) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ textColor });\n }\n\n /**\n * Goto previous page (the main whiteboard view).\n */\n prevPage() {\n this._assertNotDestroyed();\n return this.manager.prevPage();\n }\n\n /**\n * Goto next page (the main whiteboard view).\n */\n nextPage() {\n this._assertNotDestroyed();\n return this.manager.nextPage();\n }\n\n /**\n * Add one page to the main whiteboard view.\n *\n * @example\n * addPage({ after: true }) // add one page right after current one.\n * nextPage() // then, goto that page.\n */\n addPage(params?: AddPageParams) {\n this._assertNotDestroyed();\n return this.manager.addPage(params);\n }\n\n /**\n * Remove one page at given index or current page (by default).\n *\n * Requires `@netless/window-manager` >= 0.4.30.\n *\n * @example\n * removePage() // remove current page\n */\n removePage(index?: number) {\n this._assertNotDestroyed();\n return this.manager.removePage(index);\n }\n\n /**\n * Insert an image to the main view.\n *\n * @example\n * insertImage(\"https://i.imgur.com/CzXTtJV.jpg\")\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 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 Monaco Code Editor app.\n * @deprecated Use `app.manager.addApp({ kind: 'Monaco' })` instead.\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 * @deprecated Use `app.manager.addApp({ kind: 'Countdown' })` instead.\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 GeoGebra app.\n * @deprecated Use `app.manager.addApp({ kind: 'GeoGebra' })` instead.\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 region: NonNullable<WhiteWebSdkConfiguration[\"region\"]>;\n };\n joinRoom: Omit<JoinRoomParams, \"useMultiViews\" | \"disableNewPencil\" | \"disableMagixEventDispatchLimit\"> & {\n callbacks?: Partial<RoomCallbacks>;\n };\n managerConfig?: Omit<MountParams, \"room\">;\n netlessApps?: NetlessApp[];\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<TEventData = any>({\n sdkConfig,\n joinRoom: { callbacks, ...joinRoomParams },\n managerConfig,\n netlessApps,\n}: FastboardOptions) {\n const sdk = new WhiteWebSdk({\n ...sdkConfig,\n useMobXState: true,\n });\n\n const hotKeys = joinRoomParams.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 if (netlessApps) {\n netlessApps.forEach(app => {\n register({ kind: app.kind, src: app });\n });\n }\n\n const room = await sdk.joinRoom(\n {\n floatBar: true,\n hotKeys,\n ...ensure_official_plugins(joinRoomParams),\n useMultiViews: true,\n disableNewPencil: false,\n disableMagixEventDispatchLimit: true,\n },\n callbacks\n );\n\n const syncedStore = await SyncedStorePlugin.init<TEventData>(room);\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<TEventData>(sdk, room, manager, hotKeys, syncedStore);\n}\n","import type { JoinRoomParams, ReplayRoomParams } from \"white-web-sdk\";\nimport type { PublicEvent } from \"@netless/window-manager\";\nimport { WindowManager } from \"@netless/window-manager\";\nimport { SyncedStorePlugin } from \"@netless/synced-store\";\n\nexport function ensure_official_plugins<T extends JoinRoomParams | ReplayRoomParams>(joinRoom: T): T {\n const plugins = new Set(joinRoom.invisiblePlugins || []);\n plugins.add(WindowManager);\n plugins.add(SyncedStorePlugin);\n joinRoom.invisiblePlugins = [...plugins];\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 { RegisterParams } from \"@netless/window-manager\";\nimport { WindowManager } from \"@netless/window-manager\";\nimport SlideApp, { apps, addHooks, previewSlide } from \"@netless/app-slide\";\n\nexport type {\n AppOptions as SlideOptions,\n Controller as SlideController,\n PreviewParams,\n SlidePreviewer,\n} from \"@netless/app-slide\";\nexport { previewSlide, SlideApp, addHooks as addSlideHooks, apps as slideApps };\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 Plyr: {\n src: \"https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-plyr/0.1.3/dist/main.iife.js\",\n },\n};\n\nWindowManager.register({\n kind: \"Slide\",\n appOptions: { debug: false },\n src: SlideApp,\n addHooks,\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\nexport const register = WindowManager.register.bind(WindowManager);\n\ndeclare let __NAME__: string, __VERSION__: string;\n\nexport const version = __VERSION__;\n\nif (typeof window !== \"undefined\") {\n let str = (window as { __netlessUA?: string }).__netlessUA || \"\";\n str += ` ${__NAME__}@${version} `;\n (window as { __netlessUA?: string }).__netlessUA = str;\n}\n","import type { MountParams, NetlessApp, 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\";\nimport type { SyncedStore } from \"@netless/synced-store\";\n\nimport { WhiteWebSdk } from \"white-web-sdk\";\nimport { WindowManager } from \"@netless/window-manager\";\nimport { SyncedStorePlugin } from \"@netless/synced-store\";\nimport { readable, writable } from \"../utils\";\nimport { ensure_official_plugins } from \"../internal\";\nimport { register } from \"../behaviors\";\n\nclass FastboardPlayerBase<TEventData = any> {\n public constructor(\n readonly sdk: WhiteWebSdk,\n readonly player: Player,\n readonly manager: WindowManager,\n readonly syncedStore: SyncedStore<TEventData>\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 _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<TEventData = any> extends FastboardPlayerBase<TEventData> {\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 /**\n * Player current time in milliseconds.\n */\n readonly currentTime = writable(\n this.player.progressTime,\n set => {\n set(this.player.progressTime);\n return this._addPlayerListener(\"onProgressTimeChanged\", set);\n },\n this.player.seekToProgressTime.bind(this.player)\n );\n\n /**\n * Player state, like \"is it playing?\".\n */\n readonly phase = readable<PlayerPhase>(this.player.phase, set => {\n set(this.player.phase);\n return this._addPlayerListener(\"onPhaseChanged\", set);\n });\n\n /**\n * Will become true after buffering.\n */\n readonly canplay = readable(this.player.isPlayable, set => {\n set(this.player.isPlayable);\n return this._addPlayerListener(\"onIsPlayableChanged\", set);\n });\n\n private _setPlaybackRate!: (value: number) => void;\n /**\n * Playback speed, default `1`.\n */\n readonly playbackRate = writable(\n this.player.playbackSpeed,\n set => {\n this._setPlaybackRate = set;\n set(this.player.playbackSpeed);\n },\n value => {\n this.player.playbackSpeed = value;\n this._setPlaybackRate(value);\n }\n );\n\n /**\n * Playback duration in milliseconds.\n */\n readonly duration = readable(this.player.timeDuration, set => {\n set(this.player.timeDuration);\n });\n\n /**\n * Get state of room at that time, like \"who was in the room?\".\n */\n readonly state = readable<PlayerState>(this.player.state, set => {\n set(this.player.state);\n return this._addPlayerListener(\"onPlayerStateChanged\", () => set(this.player.state));\n });\n\n /**\n * Seek to some time in milliseconds.\n */\n seek(timestamp: number) {\n this._assertNotDestroyed();\n return this.player.seekToProgressTime(timestamp);\n }\n\n /**\n * Change player state to playing.\n */\n play() {\n this._assertNotDestroyed();\n this.player.play();\n }\n\n /**\n * Change player state to paused.\n */\n pause() {\n this._assertNotDestroyed();\n this.player.pause();\n }\n\n /**\n * Change player state to stopped.\n */\n stop() {\n this._assertNotDestroyed();\n this.player.stop();\n }\n\n /**\n * Set playback speed, a shortcut for `speed.set(x)`.\n */\n setPlaybackRate(value: number) {\n this._assertNotDestroyed();\n this.playbackRate.set(value);\n }\n}\n\nexport interface FastboardReplayOptions {\n sdkConfig: Omit<WhiteWebSdkConfiguration, \"useMobXState\"> & {\n region: NonNullable<WhiteWebSdkConfiguration[\"region\"]>;\n };\n replayRoom: Omit<ReplayRoomParams, \"useMultiViews\"> & {\n callbacks?: Partial<PlayerCallbacks>;\n };\n managerConfig?: Omit<MountParams, \"room\">;\n netlessApps?: NetlessApp[];\n}\n\n/**\n * Create a FastboardPlayer 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 * room: \"room uuid\",\n * roomToken: \"NETLESSROOM_...\",\n * beginTimestamp: 1646619090394,\n * duration: 70448,\n * },\n * })\n */\nexport async function replayFastboard<TEventData = any>({\n sdkConfig,\n replayRoom: { callbacks, ...replayRoomParams },\n managerConfig,\n netlessApps,\n}: FastboardReplayOptions) {\n const sdk = new WhiteWebSdk({\n ...sdkConfig,\n useMobXState: true,\n });\n\n if (netlessApps) {\n netlessApps.forEach(app => {\n register({ kind: app.kind, src: app });\n });\n }\n\n const player = await sdk.replayRoom(\n {\n ...ensure_official_plugins(replayRoomParams),\n useMultiViews: true,\n },\n callbacks\n );\n\n const syncedStore = await SyncedStorePlugin.init<TEventData>(player);\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 await player.seekToProgressTime(0);\n\n return new FastboardPlayer<TEventData>(sdk, player, manager, syncedStore);\n}\n"]}
|
|
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/behaviors/index.ts","../src/impl/FastboardPlayer.ts","../src/helpers/index.ts"],"names":["WindowManager","SyncedStorePlugin","WhiteWebSdk"],"mappings":"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","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\")) continue;\n\n const match = pptSrcRE.exec(ppt.src);\n if (!match || !match.groups) 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, NetlessApp } 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\";\nimport type { SyncedStore, Storage, Diff, DiffOne } from \"@netless/synced-store\";\n\nimport { DefaultHotKeys, WhiteWebSdk, contentModeScale } from \"white-web-sdk\";\nimport { BuiltinApps, WindowManager } from \"@netless/window-manager\";\nimport { SyncedStorePlugin } from \"@netless/synced-store\";\nimport {\n getImageSize,\n genUID,\n convertedFileToScene,\n makeSlideParams,\n readable,\n writable,\n warn,\n} from \"../utils\";\nimport { ensure_official_plugins, transform_app_status } from \"../internal\";\nimport { register } from \"../behaviors\";\n\nclass FastboardAppBase<TEventData extends Record<string, any> = any> {\n public constructor(\n readonly sdk: WhiteWebSdk,\n readonly room: Room,\n readonly manager: WindowManager,\n readonly hotKeys: Partial<HotKeys>,\n readonly syncedStore: SyncedStore<TEventData>\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 /**\n * Destroy fastboard (disconnect from the whiteboard room).\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 NetlessApp,\n PublicEvent,\n Rectangle,\n Room,\n RoomPhase,\n RoomCallbacks,\n RoomState,\n SceneDefinition,\n ShapeType,\n SyncedStore,\n Storage,\n Diff,\n DiffOne,\n ViewCallbacks,\n WhiteWebSdk,\n WhiteWebSdkConfiguration,\n WindowManager,\n};\n\n/** pencil, eraser, rectangle... */\nexport type Appliance = `${ApplianceNames}`;\n/** triangle, star... */\nexport type Shape = `${ShapeType}`;\n\n/** Params for static docs, they are rendered as many images. */\nexport interface InsertDocsStatic {\n readonly fileType: \"pdf\";\n /** Unique string for binding whiteboard view to the doc. Must start with `/`. */\n readonly scenePath: string;\n /** @example [{ name: '1', ppt: { src: 'url/to/ppt/1.png' } }] */\n readonly scenes: SceneDefinition[];\n /** Window title. */\n readonly title?: string;\n}\n\n/** Params for slides, they are rendered in @netless/app-slide with animations. */\nexport interface InsertDocsDynamic {\n readonly fileType: \"pptx\";\n /** Unique string for binding whiteboard view to the doc. Must start with `/`. */\n readonly scenePath: string;\n /** Conversion task id, see https://developer.netless.link/server-en/home/server-conversion#get-query-task-conversion-progress. */\n readonly taskId: string;\n /** Window title. */\n readonly title?: string;\n /** Where the slide resource placed. @default `https://convertcdn.netless.link/dynamicConvert` */\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\n/** App download progress. */\nexport interface AppsStatus {\n [kind: string]: {\n status: \"idle\" | \"loading\" | \"failed\";\n /** Exist if status is `failed`. */\n reason?: string;\n };\n}\n\nexport class FastboardApp<TEventData extends Record<string, any> = any> extends FastboardAppBase<TEventData> {\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 => {\n set(this.room.isWritable);\n return this._addRoomListener(\"onEnableWriteNowChanged\", () => set(this.room.isWritable));\n },\n this.room.setWritable.bind(this.room)\n );\n\n /**\n * Is current room online?\n */\n readonly phase = readable<RoomPhase>(this.room.phase, set => {\n set(this.room.phase);\n return this._addRoomListener(\"onPhaseChanged\", set);\n });\n\n /**\n * Current window-manager's windows' state (is it maximized?).\n */\n readonly boxState = readable(this.manager.boxState, set => {\n set(this.manager.boxState);\n return this._addManagerListener(\"boxStateChange\", set);\n });\n\n /**\n * Current window-manager's focused app's id.\n * @example \"HelloWorld-1A2b3C4d\"\n */\n readonly focusedApp = readable(this.manager.focused, set => {\n set(this.manager.focused);\n return this._addManagerListener(\"focusedChange\", set);\n });\n\n /**\n * How many times can I call `app.redo()`?\n */\n readonly canRedoSteps = readable(this.manager.canRedoSteps, set => {\n set(this.manager.canRedoSteps);\n return 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 set(this.manager.canUndoSteps);\n return 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.camera, set => {\n set(this.manager.camera);\n return 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 set(this.room.state.memberState);\n return 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 => {\n set(this.manager.mainViewSceneIndex);\n return this._addManagerListener(\"mainViewSceneIndexChange\", set);\n },\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 set(this.manager.mainViewScenesLength);\n return 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 /**\n * Set pencil and shape's thickness.\n */\n setStrokeWidth(strokeWidth: number) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ strokeWidth });\n }\n\n /**\n * Set pencil and shape's color.\n */\n setStrokeColor(strokeColor: Color) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ strokeColor });\n }\n\n /**\n * Set text size. Default is 16.\n */\n setTextSize(textSize: number) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ textSize });\n }\n\n /**\n * Set text color.\n *\n * @example\n * setTextColor([0x66, 0xcc, 0xff])\n */\n setTextColor(textColor: Color) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ textColor });\n }\n\n /**\n * Goto previous page (the main whiteboard view).\n */\n prevPage() {\n this._assertNotDestroyed();\n return this.manager.prevPage();\n }\n\n /**\n * Goto next page (the main whiteboard view).\n */\n nextPage() {\n this._assertNotDestroyed();\n return this.manager.nextPage();\n }\n\n /**\n * Add one page to the main whiteboard view.\n *\n * @example\n * addPage({ after: true }) // add one page right after current one.\n * nextPage() // then, goto that page.\n */\n addPage(params?: AddPageParams) {\n this._assertNotDestroyed();\n return this.manager.addPage(params);\n }\n\n /**\n * Remove one page at given index or current page (by default).\n *\n * Requires `@netless/window-manager` >= 0.4.30.\n *\n * @example\n * removePage() // remove current page\n */\n removePage(index?: number) {\n this._assertNotDestroyed();\n return this.manager.removePage(index);\n }\n\n /**\n * Insert an image to the main view.\n *\n * @example\n * insertImage(\"https://i.imgur.com/CzXTtJV.jpg\")\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 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 Monaco Code Editor app.\n * @deprecated Use `app.manager.addApp({ kind: 'Monaco' })` instead.\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 * @deprecated Use `app.manager.addApp({ kind: 'Countdown' })` instead.\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 GeoGebra app.\n * @deprecated Use `app.manager.addApp({ kind: 'GeoGebra' })` instead.\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 region: NonNullable<WhiteWebSdkConfiguration[\"region\"]>;\n };\n joinRoom: Omit<JoinRoomParams, \"useMultiViews\" | \"disableNewPencil\" | \"disableMagixEventDispatchLimit\"> & {\n callbacks?: Partial<Omit<RoomCallbacks, \"onCanRedoStepsUpdate\" | \"onCanUndoStepsUpdate\">>;\n };\n managerConfig?: Omit<MountParams, \"room\">;\n netlessApps?: NetlessApp[];\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<TEventData extends Record<string, any> = any>({\n sdkConfig,\n joinRoom: { callbacks, ...joinRoomParams },\n managerConfig,\n netlessApps,\n}: FastboardOptions) {\n const sdk = new WhiteWebSdk({\n ...sdkConfig,\n useMobXState: true,\n });\n\n const hotKeys = joinRoomParams.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 if (netlessApps) {\n netlessApps.forEach(app => {\n register({ kind: app.kind, src: app });\n });\n }\n\n const room = await sdk.joinRoom(\n {\n floatBar: true,\n hotKeys,\n ...ensure_official_plugins(joinRoomParams),\n useMultiViews: true,\n disableNewPencil: false,\n disableMagixEventDispatchLimit: true,\n },\n callbacks\n );\n\n const syncedStore = await SyncedStorePlugin.init<TEventData>(room);\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<TEventData>(sdk, room, manager, hotKeys, syncedStore);\n}\n","import type { JoinRoomParams, ReplayRoomParams } from \"white-web-sdk\";\nimport type { PublicEvent } from \"@netless/window-manager\";\nimport { WindowManager } from \"@netless/window-manager\";\nimport { SyncedStorePlugin } from \"@netless/synced-store\";\n\nexport function ensure_official_plugins<T extends JoinRoomParams | ReplayRoomParams>(joinRoom: T): T {\n const plugins = new Set(joinRoom.invisiblePlugins || []);\n plugins.add(WindowManager);\n plugins.add(SyncedStorePlugin);\n joinRoom.invisiblePlugins = [...plugins];\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 { RegisterParams } from \"@netless/window-manager\";\nimport { WindowManager } from \"@netless/window-manager\";\nimport SlideApp, { apps, addHooks, previewSlide } from \"@netless/app-slide\";\n\nexport type {\n AppOptions as SlideOptions,\n Controller as SlideController,\n PreviewParams,\n SlidePreviewer,\n} from \"@netless/app-slide\";\nexport { previewSlide, SlideApp, addHooks as addSlideHooks, apps as slideApps };\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.14-beta.1/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 Plyr: {\n src: \"https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-plyr/0.1.3/dist/main.iife.js\",\n },\n};\n\nWindowManager.register({\n kind: \"Slide\",\n appOptions: { debug: false },\n src: SlideApp,\n addHooks,\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\nexport const register = WindowManager.register.bind(WindowManager);\n\ndeclare let __NAME__: string, __VERSION__: string;\n\nexport const version = __VERSION__;\n\nif (typeof window !== \"undefined\") {\n let str = (window as { __netlessUA?: string }).__netlessUA || \"\";\n str += ` ${__NAME__}@${version} `;\n (window as { __netlessUA?: string }).__netlessUA = str;\n}\n","import type { MountParams, NetlessApp, 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\";\nimport type { SyncedStore } from \"@netless/synced-store\";\n\nimport { WhiteWebSdk } from \"white-web-sdk\";\nimport { WindowManager } from \"@netless/window-manager\";\nimport { SyncedStorePlugin } from \"@netless/synced-store\";\nimport { readable, writable } from \"../utils\";\nimport { ensure_official_plugins } from \"../internal\";\nimport { register } from \"../behaviors\";\n\nclass FastboardPlayerBase<TEventData extends Record<string, any> = any> {\n public constructor(\n readonly sdk: WhiteWebSdk,\n readonly player: Player,\n readonly manager: WindowManager,\n readonly syncedStore: SyncedStore<TEventData>\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 _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<\n TEventData extends Record<string, any> = any\n> extends FastboardPlayerBase<TEventData> {\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 /**\n * Player current time in milliseconds.\n */\n readonly currentTime = writable(\n this.player.progressTime,\n set => {\n set(this.player.progressTime);\n return this._addPlayerListener(\"onProgressTimeChanged\", set);\n },\n this.player.seekToProgressTime.bind(this.player)\n );\n\n /**\n * Player state, like \"is it playing?\".\n */\n readonly phase = readable<PlayerPhase>(this.player.phase, set => {\n set(this.player.phase);\n return this._addPlayerListener(\"onPhaseChanged\", set);\n });\n\n /**\n * Will become true after buffering.\n */\n readonly canplay = readable(this.player.isPlayable, set => {\n set(this.player.isPlayable);\n return this._addPlayerListener(\"onIsPlayableChanged\", set);\n });\n\n private _setPlaybackRate!: (value: number) => void;\n /**\n * Playback speed, default `1`.\n */\n readonly playbackRate = writable(\n this.player.playbackSpeed,\n set => {\n this._setPlaybackRate = set;\n set(this.player.playbackSpeed);\n },\n value => {\n this.player.playbackSpeed = value;\n this._setPlaybackRate(value);\n }\n );\n\n /**\n * Playback duration in milliseconds.\n */\n readonly duration = readable(this.player.timeDuration, set => {\n set(this.player.timeDuration);\n });\n\n /**\n * Get state of room at that time, like \"who was in the room?\".\n */\n readonly state = readable<PlayerState>(this.player.state, set => {\n set(this.player.state);\n return this._addPlayerListener(\"onPlayerStateChanged\", () => set(this.player.state));\n });\n\n /**\n * Seek to some time in milliseconds.\n */\n seek(timestamp: number) {\n this._assertNotDestroyed();\n return this.player.seekToProgressTime(timestamp);\n }\n\n /**\n * Change player state to playing.\n */\n play() {\n this._assertNotDestroyed();\n this.player.play();\n }\n\n /**\n * Change player state to paused.\n */\n pause() {\n this._assertNotDestroyed();\n this.player.pause();\n }\n\n /**\n * Change player state to stopped.\n */\n stop() {\n this._assertNotDestroyed();\n this.player.stop();\n }\n\n /**\n * Set playback speed, a shortcut for `speed.set(x)`.\n */\n setPlaybackRate(value: number) {\n this._assertNotDestroyed();\n this.playbackRate.set(value);\n }\n}\n\nexport interface FastboardReplayOptions {\n sdkConfig: Omit<WhiteWebSdkConfiguration, \"useMobXState\"> & {\n region: NonNullable<WhiteWebSdkConfiguration[\"region\"]>;\n };\n replayRoom: Omit<ReplayRoomParams, \"useMultiViews\"> & {\n callbacks?: Partial<PlayerCallbacks>;\n };\n managerConfig?: Omit<MountParams, \"room\">;\n netlessApps?: NetlessApp[];\n}\n\n/**\n * Create a FastboardPlayer 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 * room: \"room uuid\",\n * roomToken: \"NETLESSROOM_...\",\n * beginTimestamp: 1646619090394,\n * duration: 70448,\n * },\n * })\n */\nexport async function replayFastboard<TEventData extends Record<string, any> = any>({\n sdkConfig,\n replayRoom: { callbacks, ...replayRoomParams },\n managerConfig,\n netlessApps,\n}: FastboardReplayOptions) {\n const sdk = new WhiteWebSdk({\n ...sdkConfig,\n useMobXState: true,\n });\n\n if (netlessApps) {\n netlessApps.forEach(app => {\n register({ kind: app.kind, src: app });\n });\n }\n\n const player = await sdk.replayRoom(\n {\n ...ensure_official_plugins(replayRoomParams),\n useMultiViews: true,\n },\n callbacks\n );\n\n const syncedStore = await SyncedStorePlugin.init<TEventData>(player);\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 await player.seekToProgressTime(0);\n\n return new FastboardPlayer<TEventData>(sdk, player, manager, syncedStore);\n}\n","import type { PublicEvent, WindowManager } from \"@netless/window-manager\";\nimport type { Player, PlayerCallbacks, Room, RoomCallbacks, View, ViewCallbacks } from \"white-web-sdk\";\n\nexport function addRoomListener<K extends keyof RoomCallbacks>(\n room: Room,\n name: K,\n listener: RoomCallbacks[K]\n) {\n room.callbacks.on(name, listener);\n return () => room.callbacks.off(name, listener);\n}\n\nexport function addPlayerListener<K extends keyof PlayerCallbacks>(\n player: Player,\n name: K,\n listener: PlayerCallbacks[K]\n) {\n player.callbacks.on(name, listener);\n return () => player.callbacks.off(name, listener);\n}\n\nexport function addViewListener<K extends keyof ViewCallbacks>(\n view: View,\n name: K,\n listener: (value: ViewCallbacks[K]) => void\n) {\n view.callbacks.on(name, listener);\n return () => view.callbacks.off(name, listener);\n}\n\nexport function addManagerListener<K extends keyof PublicEvent>(\n manager: WindowManager,\n name: K,\n listener: (value: PublicEvent[K]) => void\n): () => void {\n return manager.emitter.on(name, listener);\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -35,6 +35,10 @@ var __objRest = (source, exclude) => {
|
|
|
35
35
|
}
|
|
36
36
|
return target;
|
|
37
37
|
};
|
|
38
|
+
var __publicField = (obj, key, value) => {
|
|
39
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
40
|
+
return value;
|
|
41
|
+
};
|
|
38
42
|
|
|
39
43
|
// src/utils/store.ts
|
|
40
44
|
function noop() {
|
|
@@ -121,15 +125,13 @@ function makeSlideParams(scenes) {
|
|
|
121
125
|
const pptSrcRE = new RegExp("^pptx?(?<prefix>:\\/\\/\\S+?dynamicConvert)\\/(?<taskId>\\w+)\\/");
|
|
122
126
|
for (const { name, ppt } of scenes) {
|
|
123
127
|
emptyScenes.push({ name });
|
|
124
|
-
if (!ppt || !ppt.src.startsWith("ppt"))
|
|
128
|
+
if (!ppt || !ppt.src.startsWith("ppt"))
|
|
125
129
|
continue;
|
|
126
|
-
}
|
|
127
130
|
const match = pptSrcRE.exec(ppt.src);
|
|
128
|
-
if (!match || !match.groups)
|
|
131
|
+
if (!match || !match.groups)
|
|
129
132
|
continue;
|
|
130
|
-
}
|
|
131
133
|
taskId = match.groups.taskId;
|
|
132
|
-
url =
|
|
134
|
+
url = `https${match.groups.prefix}`;
|
|
133
135
|
break;
|
|
134
136
|
}
|
|
135
137
|
return { scenes: emptyScenes, taskId, url };
|
|
@@ -181,7 +183,7 @@ function transform_app_status(status) {
|
|
|
181
183
|
}
|
|
182
184
|
var DefaultApps = {
|
|
183
185
|
Monaco: {
|
|
184
|
-
src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-monaco/0.1.
|
|
186
|
+
src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-monaco/0.1.14-beta.1/dist/main.iife.js"
|
|
185
187
|
},
|
|
186
188
|
Countdown: {
|
|
187
189
|
src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-countdown/0.0.2/dist/main.iife.js"
|
|
@@ -212,7 +214,7 @@ for (const kind in DefaultApps) {
|
|
|
212
214
|
}
|
|
213
215
|
}
|
|
214
216
|
var register = WindowManager.register.bind(WindowManager);
|
|
215
|
-
var version = "0.3.
|
|
217
|
+
var version = "0.3.7";
|
|
216
218
|
if (typeof window !== "undefined") {
|
|
217
219
|
let str = window.__netlessUA || "";
|
|
218
220
|
str += ` ${"@netless/fastboard"}@${version} `;
|
|
@@ -227,7 +229,7 @@ var FastboardAppBase = class {
|
|
|
227
229
|
this.manager = manager;
|
|
228
230
|
this.hotKeys = hotKeys;
|
|
229
231
|
this.syncedStore = syncedStore;
|
|
230
|
-
this
|
|
232
|
+
__publicField(this, "_destroyed", false);
|
|
231
233
|
}
|
|
232
234
|
_assertNotDestroyed() {
|
|
233
235
|
if (this._destroyed) {
|
|
@@ -258,51 +260,62 @@ var FastboardAppBase = class {
|
|
|
258
260
|
var FastboardApp = class extends FastboardAppBase {
|
|
259
261
|
constructor() {
|
|
260
262
|
super(...arguments);
|
|
261
|
-
this
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
263
|
+
__publicField(this, "writable", writable(
|
|
264
|
+
this.room.isWritable,
|
|
265
|
+
(set) => {
|
|
266
|
+
set(this.room.isWritable);
|
|
267
|
+
return this._addRoomListener("onEnableWriteNowChanged", () => set(this.room.isWritable));
|
|
268
|
+
},
|
|
269
|
+
this.room.setWritable.bind(this.room)
|
|
270
|
+
));
|
|
271
|
+
__publicField(this, "phase", readable(this.room.phase, (set) => {
|
|
266
272
|
set(this.room.phase);
|
|
267
273
|
return this._addRoomListener("onPhaseChanged", set);
|
|
268
|
-
});
|
|
269
|
-
this
|
|
274
|
+
}));
|
|
275
|
+
__publicField(this, "boxState", readable(this.manager.boxState, (set) => {
|
|
270
276
|
set(this.manager.boxState);
|
|
271
277
|
return this._addManagerListener("boxStateChange", set);
|
|
272
|
-
});
|
|
273
|
-
this
|
|
278
|
+
}));
|
|
279
|
+
__publicField(this, "focusedApp", readable(this.manager.focused, (set) => {
|
|
274
280
|
set(this.manager.focused);
|
|
275
281
|
return this._addManagerListener("focusedChange", set);
|
|
276
|
-
});
|
|
277
|
-
this
|
|
282
|
+
}));
|
|
283
|
+
__publicField(this, "canRedoSteps", readable(this.manager.canRedoSteps, (set) => {
|
|
278
284
|
set(this.manager.canRedoSteps);
|
|
279
285
|
return this._addManagerListener("canRedoStepsChange", set);
|
|
280
|
-
});
|
|
281
|
-
this
|
|
286
|
+
}));
|
|
287
|
+
__publicField(this, "canUndoSteps", readable(this.manager.canUndoSteps, (set) => {
|
|
282
288
|
set(this.manager.canUndoSteps);
|
|
283
289
|
return this._addManagerListener("canUndoStepsChange", set);
|
|
284
|
-
});
|
|
285
|
-
this
|
|
290
|
+
}));
|
|
291
|
+
__publicField(this, "camera", readable(this.manager.camera, (set) => {
|
|
286
292
|
set(this.manager.camera);
|
|
287
293
|
return this._addMainViewListener("onCameraUpdated", set);
|
|
288
|
-
});
|
|
289
|
-
this
|
|
294
|
+
}));
|
|
295
|
+
__publicField(this, "memberState", readable(this.room.state.memberState, (set) => {
|
|
290
296
|
set(this.room.state.memberState);
|
|
291
297
|
return this._addRoomListener("onRoomStateChanged", ({ memberState: m }) => m && set(m));
|
|
292
|
-
});
|
|
293
|
-
this
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
+
}));
|
|
299
|
+
__publicField(this, "sceneIndex", writable(
|
|
300
|
+
this.manager.mainViewSceneIndex,
|
|
301
|
+
(set) => {
|
|
302
|
+
set(this.manager.mainViewSceneIndex);
|
|
303
|
+
return this._addManagerListener("mainViewSceneIndexChange", set);
|
|
304
|
+
},
|
|
305
|
+
this.manager.setMainViewSceneIndex.bind(this.manager)
|
|
306
|
+
));
|
|
307
|
+
__publicField(this, "sceneLength", readable(this.manager.mainViewScenesLength, (set) => {
|
|
298
308
|
set(this.manager.mainViewScenesLength);
|
|
299
309
|
return this._addManagerListener("mainViewScenesLengthChange", set);
|
|
300
|
-
});
|
|
301
|
-
this._appsStatus = {};
|
|
302
|
-
this.appsStatus = readable({}, (set) => this._addManagerListener("loadApp", ({ kind, status, reason }) => {
|
|
303
|
-
this._appsStatus[kind] = { status: transform_app_status(status), reason };
|
|
304
|
-
set(this._appsStatus);
|
|
305
310
|
}));
|
|
311
|
+
__publicField(this, "_appsStatus", {});
|
|
312
|
+
__publicField(this, "appsStatus", readable(
|
|
313
|
+
{},
|
|
314
|
+
(set) => this._addManagerListener("loadApp", ({ kind, status, reason }) => {
|
|
315
|
+
this._appsStatus[kind] = { status: transform_app_status(status), reason };
|
|
316
|
+
set(this._appsStatus);
|
|
317
|
+
})
|
|
318
|
+
));
|
|
306
319
|
}
|
|
307
320
|
bindContainer(container) {
|
|
308
321
|
this._assertNotDestroyed();
|
|
@@ -490,14 +503,17 @@ async function createFastboard(_a) {
|
|
|
490
503
|
register({ kind: app.kind, src: app });
|
|
491
504
|
});
|
|
492
505
|
}
|
|
493
|
-
const room = await sdk.joinRoom(
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
506
|
+
const room = await sdk.joinRoom(
|
|
507
|
+
__spreadProps(__spreadValues({
|
|
508
|
+
floatBar: true,
|
|
509
|
+
hotKeys
|
|
510
|
+
}, ensure_official_plugins(joinRoomParams)), {
|
|
511
|
+
useMultiViews: true,
|
|
512
|
+
disableNewPencil: false,
|
|
513
|
+
disableMagixEventDispatchLimit: true
|
|
514
|
+
}),
|
|
515
|
+
callbacks
|
|
516
|
+
);
|
|
501
517
|
const syncedStore = await SyncedStorePlugin.init(room);
|
|
502
518
|
const manager = await WindowManager.mount(__spreadProps(__spreadValues({
|
|
503
519
|
cursor: true
|
|
@@ -516,7 +532,7 @@ var FastboardPlayerBase = class {
|
|
|
516
532
|
this.player = player;
|
|
517
533
|
this.manager = manager;
|
|
518
534
|
this.syncedStore = syncedStore;
|
|
519
|
-
this
|
|
535
|
+
__publicField(this, "_destroyed", false);
|
|
520
536
|
}
|
|
521
537
|
_assertNotDestroyed() {
|
|
522
538
|
if (this._destroyed) {
|
|
@@ -547,32 +563,41 @@ var FastboardPlayerBase = class {
|
|
|
547
563
|
var FastboardPlayer = class extends FastboardPlayerBase {
|
|
548
564
|
constructor() {
|
|
549
565
|
super(...arguments);
|
|
550
|
-
this
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
566
|
+
__publicField(this, "currentTime", writable(
|
|
567
|
+
this.player.progressTime,
|
|
568
|
+
(set) => {
|
|
569
|
+
set(this.player.progressTime);
|
|
570
|
+
return this._addPlayerListener("onProgressTimeChanged", set);
|
|
571
|
+
},
|
|
572
|
+
this.player.seekToProgressTime.bind(this.player)
|
|
573
|
+
));
|
|
574
|
+
__publicField(this, "phase", readable(this.player.phase, (set) => {
|
|
555
575
|
set(this.player.phase);
|
|
556
576
|
return this._addPlayerListener("onPhaseChanged", set);
|
|
557
|
-
});
|
|
558
|
-
this
|
|
577
|
+
}));
|
|
578
|
+
__publicField(this, "canplay", readable(this.player.isPlayable, (set) => {
|
|
559
579
|
set(this.player.isPlayable);
|
|
560
580
|
return this._addPlayerListener("onIsPlayableChanged", set);
|
|
561
|
-
});
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
581
|
+
}));
|
|
582
|
+
__publicField(this, "_setPlaybackRate");
|
|
583
|
+
__publicField(this, "playbackRate", writable(
|
|
584
|
+
this.player.playbackSpeed,
|
|
585
|
+
(set) => {
|
|
586
|
+
this._setPlaybackRate = set;
|
|
587
|
+
set(this.player.playbackSpeed);
|
|
588
|
+
},
|
|
589
|
+
(value) => {
|
|
590
|
+
this.player.playbackSpeed = value;
|
|
591
|
+
this._setPlaybackRate(value);
|
|
592
|
+
}
|
|
593
|
+
));
|
|
594
|
+
__publicField(this, "duration", readable(this.player.timeDuration, (set) => {
|
|
570
595
|
set(this.player.timeDuration);
|
|
571
|
-
});
|
|
572
|
-
this
|
|
596
|
+
}));
|
|
597
|
+
__publicField(this, "state", readable(this.player.state, (set) => {
|
|
573
598
|
set(this.player.state);
|
|
574
599
|
return this._addPlayerListener("onPlayerStateChanged", () => set(this.player.state));
|
|
575
|
-
});
|
|
600
|
+
}));
|
|
576
601
|
}
|
|
577
602
|
bindContainer(container) {
|
|
578
603
|
this._assertNotDestroyed();
|
|
@@ -619,9 +644,12 @@ async function replayFastboard(_a) {
|
|
|
619
644
|
register({ kind: app.kind, src: app });
|
|
620
645
|
});
|
|
621
646
|
}
|
|
622
|
-
const player = await sdk.replayRoom(
|
|
623
|
-
|
|
624
|
-
|
|
647
|
+
const player = await sdk.replayRoom(
|
|
648
|
+
__spreadProps(__spreadValues({}, ensure_official_plugins(replayRoomParams)), {
|
|
649
|
+
useMultiViews: true
|
|
650
|
+
}),
|
|
651
|
+
callbacks
|
|
652
|
+
);
|
|
625
653
|
const syncedStore = await SyncedStorePlugin.init(player);
|
|
626
654
|
const managerPromise = WindowManager.mount(__spreadProps(__spreadValues({
|
|
627
655
|
cursor: true
|
|
@@ -635,5 +663,23 @@ async function replayFastboard(_a) {
|
|
|
635
663
|
return new FastboardPlayer(sdk, player, manager, syncedStore);
|
|
636
664
|
}
|
|
637
665
|
|
|
638
|
-
|
|
666
|
+
// src/helpers/index.ts
|
|
667
|
+
function addRoomListener(room, name, listener) {
|
|
668
|
+
room.callbacks.on(name, listener);
|
|
669
|
+
return () => room.callbacks.off(name, listener);
|
|
670
|
+
}
|
|
671
|
+
function addPlayerListener(player, name, listener) {
|
|
672
|
+
player.callbacks.on(name, listener);
|
|
673
|
+
return () => player.callbacks.off(name, listener);
|
|
674
|
+
}
|
|
675
|
+
function addViewListener(view, name, listener) {
|
|
676
|
+
view.callbacks.on(name, listener);
|
|
677
|
+
return () => view.callbacks.off(name, listener);
|
|
678
|
+
}
|
|
679
|
+
function addManagerListener(manager, name, listener) {
|
|
680
|
+
return manager.emitter.on(name, listener);
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
export { FastboardApp, FastboardPlayer, addManagerListener, addPlayerListener, addRoomListener, addViewListener, convertedFileToScene, createFastboard, genUID, getImageSize, makeSlideParams, readable, register, replayFastboard, version, warn, writable };
|
|
684
|
+
//# sourceMappingURL=out.js.map
|
|
639
685
|
//# sourceMappingURL=index.mjs.map
|