@netless/fastboard-core 0.2.12 → 0.3.0-canary.1

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.
@@ -0,0 +1,49 @@
1
+ import type { ConvertedFile, SceneDefinition, Size } from "white-web-sdk";
2
+
3
+ export function getImageSize(url: string, fallback: Size) {
4
+ return new Promise<Size>(resolve => {
5
+ const img = new Image();
6
+ img.onload = () => resolve(img);
7
+ img.onerror = () => resolve(fallback);
8
+ img.src = url;
9
+ });
10
+ }
11
+
12
+ export function makeSlideParams(scenes: SceneDefinition[]) {
13
+ const emptyScenes: SceneDefinition[] = [];
14
+ let taskId = "";
15
+ let url = "";
16
+
17
+ // e.g. "ppt(x)://cdn/prefix/dynamicConvert/{taskId}/1.slide"
18
+ const pptSrcRE = /^pptx?(?<prefix>:\/\/\S+?dynamicConvert)\/(?<taskId>\w+)\//;
19
+
20
+ for (const { name, ppt } of scenes) {
21
+ // make sure scenesWithoutPPT.length === scenes.length
22
+ emptyScenes.push({ name });
23
+
24
+ if (!ppt || !ppt.src.startsWith("ppt")) {
25
+ continue;
26
+ }
27
+ const match = pptSrcRE.exec(ppt.src);
28
+ if (!match || !match.groups) {
29
+ continue;
30
+ }
31
+ taskId = match.groups.taskId;
32
+ url = "https" + match.groups.prefix;
33
+ break;
34
+ }
35
+
36
+ return { scenes: emptyScenes, taskId, url };
37
+ }
38
+
39
+ export function convertedFileToScene(f: ConvertedFile, i: number): SceneDefinition {
40
+ return {
41
+ name: String(i + 1),
42
+ ppt: {
43
+ src: f.conversionFileUrl,
44
+ width: f.width,
45
+ height: f.height,
46
+ previewURL: f.preview,
47
+ },
48
+ };
49
+ }
@@ -0,0 +1,87 @@
1
+ // This is a simple mimic of svelte/store.
2
+ export type Subscriber<T> = (value: T) => void;
3
+ export type Unsubscriber = () => void;
4
+ export type Updater<T> = (value: T) => T;
5
+ export type StartStopNotifier<T> = (set: Subscriber<T>) => Unsubscriber | void;
6
+
7
+ export interface Readable<T> {
8
+ readonly value: T;
9
+ subscribe(this: void, run: Subscriber<T>): Unsubscriber;
10
+ reaction(this: void, run: Subscriber<T>): Unsubscriber;
11
+ }
12
+
13
+ export interface Writable<T> extends Readable<T> {
14
+ set(this: void, value: T): void;
15
+ update(this: void, updater: Updater<T>): void;
16
+ }
17
+
18
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
19
+ function noop() {}
20
+
21
+ function safe_not_equal(a: unknown, b: unknown) {
22
+ return a != a ? b == b : a !== b || (a && typeof a === "object") || typeof a === "function";
23
+ }
24
+
25
+ export function readable<T>(value: T, start: StartStopNotifier<T> = noop): Readable<T> {
26
+ let stop: Unsubscriber | undefined;
27
+ const subscribers = new Set<Subscriber<T>>();
28
+ function set(new_value: T) {
29
+ if (safe_not_equal(value, new_value)) {
30
+ value = new_value;
31
+ if (stop) {
32
+ for (const run of subscribers) {
33
+ run(value);
34
+ }
35
+ }
36
+ }
37
+ }
38
+ function subscribe(run: Subscriber<T>) {
39
+ subscribers.add(run);
40
+ if (subscribers.size === 1) {
41
+ stop = start(set) || noop;
42
+ }
43
+ run(value);
44
+ return () => {
45
+ subscribers.delete(run);
46
+ if (subscribers.size === 0) {
47
+ stop && stop();
48
+ stop = undefined;
49
+ }
50
+ };
51
+ }
52
+ function reaction(run: Subscriber<T>) {
53
+ subscribers.add(run);
54
+ if (subscribers.size === 1) {
55
+ stop = start(set) || noop;
56
+ }
57
+ return () => {
58
+ subscribers.delete(run);
59
+ if (subscribers.size === 0) {
60
+ stop && stop();
61
+ stop = undefined;
62
+ }
63
+ };
64
+ }
65
+ return {
66
+ get value() {
67
+ return value;
68
+ },
69
+ subscribe,
70
+ reaction,
71
+ };
72
+ }
73
+
74
+ export function writable<T>(value: T, start: StartStopNotifier<T> = noop, set: Subscriber<T>): Writable<T> {
75
+ const internal = readable(value, start);
76
+ return {
77
+ get value() {
78
+ return internal.value;
79
+ },
80
+ subscribe: internal.subscribe,
81
+ reaction: internal.reaction,
82
+ set,
83
+ update(fn: Updater<T>) {
84
+ set(fn(value));
85
+ },
86
+ };
87
+ }
@@ -0,0 +1,12 @@
1
+ // Copy from https://github.com/crimx/side-effect-manager/blob/main/src/gen-uid.ts
2
+ const SOUP = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
3
+ const SOUP_LEN = 62; // SOUP.length
4
+ const ID_LEN = 20;
5
+ const reusedIdCarrier = /* @__PURE__ */ Array(ID_LEN);
6
+
7
+ export function genUID() {
8
+ for (let i = 0; i < ID_LEN; i++) {
9
+ reusedIdCarrier[i] = SOUP.charAt(Math.random() * SOUP_LEN);
10
+ }
11
+ return reusedIdCarrier.join("");
12
+ }
@@ -0,0 +1,11 @@
1
+ const warnings = {
2
+ "no-ppt-in-scenes":
3
+ "You're probably inserting the slide app in a wrong way, there shouldn't exist `scenes[0].ppt`.",
4
+ } as const;
5
+ const warned = new Set<string>();
6
+
7
+ export function warn(id: keyof typeof warnings) {
8
+ if (warned.has(id)) return;
9
+ warned.add(id);
10
+ console.warn(warnings[id]);
11
+ }
@@ -1,530 +0,0 @@
1
- var __defProp = Object.defineProperty;
2
- var __defProps = Object.defineProperties;
3
- var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
- var __spreadValues = (a, b) => {
9
- for (var prop in b || (b = {}))
10
- if (__hasOwnProp.call(b, prop))
11
- __defNormalProp(a, prop, b[prop]);
12
- if (__getOwnPropSymbols)
13
- for (var prop of __getOwnPropSymbols(b)) {
14
- if (__propIsEnum.call(b, prop))
15
- __defNormalProp(a, prop, b[prop]);
16
- }
17
- return a;
18
- };
19
- var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
- var __objRest = (source, exclude) => {
21
- var target = {};
22
- for (var prop in source)
23
- if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
24
- target[prop] = source[prop];
25
- if (source != null && __getOwnPropSymbols)
26
- for (var prop of __getOwnPropSymbols(source)) {
27
- if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
28
- target[prop] = source[prop];
29
- }
30
- return target;
31
- };
32
-
33
- // src/minimal.ts
34
- import { contentModeScale, DefaultHotKeys, WhiteWebSdk } from "white-web-sdk";
35
- import { WindowManager as WindowManager3 } from "@netless/window-manager";
36
-
37
- // src/helpers/utils.ts
38
- import { WindowManager } from "@netless/window-manager";
39
- function noop() {
40
- }
41
- function safe_not_equal(a, b) {
42
- return a != a ? b == b : a !== b || a && typeof a === "object" || typeof a === "function";
43
- }
44
- function getImageSize(url, fallback) {
45
- return new Promise((resolve) => {
46
- const img = new Image();
47
- img.onload = () => resolve(img);
48
- img.onerror = () => resolve(fallback);
49
- img.src = url;
50
- });
51
- }
52
- function makeSlideParams(scenes) {
53
- const emptyScenes = [];
54
- let taskId = "";
55
- let url = "";
56
- const pptSrcRE = /^pptx?(?<prefix>:\/\/\S+?dynamicConvert)\/(?<taskId>\w+)\//;
57
- for (const { name, ppt } of scenes) {
58
- emptyScenes.push({ name });
59
- if (!ppt || !ppt.src.startsWith("ppt")) {
60
- continue;
61
- }
62
- const match = pptSrcRE.exec(ppt.src);
63
- if (!match || !match.groups) {
64
- continue;
65
- }
66
- taskId = match.groups.taskId;
67
- url = "https" + match.groups.prefix;
68
- break;
69
- }
70
- return { emptyScenes, taskId, url };
71
- }
72
- function convertedFileToScene(f, i) {
73
- return {
74
- name: String(i + 1),
75
- ppt: {
76
- src: f.conversionFileUrl,
77
- width: f.width,
78
- height: f.height,
79
- previewURL: f.preview
80
- }
81
- };
82
- }
83
- function ensureWindowManager(joinRoom) {
84
- if (!joinRoom.invisiblePlugins || !joinRoom.invisiblePlugins.includes(WindowManager)) {
85
- joinRoom.invisiblePlugins = [...joinRoom.invisiblePlugins || [], WindowManager];
86
- }
87
- return joinRoom;
88
- }
89
- var SOUP = "!#%()*+,-./:;=?@[]^_`{|}~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
90
- var SOUP_LEN = SOUP.length;
91
- var ID_LEN = 20;
92
- var reusedIdCarrier = /* @__PURE__ */ Array(ID_LEN);
93
- function genUID() {
94
- for (let i = 0; i < ID_LEN; i++) {
95
- reusedIdCarrier[i] = SOUP.charAt(Math.random() * SOUP_LEN);
96
- }
97
- return reusedIdCarrier.join("");
98
- }
99
-
100
- // src/impl/app.ts
101
- import { BuiltinApps } from "@netless/window-manager";
102
-
103
- // src/helpers/emitter.ts
104
- var FastboardEmitter = class {
105
- constructor() {
106
- this.listeners = /* @__PURE__ */ new Set();
107
- }
108
- get length() {
109
- return this.listeners.size;
110
- }
111
- dispatch(message) {
112
- this.listeners.forEach((callback) => callback(message));
113
- }
114
- addListener(listener) {
115
- this.listeners.add(listener);
116
- }
117
- removeListener(listener) {
118
- this.listeners.delete(listener);
119
- }
120
- };
121
-
122
- // src/helpers/value.ts
123
- function createValue(value, effect, setValue = noop) {
124
- const emitter = new FastboardEmitter();
125
- function set(newValue) {
126
- if (safe_not_equal(value, newValue)) {
127
- emitter.dispatch(value = newValue);
128
- }
129
- }
130
- const dispose = effect(set) || noop;
131
- function subscribe(callback) {
132
- emitter.addListener(callback);
133
- callback(value);
134
- return () => emitter.removeListener(callback);
135
- }
136
- function reaction(callback) {
137
- emitter.addListener(callback);
138
- return () => emitter.removeListener(callback);
139
- }
140
- return {
141
- get value() {
142
- return value;
143
- },
144
- subscribe,
145
- reaction,
146
- setValue,
147
- dispose
148
- };
149
- }
150
-
151
- // src/impl/app.ts
152
- var FastboardAppBase = class {
153
- constructor(sdk, room, manager, hotKeys) {
154
- this.sdk = sdk;
155
- this.room = room;
156
- this.manager = manager;
157
- this.hotKeys = hotKeys;
158
- this._disposers = [];
159
- this._destroyed = false;
160
- this.createValue = (...args) => {
161
- const value = createValue(...args);
162
- this._disposers.push(value.dispose);
163
- return value;
164
- };
165
- }
166
- _assertNotDestroyed() {
167
- if (this._destroyed) {
168
- throw new Error("[FastboardApp] Can not call any method on destroyed FastboardApp.");
169
- }
170
- }
171
- _addRoomListener(name, listener) {
172
- this._assertNotDestroyed();
173
- this.room.callbacks.on(name, listener);
174
- return () => this.room.callbacks.off(name, listener);
175
- }
176
- _addManagerListener(name, set) {
177
- this._assertNotDestroyed();
178
- this.manager.emitter.on(name, set);
179
- return () => this.manager.emitter.off(name, set);
180
- }
181
- _addMainViewListener(name, listener) {
182
- this._assertNotDestroyed();
183
- this.manager.mainView.callbacks.on(name, listener);
184
- return () => this.manager.mainView.callbacks.off(name, listener);
185
- }
186
- destroy() {
187
- this._disposers.forEach((dispose) => dispose());
188
- this._disposers.length = 0;
189
- this._destroyed = true;
190
- this.manager.destroy();
191
- return this.room.disconnect();
192
- }
193
- };
194
- var FastboardApp = class extends FastboardAppBase {
195
- constructor() {
196
- super(...arguments);
197
- this.writable = this.createValue(this.room.isWritable, (set) => this._addRoomListener("onEnableWriteNowChanged", () => set(this.room.isWritable)), this.room.setWritable.bind(this.room));
198
- this.boxState = this.createValue(this.manager.boxState, (set) => this._addManagerListener("boxStateChange", set));
199
- this.focusedApp = this.createValue(this.manager.focused, (set) => this._addManagerListener("focusedChange", set));
200
- this.canRedoSteps = this.createValue(this.manager.canRedoSteps, (set) => this._addManagerListener("canRedoStepsChange", set));
201
- this.canUndoSteps = this.createValue(this.manager.canUndoSteps, (set) => this._addManagerListener("canUndoStepsChange", set));
202
- this.camera = this.createValue(this.manager.mainView.camera, (set) => this._addMainViewListener("onCameraUpdated", set));
203
- this.memberState = this.createValue(this.room.state.memberState, (set) => this._addRoomListener("onRoomStateChanged", ({ memberState: m }) => m && set(m)));
204
- this.sceneIndex = this.createValue(this.manager.mainViewSceneIndex, (set) => this._addManagerListener("mainViewSceneIndexChange", set), this.manager.setMainViewSceneIndex.bind(this.manager));
205
- this.sceneLength = this.createValue(this.manager.mainViewScenesLength, (set) => this._addManagerListener("mainViewScenesLengthChange", set));
206
- this._appsStatus = {};
207
- this.appsStatus = this.createValue({}, (set) => this._addManagerListener("loadApp", ({ kind, status, reason }) => {
208
- this._appsStatus[kind] = {
209
- status: status === "start" ? "loading" : status === "failed" ? "failed" : "idle",
210
- reason
211
- };
212
- set(this._appsStatus);
213
- }));
214
- }
215
- bindContainer(container) {
216
- this._assertNotDestroyed();
217
- this.manager.bindContainer(container);
218
- }
219
- bindCollector(container) {
220
- this._assertNotDestroyed();
221
- this.manager.bindCollectorContainer(container);
222
- }
223
- undo() {
224
- this._assertNotDestroyed();
225
- this.manager.mainView.undo();
226
- }
227
- redo() {
228
- this._assertNotDestroyed();
229
- this.manager.mainView.redo();
230
- }
231
- moveCamera(camera) {
232
- this._assertNotDestroyed();
233
- this.manager.moveCamera(camera);
234
- }
235
- moveCameraToContain(rectangle) {
236
- this._assertNotDestroyed();
237
- this.manager.moveCameraToContain(rectangle);
238
- }
239
- cleanCurrentScene() {
240
- this._assertNotDestroyed();
241
- this.manager.cleanCurrentScene();
242
- }
243
- setAppliance(appliance, shape) {
244
- this._assertNotDestroyed();
245
- this.manager.mainView.setMemberState({ currentApplianceName: appliance, shapeType: shape });
246
- }
247
- setStrokeWidth(strokeWidth) {
248
- this._assertNotDestroyed();
249
- this.manager.mainView.setMemberState({ strokeWidth });
250
- }
251
- setStrokeColor(strokeColor) {
252
- this._assertNotDestroyed();
253
- this.manager.mainView.setMemberState({ strokeColor });
254
- }
255
- async insertImage(url) {
256
- this._assertNotDestroyed();
257
- await this.manager.switchMainViewToWriter();
258
- const { divElement } = this.manager.mainView;
259
- const containerSize = {
260
- width: (divElement == null ? void 0 : divElement.scrollWidth) || window.innerWidth,
261
- height: (divElement == null ? void 0 : divElement.scrollHeight) || window.innerHeight
262
- };
263
- const maxWidth = containerSize.width * 0.8;
264
- let { width, height } = await getImageSize(url, containerSize);
265
- const scale = Math.min(maxWidth / width, 1);
266
- const uuid = genUID();
267
- const { centerX, centerY } = this.manager.camera;
268
- width *= scale;
269
- height *= scale;
270
- this.manager.mainView.insertImage({ uuid, centerX, centerY, width, height, locked: false });
271
- this.manager.mainView.completeImageUpload(uuid, url);
272
- width /= 0.8;
273
- height /= 0.8;
274
- const originX = centerX - width / 2;
275
- const originY = centerY - height / 2;
276
- this.manager.moveCameraToContain({ originX, originY, width, height });
277
- }
278
- insertDocs(arg1, arg2) {
279
- if (typeof arg1 === "object" && "fileType" in arg1) {
280
- return this._insertDocsImpl(arg1);
281
- } else if (arg2 && arg2.status !== "Finished") {
282
- throw new Error("[FastboardApp] Can not insert a converting doc.");
283
- } else if (arg2 && arg2.progress) {
284
- const scenes = arg2.progress.convertedFileList.map(convertedFileToScene);
285
- const scenePath = `/${arg2.uuid}/${genUID()}`;
286
- const { emptyScenes, taskId, url } = makeSlideParams(scenes);
287
- if (taskId && url) {
288
- const title = arg1;
289
- return this._insertDocsImpl({ fileType: "pptx", scenePath, taskId, title, url, scenes: emptyScenes });
290
- } else {
291
- return this._insertDocsImpl({ fileType: "pdf", scenePath, scenes, title: arg1 });
292
- }
293
- }
294
- }
295
- _insertDocsImpl(_a) {
296
- var _b = _a, { fileType, scenePath, title, scenes } = _b, attributes = __objRest(_b, ["fileType", "scenePath", "title", "scenes"]);
297
- this._assertNotDestroyed();
298
- switch (fileType) {
299
- case "pdf":
300
- return this.manager.addApp({
301
- kind: "DocsViewer",
302
- options: { scenePath, title, scenes }
303
- });
304
- case "pptx":
305
- return this.manager.addApp({
306
- kind: "Slide",
307
- options: { scenePath, title, scenes },
308
- attributes
309
- });
310
- }
311
- }
312
- insertCodeEditor() {
313
- this._assertNotDestroyed();
314
- return this.manager.addApp({
315
- kind: "Monaco",
316
- options: { title: "Code Editor" }
317
- });
318
- }
319
- insertCountdown() {
320
- this._assertNotDestroyed();
321
- return this.manager.addApp({
322
- kind: "Countdown",
323
- options: { title: "Countdown" }
324
- });
325
- }
326
- insertMedia(title, src) {
327
- this._assertNotDestroyed();
328
- return this.manager.addApp({
329
- kind: BuiltinApps.MediaPlayer,
330
- options: { title },
331
- attributes: { src }
332
- });
333
- }
334
- insertGeoGebra() {
335
- this._assertNotDestroyed();
336
- return this.manager.addApp({
337
- kind: "GeoGebra",
338
- options: { title: "GeoGebra" }
339
- });
340
- }
341
- };
342
-
343
- // src/impl/player.ts
344
- var FastboardPlayerBase = class {
345
- constructor(sdk, player, manager) {
346
- this.sdk = sdk;
347
- this.player = player;
348
- this.manager = manager;
349
- this._disposers = [];
350
- this._destroyed = false;
351
- this.createValue = (...args) => {
352
- const value = createValue(...args);
353
- this._disposers.push(value.dispose);
354
- return value;
355
- };
356
- }
357
- _assertNotDestroyed() {
358
- if (this._destroyed) {
359
- throw new Error("[FastboardPlayer] Can not call any method on destroyed FastboardPlayer.");
360
- }
361
- }
362
- _addPlayerListener(name, listener) {
363
- this._assertNotDestroyed();
364
- this.player.callbacks.on(name, listener);
365
- return () => this.player.callbacks.off(name, listener);
366
- }
367
- _addManagerListener(name, set) {
368
- this._assertNotDestroyed();
369
- this.manager.emitter.on(name, set);
370
- return () => this.manager.emitter.off(name, set);
371
- }
372
- _addMainViewListener(name, listener) {
373
- this._assertNotDestroyed();
374
- this.manager.mainView.callbacks.on(name, listener);
375
- return () => this.manager.mainView.callbacks.off(name, listener);
376
- }
377
- destroy() {
378
- this._disposers.forEach((dispose) => dispose());
379
- this._disposers.length = 0;
380
- this._destroyed = true;
381
- this.manager.destroy();
382
- this.player.callbacks.off();
383
- }
384
- };
385
- var FastboardPlayer = class extends FastboardPlayerBase {
386
- constructor() {
387
- super(...arguments);
388
- this.currentTime = this.createValue(this.player.progressTime, (set) => this._addPlayerListener("onProgressTimeChanged", set), this.player.seekToProgressTime.bind(this.player));
389
- this.phase = this.createValue(this.player.phase, (set) => this._addPlayerListener("onPhaseChanged", set));
390
- this.canplay = this.createValue(this.player.isPlayable, (set) => this._addPlayerListener("onIsPlayableChanged", set));
391
- this.speed = this.createValue(this.player.playbackSpeed, (set) => {
392
- this._setSpeed = set;
393
- }, (value) => {
394
- this.player.playbackSpeed = value;
395
- this._setSpeed(value);
396
- });
397
- this.state = this.createValue(null, (set) => {
398
- const update = () => set(this.player.state);
399
- const dispose1 = this._addPlayerListener("onLoadFirstFrame", update);
400
- const dispose2 = this._addPlayerListener("onPlayerStateChanged", update);
401
- return () => (dispose1(), dispose2());
402
- });
403
- }
404
- bindContainer(container) {
405
- this._assertNotDestroyed();
406
- this.manager.bindContainer(container);
407
- }
408
- bindCollector(container) {
409
- this._assertNotDestroyed();
410
- this.manager.bindCollectorContainer(container);
411
- }
412
- seek(timestamp) {
413
- this._assertNotDestroyed();
414
- return this.player.seekToProgressTime(timestamp);
415
- }
416
- play() {
417
- this._assertNotDestroyed();
418
- this.player.play();
419
- }
420
- pause() {
421
- this._assertNotDestroyed();
422
- this.player.pause();
423
- }
424
- stop() {
425
- this._assertNotDestroyed();
426
- this.player.stop();
427
- }
428
- };
429
-
430
- // src/behaviors/register-apps.ts
431
- import { WindowManager as WindowManager2 } from "@netless/window-manager";
432
- var DefaultApps = {
433
- Monaco: {
434
- src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-monaco/0.1.12/dist/main.iife.js"
435
- },
436
- Countdown: {
437
- src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-countdown/0.0.2/dist/main.iife.js"
438
- },
439
- GeoGebra: {
440
- src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-geogebra/0.0.4/dist/main.iife.js",
441
- appOptions: {
442
- HTML5Codebase: "https://flat-storage-cn-hz.whiteboard.agora.io/GeoGebra/HTML5/5.0/web3d"
443
- }
444
- },
445
- EmbeddedPage: {
446
- src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-embedded-page/0.1.1/dist/main.iife.js"
447
- },
448
- Player: {
449
- name: "NetlessAppMediaPlayer",
450
- src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-media-player/0.1.1/dist/main.iife.js"
451
- }
452
- };
453
- for (const kind in DefaultApps) {
454
- if (Object.prototype.hasOwnProperty.call(DefaultApps, kind)) {
455
- const options = DefaultApps[kind];
456
- WindowManager2.register(__spreadValues({ kind }, options));
457
- }
458
- }
459
-
460
- // src/minimal.ts
461
- async function createFastboard(_a) {
462
- var _b = _a, {
463
- sdkConfig,
464
- joinRoom: _c
465
- } = _b, _d = _c, { callbacks } = _d, joinRoomParams = __objRest(_d, ["callbacks"]), {
466
- managerConfig
467
- } = _b;
468
- const sdk = new WhiteWebSdk(__spreadProps(__spreadValues({}, sdkConfig), {
469
- useMobXState: true
470
- }));
471
- const hotKeys = __spreadProps(__spreadValues({}, DefaultHotKeys), {
472
- changeToSelector: "s",
473
- changeToLaserPointer: "z",
474
- changeToPencil: "p",
475
- changeToRectangle: "r",
476
- changeToEllipse: "c",
477
- changeToEraser: "e",
478
- changeToText: "t",
479
- changeToStraight: "l",
480
- changeToArrow: "a",
481
- changeToHand: "h"
482
- });
483
- const room = await sdk.joinRoom(__spreadProps(__spreadValues({
484
- floatBar: true,
485
- hotKeys
486
- }, ensureWindowManager(joinRoomParams)), {
487
- useMultiViews: true,
488
- disableNewPencil: false,
489
- disableMagixEventDispatchLimit: true
490
- }), callbacks);
491
- const manager = await WindowManager3.mount(__spreadProps(__spreadValues({
492
- cursor: true
493
- }, managerConfig), {
494
- room
495
- }));
496
- manager.mainView.setCameraBound({
497
- minContentMode: contentModeScale(0.3),
498
- maxContentMode: contentModeScale(3)
499
- });
500
- return new FastboardApp(sdk, room, manager, hotKeys);
501
- }
502
- async function replayFastboard(_a) {
503
- var _b = _a, {
504
- sdkConfig,
505
- replayRoom: _c
506
- } = _b, _d = _c, { callbacks } = _d, replayRoomParams = __objRest(_d, ["callbacks"]), {
507
- managerConfig
508
- } = _b;
509
- const sdk = new WhiteWebSdk(__spreadProps(__spreadValues({}, sdkConfig), {
510
- useMobXState: true
511
- }));
512
- const player = await sdk.replayRoom(__spreadProps(__spreadValues({}, ensureWindowManager(replayRoomParams)), {
513
- useMultiViews: true
514
- }), callbacks);
515
- const managerPromise = WindowManager3.mount(__spreadProps(__spreadValues({
516
- cursor: true
517
- }, managerConfig), {
518
- room: player
519
- }));
520
- player.play();
521
- const manager = await managerPromise;
522
- player.pause();
523
- return new FastboardPlayer(sdk, player, manager);
524
- }
525
-
526
- export {
527
- createFastboard,
528
- replayFastboard
529
- };
530
- //# sourceMappingURL=chunk-ITPURPVI.mjs.map