@netless/fastboard-core 0.3.4-canary.2 → 0.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +5 -4
- package/dist/index.js +55 -49
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +46 -40
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
- package/src/impl/FastboardApp.ts +11 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Size, SceneDefinition, ConvertedFile, RoomPhase as RoomPhase$1, ApplianceNames, ShapeType, MemberState, RoomState, Camera, AnimationMode, Rectangle, Color, ConversionResponse, WhiteWebSdkConfiguration, JoinRoomParams, RoomCallbacks, WhiteWebSdk, Room, HotKeys, ViewCallbacks, PlayerPhase as PlayerPhase$1, PlayerState, PlayerSeekingResult, ReplayRoomParams, PlayerCallbacks, Player } from 'white-web-sdk';
|
|
2
2
|
export { AnimationMode, ApplianceNames, Camera, Color, ConversionResponse, HotKey, HotKeys, JoinRoomParams, MemberState, PlayerSeekingResult, Rectangle, Room, RoomCallbacks, RoomState, SceneDefinition, ShapeType, ViewCallbacks, WhiteWebSdk, WhiteWebSdkConfiguration } from 'white-web-sdk';
|
|
3
|
-
import { AddPageParams, MountParams, WindowManager, PublicEvent, RegisterParams } from '@netless/window-manager';
|
|
4
|
-
export { AddPageParams, MountParams, PublicEvent, WindowManager } from '@netless/window-manager';
|
|
3
|
+
import { AddPageParams, MountParams, NetlessApp, WindowManager, PublicEvent, RegisterParams } from '@netless/window-manager';
|
|
4
|
+
export { AddPageParams, MountParams, NetlessApp, PublicEvent, WindowManager } from '@netless/window-manager';
|
|
5
5
|
export { PreviewParams, default as SlideApp, Controller as SlideController, AppOptions as SlideOptions, SlidePreviewer, addHooks as addSlideHooks, previewSlide, apps as slideApps } from '@netless/app-slide';
|
|
6
6
|
|
|
7
7
|
declare type Subscriber<T> = (value: T) => void;
|
|
@@ -112,7 +112,7 @@ declare class FastboardApp extends FastboardAppBase {
|
|
|
112
112
|
/**
|
|
113
113
|
* Current window-manager's windows' state (is it maximized?).
|
|
114
114
|
*/
|
|
115
|
-
readonly boxState: Readable<"
|
|
115
|
+
readonly boxState: Readable<"minimized" | "maximized" | "normal" | undefined>;
|
|
116
116
|
/**
|
|
117
117
|
* Current window-manager's focused app's id.
|
|
118
118
|
* @example "HelloWorld-1A2b3C4d"
|
|
@@ -275,6 +275,7 @@ interface FastboardOptions {
|
|
|
275
275
|
callbacks?: Partial<RoomCallbacks>;
|
|
276
276
|
};
|
|
277
277
|
managerConfig?: Omit<MountParams, "room">;
|
|
278
|
+
netlessApps?: NetlessApp[];
|
|
278
279
|
}
|
|
279
280
|
/**
|
|
280
281
|
* Create a FastboardApp instance.
|
|
@@ -291,7 +292,7 @@ interface FastboardOptions {
|
|
|
291
292
|
* },
|
|
292
293
|
* })
|
|
293
294
|
*/
|
|
294
|
-
declare function createFastboard({ sdkConfig, joinRoom: { callbacks, ...joinRoomParams }, managerConfig, }: FastboardOptions): Promise<FastboardApp>;
|
|
295
|
+
declare function createFastboard({ sdkConfig, joinRoom: { callbacks, ...joinRoomParams }, managerConfig, netlessApps, }: FastboardOptions): Promise<FastboardApp>;
|
|
295
296
|
|
|
296
297
|
declare class FastboardPlayerBase {
|
|
297
298
|
readonly sdk: WhiteWebSdk;
|
package/dist/index.js
CHANGED
|
@@ -209,7 +209,7 @@ function warn(id) {
|
|
|
209
209
|
|
|
210
210
|
// src/impl/FastboardApp.ts
|
|
211
211
|
var import_white_web_sdk = require("white-web-sdk");
|
|
212
|
-
var
|
|
212
|
+
var import_window_manager3 = require("@netless/window-manager");
|
|
213
213
|
|
|
214
214
|
// src/internal.ts
|
|
215
215
|
var import_window_manager = require("@netless/window-manager");
|
|
@@ -223,6 +223,49 @@ function transform_app_status(status) {
|
|
|
223
223
|
return status === "start" ? "loading" : status === "failed" ? "failed" : "idle";
|
|
224
224
|
}
|
|
225
225
|
|
|
226
|
+
// src/behaviors/index.ts
|
|
227
|
+
var import_window_manager2 = require("@netless/window-manager");
|
|
228
|
+
var import_app_slide = __toESM(require("@netless/app-slide"));
|
|
229
|
+
var DefaultApps = {
|
|
230
|
+
Monaco: {
|
|
231
|
+
src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-monaco/0.1.12/dist/main.iife.js"
|
|
232
|
+
},
|
|
233
|
+
Countdown: {
|
|
234
|
+
src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-countdown/0.0.2/dist/main.iife.js"
|
|
235
|
+
},
|
|
236
|
+
GeoGebra: {
|
|
237
|
+
src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-geogebra/0.0.4/dist/main.iife.js",
|
|
238
|
+
appOptions: {
|
|
239
|
+
HTML5Codebase: "https://flat-storage-cn-hz.whiteboard.agora.io/GeoGebra/HTML5/5.0/web3d"
|
|
240
|
+
}
|
|
241
|
+
},
|
|
242
|
+
EmbeddedPage: {
|
|
243
|
+
src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-embedded-page/0.1.1/dist/main.iife.js"
|
|
244
|
+
},
|
|
245
|
+
Plyr: {
|
|
246
|
+
src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-plyr/0.1.3/dist/main.iife.js"
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
import_window_manager2.WindowManager.register({
|
|
250
|
+
kind: "Slide",
|
|
251
|
+
appOptions: { debug: false },
|
|
252
|
+
src: import_app_slide.default,
|
|
253
|
+
addHooks: import_app_slide.addHooks
|
|
254
|
+
});
|
|
255
|
+
for (const kind in DefaultApps) {
|
|
256
|
+
if (Object.prototype.hasOwnProperty.call(DefaultApps, kind)) {
|
|
257
|
+
const options = DefaultApps[kind];
|
|
258
|
+
import_window_manager2.WindowManager.register(__spreadValues({ kind }, options));
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
var register = import_window_manager2.WindowManager.register.bind(import_window_manager2.WindowManager);
|
|
262
|
+
var version = "0.3.4";
|
|
263
|
+
if (typeof window !== "undefined") {
|
|
264
|
+
let str = window.__netlessUA || "";
|
|
265
|
+
str += ` ${"@netless/fastboard"}@${version} `;
|
|
266
|
+
window.__netlessUA = str;
|
|
267
|
+
}
|
|
268
|
+
|
|
226
269
|
// src/impl/FastboardApp.ts
|
|
227
270
|
var FastboardAppBase = class {
|
|
228
271
|
constructor(sdk, room, manager, hotKeys) {
|
|
@@ -438,7 +481,7 @@ var FastboardApp = class extends FastboardAppBase {
|
|
|
438
481
|
insertMedia(title, src) {
|
|
439
482
|
this._assertNotDestroyed();
|
|
440
483
|
return this.manager.addApp({
|
|
441
|
-
kind:
|
|
484
|
+
kind: import_window_manager3.BuiltinApps.MediaPlayer,
|
|
442
485
|
options: { title },
|
|
443
486
|
attributes: { src }
|
|
444
487
|
});
|
|
@@ -470,7 +513,8 @@ async function createFastboard(_a) {
|
|
|
470
513
|
sdkConfig,
|
|
471
514
|
joinRoom: _c
|
|
472
515
|
} = _b, _d = _c, { callbacks } = _d, joinRoomParams = __objRest(_d, ["callbacks"]), {
|
|
473
|
-
managerConfig
|
|
516
|
+
managerConfig,
|
|
517
|
+
netlessApps
|
|
474
518
|
} = _b;
|
|
475
519
|
const sdk = new import_white_web_sdk.WhiteWebSdk(__spreadProps(__spreadValues({}, sdkConfig), {
|
|
476
520
|
useMobXState: true
|
|
@@ -487,6 +531,11 @@ async function createFastboard(_a) {
|
|
|
487
531
|
changeToArrow: "a",
|
|
488
532
|
changeToHand: "h"
|
|
489
533
|
});
|
|
534
|
+
if (netlessApps) {
|
|
535
|
+
netlessApps.forEach((app) => {
|
|
536
|
+
register({ kind: app.kind, src: app });
|
|
537
|
+
});
|
|
538
|
+
}
|
|
490
539
|
const room = await sdk.joinRoom(__spreadProps(__spreadValues({
|
|
491
540
|
floatBar: true,
|
|
492
541
|
hotKeys
|
|
@@ -495,7 +544,7 @@ async function createFastboard(_a) {
|
|
|
495
544
|
disableNewPencil: false,
|
|
496
545
|
disableMagixEventDispatchLimit: true
|
|
497
546
|
}), callbacks);
|
|
498
|
-
const manager = await
|
|
547
|
+
const manager = await import_window_manager3.WindowManager.mount(__spreadProps(__spreadValues({
|
|
499
548
|
cursor: true
|
|
500
549
|
}, managerConfig), {
|
|
501
550
|
room
|
|
@@ -509,7 +558,7 @@ async function createFastboard(_a) {
|
|
|
509
558
|
|
|
510
559
|
// src/impl/FastboardPlayer.ts
|
|
511
560
|
var import_white_web_sdk2 = require("white-web-sdk");
|
|
512
|
-
var
|
|
561
|
+
var import_window_manager4 = require("@netless/window-manager");
|
|
513
562
|
var FastboardPlayerBase = class {
|
|
514
563
|
constructor(sdk, player, manager) {
|
|
515
564
|
this.sdk = sdk;
|
|
@@ -615,7 +664,7 @@ async function replayFastboard(_a) {
|
|
|
615
664
|
const player = await sdk.replayRoom(__spreadProps(__spreadValues({}, ensure_window_manager(replayRoomParams)), {
|
|
616
665
|
useMultiViews: true
|
|
617
666
|
}), callbacks);
|
|
618
|
-
const managerPromise =
|
|
667
|
+
const managerPromise = import_window_manager4.WindowManager.mount(__spreadProps(__spreadValues({
|
|
619
668
|
cursor: true
|
|
620
669
|
}, managerConfig), {
|
|
621
670
|
room: player
|
|
@@ -626,47 +675,4 @@ async function replayFastboard(_a) {
|
|
|
626
675
|
await player.seekToProgressTime(0);
|
|
627
676
|
return new FastboardPlayer(sdk, player, manager);
|
|
628
677
|
}
|
|
629
|
-
|
|
630
|
-
// src/behaviors/index.ts
|
|
631
|
-
var import_window_manager4 = require("@netless/window-manager");
|
|
632
|
-
var import_app_slide = __toESM(require("@netless/app-slide"));
|
|
633
|
-
var DefaultApps = {
|
|
634
|
-
Monaco: {
|
|
635
|
-
src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-monaco/0.1.12/dist/main.iife.js"
|
|
636
|
-
},
|
|
637
|
-
Countdown: {
|
|
638
|
-
src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-countdown/0.0.2/dist/main.iife.js"
|
|
639
|
-
},
|
|
640
|
-
GeoGebra: {
|
|
641
|
-
src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-geogebra/0.0.4/dist/main.iife.js",
|
|
642
|
-
appOptions: {
|
|
643
|
-
HTML5Codebase: "https://flat-storage-cn-hz.whiteboard.agora.io/GeoGebra/HTML5/5.0/web3d"
|
|
644
|
-
}
|
|
645
|
-
},
|
|
646
|
-
EmbeddedPage: {
|
|
647
|
-
src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-embedded-page/0.1.1/dist/main.iife.js"
|
|
648
|
-
},
|
|
649
|
-
Plyr: {
|
|
650
|
-
src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-plyr/0.1.3/dist/main.iife.js"
|
|
651
|
-
}
|
|
652
|
-
};
|
|
653
|
-
import_window_manager4.WindowManager.register({
|
|
654
|
-
kind: "Slide",
|
|
655
|
-
appOptions: { debug: false },
|
|
656
|
-
src: import_app_slide.default,
|
|
657
|
-
addHooks: import_app_slide.addHooks
|
|
658
|
-
});
|
|
659
|
-
for (const kind in DefaultApps) {
|
|
660
|
-
if (Object.prototype.hasOwnProperty.call(DefaultApps, kind)) {
|
|
661
|
-
const options = DefaultApps[kind];
|
|
662
|
-
import_window_manager4.WindowManager.register(__spreadValues({ kind }, options));
|
|
663
|
-
}
|
|
664
|
-
}
|
|
665
|
-
var register = import_window_manager4.WindowManager.register.bind(import_window_manager4.WindowManager);
|
|
666
|
-
var version = "0.3.4-canary.2";
|
|
667
|
-
if (typeof window !== "undefined") {
|
|
668
|
-
let str = window.__netlessUA || "";
|
|
669
|
-
str += ` ${"@netless/fastboard"}@${version} `;
|
|
670
|
-
window.__netlessUA = str;
|
|
671
|
-
}
|
|
672
678
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/utils/store.ts","../src/utils/misc.ts","../src/utils/uid.ts","../src/utils/warn.ts","../src/impl/FastboardApp.ts","../src/internal.ts","../src/impl/FastboardPlayer.ts","../src/behaviors/index.ts"],"names":[],"mappings":"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","sourcesContent":["export * from \"./utils\";\nexport * from \"./impl\";\nexport * from \"./behaviors\";\n","// This is a simple mimic of svelte/store.\nexport type Subscriber<T> = (value: T) => void;\nexport type Unsubscriber = () => void;\nexport type Updater<T> = (value: T) => T;\nexport type StartStopNotifier<T> = (set: Subscriber<T>) => Unsubscriber | void;\n\nexport interface Readable<T> {\n readonly value: T;\n subscribe(this: void, run: Subscriber<T>): Unsubscriber;\n reaction(this: void, run: Subscriber<T>): Unsubscriber;\n}\n\nexport interface Writable<T> extends Readable<T> {\n set(this: void, value: T): void;\n update(this: void, updater: Updater<T>): void;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nfunction noop() {}\n\nfunction safe_not_equal(a: unknown, b: unknown) {\n return a != a ? b == b : a !== b || (a && typeof a === \"object\") || typeof a === \"function\";\n}\n\nexport function readable<T>(value: T, start: StartStopNotifier<T> = noop): Readable<T> {\n let stop: Unsubscriber | undefined;\n const subscribers = new Set<Subscriber<T>>();\n function set(new_value: T) {\n if (safe_not_equal(value, new_value)) {\n value = new_value;\n if (stop) {\n for (const run of subscribers) {\n run(value);\n }\n }\n }\n }\n function subscribe(run: Subscriber<T>) {\n subscribers.add(run);\n if (subscribers.size === 1) {\n stop = start(set) || noop;\n }\n run(value);\n return () => {\n subscribers.delete(run);\n if (subscribers.size === 0) {\n stop && stop();\n stop = undefined;\n }\n };\n }\n function reaction(run: Subscriber<T>) {\n subscribers.add(run);\n if (subscribers.size === 1) {\n stop = start(set) || noop;\n }\n return () => {\n subscribers.delete(run);\n if (subscribers.size === 0) {\n stop && stop();\n stop = undefined;\n }\n };\n }\n return {\n get value() {\n return value;\n },\n subscribe,\n reaction,\n };\n}\n\nexport function writable<T>(value: T, start: StartStopNotifier<T> = noop, set: Subscriber<T>): Writable<T> {\n const internal = readable(value, start);\n return {\n get value() {\n return internal.value;\n },\n subscribe: internal.subscribe,\n reaction: internal.reaction,\n set,\n update(fn: Updater<T>) {\n set(fn(value));\n },\n };\n}\n","import type { ConvertedFile, SceneDefinition, Size } from \"white-web-sdk\";\n\nexport function getImageSize(url: string, fallback: Size) {\n return new Promise<Size>(resolve => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = () => resolve(fallback);\n img.src = url;\n });\n}\n\nexport function makeSlideParams(scenes: SceneDefinition[]) {\n const emptyScenes: SceneDefinition[] = [];\n let taskId = \"\";\n let url = \"\";\n\n // e.g. \"ppt(x)://cdn/prefix/dynamicConvert/{taskId}/1.slide\"\n const pptSrcRE = /^pptx?(?<prefix>:\\/\\/\\S+?dynamicConvert)\\/(?<taskId>\\w+)\\//;\n\n for (const { name, ppt } of scenes) {\n // make sure scenesWithoutPPT.length === scenes.length\n emptyScenes.push({ name });\n\n if (!ppt || !ppt.src.startsWith(\"ppt\")) {\n continue;\n }\n const match = pptSrcRE.exec(ppt.src);\n if (!match || !match.groups) {\n continue;\n }\n taskId = match.groups.taskId;\n url = \"https\" + match.groups.prefix;\n break;\n }\n\n return { scenes: emptyScenes, taskId, url };\n}\n\nexport function convertedFileToScene(f: ConvertedFile, i: number): SceneDefinition {\n return {\n name: String(i + 1),\n ppt: {\n src: f.conversionFileUrl,\n width: f.width,\n height: f.height,\n previewURL: f.preview,\n },\n };\n}\n","// Copy from https://github.com/crimx/side-effect-manager/blob/main/src/gen-uid.ts\nconst SOUP = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\nconst SOUP_LEN = 62; // SOUP.length\nconst ID_LEN = 20;\nconst reusedIdCarrier = /* @__PURE__ */ Array(ID_LEN);\n\nexport function genUID() {\n for (let i = 0; i < ID_LEN; i++) {\n reusedIdCarrier[i] = SOUP.charAt(Math.random() * SOUP_LEN);\n }\n return reusedIdCarrier.join(\"\");\n}\n","const warnings = {\n \"no-ppt-in-scenes\":\n \"You're probably inserting the slide app in a wrong way, there shouldn't exist `scenes[0].ppt`.\",\n} as const;\nconst warned = new Set<string>();\n\nexport function warn(id: keyof typeof warnings) {\n if (warned.has(id)) return;\n warned.add(id);\n console.warn(warnings[id]);\n}\n","import type { AddPageParams, PublicEvent, MountParams } from \"@netless/window-manager\";\nimport type {\n AnimationMode,\n ApplianceNames,\n Camera,\n Color,\n ConversionResponse,\n HotKey,\n HotKeys,\n JoinRoomParams,\n MemberState,\n Rectangle,\n Room,\n RoomPhase as RoomPhaseEnum,\n RoomCallbacks,\n RoomState,\n SceneDefinition,\n ShapeType,\n ViewCallbacks,\n WhiteWebSdkConfiguration,\n} from \"white-web-sdk\";\n\nimport { DefaultHotKeys, WhiteWebSdk, contentModeScale } from \"white-web-sdk\";\nimport { BuiltinApps, WindowManager } from \"@netless/window-manager\";\nimport {\n getImageSize,\n genUID,\n convertedFileToScene,\n makeSlideParams,\n readable,\n writable,\n warn,\n} from \"../utils\";\nimport { ensure_window_manager, transform_app_status } from \"../internal\";\n\nclass FastboardAppBase {\n public constructor(\n readonly sdk: WhiteWebSdk,\n readonly room: Room,\n readonly manager: WindowManager,\n readonly hotKeys: Partial<HotKeys>\n ) {}\n\n protected _destroyed = false;\n protected _assertNotDestroyed() {\n if (this._destroyed) {\n throw new Error(\"FastboardApp has been destroyed\");\n }\n }\n\n protected _addRoomListener<K extends keyof RoomCallbacks>(name: K, listener: RoomCallbacks[K]) {\n this._assertNotDestroyed();\n this.room.callbacks.on(name, listener);\n return () => this.room.callbacks.off(name, listener);\n }\n\n protected _addManagerListener<K extends keyof PublicEvent>(\n name: K,\n listener: (value: PublicEvent[K]) => void\n ) {\n this._assertNotDestroyed();\n this.manager.emitter.on(name, listener);\n return () => this.manager.emitter.off(name, listener);\n }\n\n protected _addMainViewListener<K extends keyof ViewCallbacks>(name: K, listener: ViewCallbacks[K]) {\n this._assertNotDestroyed();\n this.manager.mainView.callbacks.on(name, listener);\n return () => this.manager.mainView.callbacks.off(name, listener);\n }\n\n /**\n * Destroy fastboard (disconnect from the whiteboard room).\n */\n public destroy() {\n this._destroyed = true;\n this.manager.destroy();\n return this.room.disconnect();\n }\n}\n\ntype RoomPhase = `${RoomPhaseEnum}`;\n\nexport type {\n AddPageParams,\n AnimationMode,\n ApplianceNames,\n Camera,\n Color,\n ConversionResponse,\n HotKey,\n HotKeys,\n JoinRoomParams,\n MemberState,\n MountParams,\n PublicEvent,\n Rectangle,\n Room,\n RoomPhase,\n RoomCallbacks,\n RoomState,\n SceneDefinition,\n ShapeType,\n ViewCallbacks,\n WhiteWebSdk,\n WhiteWebSdkConfiguration,\n WindowManager,\n};\n\n/** pencil, eraser, rectangle... */\nexport type Appliance = `${ApplianceNames}`;\n/** triangle, star... */\nexport type Shape = `${ShapeType}`;\n\n/** Params for static docs, they are rendered as many images. */\nexport interface InsertDocsStatic {\n readonly fileType: \"pdf\";\n /** Unique string for binding whiteboard view to the doc. Must start with `/`. */\n readonly scenePath: string;\n /** @example [{ name: '1', ppt: { src: 'url/to/ppt/1.png' } }] */\n readonly scenes: SceneDefinition[];\n /** Window title. */\n readonly title?: string;\n}\n\n/** Params for slides, they are rendered in @netless/app-slide with animations. */\nexport interface InsertDocsDynamic {\n readonly fileType: \"pptx\";\n /** Unique string for binding whiteboard view to the doc. Must start with `/`. */\n readonly scenePath: string;\n /** Conversion task id, see https://developer.netless.link/server-en/home/server-conversion#get-query-task-conversion-progress. */\n readonly taskId: string;\n /** Window title. */\n readonly title?: string;\n /** Where the slide resource placed. @default `https://convertcdn.netless.link/dynamicConvert` */\n readonly url?: string;\n /** @example [{ name: '1' }, { name: '2' }, { name: '3' }] */\n readonly scenes?: SceneDefinition[];\n}\n\nexport type InsertDocsParams = InsertDocsStatic | InsertDocsDynamic;\n\nexport type SetMemberStateFn = (partialMemberState: Partial<MemberState>) => void;\n\nexport type RoomStateChanged = (diff: Partial<RoomState>) => void;\n\n/** App download progress. */\nexport interface AppsStatus {\n [kind: string]: {\n status: \"idle\" | \"loading\" | \"failed\";\n /** Exist if status is `failed`. */\n reason?: string;\n };\n}\n\nexport class FastboardApp extends FastboardAppBase {\n /**\n * Render this app to some DOM.\n */\n bindContainer(container: HTMLElement) {\n this._assertNotDestroyed();\n this.manager.bindContainer(container);\n }\n\n /**\n * Move window-manager's collector to some place.\n */\n bindCollector(container: HTMLElement) {\n this._assertNotDestroyed();\n this.manager.bindCollectorContainer(container);\n }\n\n /**\n * Is current room writable?\n */\n readonly writable = writable(\n this.room.isWritable,\n set => {\n set(this.room.isWritable);\n return this._addRoomListener(\"onEnableWriteNowChanged\", () => set(this.room.isWritable));\n },\n this.room.setWritable.bind(this.room)\n );\n\n /**\n * Is current room online?\n */\n readonly phase = readable<RoomPhase>(this.room.phase, set => {\n set(this.room.phase);\n return this._addRoomListener(\"onPhaseChanged\", set);\n });\n\n /**\n * Current window-manager's windows' state (is it maximized?).\n */\n readonly boxState = readable(this.manager.boxState, set => {\n set(this.manager.boxState);\n return this._addManagerListener(\"boxStateChange\", set);\n });\n\n /**\n * Current window-manager's focused app's id.\n * @example \"HelloWorld-1A2b3C4d\"\n */\n readonly focusedApp = readable(this.manager.focused, set => {\n set(this.manager.focused);\n return this._addManagerListener(\"focusedChange\", set);\n });\n\n /**\n * How many times can I call `app.redo()`?\n */\n readonly canRedoSteps = readable(this.manager.canRedoSteps, set => {\n set(this.manager.canRedoSteps);\n return this._addManagerListener(\"canRedoStepsChange\", set);\n });\n\n /**\n * How many times can I call `app.undo()`?\n */\n readonly canUndoSteps = readable(this.manager.canUndoSteps, set => {\n set(this.manager.canUndoSteps);\n return this._addManagerListener(\"canUndoStepsChange\", set);\n });\n\n /**\n * Current camera information of main view.\n *\n * Change the camera position by `app.moveCamera()`.\n */\n readonly camera = readable(this.manager.camera, set => {\n set(this.manager.camera);\n return this._addMainViewListener(\"onCameraUpdated\", set);\n });\n\n /**\n * Current tool's info, like \"is using pencil?\", \"what color?\".\n *\n * Change the tool by `app.setAppliance()`.\n */\n readonly memberState = readable(this.room.state.memberState, set => {\n set(this.room.state.memberState);\n return this._addRoomListener(\"onRoomStateChanged\", ({ memberState: m }) => m && set(m));\n });\n\n /**\n * 0..n-1, current index of main view scenes.\n */\n readonly sceneIndex = writable(\n this.manager.mainViewSceneIndex,\n set => {\n set(this.manager.mainViewSceneIndex);\n return this._addManagerListener(\"mainViewSceneIndexChange\", set);\n },\n this.manager.setMainViewSceneIndex.bind(this.manager)\n );\n\n /**\n * How many pages are in the main view?\n */\n readonly sceneLength = readable(this.manager.mainViewScenesLength, set => {\n set(this.manager.mainViewScenesLength);\n return this._addManagerListener(\"mainViewScenesLengthChange\", set);\n });\n\n private _appsStatus: AppsStatus = {};\n /**\n * Apps status.\n */\n readonly appsStatus = readable<AppsStatus>({}, set =>\n this._addManagerListener(\"loadApp\", ({ kind, status, reason }) => {\n this._appsStatus[kind] = { status: transform_app_status(status), reason };\n set(this._appsStatus);\n })\n );\n\n /**\n * Undo a step on main view.\n */\n undo() {\n this._assertNotDestroyed();\n this.manager.undo();\n }\n\n /**\n * Redo a step on main view.\n */\n redo() {\n this._assertNotDestroyed();\n this.manager.redo();\n }\n\n /**\n * Move current main view's camera position.\n */\n moveCamera(camera: Partial<Camera> & { animationMode?: AnimationMode | undefined }) {\n this._assertNotDestroyed();\n this.manager.moveCamera(camera);\n }\n\n /**\n * Move current main view's camera to include a rectangle.\n */\n moveCameraToContain(rectangle: Rectangle & { animationMode?: AnimationMode }) {\n this._assertNotDestroyed();\n this.manager.moveCameraToContain(rectangle);\n }\n\n /**\n * Delete all things on the main view.\n */\n cleanCurrentScene() {\n this._assertNotDestroyed();\n this.manager.cleanCurrentScene();\n }\n\n /**\n * Set current tool, like \"pencil\".\n */\n setAppliance(appliance: ApplianceNames | Appliance, shape?: ShapeType | Shape) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({\n currentApplianceName: appliance as ApplianceNames,\n shapeType: shape as ShapeType,\n });\n }\n\n /**\n * Set pencil and shape's thickness.\n */\n setStrokeWidth(strokeWidth: number) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ strokeWidth });\n }\n\n /**\n * Set pencil and shape's color.\n */\n setStrokeColor(strokeColor: Color) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ strokeColor });\n }\n\n /**\n * Set text size. Default is 16.\n */\n setTextSize(textSize: number) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ textSize });\n }\n\n /**\n * Set text color.\n *\n * @example\n * setTextColor([0x66, 0xcc, 0xff])\n */\n setTextColor(textColor: Color) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ textColor });\n }\n\n /**\n * Goto previous page (the main whiteboard view).\n */\n prevPage() {\n this._assertNotDestroyed();\n return this.manager.prevPage();\n }\n\n /**\n * Goto next page (the main whiteboard view).\n */\n nextPage() {\n this._assertNotDestroyed();\n return this.manager.nextPage();\n }\n\n /**\n * Add one page to the main whiteboard view.\n *\n * @example\n * addPage({ after: true }) // add one page right after current one.\n * nextPage() // then, goto that page.\n */\n addPage(params?: AddPageParams) {\n this._assertNotDestroyed();\n return this.manager.addPage(params);\n }\n\n /**\n * Remove one page at given index or current page (by default).\n *\n * Requires `@netless/window-manager` >= 0.4.30.\n *\n * @example\n * removePage() // remove current page\n */\n removePage(index?: number) {\n this._assertNotDestroyed();\n return this.manager.removePage(index);\n }\n\n /**\n * Insert an image to the main view.\n *\n * @example\n * insertImage(\"https://i.imgur.com/CzXTtJV.jpg\")\n */\n async insertImage(url: string) {\n this._assertNotDestroyed();\n await this.manager.switchMainViewToWriter();\n\n const { divElement } = this.manager.mainView;\n const containerSize = {\n width: divElement?.scrollWidth || window.innerWidth,\n height: divElement?.scrollHeight || window.innerHeight,\n };\n\n // 1. shrink the image a little to fit container **width**\n const maxWidth = containerSize.width * 0.8;\n let { width, height } = await getImageSize(url, containerSize);\n const scale = Math.min(maxWidth / width, 1);\n const uuid = genUID();\n const { centerX, centerY } = this.manager.camera;\n width *= scale;\n height *= scale;\n this.manager.mainView.insertImage({ uuid, centerX, centerY, width, height, locked: false });\n this.manager.mainView.completeImageUpload(uuid, url);\n\n // 2. move camera to fit image **height**\n width /= 0.8;\n height /= 0.8;\n const originX = centerX - width / 2;\n const originY = centerY - height / 2;\n this.manager.moveCameraToContain({ originX, originY, width, height });\n }\n\n /**\n * Insert PDF/PPTX from conversion result.\n * @param status https://developer.netless.link/server-en/home/server-conversion#get-query-task-conversion-progress\n */\n insertDocs(filename: string, status: ConversionResponse): Promise<string | undefined>;\n\n /**\n * Manual way.\n * @example\n * app.insertDocs({\n * fileType: 'pptx',\n * scenePath: `/pptx/${conversion.taskId}`,\n * taskId: conversion.taskId,\n * title: 'Title',\n * })\n */\n insertDocs(params: InsertDocsParams): Promise<string | undefined>;\n\n insertDocs(arg1: string | InsertDocsParams, arg2?: ConversionResponse) {\n this._assertNotDestroyed();\n if (typeof arg1 === \"object\" && \"fileType\" in arg1) {\n return this._insertDocsImpl(arg1);\n } else if (arg2 && arg2.status !== \"Finished\") {\n throw new Error(\"FastboardApp cannot insert a converting doc.\");\n } else if (arg2 && arg2.progress) {\n const title = arg1;\n const scenePath = `/${arg2.uuid}/${genUID()}`;\n const scenes1 = arg2.progress.convertedFileList.map(convertedFileToScene);\n const { scenes, taskId, url } = makeSlideParams(scenes1);\n if (taskId && url) {\n return this._insertDocsImpl({ fileType: \"pptx\", scenePath, scenes, title, taskId, url });\n } else {\n return this._insertDocsImpl({ fileType: \"pdf\", scenePath, scenes: scenes1, title });\n }\n }\n }\n\n private _insertDocsImpl({ fileType, scenePath, title, scenes, ...attributes }: InsertDocsParams) {\n this._assertNotDestroyed();\n switch (fileType) {\n case \"pdf\":\n return this.manager.addApp({\n kind: \"DocsViewer\",\n options: { scenePath, title, scenes },\n });\n case \"pptx\":\n if (scenes && scenes[0].ppt) {\n warn(\"no-ppt-in-scenes\");\n }\n return this.manager.addApp({\n kind: \"Slide\",\n options: { scenePath, title, scenes },\n attributes,\n });\n }\n }\n\n /**\n * Insert the Media Player app.\n */\n insertMedia(title: string, src: string) {\n this._assertNotDestroyed();\n return this.manager.addApp({\n kind: BuiltinApps.MediaPlayer,\n options: { title },\n attributes: { src },\n });\n }\n\n /**\n * Insert the Monaco Code Editor app.\n * @deprecated Use `app.manager.addApp({ kind: 'Monaco' })` instead.\n */\n insertCodeEditor() {\n this._assertNotDestroyed();\n return this.manager.addApp({\n kind: \"Monaco\",\n options: { title: \"Code Editor\" },\n });\n }\n\n /**\n * Insert the Countdown app.\n * @deprecated Use `app.manager.addApp({ kind: 'Countdown' })` instead.\n */\n insertCountdown() {\n this._assertNotDestroyed();\n return this.manager.addApp({\n kind: \"Countdown\",\n options: { title: \"Countdown\" },\n });\n }\n\n /**\n * Insert the GeoGebra app.\n * @deprecated Use `app.manager.addApp({ kind: 'GeoGebra' })` instead.\n */\n insertGeoGebra() {\n this._assertNotDestroyed();\n return this.manager.addApp({\n kind: \"GeoGebra\",\n options: { title: \"GeoGebra\" },\n });\n }\n}\n\nexport interface FastboardOptions {\n sdkConfig: Omit<WhiteWebSdkConfiguration, \"useMobXState\"> & {\n region: NonNullable<WhiteWebSdkConfiguration[\"region\"]>;\n };\n joinRoom: Omit<JoinRoomParams, \"useMultiViews\" | \"disableNewPencil\" | \"disableMagixEventDispatchLimit\"> & {\n callbacks?: Partial<RoomCallbacks>;\n };\n managerConfig?: Omit<MountParams, \"room\">;\n}\n\n/**\n * Create a FastboardApp instance.\n * @example\n * let app = await createFastboard({\n * sdkConfig: {\n * appIdentifier: import.meta.env.VITE_APPID,\n * region: 'cn-hz',\n * },\n * joinRoom: {\n * uid: unique_id,\n * uuid: import.meta.env.VITE_ROOM_UUID,\n * roomToken: import.meta.env.VITE_ROOM_TOKEN,\n * },\n * })\n */\nexport async function createFastboard({\n sdkConfig,\n joinRoom: { callbacks, ...joinRoomParams },\n managerConfig,\n}: FastboardOptions) {\n const sdk = new WhiteWebSdk({\n ...sdkConfig,\n useMobXState: true,\n });\n\n const hotKeys: Partial<HotKeys> = {\n ...DefaultHotKeys,\n changeToSelector: \"s\",\n changeToLaserPointer: \"z\",\n changeToPencil: \"p\",\n changeToRectangle: \"r\",\n changeToEllipse: \"c\",\n changeToEraser: \"e\",\n changeToText: \"t\",\n changeToStraight: \"l\",\n changeToArrow: \"a\",\n changeToHand: \"h\",\n };\n\n const room = await sdk.joinRoom(\n {\n floatBar: true,\n hotKeys,\n ...ensure_window_manager(joinRoomParams),\n useMultiViews: true,\n disableNewPencil: false,\n disableMagixEventDispatchLimit: true,\n },\n callbacks\n );\n\n const manager = await WindowManager.mount({\n cursor: true,\n ...managerConfig,\n room,\n });\n\n manager.mainView.setCameraBound({\n minContentMode: contentModeScale(0.3),\n maxContentMode: contentModeScale(3),\n });\n\n return new FastboardApp(sdk, room, manager, hotKeys);\n}\n","import type { JoinRoomParams, ReplayRoomParams } from \"white-web-sdk\";\nimport type { PublicEvent } from \"@netless/window-manager\";\nimport { WindowManager } from \"@netless/window-manager\";\n\nexport function ensure_window_manager<T extends JoinRoomParams | ReplayRoomParams>(joinRoom: T): T {\n if (!joinRoom.invisiblePlugins || !joinRoom.invisiblePlugins.includes(WindowManager)) {\n joinRoom.invisiblePlugins = [...(joinRoom.invisiblePlugins || []), WindowManager];\n }\n return joinRoom;\n}\n\nexport function transform_app_status(status: PublicEvent[\"loadApp\"][\"status\"]) {\n return status === \"start\" ? \"loading\" : status === \"failed\" ? \"failed\" : \"idle\";\n}\n","import type { MountParams, PublicEvent } from \"@netless/window-manager\";\nimport type {\n Player,\n PlayerPhase as PlayerPhaseEnum,\n PlayerCallbacks,\n PlayerState,\n PlayerSeekingResult,\n ReplayRoomParams,\n ViewCallbacks,\n WhiteWebSdkConfiguration,\n} from \"white-web-sdk\";\n\nimport { WhiteWebSdk } from \"white-web-sdk\";\nimport { WindowManager } from \"@netless/window-manager\";\nimport { readable, writable } from \"../utils\";\nimport { ensure_window_manager } from \"../internal\";\n\nclass FastboardPlayerBase {\n public constructor(readonly sdk: WhiteWebSdk, readonly player: Player, readonly manager: WindowManager) {}\n\n protected _destroyed = false;\n protected _assertNotDestroyed() {\n if (this._destroyed) {\n throw new Error(\"FastboardApp has been destroyed\");\n }\n }\n\n protected _addPlayerListener<K extends keyof PlayerCallbacks>(name: K, listener: PlayerCallbacks[K]) {\n this._assertNotDestroyed();\n this.player.callbacks.on(name, listener);\n return () => this.player.callbacks.off(name, listener);\n }\n\n protected _addManagerListener<K extends keyof PublicEvent>(\n name: K,\n listener: (value: PublicEvent[K]) => void\n ) {\n this._assertNotDestroyed();\n this.manager.emitter.on(name, listener);\n return () => this.manager.emitter.off(name, listener);\n }\n\n protected _addMainViewListener<K extends keyof ViewCallbacks>(name: K, listener: ViewCallbacks[K]) {\n this._assertNotDestroyed();\n this.manager.mainView.callbacks.on(name, listener);\n return () => this.manager.mainView.callbacks.off(name, listener);\n }\n\n public destroy() {\n this._destroyed = true;\n this.manager.destroy();\n return this.player.callbacks.off();\n }\n}\n\ntype PlayerPhase = `${PlayerPhaseEnum}`;\n\nexport type { PlayerPhase, PlayerSeekingResult };\n\nexport class FastboardPlayer extends FastboardPlayerBase {\n /**\n * Render this player to some DOM.\n */\n bindContainer(container: HTMLElement) {\n this._assertNotDestroyed();\n this.manager.bindContainer(container);\n }\n\n /**\n * Move window-manager's collector to some place.\n */\n bindCollector(container: HTMLElement) {\n this._assertNotDestroyed();\n this.manager.bindCollectorContainer(container);\n }\n\n /**\n * Player current time in milliseconds.\n */\n readonly currentTime = writable(\n this.player.progressTime,\n set => {\n set(this.player.progressTime);\n return this._addPlayerListener(\"onProgressTimeChanged\", set);\n },\n this.player.seekToProgressTime.bind(this.player)\n );\n\n /**\n * Player state, like \"is it playing?\".\n */\n readonly phase = readable<PlayerPhase>(this.player.phase, set => {\n set(this.player.phase);\n return this._addPlayerListener(\"onPhaseChanged\", set);\n });\n\n /**\n * Will become true after buffering.\n */\n readonly canplay = readable(this.player.isPlayable, set => {\n set(this.player.isPlayable);\n return this._addPlayerListener(\"onIsPlayableChanged\", set);\n });\n\n private _setPlaybackRate!: (value: number) => void;\n /**\n * Playback speed, default `1`.\n */\n readonly playbackRate = writable(\n this.player.playbackSpeed,\n set => {\n this._setPlaybackRate = set;\n set(this.player.playbackSpeed);\n },\n value => {\n this.player.playbackSpeed = value;\n this._setPlaybackRate(value);\n }\n );\n\n /**\n * Playback duration in milliseconds.\n */\n readonly duration = readable(this.player.timeDuration, set => {\n set(this.player.timeDuration);\n });\n\n /**\n * Get state of room at that time, like \"who was in the room?\".\n */\n readonly state = readable<PlayerState>(this.player.state, set => {\n set(this.player.state);\n return this._addPlayerListener(\"onPlayerStateChanged\", () => set(this.player.state));\n });\n\n /**\n * Seek to some time in milliseconds.\n */\n seek(timestamp: number) {\n this._assertNotDestroyed();\n return this.player.seekToProgressTime(timestamp);\n }\n\n /**\n * Change player state to playing.\n */\n play() {\n this._assertNotDestroyed();\n this.player.play();\n }\n\n /**\n * Change player state to paused.\n */\n pause() {\n this._assertNotDestroyed();\n this.player.pause();\n }\n\n /**\n * Change player state to stopped.\n */\n stop() {\n this._assertNotDestroyed();\n this.player.stop();\n }\n\n /**\n * Set playback speed, a shortcut for `speed.set(x)`.\n */\n setPlaybackRate(value: number) {\n this._assertNotDestroyed();\n this.playbackRate.set(value);\n }\n}\n\nexport interface FastboardReplayOptions {\n sdkConfig: Omit<WhiteWebSdkConfiguration, \"useMobXState\"> & {\n region: NonNullable<WhiteWebSdkConfiguration[\"region\"]>;\n };\n replayRoom: Omit<ReplayRoomParams, \"useMultiViews\"> & {\n callbacks?: Partial<PlayerCallbacks>;\n };\n managerConfig?: Omit<MountParams, \"room\">;\n}\n\n/**\n * Create a FastboardPlayer instance.\n * @example\n * let player = await replayFastboard({\n * sdkConfig: {\n * appIdentifier: import.meta.env.VITE_APPID,\n * region: 'cn-hz',\n * },\n * replayRoom: {\n * room: \"room uuid\",\n * roomToken: \"NETLESSROOM_...\",\n * beginTimestamp: 1646619090394,\n * duration: 70448,\n * },\n * })\n */\nexport async function replayFastboard({\n sdkConfig,\n replayRoom: { callbacks, ...replayRoomParams },\n managerConfig,\n}: FastboardReplayOptions) {\n const sdk = new WhiteWebSdk({\n ...sdkConfig,\n useMobXState: true,\n });\n\n const player = await sdk.replayRoom(\n {\n ...ensure_window_manager(replayRoomParams),\n useMultiViews: true,\n },\n callbacks\n );\n\n const managerPromise = WindowManager.mount({\n cursor: true,\n ...managerConfig,\n room: player,\n });\n\n player.play();\n const manager = await managerPromise;\n player.pause();\n await player.seekToProgressTime(0);\n\n return new FastboardPlayer(sdk, player, manager);\n}\n","import type { RegisterParams } from \"@netless/window-manager\";\nimport { WindowManager } from \"@netless/window-manager\";\nimport SlideApp, { apps, addHooks, previewSlide } from \"@netless/app-slide\";\n\nexport type {\n AppOptions as SlideOptions,\n Controller as SlideController,\n PreviewParams,\n SlidePreviewer,\n} from \"@netless/app-slide\";\nexport { previewSlide, SlideApp, addHooks as addSlideHooks, apps as slideApps };\n\nexport interface AppsConfig {\n [kind: string]: Omit<RegisterParams, \"kind\">;\n}\n\nconst DefaultApps: AppsConfig = {\n Monaco: {\n src: \"https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-monaco/0.1.12/dist/main.iife.js\",\n },\n Countdown: {\n src: \"https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-countdown/0.0.2/dist/main.iife.js\",\n },\n GeoGebra: {\n src: \"https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-geogebra/0.0.4/dist/main.iife.js\",\n appOptions: {\n HTML5Codebase: \"https://flat-storage-cn-hz.whiteboard.agora.io/GeoGebra/HTML5/5.0/web3d\",\n },\n },\n EmbeddedPage: {\n src: \"https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-embedded-page/0.1.1/dist/main.iife.js\",\n },\n Plyr: {\n src: \"https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-plyr/0.1.3/dist/main.iife.js\",\n },\n};\n\nWindowManager.register({\n kind: \"Slide\",\n appOptions: { debug: false },\n src: SlideApp,\n addHooks,\n});\n\nfor (const kind in DefaultApps) {\n if (Object.prototype.hasOwnProperty.call(DefaultApps, kind)) {\n const options = DefaultApps[kind];\n WindowManager.register({ kind, ...options });\n }\n}\n\nexport const register = WindowManager.register.bind(WindowManager);\n\ndeclare let __NAME__: string, __VERSION__: string;\n\nexport const version = __VERSION__;\n\nif (typeof window !== \"undefined\") {\n let str = (window as { __netlessUA?: string }).__netlessUA || \"\";\n str += ` ${__NAME__}@${version} `;\n (window as { __netlessUA?: string }).__netlessUA = str;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/utils/store.ts","../src/utils/misc.ts","../src/utils/uid.ts","../src/utils/warn.ts","../src/impl/FastboardApp.ts","../src/internal.ts","../src/behaviors/index.ts","../src/impl/FastboardPlayer.ts"],"names":[],"mappings":"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","sourcesContent":["export * from \"./utils\";\nexport * from \"./impl\";\nexport * from \"./behaviors\";\n","// This is a simple mimic of svelte/store.\nexport type Subscriber<T> = (value: T) => void;\nexport type Unsubscriber = () => void;\nexport type Updater<T> = (value: T) => T;\nexport type StartStopNotifier<T> = (set: Subscriber<T>) => Unsubscriber | void;\n\nexport interface Readable<T> {\n readonly value: T;\n subscribe(this: void, run: Subscriber<T>): Unsubscriber;\n reaction(this: void, run: Subscriber<T>): Unsubscriber;\n}\n\nexport interface Writable<T> extends Readable<T> {\n set(this: void, value: T): void;\n update(this: void, updater: Updater<T>): void;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nfunction noop() {}\n\nfunction safe_not_equal(a: unknown, b: unknown) {\n return a != a ? b == b : a !== b || (a && typeof a === \"object\") || typeof a === \"function\";\n}\n\nexport function readable<T>(value: T, start: StartStopNotifier<T> = noop): Readable<T> {\n let stop: Unsubscriber | undefined;\n const subscribers = new Set<Subscriber<T>>();\n function set(new_value: T) {\n if (safe_not_equal(value, new_value)) {\n value = new_value;\n if (stop) {\n for (const run of subscribers) {\n run(value);\n }\n }\n }\n }\n function subscribe(run: Subscriber<T>) {\n subscribers.add(run);\n if (subscribers.size === 1) {\n stop = start(set) || noop;\n }\n run(value);\n return () => {\n subscribers.delete(run);\n if (subscribers.size === 0) {\n stop && stop();\n stop = undefined;\n }\n };\n }\n function reaction(run: Subscriber<T>) {\n subscribers.add(run);\n if (subscribers.size === 1) {\n stop = start(set) || noop;\n }\n return () => {\n subscribers.delete(run);\n if (subscribers.size === 0) {\n stop && stop();\n stop = undefined;\n }\n };\n }\n return {\n get value() {\n return value;\n },\n subscribe,\n reaction,\n };\n}\n\nexport function writable<T>(value: T, start: StartStopNotifier<T> = noop, set: Subscriber<T>): Writable<T> {\n const internal = readable(value, start);\n return {\n get value() {\n return internal.value;\n },\n subscribe: internal.subscribe,\n reaction: internal.reaction,\n set,\n update(fn: Updater<T>) {\n set(fn(value));\n },\n };\n}\n","import type { ConvertedFile, SceneDefinition, Size } from \"white-web-sdk\";\n\nexport function getImageSize(url: string, fallback: Size) {\n return new Promise<Size>(resolve => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = () => resolve(fallback);\n img.src = url;\n });\n}\n\nexport function makeSlideParams(scenes: SceneDefinition[]) {\n const emptyScenes: SceneDefinition[] = [];\n let taskId = \"\";\n let url = \"\";\n\n // e.g. \"ppt(x)://cdn/prefix/dynamicConvert/{taskId}/1.slide\"\n const pptSrcRE = /^pptx?(?<prefix>:\\/\\/\\S+?dynamicConvert)\\/(?<taskId>\\w+)\\//;\n\n for (const { name, ppt } of scenes) {\n // make sure scenesWithoutPPT.length === scenes.length\n emptyScenes.push({ name });\n\n if (!ppt || !ppt.src.startsWith(\"ppt\")) {\n continue;\n }\n const match = pptSrcRE.exec(ppt.src);\n if (!match || !match.groups) {\n continue;\n }\n taskId = match.groups.taskId;\n url = \"https\" + match.groups.prefix;\n break;\n }\n\n return { scenes: emptyScenes, taskId, url };\n}\n\nexport function convertedFileToScene(f: ConvertedFile, i: number): SceneDefinition {\n return {\n name: String(i + 1),\n ppt: {\n src: f.conversionFileUrl,\n width: f.width,\n height: f.height,\n previewURL: f.preview,\n },\n };\n}\n","// Copy from https://github.com/crimx/side-effect-manager/blob/main/src/gen-uid.ts\nconst SOUP = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\nconst SOUP_LEN = 62; // SOUP.length\nconst ID_LEN = 20;\nconst reusedIdCarrier = /* @__PURE__ */ Array(ID_LEN);\n\nexport function genUID() {\n for (let i = 0; i < ID_LEN; i++) {\n reusedIdCarrier[i] = SOUP.charAt(Math.random() * SOUP_LEN);\n }\n return reusedIdCarrier.join(\"\");\n}\n","const warnings = {\n \"no-ppt-in-scenes\":\n \"You're probably inserting the slide app in a wrong way, there shouldn't exist `scenes[0].ppt`.\",\n} as const;\nconst warned = new Set<string>();\n\nexport function warn(id: keyof typeof warnings) {\n if (warned.has(id)) return;\n warned.add(id);\n console.warn(warnings[id]);\n}\n","import type { AddPageParams, PublicEvent, MountParams, NetlessApp } from \"@netless/window-manager\";\nimport type {\n AnimationMode,\n ApplianceNames,\n Camera,\n Color,\n ConversionResponse,\n HotKey,\n HotKeys,\n JoinRoomParams,\n MemberState,\n Rectangle,\n Room,\n RoomPhase as RoomPhaseEnum,\n RoomCallbacks,\n RoomState,\n SceneDefinition,\n ShapeType,\n ViewCallbacks,\n WhiteWebSdkConfiguration,\n} from \"white-web-sdk\";\n\nimport { DefaultHotKeys, WhiteWebSdk, contentModeScale } from \"white-web-sdk\";\nimport { BuiltinApps, WindowManager } from \"@netless/window-manager\";\nimport {\n getImageSize,\n genUID,\n convertedFileToScene,\n makeSlideParams,\n readable,\n writable,\n warn,\n} from \"../utils\";\nimport { ensure_window_manager, transform_app_status } from \"../internal\";\nimport { register } from \"../behaviors\";\n\nclass FastboardAppBase {\n public constructor(\n readonly sdk: WhiteWebSdk,\n readonly room: Room,\n readonly manager: WindowManager,\n readonly hotKeys: Partial<HotKeys>\n ) {}\n\n protected _destroyed = false;\n protected _assertNotDestroyed() {\n if (this._destroyed) {\n throw new Error(\"FastboardApp has been destroyed\");\n }\n }\n\n protected _addRoomListener<K extends keyof RoomCallbacks>(name: K, listener: RoomCallbacks[K]) {\n this._assertNotDestroyed();\n this.room.callbacks.on(name, listener);\n return () => this.room.callbacks.off(name, listener);\n }\n\n protected _addManagerListener<K extends keyof PublicEvent>(\n name: K,\n listener: (value: PublicEvent[K]) => void\n ) {\n this._assertNotDestroyed();\n this.manager.emitter.on(name, listener);\n return () => this.manager.emitter.off(name, listener);\n }\n\n protected _addMainViewListener<K extends keyof ViewCallbacks>(name: K, listener: ViewCallbacks[K]) {\n this._assertNotDestroyed();\n this.manager.mainView.callbacks.on(name, listener);\n return () => this.manager.mainView.callbacks.off(name, listener);\n }\n\n /**\n * Destroy fastboard (disconnect from the whiteboard room).\n */\n public destroy() {\n this._destroyed = true;\n this.manager.destroy();\n return this.room.disconnect();\n }\n}\n\ntype RoomPhase = `${RoomPhaseEnum}`;\n\nexport type {\n AddPageParams,\n AnimationMode,\n ApplianceNames,\n Camera,\n Color,\n ConversionResponse,\n HotKey,\n HotKeys,\n JoinRoomParams,\n MemberState,\n MountParams,\n NetlessApp,\n PublicEvent,\n Rectangle,\n Room,\n RoomPhase,\n RoomCallbacks,\n RoomState,\n SceneDefinition,\n ShapeType,\n ViewCallbacks,\n WhiteWebSdk,\n WhiteWebSdkConfiguration,\n WindowManager,\n};\n\n/** pencil, eraser, rectangle... */\nexport type Appliance = `${ApplianceNames}`;\n/** triangle, star... */\nexport type Shape = `${ShapeType}`;\n\n/** Params for static docs, they are rendered as many images. */\nexport interface InsertDocsStatic {\n readonly fileType: \"pdf\";\n /** Unique string for binding whiteboard view to the doc. Must start with `/`. */\n readonly scenePath: string;\n /** @example [{ name: '1', ppt: { src: 'url/to/ppt/1.png' } }] */\n readonly scenes: SceneDefinition[];\n /** Window title. */\n readonly title?: string;\n}\n\n/** Params for slides, they are rendered in @netless/app-slide with animations. */\nexport interface InsertDocsDynamic {\n readonly fileType: \"pptx\";\n /** Unique string for binding whiteboard view to the doc. Must start with `/`. */\n readonly scenePath: string;\n /** Conversion task id, see https://developer.netless.link/server-en/home/server-conversion#get-query-task-conversion-progress. */\n readonly taskId: string;\n /** Window title. */\n readonly title?: string;\n /** Where the slide resource placed. @default `https://convertcdn.netless.link/dynamicConvert` */\n readonly url?: string;\n /** @example [{ name: '1' }, { name: '2' }, { name: '3' }] */\n readonly scenes?: SceneDefinition[];\n}\n\nexport type InsertDocsParams = InsertDocsStatic | InsertDocsDynamic;\n\nexport type SetMemberStateFn = (partialMemberState: Partial<MemberState>) => void;\n\nexport type RoomStateChanged = (diff: Partial<RoomState>) => void;\n\n/** App download progress. */\nexport interface AppsStatus {\n [kind: string]: {\n status: \"idle\" | \"loading\" | \"failed\";\n /** Exist if status is `failed`. */\n reason?: string;\n };\n}\n\nexport class FastboardApp extends FastboardAppBase {\n /**\n * Render this app to some DOM.\n */\n bindContainer(container: HTMLElement) {\n this._assertNotDestroyed();\n this.manager.bindContainer(container);\n }\n\n /**\n * Move window-manager's collector to some place.\n */\n bindCollector(container: HTMLElement) {\n this._assertNotDestroyed();\n this.manager.bindCollectorContainer(container);\n }\n\n /**\n * Is current room writable?\n */\n readonly writable = writable(\n this.room.isWritable,\n set => {\n set(this.room.isWritable);\n return this._addRoomListener(\"onEnableWriteNowChanged\", () => set(this.room.isWritable));\n },\n this.room.setWritable.bind(this.room)\n );\n\n /**\n * Is current room online?\n */\n readonly phase = readable<RoomPhase>(this.room.phase, set => {\n set(this.room.phase);\n return this._addRoomListener(\"onPhaseChanged\", set);\n });\n\n /**\n * Current window-manager's windows' state (is it maximized?).\n */\n readonly boxState = readable(this.manager.boxState, set => {\n set(this.manager.boxState);\n return this._addManagerListener(\"boxStateChange\", set);\n });\n\n /**\n * Current window-manager's focused app's id.\n * @example \"HelloWorld-1A2b3C4d\"\n */\n readonly focusedApp = readable(this.manager.focused, set => {\n set(this.manager.focused);\n return this._addManagerListener(\"focusedChange\", set);\n });\n\n /**\n * How many times can I call `app.redo()`?\n */\n readonly canRedoSteps = readable(this.manager.canRedoSteps, set => {\n set(this.manager.canRedoSteps);\n return this._addManagerListener(\"canRedoStepsChange\", set);\n });\n\n /**\n * How many times can I call `app.undo()`?\n */\n readonly canUndoSteps = readable(this.manager.canUndoSteps, set => {\n set(this.manager.canUndoSteps);\n return this._addManagerListener(\"canUndoStepsChange\", set);\n });\n\n /**\n * Current camera information of main view.\n *\n * Change the camera position by `app.moveCamera()`.\n */\n readonly camera = readable(this.manager.camera, set => {\n set(this.manager.camera);\n return this._addMainViewListener(\"onCameraUpdated\", set);\n });\n\n /**\n * Current tool's info, like \"is using pencil?\", \"what color?\".\n *\n * Change the tool by `app.setAppliance()`.\n */\n readonly memberState = readable(this.room.state.memberState, set => {\n set(this.room.state.memberState);\n return this._addRoomListener(\"onRoomStateChanged\", ({ memberState: m }) => m && set(m));\n });\n\n /**\n * 0..n-1, current index of main view scenes.\n */\n readonly sceneIndex = writable(\n this.manager.mainViewSceneIndex,\n set => {\n set(this.manager.mainViewSceneIndex);\n return this._addManagerListener(\"mainViewSceneIndexChange\", set);\n },\n this.manager.setMainViewSceneIndex.bind(this.manager)\n );\n\n /**\n * How many pages are in the main view?\n */\n readonly sceneLength = readable(this.manager.mainViewScenesLength, set => {\n set(this.manager.mainViewScenesLength);\n return this._addManagerListener(\"mainViewScenesLengthChange\", set);\n });\n\n private _appsStatus: AppsStatus = {};\n /**\n * Apps status.\n */\n readonly appsStatus = readable<AppsStatus>({}, set =>\n this._addManagerListener(\"loadApp\", ({ kind, status, reason }) => {\n this._appsStatus[kind] = { status: transform_app_status(status), reason };\n set(this._appsStatus);\n })\n );\n\n /**\n * Undo a step on main view.\n */\n undo() {\n this._assertNotDestroyed();\n this.manager.undo();\n }\n\n /**\n * Redo a step on main view.\n */\n redo() {\n this._assertNotDestroyed();\n this.manager.redo();\n }\n\n /**\n * Move current main view's camera position.\n */\n moveCamera(camera: Partial<Camera> & { animationMode?: AnimationMode | undefined }) {\n this._assertNotDestroyed();\n this.manager.moveCamera(camera);\n }\n\n /**\n * Move current main view's camera to include a rectangle.\n */\n moveCameraToContain(rectangle: Rectangle & { animationMode?: AnimationMode }) {\n this._assertNotDestroyed();\n this.manager.moveCameraToContain(rectangle);\n }\n\n /**\n * Delete all things on the main view.\n */\n cleanCurrentScene() {\n this._assertNotDestroyed();\n this.manager.cleanCurrentScene();\n }\n\n /**\n * Set current tool, like \"pencil\".\n */\n setAppliance(appliance: ApplianceNames | Appliance, shape?: ShapeType | Shape) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({\n currentApplianceName: appliance as ApplianceNames,\n shapeType: shape as ShapeType,\n });\n }\n\n /**\n * Set pencil and shape's thickness.\n */\n setStrokeWidth(strokeWidth: number) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ strokeWidth });\n }\n\n /**\n * Set pencil and shape's color.\n */\n setStrokeColor(strokeColor: Color) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ strokeColor });\n }\n\n /**\n * Set text size. Default is 16.\n */\n setTextSize(textSize: number) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ textSize });\n }\n\n /**\n * Set text color.\n *\n * @example\n * setTextColor([0x66, 0xcc, 0xff])\n */\n setTextColor(textColor: Color) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ textColor });\n }\n\n /**\n * Goto previous page (the main whiteboard view).\n */\n prevPage() {\n this._assertNotDestroyed();\n return this.manager.prevPage();\n }\n\n /**\n * Goto next page (the main whiteboard view).\n */\n nextPage() {\n this._assertNotDestroyed();\n return this.manager.nextPage();\n }\n\n /**\n * Add one page to the main whiteboard view.\n *\n * @example\n * addPage({ after: true }) // add one page right after current one.\n * nextPage() // then, goto that page.\n */\n addPage(params?: AddPageParams) {\n this._assertNotDestroyed();\n return this.manager.addPage(params);\n }\n\n /**\n * Remove one page at given index or current page (by default).\n *\n * Requires `@netless/window-manager` >= 0.4.30.\n *\n * @example\n * removePage() // remove current page\n */\n removePage(index?: number) {\n this._assertNotDestroyed();\n return this.manager.removePage(index);\n }\n\n /**\n * Insert an image to the main view.\n *\n * @example\n * insertImage(\"https://i.imgur.com/CzXTtJV.jpg\")\n */\n async insertImage(url: string) {\n this._assertNotDestroyed();\n await this.manager.switchMainViewToWriter();\n\n const { divElement } = this.manager.mainView;\n const containerSize = {\n width: divElement?.scrollWidth || window.innerWidth,\n height: divElement?.scrollHeight || window.innerHeight,\n };\n\n // 1. shrink the image a little to fit container **width**\n const maxWidth = containerSize.width * 0.8;\n let { width, height } = await getImageSize(url, containerSize);\n const scale = Math.min(maxWidth / width, 1);\n const uuid = genUID();\n const { centerX, centerY } = this.manager.camera;\n width *= scale;\n height *= scale;\n this.manager.mainView.insertImage({ uuid, centerX, centerY, width, height, locked: false });\n this.manager.mainView.completeImageUpload(uuid, url);\n\n // 2. move camera to fit image **height**\n width /= 0.8;\n height /= 0.8;\n const originX = centerX - width / 2;\n const originY = centerY - height / 2;\n this.manager.moveCameraToContain({ originX, originY, width, height });\n }\n\n /**\n * Insert PDF/PPTX from conversion result.\n * @param status https://developer.netless.link/server-en/home/server-conversion#get-query-task-conversion-progress\n */\n insertDocs(filename: string, status: ConversionResponse): Promise<string | undefined>;\n\n /**\n * Manual way.\n * @example\n * app.insertDocs({\n * fileType: 'pptx',\n * scenePath: `/pptx/${conversion.taskId}`,\n * taskId: conversion.taskId,\n * title: 'Title',\n * })\n */\n insertDocs(params: InsertDocsParams): Promise<string | undefined>;\n\n insertDocs(arg1: string | InsertDocsParams, arg2?: ConversionResponse) {\n this._assertNotDestroyed();\n if (typeof arg1 === \"object\" && \"fileType\" in arg1) {\n return this._insertDocsImpl(arg1);\n } else if (arg2 && arg2.status !== \"Finished\") {\n throw new Error(\"FastboardApp cannot insert a converting doc.\");\n } else if (arg2 && arg2.progress) {\n const title = arg1;\n const scenePath = `/${arg2.uuid}/${genUID()}`;\n const scenes1 = arg2.progress.convertedFileList.map(convertedFileToScene);\n const { scenes, taskId, url } = makeSlideParams(scenes1);\n if (taskId && url) {\n return this._insertDocsImpl({ fileType: \"pptx\", scenePath, scenes, title, taskId, url });\n } else {\n return this._insertDocsImpl({ fileType: \"pdf\", scenePath, scenes: scenes1, title });\n }\n }\n }\n\n private _insertDocsImpl({ fileType, scenePath, title, scenes, ...attributes }: InsertDocsParams) {\n this._assertNotDestroyed();\n switch (fileType) {\n case \"pdf\":\n return this.manager.addApp({\n kind: \"DocsViewer\",\n options: { scenePath, title, scenes },\n });\n case \"pptx\":\n if (scenes && scenes[0].ppt) {\n warn(\"no-ppt-in-scenes\");\n }\n return this.manager.addApp({\n kind: \"Slide\",\n options: { scenePath, title, scenes },\n attributes,\n });\n }\n }\n\n /**\n * Insert the Media Player app.\n */\n insertMedia(title: string, src: string) {\n this._assertNotDestroyed();\n return this.manager.addApp({\n kind: BuiltinApps.MediaPlayer,\n options: { title },\n attributes: { src },\n });\n }\n\n /**\n * Insert the Monaco Code Editor app.\n * @deprecated Use `app.manager.addApp({ kind: 'Monaco' })` instead.\n */\n insertCodeEditor() {\n this._assertNotDestroyed();\n return this.manager.addApp({\n kind: \"Monaco\",\n options: { title: \"Code Editor\" },\n });\n }\n\n /**\n * Insert the Countdown app.\n * @deprecated Use `app.manager.addApp({ kind: 'Countdown' })` instead.\n */\n insertCountdown() {\n this._assertNotDestroyed();\n return this.manager.addApp({\n kind: \"Countdown\",\n options: { title: \"Countdown\" },\n });\n }\n\n /**\n * Insert the GeoGebra app.\n * @deprecated Use `app.manager.addApp({ kind: 'GeoGebra' })` instead.\n */\n insertGeoGebra() {\n this._assertNotDestroyed();\n return this.manager.addApp({\n kind: \"GeoGebra\",\n options: { title: \"GeoGebra\" },\n });\n }\n}\n\nexport interface FastboardOptions {\n sdkConfig: Omit<WhiteWebSdkConfiguration, \"useMobXState\"> & {\n region: NonNullable<WhiteWebSdkConfiguration[\"region\"]>;\n };\n joinRoom: Omit<JoinRoomParams, \"useMultiViews\" | \"disableNewPencil\" | \"disableMagixEventDispatchLimit\"> & {\n callbacks?: Partial<RoomCallbacks>;\n };\n managerConfig?: Omit<MountParams, \"room\">;\n netlessApps?: NetlessApp[];\n}\n\n/**\n * Create a FastboardApp instance.\n * @example\n * let app = await createFastboard({\n * sdkConfig: {\n * appIdentifier: import.meta.env.VITE_APPID,\n * region: 'cn-hz',\n * },\n * joinRoom: {\n * uid: unique_id,\n * uuid: import.meta.env.VITE_ROOM_UUID,\n * roomToken: import.meta.env.VITE_ROOM_TOKEN,\n * },\n * })\n */\nexport async function createFastboard({\n sdkConfig,\n joinRoom: { callbacks, ...joinRoomParams },\n managerConfig,\n netlessApps,\n}: FastboardOptions) {\n const sdk = new WhiteWebSdk({\n ...sdkConfig,\n useMobXState: true,\n });\n\n const hotKeys: 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 if (netlessApps) {\n netlessApps.forEach(app => {\n register({ kind: app.kind, src: app });\n });\n }\n\n const room = await sdk.joinRoom(\n {\n floatBar: true,\n hotKeys,\n ...ensure_window_manager(joinRoomParams),\n useMultiViews: true,\n disableNewPencil: false,\n disableMagixEventDispatchLimit: true,\n },\n callbacks\n );\n\n const manager = await WindowManager.mount({\n cursor: true,\n ...managerConfig,\n room,\n });\n\n manager.mainView.setCameraBound({\n minContentMode: contentModeScale(0.3),\n maxContentMode: contentModeScale(3),\n });\n\n return new FastboardApp(sdk, room, manager, hotKeys);\n}\n","import type { JoinRoomParams, ReplayRoomParams } from \"white-web-sdk\";\nimport type { PublicEvent } from \"@netless/window-manager\";\nimport { WindowManager } from \"@netless/window-manager\";\n\nexport function ensure_window_manager<T extends JoinRoomParams | ReplayRoomParams>(joinRoom: T): T {\n if (!joinRoom.invisiblePlugins || !joinRoom.invisiblePlugins.includes(WindowManager)) {\n joinRoom.invisiblePlugins = [...(joinRoom.invisiblePlugins || []), WindowManager];\n }\n return joinRoom;\n}\n\nexport function transform_app_status(status: PublicEvent[\"loadApp\"][\"status\"]) {\n return status === \"start\" ? \"loading\" : status === \"failed\" ? \"failed\" : \"idle\";\n}\n","import type { RegisterParams } from \"@netless/window-manager\";\nimport { WindowManager } from \"@netless/window-manager\";\nimport SlideApp, { apps, addHooks, previewSlide } from \"@netless/app-slide\";\n\nexport type {\n AppOptions as SlideOptions,\n Controller as SlideController,\n PreviewParams,\n SlidePreviewer,\n} from \"@netless/app-slide\";\nexport { previewSlide, SlideApp, addHooks as addSlideHooks, apps as slideApps };\n\nexport interface AppsConfig {\n [kind: string]: Omit<RegisterParams, \"kind\">;\n}\n\nconst DefaultApps: AppsConfig = {\n Monaco: {\n src: \"https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-monaco/0.1.12/dist/main.iife.js\",\n },\n Countdown: {\n src: \"https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-countdown/0.0.2/dist/main.iife.js\",\n },\n GeoGebra: {\n src: \"https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-geogebra/0.0.4/dist/main.iife.js\",\n appOptions: {\n HTML5Codebase: \"https://flat-storage-cn-hz.whiteboard.agora.io/GeoGebra/HTML5/5.0/web3d\",\n },\n },\n EmbeddedPage: {\n src: \"https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-embedded-page/0.1.1/dist/main.iife.js\",\n },\n Plyr: {\n src: \"https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-plyr/0.1.3/dist/main.iife.js\",\n },\n};\n\nWindowManager.register({\n kind: \"Slide\",\n appOptions: { debug: false },\n src: SlideApp,\n addHooks,\n});\n\nfor (const kind in DefaultApps) {\n if (Object.prototype.hasOwnProperty.call(DefaultApps, kind)) {\n const options = DefaultApps[kind];\n WindowManager.register({ kind, ...options });\n }\n}\n\nexport const register = WindowManager.register.bind(WindowManager);\n\ndeclare let __NAME__: string, __VERSION__: string;\n\nexport const version = __VERSION__;\n\nif (typeof window !== \"undefined\") {\n let str = (window as { __netlessUA?: string }).__netlessUA || \"\";\n str += ` ${__NAME__}@${version} `;\n (window as { __netlessUA?: string }).__netlessUA = str;\n}\n","import type { MountParams, PublicEvent } from \"@netless/window-manager\";\nimport type {\n Player,\n PlayerPhase as PlayerPhaseEnum,\n PlayerCallbacks,\n PlayerState,\n PlayerSeekingResult,\n ReplayRoomParams,\n ViewCallbacks,\n WhiteWebSdkConfiguration,\n} from \"white-web-sdk\";\n\nimport { WhiteWebSdk } from \"white-web-sdk\";\nimport { WindowManager } from \"@netless/window-manager\";\nimport { readable, writable } from \"../utils\";\nimport { ensure_window_manager } from \"../internal\";\n\nclass FastboardPlayerBase {\n public constructor(readonly sdk: WhiteWebSdk, readonly player: Player, readonly manager: WindowManager) {}\n\n protected _destroyed = false;\n protected _assertNotDestroyed() {\n if (this._destroyed) {\n throw new Error(\"FastboardApp has been destroyed\");\n }\n }\n\n protected _addPlayerListener<K extends keyof PlayerCallbacks>(name: K, listener: PlayerCallbacks[K]) {\n this._assertNotDestroyed();\n this.player.callbacks.on(name, listener);\n return () => this.player.callbacks.off(name, listener);\n }\n\n protected _addManagerListener<K extends keyof PublicEvent>(\n name: K,\n listener: (value: PublicEvent[K]) => void\n ) {\n this._assertNotDestroyed();\n this.manager.emitter.on(name, listener);\n return () => this.manager.emitter.off(name, listener);\n }\n\n protected _addMainViewListener<K extends keyof ViewCallbacks>(name: K, listener: ViewCallbacks[K]) {\n this._assertNotDestroyed();\n this.manager.mainView.callbacks.on(name, listener);\n return () => this.manager.mainView.callbacks.off(name, listener);\n }\n\n public destroy() {\n this._destroyed = true;\n this.manager.destroy();\n return this.player.callbacks.off();\n }\n}\n\ntype PlayerPhase = `${PlayerPhaseEnum}`;\n\nexport type { PlayerPhase, PlayerSeekingResult };\n\nexport class FastboardPlayer extends FastboardPlayerBase {\n /**\n * Render this player to some DOM.\n */\n bindContainer(container: HTMLElement) {\n this._assertNotDestroyed();\n this.manager.bindContainer(container);\n }\n\n /**\n * Move window-manager's collector to some place.\n */\n bindCollector(container: HTMLElement) {\n this._assertNotDestroyed();\n this.manager.bindCollectorContainer(container);\n }\n\n /**\n * Player current time in milliseconds.\n */\n readonly currentTime = writable(\n this.player.progressTime,\n set => {\n set(this.player.progressTime);\n return this._addPlayerListener(\"onProgressTimeChanged\", set);\n },\n this.player.seekToProgressTime.bind(this.player)\n );\n\n /**\n * Player state, like \"is it playing?\".\n */\n readonly phase = readable<PlayerPhase>(this.player.phase, set => {\n set(this.player.phase);\n return this._addPlayerListener(\"onPhaseChanged\", set);\n });\n\n /**\n * Will become true after buffering.\n */\n readonly canplay = readable(this.player.isPlayable, set => {\n set(this.player.isPlayable);\n return this._addPlayerListener(\"onIsPlayableChanged\", set);\n });\n\n private _setPlaybackRate!: (value: number) => void;\n /**\n * Playback speed, default `1`.\n */\n readonly playbackRate = writable(\n this.player.playbackSpeed,\n set => {\n this._setPlaybackRate = set;\n set(this.player.playbackSpeed);\n },\n value => {\n this.player.playbackSpeed = value;\n this._setPlaybackRate(value);\n }\n );\n\n /**\n * Playback duration in milliseconds.\n */\n readonly duration = readable(this.player.timeDuration, set => {\n set(this.player.timeDuration);\n });\n\n /**\n * Get state of room at that time, like \"who was in the room?\".\n */\n readonly state = readable<PlayerState>(this.player.state, set => {\n set(this.player.state);\n return this._addPlayerListener(\"onPlayerStateChanged\", () => set(this.player.state));\n });\n\n /**\n * Seek to some time in milliseconds.\n */\n seek(timestamp: number) {\n this._assertNotDestroyed();\n return this.player.seekToProgressTime(timestamp);\n }\n\n /**\n * Change player state to playing.\n */\n play() {\n this._assertNotDestroyed();\n this.player.play();\n }\n\n /**\n * Change player state to paused.\n */\n pause() {\n this._assertNotDestroyed();\n this.player.pause();\n }\n\n /**\n * Change player state to stopped.\n */\n stop() {\n this._assertNotDestroyed();\n this.player.stop();\n }\n\n /**\n * Set playback speed, a shortcut for `speed.set(x)`.\n */\n setPlaybackRate(value: number) {\n this._assertNotDestroyed();\n this.playbackRate.set(value);\n }\n}\n\nexport interface FastboardReplayOptions {\n sdkConfig: Omit<WhiteWebSdkConfiguration, \"useMobXState\"> & {\n region: NonNullable<WhiteWebSdkConfiguration[\"region\"]>;\n };\n replayRoom: Omit<ReplayRoomParams, \"useMultiViews\"> & {\n callbacks?: Partial<PlayerCallbacks>;\n };\n managerConfig?: Omit<MountParams, \"room\">;\n}\n\n/**\n * Create a FastboardPlayer instance.\n * @example\n * let player = await replayFastboard({\n * sdkConfig: {\n * appIdentifier: import.meta.env.VITE_APPID,\n * region: 'cn-hz',\n * },\n * replayRoom: {\n * room: \"room uuid\",\n * roomToken: \"NETLESSROOM_...\",\n * beginTimestamp: 1646619090394,\n * duration: 70448,\n * },\n * })\n */\nexport async function replayFastboard({\n sdkConfig,\n replayRoom: { callbacks, ...replayRoomParams },\n managerConfig,\n}: FastboardReplayOptions) {\n const sdk = new WhiteWebSdk({\n ...sdkConfig,\n useMobXState: true,\n });\n\n const player = await sdk.replayRoom(\n {\n ...ensure_window_manager(replayRoomParams),\n useMultiViews: true,\n },\n callbacks\n );\n\n const managerPromise = WindowManager.mount({\n cursor: true,\n ...managerConfig,\n room: player,\n });\n\n player.play();\n const manager = await managerPromise;\n player.pause();\n await player.seekToProgressTime(0);\n\n return new FastboardPlayer(sdk, player, manager);\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -177,6 +177,45 @@ function ensure_window_manager(joinRoom) {
|
|
|
177
177
|
function transform_app_status(status) {
|
|
178
178
|
return status === "start" ? "loading" : status === "failed" ? "failed" : "idle";
|
|
179
179
|
}
|
|
180
|
+
var DefaultApps = {
|
|
181
|
+
Monaco: {
|
|
182
|
+
src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-monaco/0.1.12/dist/main.iife.js"
|
|
183
|
+
},
|
|
184
|
+
Countdown: {
|
|
185
|
+
src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-countdown/0.0.2/dist/main.iife.js"
|
|
186
|
+
},
|
|
187
|
+
GeoGebra: {
|
|
188
|
+
src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-geogebra/0.0.4/dist/main.iife.js",
|
|
189
|
+
appOptions: {
|
|
190
|
+
HTML5Codebase: "https://flat-storage-cn-hz.whiteboard.agora.io/GeoGebra/HTML5/5.0/web3d"
|
|
191
|
+
}
|
|
192
|
+
},
|
|
193
|
+
EmbeddedPage: {
|
|
194
|
+
src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-embedded-page/0.1.1/dist/main.iife.js"
|
|
195
|
+
},
|
|
196
|
+
Plyr: {
|
|
197
|
+
src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-plyr/0.1.3/dist/main.iife.js"
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
WindowManager.register({
|
|
201
|
+
kind: "Slide",
|
|
202
|
+
appOptions: { debug: false },
|
|
203
|
+
src: SlideApp,
|
|
204
|
+
addHooks
|
|
205
|
+
});
|
|
206
|
+
for (const kind in DefaultApps) {
|
|
207
|
+
if (Object.prototype.hasOwnProperty.call(DefaultApps, kind)) {
|
|
208
|
+
const options = DefaultApps[kind];
|
|
209
|
+
WindowManager.register(__spreadValues({ kind }, options));
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
var register = WindowManager.register.bind(WindowManager);
|
|
213
|
+
var version = "0.3.4";
|
|
214
|
+
if (typeof window !== "undefined") {
|
|
215
|
+
let str = window.__netlessUA || "";
|
|
216
|
+
str += ` ${"@netless/fastboard"}@${version} `;
|
|
217
|
+
window.__netlessUA = str;
|
|
218
|
+
}
|
|
180
219
|
|
|
181
220
|
// src/impl/FastboardApp.ts
|
|
182
221
|
var FastboardAppBase = class {
|
|
@@ -425,7 +464,8 @@ async function createFastboard(_a) {
|
|
|
425
464
|
sdkConfig,
|
|
426
465
|
joinRoom: _c
|
|
427
466
|
} = _b, _d = _c, { callbacks } = _d, joinRoomParams = __objRest(_d, ["callbacks"]), {
|
|
428
|
-
managerConfig
|
|
467
|
+
managerConfig,
|
|
468
|
+
netlessApps
|
|
429
469
|
} = _b;
|
|
430
470
|
const sdk = new WhiteWebSdk(__spreadProps(__spreadValues({}, sdkConfig), {
|
|
431
471
|
useMobXState: true
|
|
@@ -442,6 +482,11 @@ async function createFastboard(_a) {
|
|
|
442
482
|
changeToArrow: "a",
|
|
443
483
|
changeToHand: "h"
|
|
444
484
|
});
|
|
485
|
+
if (netlessApps) {
|
|
486
|
+
netlessApps.forEach((app) => {
|
|
487
|
+
register({ kind: app.kind, src: app });
|
|
488
|
+
});
|
|
489
|
+
}
|
|
445
490
|
const room = await sdk.joinRoom(__spreadProps(__spreadValues({
|
|
446
491
|
floatBar: true,
|
|
447
492
|
hotKeys
|
|
@@ -577,45 +622,6 @@ async function replayFastboard(_a) {
|
|
|
577
622
|
await player.seekToProgressTime(0);
|
|
578
623
|
return new FastboardPlayer(sdk, player, manager);
|
|
579
624
|
}
|
|
580
|
-
var DefaultApps = {
|
|
581
|
-
Monaco: {
|
|
582
|
-
src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-monaco/0.1.12/dist/main.iife.js"
|
|
583
|
-
},
|
|
584
|
-
Countdown: {
|
|
585
|
-
src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-countdown/0.0.2/dist/main.iife.js"
|
|
586
|
-
},
|
|
587
|
-
GeoGebra: {
|
|
588
|
-
src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-geogebra/0.0.4/dist/main.iife.js",
|
|
589
|
-
appOptions: {
|
|
590
|
-
HTML5Codebase: "https://flat-storage-cn-hz.whiteboard.agora.io/GeoGebra/HTML5/5.0/web3d"
|
|
591
|
-
}
|
|
592
|
-
},
|
|
593
|
-
EmbeddedPage: {
|
|
594
|
-
src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-embedded-page/0.1.1/dist/main.iife.js"
|
|
595
|
-
},
|
|
596
|
-
Plyr: {
|
|
597
|
-
src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-plyr/0.1.3/dist/main.iife.js"
|
|
598
|
-
}
|
|
599
|
-
};
|
|
600
|
-
WindowManager.register({
|
|
601
|
-
kind: "Slide",
|
|
602
|
-
appOptions: { debug: false },
|
|
603
|
-
src: SlideApp,
|
|
604
|
-
addHooks
|
|
605
|
-
});
|
|
606
|
-
for (const kind in DefaultApps) {
|
|
607
|
-
if (Object.prototype.hasOwnProperty.call(DefaultApps, kind)) {
|
|
608
|
-
const options = DefaultApps[kind];
|
|
609
|
-
WindowManager.register(__spreadValues({ kind }, options));
|
|
610
|
-
}
|
|
611
|
-
}
|
|
612
|
-
var register = WindowManager.register.bind(WindowManager);
|
|
613
|
-
var version = "0.3.4-canary.2";
|
|
614
|
-
if (typeof window !== "undefined") {
|
|
615
|
-
let str = window.__netlessUA || "";
|
|
616
|
-
str += ` ${"@netless/fastboard"}@${version} `;
|
|
617
|
-
window.__netlessUA = str;
|
|
618
|
-
}
|
|
619
625
|
|
|
620
626
|
export { FastboardApp, FastboardPlayer, convertedFileToScene, createFastboard, genUID, getImageSize, makeSlideParams, readable, register, replayFastboard, version, warn, writable };
|
|
621
627
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/store.ts","../src/utils/misc.ts","../src/utils/uid.ts","../src/utils/warn.ts","../src/impl/FastboardApp.ts","../src/internal.ts","../src/impl/FastboardPlayer.ts","../src/behaviors/index.ts"],"names":[],"mappings":"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","sourcesContent":["// This is a simple mimic of svelte/store.\nexport type Subscriber<T> = (value: T) => void;\nexport type Unsubscriber = () => void;\nexport type Updater<T> = (value: T) => T;\nexport type StartStopNotifier<T> = (set: Subscriber<T>) => Unsubscriber | void;\n\nexport interface Readable<T> {\n readonly value: T;\n subscribe(this: void, run: Subscriber<T>): Unsubscriber;\n reaction(this: void, run: Subscriber<T>): Unsubscriber;\n}\n\nexport interface Writable<T> extends Readable<T> {\n set(this: void, value: T): void;\n update(this: void, updater: Updater<T>): void;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nfunction noop() {}\n\nfunction safe_not_equal(a: unknown, b: unknown) {\n return a != a ? b == b : a !== b || (a && typeof a === \"object\") || typeof a === \"function\";\n}\n\nexport function readable<T>(value: T, start: StartStopNotifier<T> = noop): Readable<T> {\n let stop: Unsubscriber | undefined;\n const subscribers = new Set<Subscriber<T>>();\n function set(new_value: T) {\n if (safe_not_equal(value, new_value)) {\n value = new_value;\n if (stop) {\n for (const run of subscribers) {\n run(value);\n }\n }\n }\n }\n function subscribe(run: Subscriber<T>) {\n subscribers.add(run);\n if (subscribers.size === 1) {\n stop = start(set) || noop;\n }\n run(value);\n return () => {\n subscribers.delete(run);\n if (subscribers.size === 0) {\n stop && stop();\n stop = undefined;\n }\n };\n }\n function reaction(run: Subscriber<T>) {\n subscribers.add(run);\n if (subscribers.size === 1) {\n stop = start(set) || noop;\n }\n return () => {\n subscribers.delete(run);\n if (subscribers.size === 0) {\n stop && stop();\n stop = undefined;\n }\n };\n }\n return {\n get value() {\n return value;\n },\n subscribe,\n reaction,\n };\n}\n\nexport function writable<T>(value: T, start: StartStopNotifier<T> = noop, set: Subscriber<T>): Writable<T> {\n const internal = readable(value, start);\n return {\n get value() {\n return internal.value;\n },\n subscribe: internal.subscribe,\n reaction: internal.reaction,\n set,\n update(fn: Updater<T>) {\n set(fn(value));\n },\n };\n}\n","import type { ConvertedFile, SceneDefinition, Size } from \"white-web-sdk\";\n\nexport function getImageSize(url: string, fallback: Size) {\n return new Promise<Size>(resolve => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = () => resolve(fallback);\n img.src = url;\n });\n}\n\nexport function makeSlideParams(scenes: SceneDefinition[]) {\n const emptyScenes: SceneDefinition[] = [];\n let taskId = \"\";\n let url = \"\";\n\n // e.g. \"ppt(x)://cdn/prefix/dynamicConvert/{taskId}/1.slide\"\n const pptSrcRE = /^pptx?(?<prefix>:\\/\\/\\S+?dynamicConvert)\\/(?<taskId>\\w+)\\//;\n\n for (const { name, ppt } of scenes) {\n // make sure scenesWithoutPPT.length === scenes.length\n emptyScenes.push({ name });\n\n if (!ppt || !ppt.src.startsWith(\"ppt\")) {\n continue;\n }\n const match = pptSrcRE.exec(ppt.src);\n if (!match || !match.groups) {\n continue;\n }\n taskId = match.groups.taskId;\n url = \"https\" + match.groups.prefix;\n break;\n }\n\n return { scenes: emptyScenes, taskId, url };\n}\n\nexport function convertedFileToScene(f: ConvertedFile, i: number): SceneDefinition {\n return {\n name: String(i + 1),\n ppt: {\n src: f.conversionFileUrl,\n width: f.width,\n height: f.height,\n previewURL: f.preview,\n },\n };\n}\n","// Copy from https://github.com/crimx/side-effect-manager/blob/main/src/gen-uid.ts\nconst SOUP = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\nconst SOUP_LEN = 62; // SOUP.length\nconst ID_LEN = 20;\nconst reusedIdCarrier = /* @__PURE__ */ Array(ID_LEN);\n\nexport function genUID() {\n for (let i = 0; i < ID_LEN; i++) {\n reusedIdCarrier[i] = SOUP.charAt(Math.random() * SOUP_LEN);\n }\n return reusedIdCarrier.join(\"\");\n}\n","const warnings = {\n \"no-ppt-in-scenes\":\n \"You're probably inserting the slide app in a wrong way, there shouldn't exist `scenes[0].ppt`.\",\n} as const;\nconst warned = new Set<string>();\n\nexport function warn(id: keyof typeof warnings) {\n if (warned.has(id)) return;\n warned.add(id);\n console.warn(warnings[id]);\n}\n","import type { AddPageParams, PublicEvent, MountParams } from \"@netless/window-manager\";\nimport type {\n AnimationMode,\n ApplianceNames,\n Camera,\n Color,\n ConversionResponse,\n HotKey,\n HotKeys,\n JoinRoomParams,\n MemberState,\n Rectangle,\n Room,\n RoomPhase as RoomPhaseEnum,\n RoomCallbacks,\n RoomState,\n SceneDefinition,\n ShapeType,\n ViewCallbacks,\n WhiteWebSdkConfiguration,\n} from \"white-web-sdk\";\n\nimport { DefaultHotKeys, WhiteWebSdk, contentModeScale } from \"white-web-sdk\";\nimport { BuiltinApps, WindowManager } from \"@netless/window-manager\";\nimport {\n getImageSize,\n genUID,\n convertedFileToScene,\n makeSlideParams,\n readable,\n writable,\n warn,\n} from \"../utils\";\nimport { ensure_window_manager, transform_app_status } from \"../internal\";\n\nclass FastboardAppBase {\n public constructor(\n readonly sdk: WhiteWebSdk,\n readonly room: Room,\n readonly manager: WindowManager,\n readonly hotKeys: Partial<HotKeys>\n ) {}\n\n protected _destroyed = false;\n protected _assertNotDestroyed() {\n if (this._destroyed) {\n throw new Error(\"FastboardApp has been destroyed\");\n }\n }\n\n protected _addRoomListener<K extends keyof RoomCallbacks>(name: K, listener: RoomCallbacks[K]) {\n this._assertNotDestroyed();\n this.room.callbacks.on(name, listener);\n return () => this.room.callbacks.off(name, listener);\n }\n\n protected _addManagerListener<K extends keyof PublicEvent>(\n name: K,\n listener: (value: PublicEvent[K]) => void\n ) {\n this._assertNotDestroyed();\n this.manager.emitter.on(name, listener);\n return () => this.manager.emitter.off(name, listener);\n }\n\n protected _addMainViewListener<K extends keyof ViewCallbacks>(name: K, listener: ViewCallbacks[K]) {\n this._assertNotDestroyed();\n this.manager.mainView.callbacks.on(name, listener);\n return () => this.manager.mainView.callbacks.off(name, listener);\n }\n\n /**\n * Destroy fastboard (disconnect from the whiteboard room).\n */\n public destroy() {\n this._destroyed = true;\n this.manager.destroy();\n return this.room.disconnect();\n }\n}\n\ntype RoomPhase = `${RoomPhaseEnum}`;\n\nexport type {\n AddPageParams,\n AnimationMode,\n ApplianceNames,\n Camera,\n Color,\n ConversionResponse,\n HotKey,\n HotKeys,\n JoinRoomParams,\n MemberState,\n MountParams,\n PublicEvent,\n Rectangle,\n Room,\n RoomPhase,\n RoomCallbacks,\n RoomState,\n SceneDefinition,\n ShapeType,\n ViewCallbacks,\n WhiteWebSdk,\n WhiteWebSdkConfiguration,\n WindowManager,\n};\n\n/** pencil, eraser, rectangle... */\nexport type Appliance = `${ApplianceNames}`;\n/** triangle, star... */\nexport type Shape = `${ShapeType}`;\n\n/** Params for static docs, they are rendered as many images. */\nexport interface InsertDocsStatic {\n readonly fileType: \"pdf\";\n /** Unique string for binding whiteboard view to the doc. Must start with `/`. */\n readonly scenePath: string;\n /** @example [{ name: '1', ppt: { src: 'url/to/ppt/1.png' } }] */\n readonly scenes: SceneDefinition[];\n /** Window title. */\n readonly title?: string;\n}\n\n/** Params for slides, they are rendered in @netless/app-slide with animations. */\nexport interface InsertDocsDynamic {\n readonly fileType: \"pptx\";\n /** Unique string for binding whiteboard view to the doc. Must start with `/`. */\n readonly scenePath: string;\n /** Conversion task id, see https://developer.netless.link/server-en/home/server-conversion#get-query-task-conversion-progress. */\n readonly taskId: string;\n /** Window title. */\n readonly title?: string;\n /** Where the slide resource placed. @default `https://convertcdn.netless.link/dynamicConvert` */\n readonly url?: string;\n /** @example [{ name: '1' }, { name: '2' }, { name: '3' }] */\n readonly scenes?: SceneDefinition[];\n}\n\nexport type InsertDocsParams = InsertDocsStatic | InsertDocsDynamic;\n\nexport type SetMemberStateFn = (partialMemberState: Partial<MemberState>) => void;\n\nexport type RoomStateChanged = (diff: Partial<RoomState>) => void;\n\n/** App download progress. */\nexport interface AppsStatus {\n [kind: string]: {\n status: \"idle\" | \"loading\" | \"failed\";\n /** Exist if status is `failed`. */\n reason?: string;\n };\n}\n\nexport class FastboardApp extends FastboardAppBase {\n /**\n * Render this app to some DOM.\n */\n bindContainer(container: HTMLElement) {\n this._assertNotDestroyed();\n this.manager.bindContainer(container);\n }\n\n /**\n * Move window-manager's collector to some place.\n */\n bindCollector(container: HTMLElement) {\n this._assertNotDestroyed();\n this.manager.bindCollectorContainer(container);\n }\n\n /**\n * Is current room writable?\n */\n readonly writable = writable(\n this.room.isWritable,\n set => {\n set(this.room.isWritable);\n return this._addRoomListener(\"onEnableWriteNowChanged\", () => set(this.room.isWritable));\n },\n this.room.setWritable.bind(this.room)\n );\n\n /**\n * Is current room online?\n */\n readonly phase = readable<RoomPhase>(this.room.phase, set => {\n set(this.room.phase);\n return this._addRoomListener(\"onPhaseChanged\", set);\n });\n\n /**\n * Current window-manager's windows' state (is it maximized?).\n */\n readonly boxState = readable(this.manager.boxState, set => {\n set(this.manager.boxState);\n return this._addManagerListener(\"boxStateChange\", set);\n });\n\n /**\n * Current window-manager's focused app's id.\n * @example \"HelloWorld-1A2b3C4d\"\n */\n readonly focusedApp = readable(this.manager.focused, set => {\n set(this.manager.focused);\n return this._addManagerListener(\"focusedChange\", set);\n });\n\n /**\n * How many times can I call `app.redo()`?\n */\n readonly canRedoSteps = readable(this.manager.canRedoSteps, set => {\n set(this.manager.canRedoSteps);\n return this._addManagerListener(\"canRedoStepsChange\", set);\n });\n\n /**\n * How many times can I call `app.undo()`?\n */\n readonly canUndoSteps = readable(this.manager.canUndoSteps, set => {\n set(this.manager.canUndoSteps);\n return this._addManagerListener(\"canUndoStepsChange\", set);\n });\n\n /**\n * Current camera information of main view.\n *\n * Change the camera position by `app.moveCamera()`.\n */\n readonly camera = readable(this.manager.camera, set => {\n set(this.manager.camera);\n return this._addMainViewListener(\"onCameraUpdated\", set);\n });\n\n /**\n * Current tool's info, like \"is using pencil?\", \"what color?\".\n *\n * Change the tool by `app.setAppliance()`.\n */\n readonly memberState = readable(this.room.state.memberState, set => {\n set(this.room.state.memberState);\n return this._addRoomListener(\"onRoomStateChanged\", ({ memberState: m }) => m && set(m));\n });\n\n /**\n * 0..n-1, current index of main view scenes.\n */\n readonly sceneIndex = writable(\n this.manager.mainViewSceneIndex,\n set => {\n set(this.manager.mainViewSceneIndex);\n return this._addManagerListener(\"mainViewSceneIndexChange\", set);\n },\n this.manager.setMainViewSceneIndex.bind(this.manager)\n );\n\n /**\n * How many pages are in the main view?\n */\n readonly sceneLength = readable(this.manager.mainViewScenesLength, set => {\n set(this.manager.mainViewScenesLength);\n return this._addManagerListener(\"mainViewScenesLengthChange\", set);\n });\n\n private _appsStatus: AppsStatus = {};\n /**\n * Apps status.\n */\n readonly appsStatus = readable<AppsStatus>({}, set =>\n this._addManagerListener(\"loadApp\", ({ kind, status, reason }) => {\n this._appsStatus[kind] = { status: transform_app_status(status), reason };\n set(this._appsStatus);\n })\n );\n\n /**\n * Undo a step on main view.\n */\n undo() {\n this._assertNotDestroyed();\n this.manager.undo();\n }\n\n /**\n * Redo a step on main view.\n */\n redo() {\n this._assertNotDestroyed();\n this.manager.redo();\n }\n\n /**\n * Move current main view's camera position.\n */\n moveCamera(camera: Partial<Camera> & { animationMode?: AnimationMode | undefined }) {\n this._assertNotDestroyed();\n this.manager.moveCamera(camera);\n }\n\n /**\n * Move current main view's camera to include a rectangle.\n */\n moveCameraToContain(rectangle: Rectangle & { animationMode?: AnimationMode }) {\n this._assertNotDestroyed();\n this.manager.moveCameraToContain(rectangle);\n }\n\n /**\n * Delete all things on the main view.\n */\n cleanCurrentScene() {\n this._assertNotDestroyed();\n this.manager.cleanCurrentScene();\n }\n\n /**\n * Set current tool, like \"pencil\".\n */\n setAppliance(appliance: ApplianceNames | Appliance, shape?: ShapeType | Shape) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({\n currentApplianceName: appliance as ApplianceNames,\n shapeType: shape as ShapeType,\n });\n }\n\n /**\n * Set pencil and shape's thickness.\n */\n setStrokeWidth(strokeWidth: number) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ strokeWidth });\n }\n\n /**\n * Set pencil and shape's color.\n */\n setStrokeColor(strokeColor: Color) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ strokeColor });\n }\n\n /**\n * Set text size. Default is 16.\n */\n setTextSize(textSize: number) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ textSize });\n }\n\n /**\n * Set text color.\n *\n * @example\n * setTextColor([0x66, 0xcc, 0xff])\n */\n setTextColor(textColor: Color) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ textColor });\n }\n\n /**\n * Goto previous page (the main whiteboard view).\n */\n prevPage() {\n this._assertNotDestroyed();\n return this.manager.prevPage();\n }\n\n /**\n * Goto next page (the main whiteboard view).\n */\n nextPage() {\n this._assertNotDestroyed();\n return this.manager.nextPage();\n }\n\n /**\n * Add one page to the main whiteboard view.\n *\n * @example\n * addPage({ after: true }) // add one page right after current one.\n * nextPage() // then, goto that page.\n */\n addPage(params?: AddPageParams) {\n this._assertNotDestroyed();\n return this.manager.addPage(params);\n }\n\n /**\n * Remove one page at given index or current page (by default).\n *\n * Requires `@netless/window-manager` >= 0.4.30.\n *\n * @example\n * removePage() // remove current page\n */\n removePage(index?: number) {\n this._assertNotDestroyed();\n return this.manager.removePage(index);\n }\n\n /**\n * Insert an image to the main view.\n *\n * @example\n * insertImage(\"https://i.imgur.com/CzXTtJV.jpg\")\n */\n async insertImage(url: string) {\n this._assertNotDestroyed();\n await this.manager.switchMainViewToWriter();\n\n const { divElement } = this.manager.mainView;\n const containerSize = {\n width: divElement?.scrollWidth || window.innerWidth,\n height: divElement?.scrollHeight || window.innerHeight,\n };\n\n // 1. shrink the image a little to fit container **width**\n const maxWidth = containerSize.width * 0.8;\n let { width, height } = await getImageSize(url, containerSize);\n const scale = Math.min(maxWidth / width, 1);\n const uuid = genUID();\n const { centerX, centerY } = this.manager.camera;\n width *= scale;\n height *= scale;\n this.manager.mainView.insertImage({ uuid, centerX, centerY, width, height, locked: false });\n this.manager.mainView.completeImageUpload(uuid, url);\n\n // 2. move camera to fit image **height**\n width /= 0.8;\n height /= 0.8;\n const originX = centerX - width / 2;\n const originY = centerY - height / 2;\n this.manager.moveCameraToContain({ originX, originY, width, height });\n }\n\n /**\n * Insert PDF/PPTX from conversion result.\n * @param status https://developer.netless.link/server-en/home/server-conversion#get-query-task-conversion-progress\n */\n insertDocs(filename: string, status: ConversionResponse): Promise<string | undefined>;\n\n /**\n * Manual way.\n * @example\n * app.insertDocs({\n * fileType: 'pptx',\n * scenePath: `/pptx/${conversion.taskId}`,\n * taskId: conversion.taskId,\n * title: 'Title',\n * })\n */\n insertDocs(params: InsertDocsParams): Promise<string | undefined>;\n\n insertDocs(arg1: string | InsertDocsParams, arg2?: ConversionResponse) {\n this._assertNotDestroyed();\n if (typeof arg1 === \"object\" && \"fileType\" in arg1) {\n return this._insertDocsImpl(arg1);\n } else if (arg2 && arg2.status !== \"Finished\") {\n throw new Error(\"FastboardApp cannot insert a converting doc.\");\n } else if (arg2 && arg2.progress) {\n const title = arg1;\n const scenePath = `/${arg2.uuid}/${genUID()}`;\n const scenes1 = arg2.progress.convertedFileList.map(convertedFileToScene);\n const { scenes, taskId, url } = makeSlideParams(scenes1);\n if (taskId && url) {\n return this._insertDocsImpl({ fileType: \"pptx\", scenePath, scenes, title, taskId, url });\n } else {\n return this._insertDocsImpl({ fileType: \"pdf\", scenePath, scenes: scenes1, title });\n }\n }\n }\n\n private _insertDocsImpl({ fileType, scenePath, title, scenes, ...attributes }: InsertDocsParams) {\n this._assertNotDestroyed();\n switch (fileType) {\n case \"pdf\":\n return this.manager.addApp({\n kind: \"DocsViewer\",\n options: { scenePath, title, scenes },\n });\n case \"pptx\":\n if (scenes && scenes[0].ppt) {\n warn(\"no-ppt-in-scenes\");\n }\n return this.manager.addApp({\n kind: \"Slide\",\n options: { scenePath, title, scenes },\n attributes,\n });\n }\n }\n\n /**\n * Insert the Media Player app.\n */\n insertMedia(title: string, src: string) {\n this._assertNotDestroyed();\n return this.manager.addApp({\n kind: BuiltinApps.MediaPlayer,\n options: { title },\n attributes: { src },\n });\n }\n\n /**\n * Insert the Monaco Code Editor app.\n * @deprecated Use `app.manager.addApp({ kind: 'Monaco' })` instead.\n */\n insertCodeEditor() {\n this._assertNotDestroyed();\n return this.manager.addApp({\n kind: \"Monaco\",\n options: { title: \"Code Editor\" },\n });\n }\n\n /**\n * Insert the Countdown app.\n * @deprecated Use `app.manager.addApp({ kind: 'Countdown' })` instead.\n */\n insertCountdown() {\n this._assertNotDestroyed();\n return this.manager.addApp({\n kind: \"Countdown\",\n options: { title: \"Countdown\" },\n });\n }\n\n /**\n * Insert the GeoGebra app.\n * @deprecated Use `app.manager.addApp({ kind: 'GeoGebra' })` instead.\n */\n insertGeoGebra() {\n this._assertNotDestroyed();\n return this.manager.addApp({\n kind: \"GeoGebra\",\n options: { title: \"GeoGebra\" },\n });\n }\n}\n\nexport interface FastboardOptions {\n sdkConfig: Omit<WhiteWebSdkConfiguration, \"useMobXState\"> & {\n region: NonNullable<WhiteWebSdkConfiguration[\"region\"]>;\n };\n joinRoom: Omit<JoinRoomParams, \"useMultiViews\" | \"disableNewPencil\" | \"disableMagixEventDispatchLimit\"> & {\n callbacks?: Partial<RoomCallbacks>;\n };\n managerConfig?: Omit<MountParams, \"room\">;\n}\n\n/**\n * Create a FastboardApp instance.\n * @example\n * let app = await createFastboard({\n * sdkConfig: {\n * appIdentifier: import.meta.env.VITE_APPID,\n * region: 'cn-hz',\n * },\n * joinRoom: {\n * uid: unique_id,\n * uuid: import.meta.env.VITE_ROOM_UUID,\n * roomToken: import.meta.env.VITE_ROOM_TOKEN,\n * },\n * })\n */\nexport async function createFastboard({\n sdkConfig,\n joinRoom: { callbacks, ...joinRoomParams },\n managerConfig,\n}: FastboardOptions) {\n const sdk = new WhiteWebSdk({\n ...sdkConfig,\n useMobXState: true,\n });\n\n const hotKeys: Partial<HotKeys> = {\n ...DefaultHotKeys,\n changeToSelector: \"s\",\n changeToLaserPointer: \"z\",\n changeToPencil: \"p\",\n changeToRectangle: \"r\",\n changeToEllipse: \"c\",\n changeToEraser: \"e\",\n changeToText: \"t\",\n changeToStraight: \"l\",\n changeToArrow: \"a\",\n changeToHand: \"h\",\n };\n\n const room = await sdk.joinRoom(\n {\n floatBar: true,\n hotKeys,\n ...ensure_window_manager(joinRoomParams),\n useMultiViews: true,\n disableNewPencil: false,\n disableMagixEventDispatchLimit: true,\n },\n callbacks\n );\n\n const manager = await WindowManager.mount({\n cursor: true,\n ...managerConfig,\n room,\n });\n\n manager.mainView.setCameraBound({\n minContentMode: contentModeScale(0.3),\n maxContentMode: contentModeScale(3),\n });\n\n return new FastboardApp(sdk, room, manager, hotKeys);\n}\n","import type { JoinRoomParams, ReplayRoomParams } from \"white-web-sdk\";\nimport type { PublicEvent } from \"@netless/window-manager\";\nimport { WindowManager } from \"@netless/window-manager\";\n\nexport function ensure_window_manager<T extends JoinRoomParams | ReplayRoomParams>(joinRoom: T): T {\n if (!joinRoom.invisiblePlugins || !joinRoom.invisiblePlugins.includes(WindowManager)) {\n joinRoom.invisiblePlugins = [...(joinRoom.invisiblePlugins || []), WindowManager];\n }\n return joinRoom;\n}\n\nexport function transform_app_status(status: PublicEvent[\"loadApp\"][\"status\"]) {\n return status === \"start\" ? \"loading\" : status === \"failed\" ? \"failed\" : \"idle\";\n}\n","import type { MountParams, PublicEvent } from \"@netless/window-manager\";\nimport type {\n Player,\n PlayerPhase as PlayerPhaseEnum,\n PlayerCallbacks,\n PlayerState,\n PlayerSeekingResult,\n ReplayRoomParams,\n ViewCallbacks,\n WhiteWebSdkConfiguration,\n} from \"white-web-sdk\";\n\nimport { WhiteWebSdk } from \"white-web-sdk\";\nimport { WindowManager } from \"@netless/window-manager\";\nimport { readable, writable } from \"../utils\";\nimport { ensure_window_manager } from \"../internal\";\n\nclass FastboardPlayerBase {\n public constructor(readonly sdk: WhiteWebSdk, readonly player: Player, readonly manager: WindowManager) {}\n\n protected _destroyed = false;\n protected _assertNotDestroyed() {\n if (this._destroyed) {\n throw new Error(\"FastboardApp has been destroyed\");\n }\n }\n\n protected _addPlayerListener<K extends keyof PlayerCallbacks>(name: K, listener: PlayerCallbacks[K]) {\n this._assertNotDestroyed();\n this.player.callbacks.on(name, listener);\n return () => this.player.callbacks.off(name, listener);\n }\n\n protected _addManagerListener<K extends keyof PublicEvent>(\n name: K,\n listener: (value: PublicEvent[K]) => void\n ) {\n this._assertNotDestroyed();\n this.manager.emitter.on(name, listener);\n return () => this.manager.emitter.off(name, listener);\n }\n\n protected _addMainViewListener<K extends keyof ViewCallbacks>(name: K, listener: ViewCallbacks[K]) {\n this._assertNotDestroyed();\n this.manager.mainView.callbacks.on(name, listener);\n return () => this.manager.mainView.callbacks.off(name, listener);\n }\n\n public destroy() {\n this._destroyed = true;\n this.manager.destroy();\n return this.player.callbacks.off();\n }\n}\n\ntype PlayerPhase = `${PlayerPhaseEnum}`;\n\nexport type { PlayerPhase, PlayerSeekingResult };\n\nexport class FastboardPlayer extends FastboardPlayerBase {\n /**\n * Render this player to some DOM.\n */\n bindContainer(container: HTMLElement) {\n this._assertNotDestroyed();\n this.manager.bindContainer(container);\n }\n\n /**\n * Move window-manager's collector to some place.\n */\n bindCollector(container: HTMLElement) {\n this._assertNotDestroyed();\n this.manager.bindCollectorContainer(container);\n }\n\n /**\n * Player current time in milliseconds.\n */\n readonly currentTime = writable(\n this.player.progressTime,\n set => {\n set(this.player.progressTime);\n return this._addPlayerListener(\"onProgressTimeChanged\", set);\n },\n this.player.seekToProgressTime.bind(this.player)\n );\n\n /**\n * Player state, like \"is it playing?\".\n */\n readonly phase = readable<PlayerPhase>(this.player.phase, set => {\n set(this.player.phase);\n return this._addPlayerListener(\"onPhaseChanged\", set);\n });\n\n /**\n * Will become true after buffering.\n */\n readonly canplay = readable(this.player.isPlayable, set => {\n set(this.player.isPlayable);\n return this._addPlayerListener(\"onIsPlayableChanged\", set);\n });\n\n private _setPlaybackRate!: (value: number) => void;\n /**\n * Playback speed, default `1`.\n */\n readonly playbackRate = writable(\n this.player.playbackSpeed,\n set => {\n this._setPlaybackRate = set;\n set(this.player.playbackSpeed);\n },\n value => {\n this.player.playbackSpeed = value;\n this._setPlaybackRate(value);\n }\n );\n\n /**\n * Playback duration in milliseconds.\n */\n readonly duration = readable(this.player.timeDuration, set => {\n set(this.player.timeDuration);\n });\n\n /**\n * Get state of room at that time, like \"who was in the room?\".\n */\n readonly state = readable<PlayerState>(this.player.state, set => {\n set(this.player.state);\n return this._addPlayerListener(\"onPlayerStateChanged\", () => set(this.player.state));\n });\n\n /**\n * Seek to some time in milliseconds.\n */\n seek(timestamp: number) {\n this._assertNotDestroyed();\n return this.player.seekToProgressTime(timestamp);\n }\n\n /**\n * Change player state to playing.\n */\n play() {\n this._assertNotDestroyed();\n this.player.play();\n }\n\n /**\n * Change player state to paused.\n */\n pause() {\n this._assertNotDestroyed();\n this.player.pause();\n }\n\n /**\n * Change player state to stopped.\n */\n stop() {\n this._assertNotDestroyed();\n this.player.stop();\n }\n\n /**\n * Set playback speed, a shortcut for `speed.set(x)`.\n */\n setPlaybackRate(value: number) {\n this._assertNotDestroyed();\n this.playbackRate.set(value);\n }\n}\n\nexport interface FastboardReplayOptions {\n sdkConfig: Omit<WhiteWebSdkConfiguration, \"useMobXState\"> & {\n region: NonNullable<WhiteWebSdkConfiguration[\"region\"]>;\n };\n replayRoom: Omit<ReplayRoomParams, \"useMultiViews\"> & {\n callbacks?: Partial<PlayerCallbacks>;\n };\n managerConfig?: Omit<MountParams, \"room\">;\n}\n\n/**\n * Create a FastboardPlayer instance.\n * @example\n * let player = await replayFastboard({\n * sdkConfig: {\n * appIdentifier: import.meta.env.VITE_APPID,\n * region: 'cn-hz',\n * },\n * replayRoom: {\n * room: \"room uuid\",\n * roomToken: \"NETLESSROOM_...\",\n * beginTimestamp: 1646619090394,\n * duration: 70448,\n * },\n * })\n */\nexport async function replayFastboard({\n sdkConfig,\n replayRoom: { callbacks, ...replayRoomParams },\n managerConfig,\n}: FastboardReplayOptions) {\n const sdk = new WhiteWebSdk({\n ...sdkConfig,\n useMobXState: true,\n });\n\n const player = await sdk.replayRoom(\n {\n ...ensure_window_manager(replayRoomParams),\n useMultiViews: true,\n },\n callbacks\n );\n\n const managerPromise = WindowManager.mount({\n cursor: true,\n ...managerConfig,\n room: player,\n });\n\n player.play();\n const manager = await managerPromise;\n player.pause();\n await player.seekToProgressTime(0);\n\n return new FastboardPlayer(sdk, player, manager);\n}\n","import type { RegisterParams } from \"@netless/window-manager\";\nimport { WindowManager } from \"@netless/window-manager\";\nimport SlideApp, { apps, addHooks, previewSlide } from \"@netless/app-slide\";\n\nexport type {\n AppOptions as SlideOptions,\n Controller as SlideController,\n PreviewParams,\n SlidePreviewer,\n} from \"@netless/app-slide\";\nexport { previewSlide, SlideApp, addHooks as addSlideHooks, apps as slideApps };\n\nexport interface AppsConfig {\n [kind: string]: Omit<RegisterParams, \"kind\">;\n}\n\nconst DefaultApps: AppsConfig = {\n Monaco: {\n src: \"https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-monaco/0.1.12/dist/main.iife.js\",\n },\n Countdown: {\n src: \"https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-countdown/0.0.2/dist/main.iife.js\",\n },\n GeoGebra: {\n src: \"https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-geogebra/0.0.4/dist/main.iife.js\",\n appOptions: {\n HTML5Codebase: \"https://flat-storage-cn-hz.whiteboard.agora.io/GeoGebra/HTML5/5.0/web3d\",\n },\n },\n EmbeddedPage: {\n src: \"https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-embedded-page/0.1.1/dist/main.iife.js\",\n },\n Plyr: {\n src: \"https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-plyr/0.1.3/dist/main.iife.js\",\n },\n};\n\nWindowManager.register({\n kind: \"Slide\",\n appOptions: { debug: false },\n src: SlideApp,\n addHooks,\n});\n\nfor (const kind in DefaultApps) {\n if (Object.prototype.hasOwnProperty.call(DefaultApps, kind)) {\n const options = DefaultApps[kind];\n WindowManager.register({ kind, ...options });\n }\n}\n\nexport const register = WindowManager.register.bind(WindowManager);\n\ndeclare let __NAME__: string, __VERSION__: string;\n\nexport const version = __VERSION__;\n\nif (typeof window !== \"undefined\") {\n let str = (window as { __netlessUA?: string }).__netlessUA || \"\";\n str += ` ${__NAME__}@${version} `;\n (window as { __netlessUA?: string }).__netlessUA = str;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/store.ts","../src/utils/misc.ts","../src/utils/uid.ts","../src/utils/warn.ts","../src/impl/FastboardApp.ts","../src/internal.ts","../src/behaviors/index.ts","../src/impl/FastboardPlayer.ts"],"names":[],"mappings":"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","sourcesContent":["// This is a simple mimic of svelte/store.\nexport type Subscriber<T> = (value: T) => void;\nexport type Unsubscriber = () => void;\nexport type Updater<T> = (value: T) => T;\nexport type StartStopNotifier<T> = (set: Subscriber<T>) => Unsubscriber | void;\n\nexport interface Readable<T> {\n readonly value: T;\n subscribe(this: void, run: Subscriber<T>): Unsubscriber;\n reaction(this: void, run: Subscriber<T>): Unsubscriber;\n}\n\nexport interface Writable<T> extends Readable<T> {\n set(this: void, value: T): void;\n update(this: void, updater: Updater<T>): void;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nfunction noop() {}\n\nfunction safe_not_equal(a: unknown, b: unknown) {\n return a != a ? b == b : a !== b || (a && typeof a === \"object\") || typeof a === \"function\";\n}\n\nexport function readable<T>(value: T, start: StartStopNotifier<T> = noop): Readable<T> {\n let stop: Unsubscriber | undefined;\n const subscribers = new Set<Subscriber<T>>();\n function set(new_value: T) {\n if (safe_not_equal(value, new_value)) {\n value = new_value;\n if (stop) {\n for (const run of subscribers) {\n run(value);\n }\n }\n }\n }\n function subscribe(run: Subscriber<T>) {\n subscribers.add(run);\n if (subscribers.size === 1) {\n stop = start(set) || noop;\n }\n run(value);\n return () => {\n subscribers.delete(run);\n if (subscribers.size === 0) {\n stop && stop();\n stop = undefined;\n }\n };\n }\n function reaction(run: Subscriber<T>) {\n subscribers.add(run);\n if (subscribers.size === 1) {\n stop = start(set) || noop;\n }\n return () => {\n subscribers.delete(run);\n if (subscribers.size === 0) {\n stop && stop();\n stop = undefined;\n }\n };\n }\n return {\n get value() {\n return value;\n },\n subscribe,\n reaction,\n };\n}\n\nexport function writable<T>(value: T, start: StartStopNotifier<T> = noop, set: Subscriber<T>): Writable<T> {\n const internal = readable(value, start);\n return {\n get value() {\n return internal.value;\n },\n subscribe: internal.subscribe,\n reaction: internal.reaction,\n set,\n update(fn: Updater<T>) {\n set(fn(value));\n },\n };\n}\n","import type { ConvertedFile, SceneDefinition, Size } from \"white-web-sdk\";\n\nexport function getImageSize(url: string, fallback: Size) {\n return new Promise<Size>(resolve => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = () => resolve(fallback);\n img.src = url;\n });\n}\n\nexport function makeSlideParams(scenes: SceneDefinition[]) {\n const emptyScenes: SceneDefinition[] = [];\n let taskId = \"\";\n let url = \"\";\n\n // e.g. \"ppt(x)://cdn/prefix/dynamicConvert/{taskId}/1.slide\"\n const pptSrcRE = /^pptx?(?<prefix>:\\/\\/\\S+?dynamicConvert)\\/(?<taskId>\\w+)\\//;\n\n for (const { name, ppt } of scenes) {\n // make sure scenesWithoutPPT.length === scenes.length\n emptyScenes.push({ name });\n\n if (!ppt || !ppt.src.startsWith(\"ppt\")) {\n continue;\n }\n const match = pptSrcRE.exec(ppt.src);\n if (!match || !match.groups) {\n continue;\n }\n taskId = match.groups.taskId;\n url = \"https\" + match.groups.prefix;\n break;\n }\n\n return { scenes: emptyScenes, taskId, url };\n}\n\nexport function convertedFileToScene(f: ConvertedFile, i: number): SceneDefinition {\n return {\n name: String(i + 1),\n ppt: {\n src: f.conversionFileUrl,\n width: f.width,\n height: f.height,\n previewURL: f.preview,\n },\n };\n}\n","// Copy from https://github.com/crimx/side-effect-manager/blob/main/src/gen-uid.ts\nconst SOUP = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\nconst SOUP_LEN = 62; // SOUP.length\nconst ID_LEN = 20;\nconst reusedIdCarrier = /* @__PURE__ */ Array(ID_LEN);\n\nexport function genUID() {\n for (let i = 0; i < ID_LEN; i++) {\n reusedIdCarrier[i] = SOUP.charAt(Math.random() * SOUP_LEN);\n }\n return reusedIdCarrier.join(\"\");\n}\n","const warnings = {\n \"no-ppt-in-scenes\":\n \"You're probably inserting the slide app in a wrong way, there shouldn't exist `scenes[0].ppt`.\",\n} as const;\nconst warned = new Set<string>();\n\nexport function warn(id: keyof typeof warnings) {\n if (warned.has(id)) return;\n warned.add(id);\n console.warn(warnings[id]);\n}\n","import type { AddPageParams, PublicEvent, MountParams, NetlessApp } from \"@netless/window-manager\";\nimport type {\n AnimationMode,\n ApplianceNames,\n Camera,\n Color,\n ConversionResponse,\n HotKey,\n HotKeys,\n JoinRoomParams,\n MemberState,\n Rectangle,\n Room,\n RoomPhase as RoomPhaseEnum,\n RoomCallbacks,\n RoomState,\n SceneDefinition,\n ShapeType,\n ViewCallbacks,\n WhiteWebSdkConfiguration,\n} from \"white-web-sdk\";\n\nimport { DefaultHotKeys, WhiteWebSdk, contentModeScale } from \"white-web-sdk\";\nimport { BuiltinApps, WindowManager } from \"@netless/window-manager\";\nimport {\n getImageSize,\n genUID,\n convertedFileToScene,\n makeSlideParams,\n readable,\n writable,\n warn,\n} from \"../utils\";\nimport { ensure_window_manager, transform_app_status } from \"../internal\";\nimport { register } from \"../behaviors\";\n\nclass FastboardAppBase {\n public constructor(\n readonly sdk: WhiteWebSdk,\n readonly room: Room,\n readonly manager: WindowManager,\n readonly hotKeys: Partial<HotKeys>\n ) {}\n\n protected _destroyed = false;\n protected _assertNotDestroyed() {\n if (this._destroyed) {\n throw new Error(\"FastboardApp has been destroyed\");\n }\n }\n\n protected _addRoomListener<K extends keyof RoomCallbacks>(name: K, listener: RoomCallbacks[K]) {\n this._assertNotDestroyed();\n this.room.callbacks.on(name, listener);\n return () => this.room.callbacks.off(name, listener);\n }\n\n protected _addManagerListener<K extends keyof PublicEvent>(\n name: K,\n listener: (value: PublicEvent[K]) => void\n ) {\n this._assertNotDestroyed();\n this.manager.emitter.on(name, listener);\n return () => this.manager.emitter.off(name, listener);\n }\n\n protected _addMainViewListener<K extends keyof ViewCallbacks>(name: K, listener: ViewCallbacks[K]) {\n this._assertNotDestroyed();\n this.manager.mainView.callbacks.on(name, listener);\n return () => this.manager.mainView.callbacks.off(name, listener);\n }\n\n /**\n * Destroy fastboard (disconnect from the whiteboard room).\n */\n public destroy() {\n this._destroyed = true;\n this.manager.destroy();\n return this.room.disconnect();\n }\n}\n\ntype RoomPhase = `${RoomPhaseEnum}`;\n\nexport type {\n AddPageParams,\n AnimationMode,\n ApplianceNames,\n Camera,\n Color,\n ConversionResponse,\n HotKey,\n HotKeys,\n JoinRoomParams,\n MemberState,\n MountParams,\n NetlessApp,\n PublicEvent,\n Rectangle,\n Room,\n RoomPhase,\n RoomCallbacks,\n RoomState,\n SceneDefinition,\n ShapeType,\n ViewCallbacks,\n WhiteWebSdk,\n WhiteWebSdkConfiguration,\n WindowManager,\n};\n\n/** pencil, eraser, rectangle... */\nexport type Appliance = `${ApplianceNames}`;\n/** triangle, star... */\nexport type Shape = `${ShapeType}`;\n\n/** Params for static docs, they are rendered as many images. */\nexport interface InsertDocsStatic {\n readonly fileType: \"pdf\";\n /** Unique string for binding whiteboard view to the doc. Must start with `/`. */\n readonly scenePath: string;\n /** @example [{ name: '1', ppt: { src: 'url/to/ppt/1.png' } }] */\n readonly scenes: SceneDefinition[];\n /** Window title. */\n readonly title?: string;\n}\n\n/** Params for slides, they are rendered in @netless/app-slide with animations. */\nexport interface InsertDocsDynamic {\n readonly fileType: \"pptx\";\n /** Unique string for binding whiteboard view to the doc. Must start with `/`. */\n readonly scenePath: string;\n /** Conversion task id, see https://developer.netless.link/server-en/home/server-conversion#get-query-task-conversion-progress. */\n readonly taskId: string;\n /** Window title. */\n readonly title?: string;\n /** Where the slide resource placed. @default `https://convertcdn.netless.link/dynamicConvert` */\n readonly url?: string;\n /** @example [{ name: '1' }, { name: '2' }, { name: '3' }] */\n readonly scenes?: SceneDefinition[];\n}\n\nexport type InsertDocsParams = InsertDocsStatic | InsertDocsDynamic;\n\nexport type SetMemberStateFn = (partialMemberState: Partial<MemberState>) => void;\n\nexport type RoomStateChanged = (diff: Partial<RoomState>) => void;\n\n/** App download progress. */\nexport interface AppsStatus {\n [kind: string]: {\n status: \"idle\" | \"loading\" | \"failed\";\n /** Exist if status is `failed`. */\n reason?: string;\n };\n}\n\nexport class FastboardApp extends FastboardAppBase {\n /**\n * Render this app to some DOM.\n */\n bindContainer(container: HTMLElement) {\n this._assertNotDestroyed();\n this.manager.bindContainer(container);\n }\n\n /**\n * Move window-manager's collector to some place.\n */\n bindCollector(container: HTMLElement) {\n this._assertNotDestroyed();\n this.manager.bindCollectorContainer(container);\n }\n\n /**\n * Is current room writable?\n */\n readonly writable = writable(\n this.room.isWritable,\n set => {\n set(this.room.isWritable);\n return this._addRoomListener(\"onEnableWriteNowChanged\", () => set(this.room.isWritable));\n },\n this.room.setWritable.bind(this.room)\n );\n\n /**\n * Is current room online?\n */\n readonly phase = readable<RoomPhase>(this.room.phase, set => {\n set(this.room.phase);\n return this._addRoomListener(\"onPhaseChanged\", set);\n });\n\n /**\n * Current window-manager's windows' state (is it maximized?).\n */\n readonly boxState = readable(this.manager.boxState, set => {\n set(this.manager.boxState);\n return this._addManagerListener(\"boxStateChange\", set);\n });\n\n /**\n * Current window-manager's focused app's id.\n * @example \"HelloWorld-1A2b3C4d\"\n */\n readonly focusedApp = readable(this.manager.focused, set => {\n set(this.manager.focused);\n return this._addManagerListener(\"focusedChange\", set);\n });\n\n /**\n * How many times can I call `app.redo()`?\n */\n readonly canRedoSteps = readable(this.manager.canRedoSteps, set => {\n set(this.manager.canRedoSteps);\n return this._addManagerListener(\"canRedoStepsChange\", set);\n });\n\n /**\n * How many times can I call `app.undo()`?\n */\n readonly canUndoSteps = readable(this.manager.canUndoSteps, set => {\n set(this.manager.canUndoSteps);\n return this._addManagerListener(\"canUndoStepsChange\", set);\n });\n\n /**\n * Current camera information of main view.\n *\n * Change the camera position by `app.moveCamera()`.\n */\n readonly camera = readable(this.manager.camera, set => {\n set(this.manager.camera);\n return this._addMainViewListener(\"onCameraUpdated\", set);\n });\n\n /**\n * Current tool's info, like \"is using pencil?\", \"what color?\".\n *\n * Change the tool by `app.setAppliance()`.\n */\n readonly memberState = readable(this.room.state.memberState, set => {\n set(this.room.state.memberState);\n return this._addRoomListener(\"onRoomStateChanged\", ({ memberState: m }) => m && set(m));\n });\n\n /**\n * 0..n-1, current index of main view scenes.\n */\n readonly sceneIndex = writable(\n this.manager.mainViewSceneIndex,\n set => {\n set(this.manager.mainViewSceneIndex);\n return this._addManagerListener(\"mainViewSceneIndexChange\", set);\n },\n this.manager.setMainViewSceneIndex.bind(this.manager)\n );\n\n /**\n * How many pages are in the main view?\n */\n readonly sceneLength = readable(this.manager.mainViewScenesLength, set => {\n set(this.manager.mainViewScenesLength);\n return this._addManagerListener(\"mainViewScenesLengthChange\", set);\n });\n\n private _appsStatus: AppsStatus = {};\n /**\n * Apps status.\n */\n readonly appsStatus = readable<AppsStatus>({}, set =>\n this._addManagerListener(\"loadApp\", ({ kind, status, reason }) => {\n this._appsStatus[kind] = { status: transform_app_status(status), reason };\n set(this._appsStatus);\n })\n );\n\n /**\n * Undo a step on main view.\n */\n undo() {\n this._assertNotDestroyed();\n this.manager.undo();\n }\n\n /**\n * Redo a step on main view.\n */\n redo() {\n this._assertNotDestroyed();\n this.manager.redo();\n }\n\n /**\n * Move current main view's camera position.\n */\n moveCamera(camera: Partial<Camera> & { animationMode?: AnimationMode | undefined }) {\n this._assertNotDestroyed();\n this.manager.moveCamera(camera);\n }\n\n /**\n * Move current main view's camera to include a rectangle.\n */\n moveCameraToContain(rectangle: Rectangle & { animationMode?: AnimationMode }) {\n this._assertNotDestroyed();\n this.manager.moveCameraToContain(rectangle);\n }\n\n /**\n * Delete all things on the main view.\n */\n cleanCurrentScene() {\n this._assertNotDestroyed();\n this.manager.cleanCurrentScene();\n }\n\n /**\n * Set current tool, like \"pencil\".\n */\n setAppliance(appliance: ApplianceNames | Appliance, shape?: ShapeType | Shape) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({\n currentApplianceName: appliance as ApplianceNames,\n shapeType: shape as ShapeType,\n });\n }\n\n /**\n * Set pencil and shape's thickness.\n */\n setStrokeWidth(strokeWidth: number) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ strokeWidth });\n }\n\n /**\n * Set pencil and shape's color.\n */\n setStrokeColor(strokeColor: Color) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ strokeColor });\n }\n\n /**\n * Set text size. Default is 16.\n */\n setTextSize(textSize: number) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ textSize });\n }\n\n /**\n * Set text color.\n *\n * @example\n * setTextColor([0x66, 0xcc, 0xff])\n */\n setTextColor(textColor: Color) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ textColor });\n }\n\n /**\n * Goto previous page (the main whiteboard view).\n */\n prevPage() {\n this._assertNotDestroyed();\n return this.manager.prevPage();\n }\n\n /**\n * Goto next page (the main whiteboard view).\n */\n nextPage() {\n this._assertNotDestroyed();\n return this.manager.nextPage();\n }\n\n /**\n * Add one page to the main whiteboard view.\n *\n * @example\n * addPage({ after: true }) // add one page right after current one.\n * nextPage() // then, goto that page.\n */\n addPage(params?: AddPageParams) {\n this._assertNotDestroyed();\n return this.manager.addPage(params);\n }\n\n /**\n * Remove one page at given index or current page (by default).\n *\n * Requires `@netless/window-manager` >= 0.4.30.\n *\n * @example\n * removePage() // remove current page\n */\n removePage(index?: number) {\n this._assertNotDestroyed();\n return this.manager.removePage(index);\n }\n\n /**\n * Insert an image to the main view.\n *\n * @example\n * insertImage(\"https://i.imgur.com/CzXTtJV.jpg\")\n */\n async insertImage(url: string) {\n this._assertNotDestroyed();\n await this.manager.switchMainViewToWriter();\n\n const { divElement } = this.manager.mainView;\n const containerSize = {\n width: divElement?.scrollWidth || window.innerWidth,\n height: divElement?.scrollHeight || window.innerHeight,\n };\n\n // 1. shrink the image a little to fit container **width**\n const maxWidth = containerSize.width * 0.8;\n let { width, height } = await getImageSize(url, containerSize);\n const scale = Math.min(maxWidth / width, 1);\n const uuid = genUID();\n const { centerX, centerY } = this.manager.camera;\n width *= scale;\n height *= scale;\n this.manager.mainView.insertImage({ uuid, centerX, centerY, width, height, locked: false });\n this.manager.mainView.completeImageUpload(uuid, url);\n\n // 2. move camera to fit image **height**\n width /= 0.8;\n height /= 0.8;\n const originX = centerX - width / 2;\n const originY = centerY - height / 2;\n this.manager.moveCameraToContain({ originX, originY, width, height });\n }\n\n /**\n * Insert PDF/PPTX from conversion result.\n * @param status https://developer.netless.link/server-en/home/server-conversion#get-query-task-conversion-progress\n */\n insertDocs(filename: string, status: ConversionResponse): Promise<string | undefined>;\n\n /**\n * Manual way.\n * @example\n * app.insertDocs({\n * fileType: 'pptx',\n * scenePath: `/pptx/${conversion.taskId}`,\n * taskId: conversion.taskId,\n * title: 'Title',\n * })\n */\n insertDocs(params: InsertDocsParams): Promise<string | undefined>;\n\n insertDocs(arg1: string | InsertDocsParams, arg2?: ConversionResponse) {\n this._assertNotDestroyed();\n if (typeof arg1 === \"object\" && \"fileType\" in arg1) {\n return this._insertDocsImpl(arg1);\n } else if (arg2 && arg2.status !== \"Finished\") {\n throw new Error(\"FastboardApp cannot insert a converting doc.\");\n } else if (arg2 && arg2.progress) {\n const title = arg1;\n const scenePath = `/${arg2.uuid}/${genUID()}`;\n const scenes1 = arg2.progress.convertedFileList.map(convertedFileToScene);\n const { scenes, taskId, url } = makeSlideParams(scenes1);\n if (taskId && url) {\n return this._insertDocsImpl({ fileType: \"pptx\", scenePath, scenes, title, taskId, url });\n } else {\n return this._insertDocsImpl({ fileType: \"pdf\", scenePath, scenes: scenes1, title });\n }\n }\n }\n\n private _insertDocsImpl({ fileType, scenePath, title, scenes, ...attributes }: InsertDocsParams) {\n this._assertNotDestroyed();\n switch (fileType) {\n case \"pdf\":\n return this.manager.addApp({\n kind: \"DocsViewer\",\n options: { scenePath, title, scenes },\n });\n case \"pptx\":\n if (scenes && scenes[0].ppt) {\n warn(\"no-ppt-in-scenes\");\n }\n return this.manager.addApp({\n kind: \"Slide\",\n options: { scenePath, title, scenes },\n attributes,\n });\n }\n }\n\n /**\n * Insert the Media Player app.\n */\n insertMedia(title: string, src: string) {\n this._assertNotDestroyed();\n return this.manager.addApp({\n kind: BuiltinApps.MediaPlayer,\n options: { title },\n attributes: { src },\n });\n }\n\n /**\n * Insert the Monaco Code Editor app.\n * @deprecated Use `app.manager.addApp({ kind: 'Monaco' })` instead.\n */\n insertCodeEditor() {\n this._assertNotDestroyed();\n return this.manager.addApp({\n kind: \"Monaco\",\n options: { title: \"Code Editor\" },\n });\n }\n\n /**\n * Insert the Countdown app.\n * @deprecated Use `app.manager.addApp({ kind: 'Countdown' })` instead.\n */\n insertCountdown() {\n this._assertNotDestroyed();\n return this.manager.addApp({\n kind: \"Countdown\",\n options: { title: \"Countdown\" },\n });\n }\n\n /**\n * Insert the GeoGebra app.\n * @deprecated Use `app.manager.addApp({ kind: 'GeoGebra' })` instead.\n */\n insertGeoGebra() {\n this._assertNotDestroyed();\n return this.manager.addApp({\n kind: \"GeoGebra\",\n options: { title: \"GeoGebra\" },\n });\n }\n}\n\nexport interface FastboardOptions {\n sdkConfig: Omit<WhiteWebSdkConfiguration, \"useMobXState\"> & {\n region: NonNullable<WhiteWebSdkConfiguration[\"region\"]>;\n };\n joinRoom: Omit<JoinRoomParams, \"useMultiViews\" | \"disableNewPencil\" | \"disableMagixEventDispatchLimit\"> & {\n callbacks?: Partial<RoomCallbacks>;\n };\n managerConfig?: Omit<MountParams, \"room\">;\n netlessApps?: NetlessApp[];\n}\n\n/**\n * Create a FastboardApp instance.\n * @example\n * let app = await createFastboard({\n * sdkConfig: {\n * appIdentifier: import.meta.env.VITE_APPID,\n * region: 'cn-hz',\n * },\n * joinRoom: {\n * uid: unique_id,\n * uuid: import.meta.env.VITE_ROOM_UUID,\n * roomToken: import.meta.env.VITE_ROOM_TOKEN,\n * },\n * })\n */\nexport async function createFastboard({\n sdkConfig,\n joinRoom: { callbacks, ...joinRoomParams },\n managerConfig,\n netlessApps,\n}: FastboardOptions) {\n const sdk = new WhiteWebSdk({\n ...sdkConfig,\n useMobXState: true,\n });\n\n const hotKeys: 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 if (netlessApps) {\n netlessApps.forEach(app => {\n register({ kind: app.kind, src: app });\n });\n }\n\n const room = await sdk.joinRoom(\n {\n floatBar: true,\n hotKeys,\n ...ensure_window_manager(joinRoomParams),\n useMultiViews: true,\n disableNewPencil: false,\n disableMagixEventDispatchLimit: true,\n },\n callbacks\n );\n\n const manager = await WindowManager.mount({\n cursor: true,\n ...managerConfig,\n room,\n });\n\n manager.mainView.setCameraBound({\n minContentMode: contentModeScale(0.3),\n maxContentMode: contentModeScale(3),\n });\n\n return new FastboardApp(sdk, room, manager, hotKeys);\n}\n","import type { JoinRoomParams, ReplayRoomParams } from \"white-web-sdk\";\nimport type { PublicEvent } from \"@netless/window-manager\";\nimport { WindowManager } from \"@netless/window-manager\";\n\nexport function ensure_window_manager<T extends JoinRoomParams | ReplayRoomParams>(joinRoom: T): T {\n if (!joinRoom.invisiblePlugins || !joinRoom.invisiblePlugins.includes(WindowManager)) {\n joinRoom.invisiblePlugins = [...(joinRoom.invisiblePlugins || []), WindowManager];\n }\n return joinRoom;\n}\n\nexport function transform_app_status(status: PublicEvent[\"loadApp\"][\"status\"]) {\n return status === \"start\" ? \"loading\" : status === \"failed\" ? \"failed\" : \"idle\";\n}\n","import type { RegisterParams } from \"@netless/window-manager\";\nimport { WindowManager } from \"@netless/window-manager\";\nimport SlideApp, { apps, addHooks, previewSlide } from \"@netless/app-slide\";\n\nexport type {\n AppOptions as SlideOptions,\n Controller as SlideController,\n PreviewParams,\n SlidePreviewer,\n} from \"@netless/app-slide\";\nexport { previewSlide, SlideApp, addHooks as addSlideHooks, apps as slideApps };\n\nexport interface AppsConfig {\n [kind: string]: Omit<RegisterParams, \"kind\">;\n}\n\nconst DefaultApps: AppsConfig = {\n Monaco: {\n src: \"https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-monaco/0.1.12/dist/main.iife.js\",\n },\n Countdown: {\n src: \"https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-countdown/0.0.2/dist/main.iife.js\",\n },\n GeoGebra: {\n src: \"https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-geogebra/0.0.4/dist/main.iife.js\",\n appOptions: {\n HTML5Codebase: \"https://flat-storage-cn-hz.whiteboard.agora.io/GeoGebra/HTML5/5.0/web3d\",\n },\n },\n EmbeddedPage: {\n src: \"https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-embedded-page/0.1.1/dist/main.iife.js\",\n },\n Plyr: {\n src: \"https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-plyr/0.1.3/dist/main.iife.js\",\n },\n};\n\nWindowManager.register({\n kind: \"Slide\",\n appOptions: { debug: false },\n src: SlideApp,\n addHooks,\n});\n\nfor (const kind in DefaultApps) {\n if (Object.prototype.hasOwnProperty.call(DefaultApps, kind)) {\n const options = DefaultApps[kind];\n WindowManager.register({ kind, ...options });\n }\n}\n\nexport const register = WindowManager.register.bind(WindowManager);\n\ndeclare let __NAME__: string, __VERSION__: string;\n\nexport const version = __VERSION__;\n\nif (typeof window !== \"undefined\") {\n let str = (window as { __netlessUA?: string }).__netlessUA || \"\";\n str += ` ${__NAME__}@${version} `;\n (window as { __netlessUA?: string }).__netlessUA = str;\n}\n","import type { MountParams, PublicEvent } from \"@netless/window-manager\";\nimport type {\n Player,\n PlayerPhase as PlayerPhaseEnum,\n PlayerCallbacks,\n PlayerState,\n PlayerSeekingResult,\n ReplayRoomParams,\n ViewCallbacks,\n WhiteWebSdkConfiguration,\n} from \"white-web-sdk\";\n\nimport { WhiteWebSdk } from \"white-web-sdk\";\nimport { WindowManager } from \"@netless/window-manager\";\nimport { readable, writable } from \"../utils\";\nimport { ensure_window_manager } from \"../internal\";\n\nclass FastboardPlayerBase {\n public constructor(readonly sdk: WhiteWebSdk, readonly player: Player, readonly manager: WindowManager) {}\n\n protected _destroyed = false;\n protected _assertNotDestroyed() {\n if (this._destroyed) {\n throw new Error(\"FastboardApp has been destroyed\");\n }\n }\n\n protected _addPlayerListener<K extends keyof PlayerCallbacks>(name: K, listener: PlayerCallbacks[K]) {\n this._assertNotDestroyed();\n this.player.callbacks.on(name, listener);\n return () => this.player.callbacks.off(name, listener);\n }\n\n protected _addManagerListener<K extends keyof PublicEvent>(\n name: K,\n listener: (value: PublicEvent[K]) => void\n ) {\n this._assertNotDestroyed();\n this.manager.emitter.on(name, listener);\n return () => this.manager.emitter.off(name, listener);\n }\n\n protected _addMainViewListener<K extends keyof ViewCallbacks>(name: K, listener: ViewCallbacks[K]) {\n this._assertNotDestroyed();\n this.manager.mainView.callbacks.on(name, listener);\n return () => this.manager.mainView.callbacks.off(name, listener);\n }\n\n public destroy() {\n this._destroyed = true;\n this.manager.destroy();\n return this.player.callbacks.off();\n }\n}\n\ntype PlayerPhase = `${PlayerPhaseEnum}`;\n\nexport type { PlayerPhase, PlayerSeekingResult };\n\nexport class FastboardPlayer extends FastboardPlayerBase {\n /**\n * Render this player to some DOM.\n */\n bindContainer(container: HTMLElement) {\n this._assertNotDestroyed();\n this.manager.bindContainer(container);\n }\n\n /**\n * Move window-manager's collector to some place.\n */\n bindCollector(container: HTMLElement) {\n this._assertNotDestroyed();\n this.manager.bindCollectorContainer(container);\n }\n\n /**\n * Player current time in milliseconds.\n */\n readonly currentTime = writable(\n this.player.progressTime,\n set => {\n set(this.player.progressTime);\n return this._addPlayerListener(\"onProgressTimeChanged\", set);\n },\n this.player.seekToProgressTime.bind(this.player)\n );\n\n /**\n * Player state, like \"is it playing?\".\n */\n readonly phase = readable<PlayerPhase>(this.player.phase, set => {\n set(this.player.phase);\n return this._addPlayerListener(\"onPhaseChanged\", set);\n });\n\n /**\n * Will become true after buffering.\n */\n readonly canplay = readable(this.player.isPlayable, set => {\n set(this.player.isPlayable);\n return this._addPlayerListener(\"onIsPlayableChanged\", set);\n });\n\n private _setPlaybackRate!: (value: number) => void;\n /**\n * Playback speed, default `1`.\n */\n readonly playbackRate = writable(\n this.player.playbackSpeed,\n set => {\n this._setPlaybackRate = set;\n set(this.player.playbackSpeed);\n },\n value => {\n this.player.playbackSpeed = value;\n this._setPlaybackRate(value);\n }\n );\n\n /**\n * Playback duration in milliseconds.\n */\n readonly duration = readable(this.player.timeDuration, set => {\n set(this.player.timeDuration);\n });\n\n /**\n * Get state of room at that time, like \"who was in the room?\".\n */\n readonly state = readable<PlayerState>(this.player.state, set => {\n set(this.player.state);\n return this._addPlayerListener(\"onPlayerStateChanged\", () => set(this.player.state));\n });\n\n /**\n * Seek to some time in milliseconds.\n */\n seek(timestamp: number) {\n this._assertNotDestroyed();\n return this.player.seekToProgressTime(timestamp);\n }\n\n /**\n * Change player state to playing.\n */\n play() {\n this._assertNotDestroyed();\n this.player.play();\n }\n\n /**\n * Change player state to paused.\n */\n pause() {\n this._assertNotDestroyed();\n this.player.pause();\n }\n\n /**\n * Change player state to stopped.\n */\n stop() {\n this._assertNotDestroyed();\n this.player.stop();\n }\n\n /**\n * Set playback speed, a shortcut for `speed.set(x)`.\n */\n setPlaybackRate(value: number) {\n this._assertNotDestroyed();\n this.playbackRate.set(value);\n }\n}\n\nexport interface FastboardReplayOptions {\n sdkConfig: Omit<WhiteWebSdkConfiguration, \"useMobXState\"> & {\n region: NonNullable<WhiteWebSdkConfiguration[\"region\"]>;\n };\n replayRoom: Omit<ReplayRoomParams, \"useMultiViews\"> & {\n callbacks?: Partial<PlayerCallbacks>;\n };\n managerConfig?: Omit<MountParams, \"room\">;\n}\n\n/**\n * Create a FastboardPlayer instance.\n * @example\n * let player = await replayFastboard({\n * sdkConfig: {\n * appIdentifier: import.meta.env.VITE_APPID,\n * region: 'cn-hz',\n * },\n * replayRoom: {\n * room: \"room uuid\",\n * roomToken: \"NETLESSROOM_...\",\n * beginTimestamp: 1646619090394,\n * duration: 70448,\n * },\n * })\n */\nexport async function replayFastboard({\n sdkConfig,\n replayRoom: { callbacks, ...replayRoomParams },\n managerConfig,\n}: FastboardReplayOptions) {\n const sdk = new WhiteWebSdk({\n ...sdkConfig,\n useMobXState: true,\n });\n\n const player = await sdk.replayRoom(\n {\n ...ensure_window_manager(replayRoomParams),\n useMultiViews: true,\n },\n callbacks\n );\n\n const managerPromise = WindowManager.mount({\n cursor: true,\n ...managerConfig,\n room: player,\n });\n\n player.play();\n const manager = await managerPromise;\n player.pause();\n await player.seekToProgressTime(0);\n\n return new FastboardPlayer(sdk, player, manager);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@netless/fastboard-core",
|
|
3
|
-
"version": "0.3.4
|
|
3
|
+
"version": "0.3.4",
|
|
4
4
|
"description": "A tiny wrapper of white-web-sdk and @netless/window-manager.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"files": [
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
],
|
|
10
10
|
"repository": "netless-io/fastboard",
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@netless/app-slide": "^0.2.
|
|
12
|
+
"@netless/app-slide": "^0.2.2"
|
|
13
13
|
},
|
|
14
14
|
"peerDependencies": {
|
|
15
15
|
"@netless/window-manager": ">=0.4.0",
|
package/src/impl/FastboardApp.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AddPageParams, PublicEvent, MountParams } from "@netless/window-manager";
|
|
1
|
+
import type { AddPageParams, PublicEvent, MountParams, NetlessApp } from "@netless/window-manager";
|
|
2
2
|
import type {
|
|
3
3
|
AnimationMode,
|
|
4
4
|
ApplianceNames,
|
|
@@ -32,6 +32,7 @@ import {
|
|
|
32
32
|
warn,
|
|
33
33
|
} from "../utils";
|
|
34
34
|
import { ensure_window_manager, transform_app_status } from "../internal";
|
|
35
|
+
import { register } from "../behaviors";
|
|
35
36
|
|
|
36
37
|
class FastboardAppBase {
|
|
37
38
|
public constructor(
|
|
@@ -93,6 +94,7 @@ export type {
|
|
|
93
94
|
JoinRoomParams,
|
|
94
95
|
MemberState,
|
|
95
96
|
MountParams,
|
|
97
|
+
NetlessApp,
|
|
96
98
|
PublicEvent,
|
|
97
99
|
Rectangle,
|
|
98
100
|
Room,
|
|
@@ -550,6 +552,7 @@ export interface FastboardOptions {
|
|
|
550
552
|
callbacks?: Partial<RoomCallbacks>;
|
|
551
553
|
};
|
|
552
554
|
managerConfig?: Omit<MountParams, "room">;
|
|
555
|
+
netlessApps?: NetlessApp[];
|
|
553
556
|
}
|
|
554
557
|
|
|
555
558
|
/**
|
|
@@ -571,6 +574,7 @@ export async function createFastboard({
|
|
|
571
574
|
sdkConfig,
|
|
572
575
|
joinRoom: { callbacks, ...joinRoomParams },
|
|
573
576
|
managerConfig,
|
|
577
|
+
netlessApps,
|
|
574
578
|
}: FastboardOptions) {
|
|
575
579
|
const sdk = new WhiteWebSdk({
|
|
576
580
|
...sdkConfig,
|
|
@@ -591,6 +595,12 @@ export async function createFastboard({
|
|
|
591
595
|
changeToHand: "h",
|
|
592
596
|
};
|
|
593
597
|
|
|
598
|
+
if (netlessApps) {
|
|
599
|
+
netlessApps.forEach(app => {
|
|
600
|
+
register({ kind: app.kind, src: app });
|
|
601
|
+
});
|
|
602
|
+
}
|
|
603
|
+
|
|
594
604
|
const room = await sdk.joinRoom(
|
|
595
605
|
{
|
|
596
606
|
floatBar: true,
|