@netless/fastboard-core 0.2.11 → 0.2.12

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.
@@ -34,40 +34,8 @@ var __objRest = (source, exclude) => {
34
34
  import { contentModeScale, DefaultHotKeys, WhiteWebSdk } from "white-web-sdk";
35
35
  import { WindowManager as WindowManager3 } from "@netless/window-manager";
36
36
 
37
- // src/behaviors/register-apps.ts
38
- import { WindowManager } from "@netless/window-manager";
39
- var DefaultApps = {
40
- Monaco: {
41
- src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-monaco/0.1.12/dist/main.iife.js"
42
- },
43
- Countdown: {
44
- src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-countdown/0.0.2/dist/main.iife.js"
45
- },
46
- GeoGebra: {
47
- src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-geogebra/0.0.4/dist/main.iife.js",
48
- appOptions: {
49
- HTML5Codebase: "https://flat-storage-cn-hz.whiteboard.agora.io/GeoGebra/HTML5/5.0/web3d"
50
- }
51
- },
52
- EmbeddedPage: {
53
- src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-embedded-page/0.1.1/dist/main.iife.js"
54
- },
55
- Player: {
56
- name: "NetlessAppMediaPlayer",
57
- src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-media-player/0.1.1/dist/main.iife.js"
58
- }
59
- };
60
- function registerApps(config) {
61
- for (const kind in config) {
62
- if (Object.prototype.hasOwnProperty.call(config, kind)) {
63
- const options = config[kind];
64
- WindowManager.register(__spreadValues({ kind }, options));
65
- }
66
- }
67
- }
68
-
69
37
  // src/helpers/utils.ts
70
- import { WindowManager as WindowManager2 } from "@netless/window-manager";
38
+ import { WindowManager } from "@netless/window-manager";
71
39
  function noop() {
72
40
  }
73
41
  function safe_not_equal(a, b) {
@@ -113,8 +81,8 @@ function convertedFileToScene(f, i) {
113
81
  };
114
82
  }
115
83
  function ensureWindowManager(joinRoom) {
116
- if (!joinRoom.invisiblePlugins || !joinRoom.invisiblePlugins.includes(WindowManager2)) {
117
- joinRoom.invisiblePlugins = [...joinRoom.invisiblePlugins || [], WindowManager2];
84
+ if (!joinRoom.invisiblePlugins || !joinRoom.invisiblePlugins.includes(WindowManager)) {
85
+ joinRoom.invisiblePlugins = [...joinRoom.invisiblePlugins || [], WindowManager];
118
86
  }
119
87
  return joinRoom;
120
88
  }
@@ -459,16 +427,44 @@ var FastboardPlayer = class extends FastboardPlayerBase {
459
427
  }
460
428
  };
461
429
 
430
+ // src/behaviors/register-apps.ts
431
+ import { WindowManager as WindowManager2 } from "@netless/window-manager";
432
+ var DefaultApps = {
433
+ Monaco: {
434
+ src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-monaco/0.1.12/dist/main.iife.js"
435
+ },
436
+ Countdown: {
437
+ src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-countdown/0.0.2/dist/main.iife.js"
438
+ },
439
+ GeoGebra: {
440
+ src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-geogebra/0.0.4/dist/main.iife.js",
441
+ appOptions: {
442
+ HTML5Codebase: "https://flat-storage-cn-hz.whiteboard.agora.io/GeoGebra/HTML5/5.0/web3d"
443
+ }
444
+ },
445
+ EmbeddedPage: {
446
+ src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-embedded-page/0.1.1/dist/main.iife.js"
447
+ },
448
+ Player: {
449
+ name: "NetlessAppMediaPlayer",
450
+ src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-media-player/0.1.1/dist/main.iife.js"
451
+ }
452
+ };
453
+ for (const kind in DefaultApps) {
454
+ if (Object.prototype.hasOwnProperty.call(DefaultApps, kind)) {
455
+ const options = DefaultApps[kind];
456
+ WindowManager2.register(__spreadValues({ kind }, options));
457
+ }
458
+ }
459
+
462
460
  // src/minimal.ts
463
461
  async function createFastboard(_a) {
464
462
  var _b = _a, {
465
463
  sdkConfig,
466
464
  joinRoom: _c
467
465
  } = _b, _d = _c, { callbacks } = _d, joinRoomParams = __objRest(_d, ["callbacks"]), {
468
- managerConfig,
469
- appsConfig = DefaultApps
466
+ managerConfig
470
467
  } = _b;
471
- registerApps(appsConfig);
472
468
  const sdk = new WhiteWebSdk(__spreadProps(__spreadValues({}, sdkConfig), {
473
469
  useMobXState: true
474
470
  }));
@@ -508,10 +504,8 @@ async function replayFastboard(_a) {
508
504
  sdkConfig,
509
505
  replayRoom: _c
510
506
  } = _b, _d = _c, { callbacks } = _d, replayRoomParams = __objRest(_d, ["callbacks"]), {
511
- managerConfig,
512
- appsConfig = DefaultApps
507
+ managerConfig
513
508
  } = _b;
514
- registerApps(appsConfig);
515
509
  const sdk = new WhiteWebSdk(__spreadProps(__spreadValues({}, sdkConfig), {
516
510
  useMobXState: true
517
511
  }));
@@ -530,9 +524,7 @@ async function replayFastboard(_a) {
530
524
  }
531
525
 
532
526
  export {
533
- DefaultApps,
534
- registerApps,
535
527
  createFastboard,
536
528
  replayFastboard
537
529
  };
538
- //# sourceMappingURL=chunk-IHDHV4XE.mjs.map
530
+ //# sourceMappingURL=chunk-ITPURPVI.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/minimal.ts","../src/helpers/utils.ts","../src/impl/app.ts","../src/helpers/emitter.ts","../src/helpers/value.ts","../src/impl/player.ts","../src/behaviors/register-apps.ts"],"sourcesContent":["import type {\n Displayer,\n HotKeys,\n JoinRoomParams,\n PlayerCallbacks,\n ReplayRoomParams,\n Room,\n RoomCallbacks,\n WhiteWebSdkConfiguration,\n} from \"white-web-sdk\";\nimport type { MountParams } from \"@netless/window-manager\";\n\nimport { contentModeScale, DefaultHotKeys, WhiteWebSdk } from \"white-web-sdk\";\nimport { WindowManager } from \"@netless/window-manager\";\n\nimport { ensureWindowManager } from \"./helpers/utils\";\nimport { FastboardApp } from \"./impl/app\";\nimport { FastboardPlayer } from \"./impl/player\";\n\nexport type { FastboardReadable, FastboardWritable } from \"./helpers/value\";\n\nexport type { AppsStatus, InsertDocsDynamic, InsertDocsParams, InsertDocsStatic } from \"./impl/app\";\n\nexport type { FastboardApp, FastboardPlayer };\n\nexport interface FastboardOptions {\n sdkConfig: Omit<WhiteWebSdkConfiguration, \"useMobXState\"> & { region: string };\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 ...ensureWindowManager(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\nexport interface FastboardReplayOptions {\n sdkConfig: Omit<WhiteWebSdkConfiguration, \"useMobXState\"> & { region: string };\n replayRoom: Omit<ReplayRoomParams, \"useMultiViews\"> & {\n callbacks?: Partial<PlayerCallbacks>;\n };\n managerConfig?: Omit<MountParams, \"room\">;\n}\n\n/**\n * Create a FastboardPlayer instance.\n * @example\n * let app = 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 ...ensureWindowManager(replayRoomParams),\n useMultiViews: true,\n },\n callbacks\n );\n\n const managerPromise = WindowManager.mount({\n cursor: true,\n ...managerConfig,\n room: player as Displayer as Room,\n });\n\n player.play();\n const manager = await managerPromise;\n player.pause();\n\n return new FastboardPlayer(sdk, player, manager);\n}\n\nimport \"./behaviors/register-apps\";\n","import type { ConvertedFile, JoinRoomParams, ReplayRoomParams, SceneDefinition, Size } from \"white-web-sdk\";\nimport { WindowManager } from \"@netless/window-manager\";\n\nexport function noop() {\n /* noop */\n}\n\nexport function 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 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 { emptyScenes, taskId, url };\n}\n\nexport function convertedFileToScene(f: ConvertedFile, i: number) {\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\nexport function ensureWindowManager<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\n// Copy from https://github.com/crimx/side-effect-manager/blob/main/src/gen-uid.ts\nconst SOUP = \"!#%()*+,-./:;=?@[]^_`{|}~\" + \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\nconst SOUP_LEN = 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","import type { PublicEvent, WindowManager } from \"@netless/window-manager\";\nimport type {\n AnimationMode,\n ApplianceNames,\n Camera,\n Color,\n ConversionResponse,\n HotKeys,\n MemberState,\n Rectangle,\n Room,\n RoomCallbacks,\n RoomState,\n SceneDefinition,\n ShapeType,\n ViewCallbacks,\n WhiteWebSdk,\n} from \"white-web-sdk\";\nimport type { FastboardDisposer, FastboardInternalValue } from \"../helpers/value\";\n\nimport { BuiltinApps } from \"@netless/window-manager\";\nimport { convertedFileToScene, genUID, getImageSize, makeSlideParams } from \"../helpers/utils\";\nimport { createValue } from \"../helpers/value\";\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 readonly _disposers: FastboardDisposer[] = [];\n protected _destroyed = false;\n protected _assertNotDestroyed() {\n if (this._destroyed) {\n throw new Error(\"[FastboardApp] Can not call any method on destroyed FastboardApp.\");\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected createValue: typeof createValue = (...args: [any, any]): any => {\n const value = createValue(...args);\n this._disposers.push((value as FastboardInternalValue<unknown>).dispose);\n return value;\n };\n\n protected _addRoomListener<K extends keyof RoomCallbacks, T = RoomCallbacks[K]>(name: K, listener: T) {\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>(name: K, set: (value: PublicEvent[K]) => void) {\n this._assertNotDestroyed();\n this.manager.emitter.on(name, set);\n return () => this.manager.emitter.off(name, set);\n }\n\n protected _addMainViewListener<K extends keyof ViewCallbacks, T = ViewCallbacks[K]>(name: K, listener: T) {\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._disposers.forEach(dispose => dispose());\n this._disposers.length = 0;\n this._destroyed = true;\n this.manager.destroy();\n return this.room.disconnect();\n }\n}\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 = this.createValue(\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 = this.createValue(this.manager.boxState, set =>\n this._addManagerListener(\"boxStateChange\", set)\n );\n\n /**\n * Current window-manager's focused app's id.\n * @example \"HelloWorld-1A2b3C4d\"\n */\n readonly focusedApp = this.createValue(this.manager.focused, set =>\n this._addManagerListener(\"focusedChange\", set)\n );\n\n /**\n * How many times can I call `app.redo()`?\n */\n readonly canRedoSteps = this.createValue(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 = this.createValue(this.manager.canUndoSteps, set =>\n this._addManagerListener(\"canUndoStepsChange\", set)\n );\n\n /**\n * Current camera information of main view.\n */\n readonly camera = this.createValue(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 readonly memberState = this.createValue(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 = this.createValue(\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 = this.createValue(this.manager.mainViewScenesLength, set =>\n this._addManagerListener(\"mainViewScenesLengthChange\", set)\n );\n\n private _appsStatus: AppsStatus = {};\n /**\n * Apps status.\n */\n readonly appsStatus = this.createValue<AppsStatus>({}, set =>\n this._addManagerListener(\"loadApp\", ({ kind, status, reason }) => {\n this._appsStatus[kind] = {\n status: status === \"start\" ? \"loading\" : status === \"failed\" ? \"failed\" : \"idle\",\n reason,\n };\n set(this._appsStatus);\n })\n );\n\n /**\n * Undo a step on main view.\n */\n undo() {\n this._assertNotDestroyed();\n this.manager.mainView.undo();\n }\n\n /**\n * Redo a step on main view.\n */\n redo() {\n this._assertNotDestroyed();\n this.manager.mainView.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, shape?: ShapeType) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ currentApplianceName: appliance, shapeType: shape });\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 /**\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 if (typeof arg1 === \"object\" && \"fileType\" in arg1) {\n return this._insertDocsImpl(arg1);\n } else if (arg2 && arg2.status !== \"Finished\") {\n throw new Error(\"[FastboardApp] Can not insert a converting doc.\");\n } else if (arg2 && arg2.progress) {\n const scenes: SceneDefinition[] = arg2.progress.convertedFileList.map(convertedFileToScene);\n const scenePath = `/${arg2.uuid}/${genUID()}`;\n const { emptyScenes, taskId, url } = makeSlideParams(scenes);\n if (taskId && url) {\n const title = arg1;\n return this._insertDocsImpl({ fileType: \"pptx\", scenePath, taskId, title, url, scenes: emptyScenes });\n } else {\n return this._insertDocsImpl({ fileType: \"pdf\", scenePath, scenes, title: arg1 });\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 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","export type FastboardListener<T> = (event: T) => void;\n\nexport class FastboardEmitter<T> {\n listeners = new Set<FastboardListener<T>>();\n\n get length(): number {\n return this.listeners.size;\n }\n\n dispatch(message: T) {\n this.listeners.forEach(callback => callback(message));\n }\n\n addListener(listener: FastboardListener<T>) {\n this.listeners.add(listener);\n }\n\n removeListener(listener: FastboardListener<T>) {\n this.listeners.delete(listener);\n }\n}\n","import { FastboardEmitter } from \"./emitter\";\nimport { noop, safe_not_equal } from \"./utils\";\n\nexport type FastboardDisposer = () => void;\n\nexport interface FastboardReadable<T> {\n readonly value: T;\n subscribe(callback: (value: T) => void): FastboardDisposer;\n reaction(callback: (value: T) => void): FastboardDisposer;\n}\n\nexport interface FastboardWritable<T, SetFn = (value: T) => void> extends FastboardReadable<T> {\n setValue: SetFn;\n}\n\nexport interface FastboardInternalValue<T> extends FastboardWritable<T> {\n dispose: FastboardDisposer;\n}\n\n/**\n * Create a readonly, reactive value.\n * @example\n * createValue(manager.getMainViewSceneIndex(), (set) => {\n * manager.emitter.on(\"mainViewSceneIndexChanged\", set)\n * return () => manager.emitter.off(\"mainViewSceneIndexChanged\", set)\n * })\n */\nexport function createValue<T>(\n value: T,\n effect: (set: (value: T) => void) => FastboardDisposer | void\n): FastboardReadable<T>;\n\n/**\n * Create a writable, reactive value.\n * @example\n * createValue(manager.getMainViewSceneIndex(), (set) => {\n * manager.emitter.on(\"mainViewSceneIndexChanged\", set)\n * return () => manager.emitter.off(\"mainViewSceneIndexChanged\", set)\n * }, (newValue) => {\n * manager.setMainViewSceneIndex(newValue)\n * })\n */\nexport function createValue<T, SetFn = (value: T) => void>(\n value: T,\n effect: (set: (value: T) => void) => FastboardDisposer | void,\n set: (value: T) => void\n): FastboardWritable<T, SetFn>;\n\nexport function createValue<T>(\n value: T,\n effect: (set: (value: T) => void) => FastboardDisposer | void,\n setValue: (value: T) => void = noop\n): FastboardInternalValue<T> {\n const emitter = new FastboardEmitter<T>();\n\n function set(newValue: T) {\n if (safe_not_equal(value, newValue)) {\n emitter.dispatch((value = newValue));\n }\n }\n\n const dispose = effect(set) || noop;\n\n function subscribe(callback: (value: T) => void) {\n emitter.addListener(callback);\n callback(value);\n return () => emitter.removeListener(callback);\n }\n\n function reaction(callback: (value: T) => void) {\n emitter.addListener(callback);\n return () => emitter.removeListener(callback);\n }\n\n return {\n get value() {\n return value;\n },\n subscribe,\n reaction,\n setValue,\n dispose,\n };\n}\n","import type { Player, PlayerCallbacks, PlayerState, ViewCallbacks, WhiteWebSdk } from \"white-web-sdk\";\nimport type { PublicEvent, WindowManager } from \"@netless/window-manager\";\nimport type { FastboardDisposer, FastboardInternalValue } from \"../helpers/value\";\n\nimport { createValue } from \"../helpers/value\";\n\nclass FastboardPlayerBase {\n public constructor(readonly sdk: WhiteWebSdk, readonly player: Player, readonly manager: WindowManager) {}\n\n protected readonly _disposers: FastboardDisposer[] = [];\n protected _destroyed = false;\n protected _assertNotDestroyed() {\n if (this._destroyed) {\n throw new Error(\"[FastboardPlayer] Can not call any method on destroyed FastboardPlayer.\");\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected createValue: typeof createValue = (...args: [any, any]): any => {\n const value = createValue(...args);\n this._disposers.push((value as FastboardInternalValue<unknown>).dispose);\n return value;\n };\n\n protected _addPlayerListener<K extends keyof PlayerCallbacks, T = PlayerCallbacks[K]>(\n name: K,\n listener: T\n ) {\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>(name: K, set: (value: PublicEvent[K]) => void) {\n this._assertNotDestroyed();\n this.manager.emitter.on(name, set);\n return () => this.manager.emitter.off(name, set);\n }\n\n protected _addMainViewListener<K extends keyof ViewCallbacks, T = ViewCallbacks[K]>(name: K, listener: T) {\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._disposers.forEach(dispose => dispose());\n this._disposers.length = 0;\n this._destroyed = true;\n this.manager.destroy();\n this.player.callbacks.off();\n }\n}\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 = this.createValue(\n this.player.progressTime,\n set => this._addPlayerListener(\"onProgressTimeChanged\", set),\n this.player.seekToProgressTime.bind(this.player)\n );\n\n readonly phase = this.createValue(this.player.phase, set => this._addPlayerListener(\"onPhaseChanged\", set));\n\n readonly canplay = this.createValue(this.player.isPlayable, set =>\n this._addPlayerListener(\"onIsPlayableChanged\", set)\n );\n\n private _setSpeed!: (value: number) => void;\n readonly speed = this.createValue(\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 readonly state = this.createValue<PlayerState | null>(null, set => {\n const update = () => set(this.player.state);\n const dispose1 = this._addPlayerListener(\"onLoadFirstFrame\", update);\n const dispose2 = this._addPlayerListener(\"onPlayerStateChanged\", update);\n return () => (dispose1(), dispose2());\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","import type { RegisterParams } from \"@netless/window-manager\";\nimport { WindowManager } from \"@netless/window-manager\";\n\nexport interface AppsConfig {\n [kind: string]: Omit<RegisterParams, \"kind\">;\n}\n\nexport const 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\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/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- export { AppsConfig, AppsStatus, DefaultApps, FastboardApp, FastboardOptions, FastboardPlayer, FastboardReadable, FastboardReplayOptions, FastboardWritable, InsertDocsDynamic, InsertDocsParams, InsertDocsStatic, createFastboard, registerApps, replayFastboard } from './minimal';
1
+ export { AppsStatus, FastboardApp, FastboardOptions, FastboardPlayer, FastboardReadable, FastboardReplayOptions, FastboardWritable, InsertDocsDynamic, InsertDocsParams, InsertDocsStatic, createFastboard, replayFastboard } from './minimal';
2
2
  import 'white-web-sdk';
3
3
  import '@netless/window-manager';
package/dist/index.js CHANGED
@@ -58,61 +58,16 @@ var __toCommonJS = /* @__PURE__ */ ((cache) => {
58
58
  // src/index.ts
59
59
  var src_exports = {};
60
60
  __export(src_exports, {
61
- DefaultApps: () => DefaultApps,
62
61
  createFastboard: () => createFastboard,
63
- registerApps: () => registerApps,
64
62
  replayFastboard: () => replayFastboard
65
63
  });
66
64
 
67
- // src/behaviors/register-slide.ts
68
- var import_window_manager = require("@netless/window-manager");
69
- var import_app_slide = __toESM(require("@netless/app-slide"));
70
- import_window_manager.WindowManager.register({
71
- kind: "Slide",
72
- appOptions: {
73
- debug: false
74
- },
75
- src: import_app_slide.default
76
- });
77
-
78
65
  // src/minimal.ts
79
66
  var import_white_web_sdk = require("white-web-sdk");
80
- var import_window_manager5 = require("@netless/window-manager");
81
-
82
- // src/behaviors/register-apps.ts
83
- var import_window_manager2 = require("@netless/window-manager");
84
- var DefaultApps = {
85
- Monaco: {
86
- src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-monaco/0.1.12/dist/main.iife.js"
87
- },
88
- Countdown: {
89
- src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-countdown/0.0.2/dist/main.iife.js"
90
- },
91
- GeoGebra: {
92
- src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-geogebra/0.0.4/dist/main.iife.js",
93
- appOptions: {
94
- HTML5Codebase: "https://flat-storage-cn-hz.whiteboard.agora.io/GeoGebra/HTML5/5.0/web3d"
95
- }
96
- },
97
- EmbeddedPage: {
98
- src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-embedded-page/0.1.1/dist/main.iife.js"
99
- },
100
- Player: {
101
- name: "NetlessAppMediaPlayer",
102
- src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-media-player/0.1.1/dist/main.iife.js"
103
- }
104
- };
105
- function registerApps(config) {
106
- for (const kind in config) {
107
- if (Object.prototype.hasOwnProperty.call(config, kind)) {
108
- const options = config[kind];
109
- import_window_manager2.WindowManager.register(__spreadValues({ kind }, options));
110
- }
111
- }
112
- }
67
+ var import_window_manager4 = require("@netless/window-manager");
113
68
 
114
69
  // src/helpers/utils.ts
115
- var import_window_manager3 = require("@netless/window-manager");
70
+ var import_window_manager = require("@netless/window-manager");
116
71
  function noop() {
117
72
  }
118
73
  function safe_not_equal(a, b) {
@@ -158,8 +113,8 @@ function convertedFileToScene(f, i) {
158
113
  };
159
114
  }
160
115
  function ensureWindowManager(joinRoom) {
161
- if (!joinRoom.invisiblePlugins || !joinRoom.invisiblePlugins.includes(import_window_manager3.WindowManager)) {
162
- joinRoom.invisiblePlugins = [...joinRoom.invisiblePlugins || [], import_window_manager3.WindowManager];
116
+ if (!joinRoom.invisiblePlugins || !joinRoom.invisiblePlugins.includes(import_window_manager.WindowManager)) {
117
+ joinRoom.invisiblePlugins = [...joinRoom.invisiblePlugins || [], import_window_manager.WindowManager];
163
118
  }
164
119
  return joinRoom;
165
120
  }
@@ -175,7 +130,7 @@ function genUID() {
175
130
  }
176
131
 
177
132
  // src/impl/app.ts
178
- var import_window_manager4 = require("@netless/window-manager");
133
+ var import_window_manager2 = require("@netless/window-manager");
179
134
 
180
135
  // src/helpers/emitter.ts
181
136
  var FastboardEmitter = class {
@@ -403,7 +358,7 @@ var FastboardApp = class extends FastboardAppBase {
403
358
  insertMedia(title, src) {
404
359
  this._assertNotDestroyed();
405
360
  return this.manager.addApp({
406
- kind: import_window_manager4.BuiltinApps.MediaPlayer,
361
+ kind: import_window_manager2.BuiltinApps.MediaPlayer,
407
362
  options: { title },
408
363
  attributes: { src }
409
364
  });
@@ -504,16 +459,44 @@ var FastboardPlayer = class extends FastboardPlayerBase {
504
459
  }
505
460
  };
506
461
 
462
+ // src/behaviors/register-apps.ts
463
+ var import_window_manager3 = require("@netless/window-manager");
464
+ var DefaultApps = {
465
+ Monaco: {
466
+ src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-monaco/0.1.12/dist/main.iife.js"
467
+ },
468
+ Countdown: {
469
+ src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-countdown/0.0.2/dist/main.iife.js"
470
+ },
471
+ GeoGebra: {
472
+ src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-geogebra/0.0.4/dist/main.iife.js",
473
+ appOptions: {
474
+ HTML5Codebase: "https://flat-storage-cn-hz.whiteboard.agora.io/GeoGebra/HTML5/5.0/web3d"
475
+ }
476
+ },
477
+ EmbeddedPage: {
478
+ src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-embedded-page/0.1.1/dist/main.iife.js"
479
+ },
480
+ Player: {
481
+ name: "NetlessAppMediaPlayer",
482
+ src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-media-player/0.1.1/dist/main.iife.js"
483
+ }
484
+ };
485
+ for (const kind in DefaultApps) {
486
+ if (Object.prototype.hasOwnProperty.call(DefaultApps, kind)) {
487
+ const options = DefaultApps[kind];
488
+ import_window_manager3.WindowManager.register(__spreadValues({ kind }, options));
489
+ }
490
+ }
491
+
507
492
  // src/minimal.ts
508
493
  async function createFastboard(_a) {
509
494
  var _b = _a, {
510
495
  sdkConfig,
511
496
  joinRoom: _c
512
497
  } = _b, _d = _c, { callbacks } = _d, joinRoomParams = __objRest(_d, ["callbacks"]), {
513
- managerConfig,
514
- appsConfig = DefaultApps
498
+ managerConfig
515
499
  } = _b;
516
- registerApps(appsConfig);
517
500
  const sdk = new import_white_web_sdk.WhiteWebSdk(__spreadProps(__spreadValues({}, sdkConfig), {
518
501
  useMobXState: true
519
502
  }));
@@ -537,7 +520,7 @@ async function createFastboard(_a) {
537
520
  disableNewPencil: false,
538
521
  disableMagixEventDispatchLimit: true
539
522
  }), callbacks);
540
- const manager = await import_window_manager5.WindowManager.mount(__spreadProps(__spreadValues({
523
+ const manager = await import_window_manager4.WindowManager.mount(__spreadProps(__spreadValues({
541
524
  cursor: true
542
525
  }, managerConfig), {
543
526
  room
@@ -553,17 +536,15 @@ async function replayFastboard(_a) {
553
536
  sdkConfig,
554
537
  replayRoom: _c
555
538
  } = _b, _d = _c, { callbacks } = _d, replayRoomParams = __objRest(_d, ["callbacks"]), {
556
- managerConfig,
557
- appsConfig = DefaultApps
539
+ managerConfig
558
540
  } = _b;
559
- registerApps(appsConfig);
560
541
  const sdk = new import_white_web_sdk.WhiteWebSdk(__spreadProps(__spreadValues({}, sdkConfig), {
561
542
  useMobXState: true
562
543
  }));
563
544
  const player = await sdk.replayRoom(__spreadProps(__spreadValues({}, ensureWindowManager(replayRoomParams)), {
564
545
  useMultiViews: true
565
546
  }), callbacks);
566
- const managerPromise = import_window_manager5.WindowManager.mount(__spreadProps(__spreadValues({
547
+ const managerPromise = import_window_manager4.WindowManager.mount(__spreadProps(__spreadValues({
567
548
  cursor: true
568
549
  }, managerConfig), {
569
550
  room: player
@@ -573,5 +554,16 @@ async function replayFastboard(_a) {
573
554
  player.pause();
574
555
  return new FastboardPlayer(sdk, player, manager);
575
556
  }
557
+
558
+ // src/behaviors/register-slide.ts
559
+ var import_window_manager5 = require("@netless/window-manager");
560
+ var import_app_slide = __toESM(require("@netless/app-slide"));
561
+ import_window_manager5.WindowManager.register({
562
+ kind: "Slide",
563
+ appOptions: {
564
+ debug: false
565
+ },
566
+ src: import_app_slide.default
567
+ });
576
568
  module.exports = __toCommonJS(src_exports);
577
569
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/behaviors/register-slide.ts","../src/minimal.ts","../src/behaviors/register-apps.ts","../src/helpers/utils.ts","../src/impl/app.ts","../src/helpers/emitter.ts","../src/helpers/value.ts","../src/impl/player.ts"],"sourcesContent":["import \"./behaviors/register-slide\";\n\nexport * from \"./minimal\";\n","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","import type {\n Displayer,\n HotKeys,\n JoinRoomParams,\n PlayerCallbacks,\n ReplayRoomParams,\n Room,\n RoomCallbacks,\n WhiteWebSdkConfiguration,\n} from \"white-web-sdk\";\nimport type { MountParams } from \"@netless/window-manager\";\n\nimport { contentModeScale, DefaultHotKeys, WhiteWebSdk } from \"white-web-sdk\";\nimport { WindowManager } from \"@netless/window-manager\";\n\nimport type { AppsConfig } from \"./behaviors/register-apps\";\n\nimport { DefaultApps, registerApps } from \"./behaviors/register-apps\";\nimport { ensureWindowManager } from \"./helpers/utils\";\nimport { FastboardApp } from \"./impl/app\";\nimport { FastboardPlayer } from \"./impl/player\";\n\nexport type { FastboardReadable, FastboardWritable } from \"./helpers/value\";\n\nexport type { AppsStatus, InsertDocsDynamic, InsertDocsParams, InsertDocsStatic } from \"./impl/app\";\n\nexport type { AppsConfig, FastboardApp, FastboardPlayer };\nexport { DefaultApps, registerApps };\n\nexport interface FastboardOptions {\n sdkConfig: Omit<WhiteWebSdkConfiguration, \"useMobXState\"> & { region: string };\n joinRoom: Omit<JoinRoomParams, \"useMultiViews\" | \"disableNewPencil\" | \"disableMagixEventDispatchLimit\"> & {\n callbacks?: Partial<RoomCallbacks>;\n };\n managerConfig?: Omit<MountParams, \"room\">;\n appsConfig?: AppsConfig;\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: \"ch-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 appsConfig = DefaultApps,\n}: FastboardOptions) {\n registerApps(appsConfig);\n\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 ...ensureWindowManager(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\nexport interface FastboardReplayOptions {\n sdkConfig: Omit<WhiteWebSdkConfiguration, \"useMobXState\"> & { region: string };\n replayRoom: Omit<ReplayRoomParams, \"useMultiViews\"> & {\n callbacks?: Partial<PlayerCallbacks>;\n };\n managerConfig?: Omit<MountParams, \"room\">;\n appsConfig?: AppsConfig;\n}\n\n/**\n * Create a FastboardPlayer instance.\n * @example\n * let app = await replayFastboard({\n * sdkConfig: {\n * appIdentifier: import.meta.env.VITE_APPID,\n * region: \"ch-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 appsConfig = DefaultApps,\n}: FastboardReplayOptions) {\n registerApps(appsConfig);\n\n const sdk = new WhiteWebSdk({\n ...sdkConfig,\n useMobXState: true,\n });\n\n const player = await sdk.replayRoom(\n {\n ...ensureWindowManager(replayRoomParams),\n useMultiViews: true,\n },\n callbacks\n );\n\n const managerPromise = WindowManager.mount({\n cursor: true,\n ...managerConfig,\n room: player as Displayer as Room,\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\";\n\nexport interface AppsConfig {\n [kind: string]: Omit<RegisterParams, \"kind\">;\n}\n\nexport const 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\nexport function registerApps(config: AppsConfig) {\n for (const kind in config) {\n if (Object.prototype.hasOwnProperty.call(config, kind)) {\n const options = config[kind];\n WindowManager.register({ kind, ...options });\n }\n }\n}\n","import type { ConvertedFile, JoinRoomParams, ReplayRoomParams, SceneDefinition, Size } from \"white-web-sdk\";\nimport { WindowManager } from \"@netless/window-manager\";\n\nexport function noop() {\n /* noop */\n}\n\nexport function 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 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 { emptyScenes, taskId, url };\n}\n\nexport function convertedFileToScene(f: ConvertedFile, i: number) {\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\nexport function ensureWindowManager<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\n// Copy from https://github.com/crimx/side-effect-manager/blob/main/src/gen-uid.ts\nconst SOUP = \"!#%()*+,-./:;=?@[]^_`{|}~\" + \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\nconst SOUP_LEN = 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","import type { PublicEvent, WindowManager } from \"@netless/window-manager\";\nimport type {\n AnimationMode,\n ApplianceNames,\n Camera,\n Color,\n ConversionResponse,\n HotKeys,\n MemberState,\n Rectangle,\n Room,\n RoomCallbacks,\n RoomState,\n SceneDefinition,\n ShapeType,\n ViewCallbacks,\n WhiteWebSdk,\n} from \"white-web-sdk\";\nimport type { FastboardDisposer, FastboardInternalValue } from \"../helpers/value\";\n\nimport { BuiltinApps } from \"@netless/window-manager\";\nimport { convertedFileToScene, genUID, getImageSize, makeSlideParams } from \"../helpers/utils\";\nimport { createValue } from \"../helpers/value\";\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 readonly _disposers: FastboardDisposer[] = [];\n protected _destroyed = false;\n protected _assertNotDestroyed() {\n if (this._destroyed) {\n throw new Error(\"[FastboardApp] Can not call any method on destroyed FastboardApp.\");\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected createValue: typeof createValue = (...args: [any, any]): any => {\n const value = createValue(...args);\n this._disposers.push((value as FastboardInternalValue<unknown>).dispose);\n return value;\n };\n\n protected _addRoomListener<K extends keyof RoomCallbacks, T = RoomCallbacks[K]>(name: K, listener: T) {\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>(name: K, set: (value: PublicEvent[K]) => void) {\n this._assertNotDestroyed();\n this.manager.emitter.on(name, set);\n return () => this.manager.emitter.off(name, set);\n }\n\n protected _addMainViewListener<K extends keyof ViewCallbacks, T = ViewCallbacks[K]>(name: K, listener: T) {\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._disposers.forEach(dispose => dispose());\n this._disposers.length = 0;\n this._destroyed = true;\n this.manager.destroy();\n return this.room.disconnect();\n }\n}\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 = this.createValue(\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 = this.createValue(this.manager.boxState, set =>\n this._addManagerListener(\"boxStateChange\", set)\n );\n\n /**\n * Current window-manager's focused app's id.\n * @example \"HelloWorld-1A2b3C4d\"\n */\n readonly focusedApp = this.createValue(this.manager.focused, set =>\n this._addManagerListener(\"focusedChange\", set)\n );\n\n /**\n * How many times can I call `app.redo()`?\n */\n readonly canRedoSteps = this.createValue(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 = this.createValue(this.manager.canUndoSteps, set =>\n this._addManagerListener(\"canUndoStepsChange\", set)\n );\n\n /**\n * Current camera information of main view.\n */\n readonly camera = this.createValue(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 readonly memberState = this.createValue(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 = this.createValue(\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 = this.createValue(this.manager.mainViewScenesLength, set =>\n this._addManagerListener(\"mainViewScenesLengthChange\", set)\n );\n\n private _appsStatus: AppsStatus = {};\n /**\n * Apps status.\n */\n readonly appsStatus = this.createValue<AppsStatus>({}, set =>\n this._addManagerListener(\"loadApp\", ({ kind, status, reason }) => {\n this._appsStatus[kind] = {\n status: status === \"start\" ? \"loading\" : status === \"failed\" ? \"failed\" : \"idle\",\n reason,\n };\n set(this._appsStatus);\n })\n );\n\n /**\n * Undo a step on main view.\n */\n undo() {\n this._assertNotDestroyed();\n this.manager.mainView.undo();\n }\n\n /**\n * Redo a step on main view.\n */\n redo() {\n this._assertNotDestroyed();\n this.manager.mainView.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, shape?: ShapeType) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ currentApplianceName: appliance, shapeType: shape });\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 /**\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 if (typeof arg1 === \"object\" && \"fileType\" in arg1) {\n return this._insertDocsImpl(arg1);\n } else if (arg2 && arg2.status !== \"Finished\") {\n throw new Error(\"[FastboardApp] Can not insert a converting doc.\");\n } else if (arg2 && arg2.progress) {\n const scenes: SceneDefinition[] = arg2.progress.convertedFileList.map(convertedFileToScene);\n const scenePath = `/${arg2.uuid}/${genUID()}`;\n const { emptyScenes, taskId, url } = makeSlideParams(scenes);\n if (taskId && url) {\n const title = arg1;\n return this._insertDocsImpl({ fileType: \"pptx\", scenePath, taskId, title, url, scenes: emptyScenes });\n } else {\n return this._insertDocsImpl({ fileType: \"pdf\", scenePath, scenes, title: arg1 });\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 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","export type FastboardListener<T> = (event: T) => void;\n\nexport class FastboardEmitter<T> {\n listeners = new Set<FastboardListener<T>>();\n\n get length(): number {\n return this.listeners.size;\n }\n\n dispatch(message: T) {\n this.listeners.forEach(callback => callback(message));\n }\n\n addListener(listener: FastboardListener<T>) {\n this.listeners.add(listener);\n }\n\n removeListener(listener: FastboardListener<T>) {\n this.listeners.delete(listener);\n }\n}\n","import { FastboardEmitter } from \"./emitter\";\nimport { noop, safe_not_equal } from \"./utils\";\n\nexport type FastboardDisposer = () => void;\n\nexport interface FastboardReadable<T> {\n readonly value: T;\n subscribe(callback: (value: T) => void): FastboardDisposer;\n reaction(callback: (value: T) => void): FastboardDisposer;\n}\n\nexport interface FastboardWritable<T, SetFn = (value: T) => void> extends FastboardReadable<T> {\n setValue: SetFn;\n}\n\nexport interface FastboardInternalValue<T> extends FastboardWritable<T> {\n dispose: FastboardDisposer;\n}\n\n/**\n * Create a readonly, reactive value.\n * @example\n * createValue(manager.getMainViewSceneIndex(), (set) => {\n * manager.emitter.on(\"mainViewSceneIndexChanged\", set)\n * return () => manager.emitter.off(\"mainViewSceneIndexChanged\", set)\n * })\n */\nexport function createValue<T>(\n value: T,\n effect: (set: (value: T) => void) => FastboardDisposer | void\n): FastboardReadable<T>;\n\n/**\n * Create a writable, reactive value.\n * @example\n * createValue(manager.getMainViewSceneIndex(), (set) => {\n * manager.emitter.on(\"mainViewSceneIndexChanged\", set)\n * return () => manager.emitter.off(\"mainViewSceneIndexChanged\", set)\n * }, (newValue) => {\n * manager.setMainViewSceneIndex(newValue)\n * })\n */\nexport function createValue<T, SetFn = (value: T) => void>(\n value: T,\n effect: (set: (value: T) => void) => FastboardDisposer | void,\n set: (value: T) => void\n): FastboardWritable<T, SetFn>;\n\nexport function createValue<T>(\n value: T,\n effect: (set: (value: T) => void) => FastboardDisposer | void,\n setValue: (value: T) => void = noop\n): FastboardInternalValue<T> {\n const emitter = new FastboardEmitter<T>();\n\n function set(newValue: T) {\n if (safe_not_equal(value, newValue)) {\n emitter.dispatch((value = newValue));\n }\n }\n\n const dispose = effect(set) || noop;\n\n function subscribe(callback: (value: T) => void) {\n emitter.addListener(callback);\n callback(value);\n return () => emitter.removeListener(callback);\n }\n\n function reaction(callback: (value: T) => void) {\n emitter.addListener(callback);\n return () => emitter.removeListener(callback);\n }\n\n return {\n get value() {\n return value;\n },\n subscribe,\n reaction,\n setValue,\n dispose,\n };\n}\n","import type { Player, PlayerCallbacks, PlayerState, ViewCallbacks, WhiteWebSdk } from \"white-web-sdk\";\nimport type { PublicEvent, WindowManager } from \"@netless/window-manager\";\nimport type { FastboardDisposer, FastboardInternalValue } from \"../helpers/value\";\n\nimport { createValue } from \"../helpers/value\";\n\nclass FastboardPlayerBase {\n public constructor(readonly sdk: WhiteWebSdk, readonly player: Player, readonly manager: WindowManager) {}\n\n protected readonly _disposers: FastboardDisposer[] = [];\n protected _destroyed = false;\n protected _assertNotDestroyed() {\n if (this._destroyed) {\n throw new Error(\"[FastboardPlayer] Can not call any method on destroyed FastboardPlayer.\");\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected createValue: typeof createValue = (...args: [any, any]): any => {\n const value = createValue(...args);\n this._disposers.push((value as FastboardInternalValue<unknown>).dispose);\n return value;\n };\n\n protected _addPlayerListener<K extends keyof PlayerCallbacks, T = PlayerCallbacks[K]>(\n name: K,\n listener: T\n ) {\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>(name: K, set: (value: PublicEvent[K]) => void) {\n this._assertNotDestroyed();\n this.manager.emitter.on(name, set);\n return () => this.manager.emitter.off(name, set);\n }\n\n protected _addMainViewListener<K extends keyof ViewCallbacks, T = ViewCallbacks[K]>(name: K, listener: T) {\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._disposers.forEach(dispose => dispose());\n this._disposers.length = 0;\n this._destroyed = true;\n this.manager.destroy();\n this.player.callbacks.off();\n }\n}\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 = this.createValue(\n this.player.progressTime,\n set => this._addPlayerListener(\"onProgressTimeChanged\", set),\n this.player.seekToProgressTime.bind(this.player)\n );\n\n readonly phase = this.createValue(this.player.phase, set => this._addPlayerListener(\"onPhaseChanged\", set));\n\n readonly canplay = this.createValue(this.player.isPlayable, set =>\n this._addPlayerListener(\"onIsPlayableChanged\", set)\n );\n\n private _setSpeed!: (value: number) => void;\n readonly speed = this.createValue(\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 readonly state = this.createValue<PlayerState | null>(null, set => {\n const update = () => set(this.player.state);\n const dispose1 = this._addPlayerListener(\"onLoadFirstFrame\", update);\n const dispose2 = this._addPlayerListener(\"onPlayerStateChanged\", update);\n return () => (dispose1(), dispose2());\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"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/minimal.ts","../src/helpers/utils.ts","../src/impl/app.ts","../src/helpers/emitter.ts","../src/helpers/value.ts","../src/impl/player.ts","../src/behaviors/register-apps.ts","../src/behaviors/register-slide.ts"],"sourcesContent":["export * from \"./minimal\";\n\nimport \"./behaviors/register-slide\";\n","import type {\n Displayer,\n HotKeys,\n JoinRoomParams,\n PlayerCallbacks,\n ReplayRoomParams,\n Room,\n RoomCallbacks,\n WhiteWebSdkConfiguration,\n} from \"white-web-sdk\";\nimport type { MountParams } from \"@netless/window-manager\";\n\nimport { contentModeScale, DefaultHotKeys, WhiteWebSdk } from \"white-web-sdk\";\nimport { WindowManager } from \"@netless/window-manager\";\n\nimport { ensureWindowManager } from \"./helpers/utils\";\nimport { FastboardApp } from \"./impl/app\";\nimport { FastboardPlayer } from \"./impl/player\";\n\nexport type { FastboardReadable, FastboardWritable } from \"./helpers/value\";\n\nexport type { AppsStatus, InsertDocsDynamic, InsertDocsParams, InsertDocsStatic } from \"./impl/app\";\n\nexport type { FastboardApp, FastboardPlayer };\n\nexport interface FastboardOptions {\n sdkConfig: Omit<WhiteWebSdkConfiguration, \"useMobXState\"> & { region: string };\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 ...ensureWindowManager(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\nexport interface FastboardReplayOptions {\n sdkConfig: Omit<WhiteWebSdkConfiguration, \"useMobXState\"> & { region: string };\n replayRoom: Omit<ReplayRoomParams, \"useMultiViews\"> & {\n callbacks?: Partial<PlayerCallbacks>;\n };\n managerConfig?: Omit<MountParams, \"room\">;\n}\n\n/**\n * Create a FastboardPlayer instance.\n * @example\n * let app = 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 ...ensureWindowManager(replayRoomParams),\n useMultiViews: true,\n },\n callbacks\n );\n\n const managerPromise = WindowManager.mount({\n cursor: true,\n ...managerConfig,\n room: player as Displayer as Room,\n });\n\n player.play();\n const manager = await managerPromise;\n player.pause();\n\n return new FastboardPlayer(sdk, player, manager);\n}\n\nimport \"./behaviors/register-apps\";\n","import type { ConvertedFile, JoinRoomParams, ReplayRoomParams, SceneDefinition, Size } from \"white-web-sdk\";\nimport { WindowManager } from \"@netless/window-manager\";\n\nexport function noop() {\n /* noop */\n}\n\nexport function 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 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 { emptyScenes, taskId, url };\n}\n\nexport function convertedFileToScene(f: ConvertedFile, i: number) {\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\nexport function ensureWindowManager<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\n// Copy from https://github.com/crimx/side-effect-manager/blob/main/src/gen-uid.ts\nconst SOUP = \"!#%()*+,-./:;=?@[]^_`{|}~\" + \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\nconst SOUP_LEN = 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","import type { PublicEvent, WindowManager } from \"@netless/window-manager\";\nimport type {\n AnimationMode,\n ApplianceNames,\n Camera,\n Color,\n ConversionResponse,\n HotKeys,\n MemberState,\n Rectangle,\n Room,\n RoomCallbacks,\n RoomState,\n SceneDefinition,\n ShapeType,\n ViewCallbacks,\n WhiteWebSdk,\n} from \"white-web-sdk\";\nimport type { FastboardDisposer, FastboardInternalValue } from \"../helpers/value\";\n\nimport { BuiltinApps } from \"@netless/window-manager\";\nimport { convertedFileToScene, genUID, getImageSize, makeSlideParams } from \"../helpers/utils\";\nimport { createValue } from \"../helpers/value\";\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 readonly _disposers: FastboardDisposer[] = [];\n protected _destroyed = false;\n protected _assertNotDestroyed() {\n if (this._destroyed) {\n throw new Error(\"[FastboardApp] Can not call any method on destroyed FastboardApp.\");\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected createValue: typeof createValue = (...args: [any, any]): any => {\n const value = createValue(...args);\n this._disposers.push((value as FastboardInternalValue<unknown>).dispose);\n return value;\n };\n\n protected _addRoomListener<K extends keyof RoomCallbacks, T = RoomCallbacks[K]>(name: K, listener: T) {\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>(name: K, set: (value: PublicEvent[K]) => void) {\n this._assertNotDestroyed();\n this.manager.emitter.on(name, set);\n return () => this.manager.emitter.off(name, set);\n }\n\n protected _addMainViewListener<K extends keyof ViewCallbacks, T = ViewCallbacks[K]>(name: K, listener: T) {\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._disposers.forEach(dispose => dispose());\n this._disposers.length = 0;\n this._destroyed = true;\n this.manager.destroy();\n return this.room.disconnect();\n }\n}\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 = this.createValue(\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 = this.createValue(this.manager.boxState, set =>\n this._addManagerListener(\"boxStateChange\", set)\n );\n\n /**\n * Current window-manager's focused app's id.\n * @example \"HelloWorld-1A2b3C4d\"\n */\n readonly focusedApp = this.createValue(this.manager.focused, set =>\n this._addManagerListener(\"focusedChange\", set)\n );\n\n /**\n * How many times can I call `app.redo()`?\n */\n readonly canRedoSteps = this.createValue(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 = this.createValue(this.manager.canUndoSteps, set =>\n this._addManagerListener(\"canUndoStepsChange\", set)\n );\n\n /**\n * Current camera information of main view.\n */\n readonly camera = this.createValue(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 readonly memberState = this.createValue(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 = this.createValue(\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 = this.createValue(this.manager.mainViewScenesLength, set =>\n this._addManagerListener(\"mainViewScenesLengthChange\", set)\n );\n\n private _appsStatus: AppsStatus = {};\n /**\n * Apps status.\n */\n readonly appsStatus = this.createValue<AppsStatus>({}, set =>\n this._addManagerListener(\"loadApp\", ({ kind, status, reason }) => {\n this._appsStatus[kind] = {\n status: status === \"start\" ? \"loading\" : status === \"failed\" ? \"failed\" : \"idle\",\n reason,\n };\n set(this._appsStatus);\n })\n );\n\n /**\n * Undo a step on main view.\n */\n undo() {\n this._assertNotDestroyed();\n this.manager.mainView.undo();\n }\n\n /**\n * Redo a step on main view.\n */\n redo() {\n this._assertNotDestroyed();\n this.manager.mainView.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, shape?: ShapeType) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ currentApplianceName: appliance, shapeType: shape });\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 /**\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 if (typeof arg1 === \"object\" && \"fileType\" in arg1) {\n return this._insertDocsImpl(arg1);\n } else if (arg2 && arg2.status !== \"Finished\") {\n throw new Error(\"[FastboardApp] Can not insert a converting doc.\");\n } else if (arg2 && arg2.progress) {\n const scenes: SceneDefinition[] = arg2.progress.convertedFileList.map(convertedFileToScene);\n const scenePath = `/${arg2.uuid}/${genUID()}`;\n const { emptyScenes, taskId, url } = makeSlideParams(scenes);\n if (taskId && url) {\n const title = arg1;\n return this._insertDocsImpl({ fileType: \"pptx\", scenePath, taskId, title, url, scenes: emptyScenes });\n } else {\n return this._insertDocsImpl({ fileType: \"pdf\", scenePath, scenes, title: arg1 });\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 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","export type FastboardListener<T> = (event: T) => void;\n\nexport class FastboardEmitter<T> {\n listeners = new Set<FastboardListener<T>>();\n\n get length(): number {\n return this.listeners.size;\n }\n\n dispatch(message: T) {\n this.listeners.forEach(callback => callback(message));\n }\n\n addListener(listener: FastboardListener<T>) {\n this.listeners.add(listener);\n }\n\n removeListener(listener: FastboardListener<T>) {\n this.listeners.delete(listener);\n }\n}\n","import { FastboardEmitter } from \"./emitter\";\nimport { noop, safe_not_equal } from \"./utils\";\n\nexport type FastboardDisposer = () => void;\n\nexport interface FastboardReadable<T> {\n readonly value: T;\n subscribe(callback: (value: T) => void): FastboardDisposer;\n reaction(callback: (value: T) => void): FastboardDisposer;\n}\n\nexport interface FastboardWritable<T, SetFn = (value: T) => void> extends FastboardReadable<T> {\n setValue: SetFn;\n}\n\nexport interface FastboardInternalValue<T> extends FastboardWritable<T> {\n dispose: FastboardDisposer;\n}\n\n/**\n * Create a readonly, reactive value.\n * @example\n * createValue(manager.getMainViewSceneIndex(), (set) => {\n * manager.emitter.on(\"mainViewSceneIndexChanged\", set)\n * return () => manager.emitter.off(\"mainViewSceneIndexChanged\", set)\n * })\n */\nexport function createValue<T>(\n value: T,\n effect: (set: (value: T) => void) => FastboardDisposer | void\n): FastboardReadable<T>;\n\n/**\n * Create a writable, reactive value.\n * @example\n * createValue(manager.getMainViewSceneIndex(), (set) => {\n * manager.emitter.on(\"mainViewSceneIndexChanged\", set)\n * return () => manager.emitter.off(\"mainViewSceneIndexChanged\", set)\n * }, (newValue) => {\n * manager.setMainViewSceneIndex(newValue)\n * })\n */\nexport function createValue<T, SetFn = (value: T) => void>(\n value: T,\n effect: (set: (value: T) => void) => FastboardDisposer | void,\n set: (value: T) => void\n): FastboardWritable<T, SetFn>;\n\nexport function createValue<T>(\n value: T,\n effect: (set: (value: T) => void) => FastboardDisposer | void,\n setValue: (value: T) => void = noop\n): FastboardInternalValue<T> {\n const emitter = new FastboardEmitter<T>();\n\n function set(newValue: T) {\n if (safe_not_equal(value, newValue)) {\n emitter.dispatch((value = newValue));\n }\n }\n\n const dispose = effect(set) || noop;\n\n function subscribe(callback: (value: T) => void) {\n emitter.addListener(callback);\n callback(value);\n return () => emitter.removeListener(callback);\n }\n\n function reaction(callback: (value: T) => void) {\n emitter.addListener(callback);\n return () => emitter.removeListener(callback);\n }\n\n return {\n get value() {\n return value;\n },\n subscribe,\n reaction,\n setValue,\n dispose,\n };\n}\n","import type { Player, PlayerCallbacks, PlayerState, ViewCallbacks, WhiteWebSdk } from \"white-web-sdk\";\nimport type { PublicEvent, WindowManager } from \"@netless/window-manager\";\nimport type { FastboardDisposer, FastboardInternalValue } from \"../helpers/value\";\n\nimport { createValue } from \"../helpers/value\";\n\nclass FastboardPlayerBase {\n public constructor(readonly sdk: WhiteWebSdk, readonly player: Player, readonly manager: WindowManager) {}\n\n protected readonly _disposers: FastboardDisposer[] = [];\n protected _destroyed = false;\n protected _assertNotDestroyed() {\n if (this._destroyed) {\n throw new Error(\"[FastboardPlayer] Can not call any method on destroyed FastboardPlayer.\");\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected createValue: typeof createValue = (...args: [any, any]): any => {\n const value = createValue(...args);\n this._disposers.push((value as FastboardInternalValue<unknown>).dispose);\n return value;\n };\n\n protected _addPlayerListener<K extends keyof PlayerCallbacks, T = PlayerCallbacks[K]>(\n name: K,\n listener: T\n ) {\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>(name: K, set: (value: PublicEvent[K]) => void) {\n this._assertNotDestroyed();\n this.manager.emitter.on(name, set);\n return () => this.manager.emitter.off(name, set);\n }\n\n protected _addMainViewListener<K extends keyof ViewCallbacks, T = ViewCallbacks[K]>(name: K, listener: T) {\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._disposers.forEach(dispose => dispose());\n this._disposers.length = 0;\n this._destroyed = true;\n this.manager.destroy();\n this.player.callbacks.off();\n }\n}\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 = this.createValue(\n this.player.progressTime,\n set => this._addPlayerListener(\"onProgressTimeChanged\", set),\n this.player.seekToProgressTime.bind(this.player)\n );\n\n readonly phase = this.createValue(this.player.phase, set => this._addPlayerListener(\"onPhaseChanged\", set));\n\n readonly canplay = this.createValue(this.player.isPlayable, set =>\n this._addPlayerListener(\"onIsPlayableChanged\", set)\n );\n\n private _setSpeed!: (value: number) => void;\n readonly speed = this.createValue(\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 readonly state = this.createValue<PlayerState | null>(null, set => {\n const update = () => set(this.player.state);\n const dispose1 = this._addPlayerListener(\"onLoadFirstFrame\", update);\n const dispose2 = this._addPlayerListener(\"onPlayerStateChanged\", update);\n return () => (dispose1(), dispose2());\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","import type { RegisterParams } from \"@netless/window-manager\";\nimport { WindowManager } from \"@netless/window-manager\";\n\nexport interface AppsConfig {\n [kind: string]: Omit<RegisterParams, \"kind\">;\n}\n\nexport const 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\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","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;AAAA;AAAA;AAAA;AAAA;;;ACYA,2BAA8D;AAC9D,6BAA8B;;;ACZ9B,4BAA8B;AAEvB,gBAAgB;AAEvB;AAEO,wBAAwB,GAAY,GAAY;AACrD,SAAO,KAAK,IAAI,KAAK,IAAI,MAAM,KAAM,KAAK,OAAO,MAAM,YAAa,OAAO,MAAM;AACnF;AAEO,sBAAsB,KAAa,UAAgB;AACxD,SAAO,IAAI,QAAc,aAAW;AAClC,UAAM,MAAM,IAAI,MAAM;AACtB,QAAI,SAAS,MAAM,QAAQ,GAAG;AAC9B,QAAI,UAAU,MAAM,QAAQ,QAAQ;AACpC,QAAI,MAAM;AAAA,EACZ,CAAC;AACH;AAEO,yBAAyB,QAA2B;AACzD,QAAM,cAAiC,CAAC;AACxC,MAAI,SAAS;AACb,MAAI,MAAM;AAGV,QAAM,WAAW;AAEjB,aAAW,EAAE,MAAM,SAAS,QAAQ;AAElC,gBAAY,KAAK,EAAE,KAAK,CAAC;AAEzB,QAAI,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,KAAK,GAAG;AACtC;AAAA,IACF;AACA,UAAM,QAAQ,SAAS,KAAK,IAAI,GAAG;AACnC,QAAI,CAAC,SAAS,CAAC,MAAM,QAAQ;AAC3B;AAAA,IACF;AACA,aAAS,MAAM,OAAO;AACtB,UAAM,UAAU,MAAM,OAAO;AAC7B;AAAA,EACF;AAEA,SAAO,EAAE,aAAa,QAAQ,IAAI;AACpC;AAEO,8BAA8B,GAAkB,GAAW;AAChE,SAAO;AAAA,IACL,MAAM,OAAO,IAAI,CAAC;AAAA,IAClB,KAAK;AAAA,MACH,KAAK,EAAE;AAAA,MACP,OAAO,EAAE;AAAA,MACT,QAAQ,EAAE;AAAA,MACV,YAAY,EAAE;AAAA,IAChB;AAAA,EACF;AACF;AAEO,6BAA0E,UAAgB;AAC/F,MAAI,CAAC,SAAS,oBAAoB,CAAC,SAAS,iBAAiB,SAAS,mCAAa,GAAG;AACpF,aAAS,mBAAmB,CAAC,GAAI,SAAS,oBAAoB,CAAC,GAAI,mCAAa;AAAA,EAClF;AACA,SAAO;AACT;AAGA,IAAM,OAAO;AACb,IAAM,WAAW,KAAK;AACtB,IAAM,SAAS;AACf,IAAM,kBAAkC,sBAAM,MAAM;AAE7C,kBAAkB;AACvB,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,oBAAgB,KAAK,KAAK,OAAO,KAAK,OAAO,IAAI,QAAQ;AAAA,EAC3D;AACA,SAAO,gBAAgB,KAAK,EAAE;AAChC;;;ACzDA,6BAA4B;;;AClBrB,6BAA0B;AAAA,EAA1B;AACL,qBAAY,oBAAI,IAA0B;AAAA;AAAA,MAEtC,SAAiB;AACnB,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEA,SAAS,SAAY;AACnB,SAAK,UAAU,QAAQ,cAAY,SAAS,OAAO,CAAC;AAAA,EACtD;AAAA,EAEA,YAAY,UAAgC;AAC1C,SAAK,UAAU,IAAI,QAAQ;AAAA,EAC7B;AAAA,EAEA,eAAe,UAAgC;AAC7C,SAAK,UAAU,OAAO,QAAQ;AAAA,EAChC;AACF;;;AC4BO,qBACL,OACA,QACA,WAA+B,MACJ;AAC3B,QAAM,UAAU,IAAI,iBAAoB;AAExC,eAAa,UAAa;AACxB,QAAI,eAAe,OAAO,QAAQ,GAAG;AACnC,cAAQ,SAAU,QAAQ,QAAS;AAAA,IACrC;AAAA,EACF;AAEA,QAAM,UAAU,OAAO,GAAG,KAAK;AAE/B,qBAAmB,UAA8B;AAC/C,YAAQ,YAAY,QAAQ;AAC5B,aAAS,KAAK;AACd,WAAO,MAAM,QAAQ,eAAe,QAAQ;AAAA,EAC9C;AAEA,oBAAkB,UAA8B;AAC9C,YAAQ,YAAY,QAAQ;AAC5B,WAAO,MAAM,QAAQ,eAAe,QAAQ;AAAA,EAC9C;AAEA,SAAO;AAAA,QACD,QAAQ;AACV,aAAO;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AF3DA,6BAAuB;AAAA,EACd,YACI,KACA,MACA,SACA,SACT;AAJS;AACA;AACA;AACA;AAGQ,sBAAkC,CAAC;AAC5C,sBAAa;AAQb,uBAAkC,IAAI,SAA0B;AACxE,YAAM,QAAQ,YAAY,GAAG,IAAI;AACjC,WAAK,WAAW,KAAM,MAA0C,OAAO;AACvE,aAAO;AAAA,IACT;AAAA,EAfG;AAAA,EAIO,sBAAsB;AAC9B,QAAI,KAAK,YAAY;AACnB,YAAM,IAAI,MAAM,mEAAmE;AAAA,IACrF;AAAA,EACF;AAAA,EASU,iBAAsE,MAAS,UAAa;AACpG,SAAK,oBAAoB;AACzB,SAAK,KAAK,UAAU,GAAG,MAAM,QAAQ;AACrC,WAAO,MAAM,KAAK,KAAK,UAAU,IAAI,MAAM,QAAQ;AAAA,EACrD;AAAA,EAEU,oBAAiD,MAAS,KAAsC;AACxG,SAAK,oBAAoB;AACzB,SAAK,QAAQ,QAAQ,GAAG,MAAM,GAAG;AACjC,WAAO,MAAM,KAAK,QAAQ,QAAQ,IAAI,MAAM,GAAG;AAAA,EACjD;AAAA,EAEU,qBAA0E,MAAS,UAAa;AACxG,SAAK,oBAAoB;AACzB,SAAK,QAAQ,SAAS,UAAU,GAAG,MAAM,QAAQ;AACjD,WAAO,MAAM,KAAK,QAAQ,SAAS,UAAU,IAAI,MAAM,QAAQ;AAAA,EACjE;AAAA,EAEO,UAAU;AACf,SAAK,WAAW,QAAQ,aAAW,QAAQ,CAAC;AAC5C,SAAK,WAAW,SAAS;AACzB,SAAK,aAAa;AAClB,SAAK,QAAQ,QAAQ;AACrB,WAAO,KAAK,KAAK,WAAW;AAAA,EAC9B;AACF;AAgCO,iCAA2B,iBAAiB;AAAA,EAA5C;AAAA;AAoBI,oBAAW,KAAK,YACvB,KAAK,KAAK,YACV,SAAO,KAAK,iBAAiB,2BAA2B,MAAM,IAAI,KAAK,KAAK,UAAU,CAAC,GACvF,KAAK,KAAK,YAAY,KAAK,KAAK,IAAI,CACtC;AAKS,oBAAW,KAAK,YAAY,KAAK,QAAQ,UAAU,SAC1D,KAAK,oBAAoB,kBAAkB,GAAG,CAChD;AAMS,sBAAa,KAAK,YAAY,KAAK,QAAQ,SAAS,SAC3D,KAAK,oBAAoB,iBAAiB,GAAG,CAC/C;AAKS,wBAAe,KAAK,YAAY,KAAK,QAAQ,cAAc,SAClE,KAAK,oBAAoB,sBAAsB,GAAG,CACpD;AAKS,wBAAe,KAAK,YAAY,KAAK,QAAQ,cAAc,SAClE,KAAK,oBAAoB,sBAAsB,GAAG,CACpD;AAKS,kBAAS,KAAK,YAAY,KAAK,QAAQ,SAAS,QAAQ,SAC/D,KAAK,qBAAqB,mBAAmB,GAAG,CAClD;AAKS,uBAAc,KAAK,YAAY,KAAK,KAAK,MAAM,aAAa,SACnE,KAAK,iBAAiB,sBAAsB,CAAC,EAAE,aAAa,QAAQ,KAAK,IAAI,CAAC,CAAC,CACjF;AAKS,sBAAa,KAAK,YACzB,KAAK,QAAQ,oBACb,SAAO,KAAK,oBAAoB,4BAA4B,GAAG,GAC/D,KAAK,QAAQ,sBAAsB,KAAK,KAAK,OAAO,CACtD;AAKS,uBAAc,KAAK,YAAY,KAAK,QAAQ,sBAAsB,SACzE,KAAK,oBAAoB,8BAA8B,GAAG,CAC5D;AAEQ,uBAA0B,CAAC;AAI1B,sBAAa,KAAK,YAAwB,CAAC,GAAG,SACrD,KAAK,oBAAoB,WAAW,CAAC,EAAE,MAAM,QAAQ,aAAa;AAChE,WAAK,YAAY,QAAQ;AAAA,QACvB,QAAQ,WAAW,UAAU,YAAY,WAAW,WAAW,WAAW;AAAA,QAC1E;AAAA,MACF;AACA,UAAI,KAAK,WAAW;AAAA,IACtB,CAAC,CACH;AAAA;AAAA,EA7FA,cAAc,WAAwB;AACpC,SAAK,oBAAoB;AACzB,SAAK,QAAQ,cAAc,SAAS;AAAA,EACtC;AAAA,EAKA,cAAc,WAAwB;AACpC,SAAK,oBAAoB;AACzB,SAAK,QAAQ,uBAAuB,SAAS;AAAA,EAC/C;AAAA,EAuFA,OAAO;AACL,SAAK,oBAAoB;AACzB,SAAK,QAAQ,SAAS,KAAK;AAAA,EAC7B;AAAA,EAKA,OAAO;AACL,SAAK,oBAAoB;AACzB,SAAK,QAAQ,SAAS,KAAK;AAAA,EAC7B;AAAA,EAKA,WAAW,QAAyE;AAClF,SAAK,oBAAoB;AACzB,SAAK,QAAQ,WAAW,MAAM;AAAA,EAChC;AAAA,EAKA,oBAAoB,WAA0D;AAC5E,SAAK,oBAAoB;AACzB,SAAK,QAAQ,oBAAoB,SAAS;AAAA,EAC5C;AAAA,EAKA,oBAAoB;AAClB,SAAK,oBAAoB;AACzB,SAAK,QAAQ,kBAAkB;AAAA,EACjC;AAAA,EAKA,aAAa,WAA2B,OAAmB;AACzD,SAAK,oBAAoB;AACzB,SAAK,QAAQ,SAAS,eAAe,EAAE,sBAAsB,WAAW,WAAW,MAAM,CAAC;AAAA,EAC5F;AAAA,EAEA,eAAe,aAAqB;AAClC,SAAK,oBAAoB;AACzB,SAAK,QAAQ,SAAS,eAAe,EAAE,YAAY,CAAC;AAAA,EACtD;AAAA,EAEA,eAAe,aAAoB;AACjC,SAAK,oBAAoB;AACzB,SAAK,QAAQ,SAAS,eAAe,EAAE,YAAY,CAAC;AAAA,EACtD;AAAA,QAKM,YAAY,KAAa;AAC7B,SAAK,oBAAoB;AACzB,UAAM,KAAK,QAAQ,uBAAuB;AAE1C,UAAM,EAAE,eAAe,KAAK,QAAQ;AACpC,UAAM,gBAAgB;AAAA,MACpB,OAAO,0CAAY,gBAAe,OAAO;AAAA,MACzC,QAAQ,0CAAY,iBAAgB,OAAO;AAAA,IAC7C;AAGA,UAAM,WAAW,cAAc,QAAQ;AACvC,QAAI,EAAE,OAAO,WAAW,MAAM,aAAa,KAAK,aAAa;AAC7D,UAAM,QAAQ,KAAK,IAAI,WAAW,OAAO,CAAC;AAC1C,UAAM,OAAO,OAAO;AACpB,UAAM,EAAE,SAAS,YAAY,KAAK,QAAQ;AAC1C,aAAS;AACT,cAAU;AACV,SAAK,QAAQ,SAAS,YAAY,EAAE,MAAM,SAAS,SAAS,OAAO,QAAQ,QAAQ,MAAM,CAAC;AAC1F,SAAK,QAAQ,SAAS,oBAAoB,MAAM,GAAG;AAGnD,aAAS;AACT,cAAU;AACV,UAAM,UAAU,UAAU,QAAQ;AAClC,UAAM,UAAU,UAAU,SAAS;AACnC,SAAK,QAAQ,oBAAoB,EAAE,SAAS,SAAS,OAAO,OAAO,CAAC;AAAA,EACtE;AAAA,EAoBA,WAAW,MAAiC,MAA2B;AACrE,QAAI,OAAO,SAAS,YAAY,cAAc,MAAM;AAClD,aAAO,KAAK,gBAAgB,IAAI;AAAA,IAClC,WAAW,QAAQ,KAAK,WAAW,YAAY;AAC7C,YAAM,IAAI,MAAM,iDAAiD;AAAA,IACnE,WAAW,QAAQ,KAAK,UAAU;AAChC,YAAM,SAA4B,KAAK,SAAS,kBAAkB,IAAI,oBAAoB;AAC1F,YAAM,YAAY,IAAI,KAAK,QAAQ,OAAO;AAC1C,YAAM,EAAE,aAAa,QAAQ,QAAQ,gBAAgB,MAAM;AAC3D,UAAI,UAAU,KAAK;AACjB,cAAM,QAAQ;AACd,eAAO,KAAK,gBAAgB,EAAE,UAAU,QAAQ,WAAW,QAAQ,OAAO,KAAK,QAAQ,YAAY,CAAC;AAAA,MACtG,OAAO;AACL,eAAO,KAAK,gBAAgB,EAAE,UAAU,OAAO,WAAW,QAAQ,OAAO,KAAK,CAAC;AAAA,MACjF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,gBAAgB,IAAyE;AAAzE,iBAAE,YAAU,WAAW,OAAO,WAA9B,IAAyC,uBAAzC,IAAyC,CAAvC,YAAU,aAAW,SAAO;AACpD,SAAK,oBAAoB;AACzB,YAAQ;AAAA,WACD;AACH,eAAO,KAAK,QAAQ,OAAO;AAAA,UACzB,MAAM;AAAA,UACN,SAAS,EAAE,WAAW,OAAO,OAAO;AAAA,QACtC,CAAC;AAAA,WACE;AACH,eAAO,KAAK,QAAQ,OAAO;AAAA,UACzB,MAAM;AAAA,UACN,SAAS,EAAE,WAAW,OAAO,OAAO;AAAA,UACpC;AAAA,QACF,CAAC;AAAA;AAAA,EAEP;AAAA,EAKA,mBAAmB;AACjB,SAAK,oBAAoB;AACzB,WAAO,KAAK,QAAQ,OAAO;AAAA,MACzB,MAAM;AAAA,MACN,SAAS,EAAE,OAAO,cAAc;AAAA,IAClC,CAAC;AAAA,EACH;AAAA,EAKA,kBAAkB;AAChB,SAAK,oBAAoB;AACzB,WAAO,KAAK,QAAQ,OAAO;AAAA,MACzB,MAAM;AAAA,MACN,SAAS,EAAE,OAAO,YAAY;AAAA,IAChC,CAAC;AAAA,EACH;AAAA,EAKA,YAAY,OAAe,KAAa;AACtC,SAAK,oBAAoB;AACzB,WAAO,KAAK,QAAQ,OAAO;AAAA,MACzB,MAAM,mCAAY;AAAA,MAClB,SAAS,EAAE,MAAM;AAAA,MACjB,YAAY,EAAE,IAAI;AAAA,IACpB,CAAC;AAAA,EACH;AAAA,EAKA,iBAAiB;AACf,SAAK,oBAAoB;AACzB,WAAO,KAAK,QAAQ,OAAO;AAAA,MACzB,MAAM;AAAA,MACN,SAAS,EAAE,OAAO,WAAW;AAAA,IAC/B,CAAC;AAAA,EACH;AACF;;;AGhYA,gCAA0B;AAAA,EACjB,YAAqB,KAA2B,QAAyB,SAAwB;AAA5E;AAA2B;AAAyB;AAE7D,sBAAkC,CAAC;AAC5C,sBAAa;AAQb,uBAAkC,IAAI,SAA0B;AACxE,YAAM,QAAQ,YAAY,GAAG,IAAI;AACjC,WAAK,WAAW,KAAM,MAA0C,OAAO;AACvE,aAAO;AAAA,IACT;AAAA,EAfyG;AAAA,EAI/F,sBAAsB;AAC9B,QAAI,KAAK,YAAY;AACnB,YAAM,IAAI,MAAM,yEAAyE;AAAA,IAC3F;AAAA,EACF;AAAA,EASU,mBACR,MACA,UACA;AACA,SAAK,oBAAoB;AACzB,SAAK,OAAO,UAAU,GAAG,MAAM,QAAQ;AACvC,WAAO,MAAM,KAAK,OAAO,UAAU,IAAI,MAAM,QAAQ;AAAA,EACvD;AAAA,EAEU,oBAAiD,MAAS,KAAsC;AACxG,SAAK,oBAAoB;AACzB,SAAK,QAAQ,QAAQ,GAAG,MAAM,GAAG;AACjC,WAAO,MAAM,KAAK,QAAQ,QAAQ,IAAI,MAAM,GAAG;AAAA,EACjD;AAAA,EAEU,qBAA0E,MAAS,UAAa;AACxG,SAAK,oBAAoB;AACzB,SAAK,QAAQ,SAAS,UAAU,GAAG,MAAM,QAAQ;AACjD,WAAO,MAAM,KAAK,QAAQ,SAAS,UAAU,IAAI,MAAM,QAAQ;AAAA,EACjE;AAAA,EAEO,UAAU;AACf,SAAK,WAAW,QAAQ,aAAW,QAAQ,CAAC;AAC5C,SAAK,WAAW,SAAS;AACzB,SAAK,aAAa;AAClB,SAAK,QAAQ,QAAQ;AACrB,SAAK,OAAO,UAAU,IAAI;AAAA,EAC5B;AACF;AAEO,oCAA8B,oBAAoB;AAAA,EAAlD;AAAA;AAiBI,uBAAc,KAAK,YAC1B,KAAK,OAAO,cACZ,SAAO,KAAK,mBAAmB,yBAAyB,GAAG,GAC3D,KAAK,OAAO,mBAAmB,KAAK,KAAK,MAAM,CACjD;AAES,iBAAQ,KAAK,YAAY,KAAK,OAAO,OAAO,SAAO,KAAK,mBAAmB,kBAAkB,GAAG,CAAC;AAEjG,mBAAU,KAAK,YAAY,KAAK,OAAO,YAAY,SAC1D,KAAK,mBAAmB,uBAAuB,GAAG,CACpD;AAGS,iBAAQ,KAAK,YACpB,KAAK,OAAO,eACZ,SAAO;AACL,WAAK,YAAY;AAAA,IACnB,GACA,WAAS;AACP,WAAK,OAAO,gBAAgB;AAC5B,WAAK,UAAU,KAAK;AAAA,IACtB,CACF;AAES,iBAAQ,KAAK,YAAgC,MAAM,SAAO;AACjE,YAAM,SAAS,MAAM,IAAI,KAAK,OAAO,KAAK;AAC1C,YAAM,WAAW,KAAK,mBAAmB,oBAAoB,MAAM;AACnE,YAAM,WAAW,KAAK,mBAAmB,wBAAwB,MAAM;AACvE,aAAO,MAAO,UAAS,GAAG,SAAS;AAAA,IACrC,CAAC;AAAA;AAAA,EA1CD,cAAc,WAAwB;AACpC,SAAK,oBAAoB;AACzB,SAAK,QAAQ,cAAc,SAAS;AAAA,EACtC;AAAA,EAKA,cAAc,WAAwB;AACpC,SAAK,oBAAoB;AACzB,SAAK,QAAQ,uBAAuB,SAAS;AAAA,EAC/C;AAAA,EAiCA,KAAK,WAAmB;AACtB,SAAK,oBAAoB;AACzB,WAAO,KAAK,OAAO,mBAAmB,SAAS;AAAA,EACjD;AAAA,EAEA,OAAO;AACL,SAAK,oBAAoB;AACzB,SAAK,OAAO,KAAK;AAAA,EACnB;AAAA,EAEA,QAAQ;AACN,SAAK,oBAAoB;AACzB,SAAK,OAAO,MAAM;AAAA,EACpB;AAAA,EAEA,OAAO;AACL,SAAK,oBAAoB;AACzB,SAAK,OAAO,KAAK;AAAA,EACnB;AACF;;;ACxHA,6BAA8B;AAMvB,IAAM,cAA0B;AAAA,EACrC,QAAQ;AAAA,IACN,KAAK;AAAA,EACP;AAAA,EACA,WAAW;AAAA,IACT,KAAK;AAAA,EACP;AAAA,EACA,UAAU;AAAA,IACR,KAAK;AAAA,IACL,YAAY;AAAA,MACV,eAAe;AAAA,IACjB;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ,KAAK;AAAA,EACP;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,KAAK;AAAA,EACP;AACF;AAEA,WAAW,QAAQ,aAAa;AAC9B,MAAI,OAAO,UAAU,eAAe,KAAK,aAAa,IAAI,GAAG;AAC3D,UAAM,UAAU,YAAY;AAC5B,yCAAc,SAAS,iBAAE,QAAS,QAAS;AAAA,EAC7C;AACF;;;ANcA,+BAAsC,IAIjB;AAJiB,eAE1B;AAAA,IADV;AAAA,IACA,UAAU;AAAA,MAF0B,IAE1B,SAAE,gBAAF,IAAgB,2BAAhB,IAAgB,CAAd,eAAF;AAAA,IACV;AAAA,MAHoC;AAKpC,QAAM,MAAM,IAAI,iCAAY,iCACvB,YADuB;AAAA,IAE1B,cAAc;AAAA,EAChB,EAAC;AAED,QAAM,UAA4B,iCAC7B,sCAD6B;AAAA,IAEhC,kBAAkB;AAAA,IAClB,sBAAsB;AAAA,IACtB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf,cAAc;AAAA,EAChB;AAEA,QAAM,OAAO,MAAM,IAAI,SACrB;AAAA,IACE,UAAU;AAAA,IACV;AAAA,KACG,oBAAoB,cAAc,IAHvC;AAAA,IAIE,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,gCAAgC;AAAA,EAClC,IACA,SACF;AAEA,QAAM,UAAU,MAAM,qCAAc,MAAM;AAAA,IACxC,QAAQ;AAAA,KACL,gBAFqC;AAAA,IAGxC;AAAA,EACF,EAAC;AAED,UAAQ,SAAS,eAAe;AAAA,IAC9B,gBAAgB,2CAAiB,GAAG;AAAA,IACpC,gBAAgB,2CAAiB,CAAC;AAAA,EACpC,CAAC;AAED,SAAO,IAAI,aAAa,KAAK,MAAM,SAAS,OAAO;AACrD;AAyBA,+BAAsC,IAIX;AAJW,eAExB;AAAA,IADZ;AAAA,IACA,YAAY;AAAA,MAFwB,IAExB,SAAE,gBAAF,IAAgB,6BAAhB,IAAgB,CAAd,eAAF;AAAA,IACZ;AAAA,MAHoC;AAKpC,QAAM,MAAM,IAAI,iCAAY,iCACvB,YADuB;AAAA,IAE1B,cAAc;AAAA,EAChB,EAAC;AAED,QAAM,SAAS,MAAM,IAAI,WACvB,iCACK,oBAAoB,gBAAgB,IADzC;AAAA,IAEE,eAAe;AAAA,EACjB,IACA,SACF;AAEA,QAAM,iBAAiB,qCAAc,MAAM;AAAA,IACzC,QAAQ;AAAA,KACL,gBAFsC;AAAA,IAGzC,MAAM;AAAA,EACR,EAAC;AAED,SAAO,KAAK;AACZ,QAAM,UAAU,MAAM;AACtB,SAAO,MAAM;AAEb,SAAO,IAAI,gBAAgB,KAAK,QAAQ,OAAO;AACjD;;;AOtJA,6BAA8B;AAC9B,uBAAqB;AAErB,qCAAc,SAAS;AAAA,EACrB,MAAM;AAAA,EACN,YAAY;AAAA,IAEV,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AACP,CAAC;","names":[]}
package/dist/index.mjs CHANGED
@@ -1,9 +1,7 @@
1
1
  import {
2
- DefaultApps,
3
2
  createFastboard,
4
- registerApps,
5
3
  replayFastboard
6
- } from "./chunk-IHDHV4XE.mjs";
4
+ } from "./chunk-ITPURPVI.mjs";
7
5
 
8
6
  // src/behaviors/register-slide.ts
9
7
  import { WindowManager } from "@netless/window-manager";
@@ -16,9 +14,7 @@ WindowManager.register({
16
14
  src: AppSlide
17
15
  });
18
16
  export {
19
- DefaultApps,
20
17
  createFastboard,
21
- registerApps,
22
18
  replayFastboard
23
19
  };
24
20
  //# sourceMappingURL=index.mjs.map
@@ -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/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":[]}