@netless/fastboard-core 0.2.11 → 0.3.0-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -58,66 +58,89 @@ var __toCommonJS = /* @__PURE__ */ ((cache) => {
58
58
  // src/index.ts
59
59
  var src_exports = {};
60
60
  __export(src_exports, {
61
- DefaultApps: () => DefaultApps,
61
+ FastboardApp: () => FastboardApp,
62
+ FastboardPlayer: () => FastboardPlayer,
63
+ convertedFileToScene: () => convertedFileToScene,
62
64
  createFastboard: () => createFastboard,
63
- registerApps: () => registerApps,
64
- replayFastboard: () => replayFastboard
65
+ genUID: () => genUID,
66
+ getImageSize: () => getImageSize,
67
+ makeSlideParams: () => makeSlideParams,
68
+ readable: () => readable,
69
+ replayFastboard: () => replayFastboard,
70
+ warn: () => warn,
71
+ writable: () => writable
65
72
  });
66
73
 
67
- // src/behaviors/register-slide.ts
68
- var import_window_manager = require("@netless/window-manager");
69
- var import_app_slide = __toESM(require("@netless/app-slide"));
70
- import_window_manager.WindowManager.register({
71
- kind: "Slide",
72
- appOptions: {
73
- debug: false
74
- },
75
- src: import_app_slide.default
76
- });
77
-
78
- // src/minimal.ts
79
- var import_white_web_sdk = require("white-web-sdk");
80
- var import_window_manager5 = require("@netless/window-manager");
81
-
82
- // src/behaviors/register-apps.ts
83
- var import_window_manager2 = require("@netless/window-manager");
84
- var DefaultApps = {
85
- Monaco: {
86
- src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-monaco/0.1.12/dist/main.iife.js"
87
- },
88
- Countdown: {
89
- src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-countdown/0.0.2/dist/main.iife.js"
90
- },
91
- GeoGebra: {
92
- src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-geogebra/0.0.4/dist/main.iife.js",
93
- appOptions: {
94
- HTML5Codebase: "https://flat-storage-cn-hz.whiteboard.agora.io/GeoGebra/HTML5/5.0/web3d"
74
+ // src/utils/store.ts
75
+ function noop() {
76
+ }
77
+ function safe_not_equal(a, b) {
78
+ return a != a ? b == b : a !== b || a && typeof a === "object" || typeof a === "function";
79
+ }
80
+ function readable(value, start = noop) {
81
+ let stop;
82
+ const subscribers = /* @__PURE__ */ new Set();
83
+ function set(new_value) {
84
+ if (safe_not_equal(value, new_value)) {
85
+ value = new_value;
86
+ if (stop) {
87
+ for (const run of subscribers) {
88
+ run(value);
89
+ }
90
+ }
95
91
  }
96
- },
97
- EmbeddedPage: {
98
- src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-embedded-page/0.1.1/dist/main.iife.js"
99
- },
100
- Player: {
101
- name: "NetlessAppMediaPlayer",
102
- src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-media-player/0.1.1/dist/main.iife.js"
103
92
  }
104
- };
105
- function registerApps(config) {
106
- for (const kind in config) {
107
- if (Object.prototype.hasOwnProperty.call(config, kind)) {
108
- const options = config[kind];
109
- import_window_manager2.WindowManager.register(__spreadValues({ kind }, options));
93
+ function subscribe(run) {
94
+ subscribers.add(run);
95
+ if (subscribers.size === 1) {
96
+ stop = start(set) || noop;
110
97
  }
98
+ run(value);
99
+ return () => {
100
+ subscribers.delete(run);
101
+ if (subscribers.size === 0) {
102
+ stop && stop();
103
+ stop = void 0;
104
+ }
105
+ };
111
106
  }
107
+ function reaction(run) {
108
+ subscribers.add(run);
109
+ if (subscribers.size === 1) {
110
+ stop = start(set) || noop;
111
+ }
112
+ return () => {
113
+ subscribers.delete(run);
114
+ if (subscribers.size === 0) {
115
+ stop && stop();
116
+ stop = void 0;
117
+ }
118
+ };
119
+ }
120
+ return {
121
+ get value() {
122
+ return value;
123
+ },
124
+ subscribe,
125
+ reaction
126
+ };
112
127
  }
113
-
114
- // src/helpers/utils.ts
115
- var import_window_manager3 = require("@netless/window-manager");
116
- function noop() {
117
- }
118
- function safe_not_equal(a, b) {
119
- return a != a ? b == b : a !== b || a && typeof a === "object" || typeof a === "function";
128
+ function writable(value, start = noop, set) {
129
+ const internal = readable(value, start);
130
+ return {
131
+ get value() {
132
+ return internal.value;
133
+ },
134
+ subscribe: internal.subscribe,
135
+ reaction: internal.reaction,
136
+ set,
137
+ update(fn) {
138
+ set(fn(value));
139
+ }
140
+ };
120
141
  }
142
+
143
+ // src/utils/misc.ts
121
144
  function getImageSize(url, fallback) {
122
145
  return new Promise((resolve) => {
123
146
  const img = new Image();
@@ -144,7 +167,7 @@ function makeSlideParams(scenes) {
144
167
  url = "https" + match.groups.prefix;
145
168
  break;
146
169
  }
147
- return { emptyScenes, taskId, url };
170
+ return { scenes: emptyScenes, taskId, url };
148
171
  }
149
172
  function convertedFileToScene(f, i) {
150
173
  return {
@@ -157,14 +180,10 @@ function convertedFileToScene(f, i) {
157
180
  }
158
181
  };
159
182
  }
160
- function ensureWindowManager(joinRoom) {
161
- if (!joinRoom.invisiblePlugins || !joinRoom.invisiblePlugins.includes(import_window_manager3.WindowManager)) {
162
- joinRoom.invisiblePlugins = [...joinRoom.invisiblePlugins || [], import_window_manager3.WindowManager];
163
- }
164
- return joinRoom;
165
- }
166
- var SOUP = "!#%()*+,-./:;=?@[]^_`{|}~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
167
- var SOUP_LEN = SOUP.length;
183
+
184
+ // src/utils/uid.ts
185
+ var SOUP = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
186
+ var SOUP_LEN = 62;
168
187
  var ID_LEN = 20;
169
188
  var reusedIdCarrier = /* @__PURE__ */ Array(ID_LEN);
170
189
  function genUID() {
@@ -174,75 +193,46 @@ function genUID() {
174
193
  return reusedIdCarrier.join("");
175
194
  }
176
195
 
177
- // src/impl/app.ts
178
- var import_window_manager4 = require("@netless/window-manager");
179
-
180
- // src/helpers/emitter.ts
181
- var FastboardEmitter = class {
182
- constructor() {
183
- this.listeners = /* @__PURE__ */ new Set();
184
- }
185
- get length() {
186
- return this.listeners.size;
187
- }
188
- dispatch(message) {
189
- this.listeners.forEach((callback) => callback(message));
190
- }
191
- addListener(listener) {
192
- this.listeners.add(listener);
193
- }
194
- removeListener(listener) {
195
- this.listeners.delete(listener);
196
- }
196
+ // src/utils/warn.ts
197
+ var warnings = {
198
+ "no-ppt-in-scenes": "You're probably inserting the slide app in a wrong way, there shouldn't exist `scenes[0].ppt`."
197
199
  };
200
+ var warned = /* @__PURE__ */ new Set();
201
+ function warn(id) {
202
+ if (warned.has(id))
203
+ return;
204
+ warned.add(id);
205
+ console.warn(warnings[id]);
206
+ }
198
207
 
199
- // src/helpers/value.ts
200
- function createValue(value, effect, setValue = noop) {
201
- const emitter = new FastboardEmitter();
202
- function set(newValue) {
203
- if (safe_not_equal(value, newValue)) {
204
- emitter.dispatch(value = newValue);
205
- }
206
- }
207
- const dispose = effect(set) || noop;
208
- function subscribe(callback) {
209
- emitter.addListener(callback);
210
- callback(value);
211
- return () => emitter.removeListener(callback);
212
- }
213
- function reaction(callback) {
214
- emitter.addListener(callback);
215
- return () => emitter.removeListener(callback);
208
+ // src/impl/FastboardApp.ts
209
+ var import_white_web_sdk = require("white-web-sdk");
210
+ var import_window_manager2 = require("@netless/window-manager");
211
+
212
+ // src/internal.ts
213
+ var import_window_manager = require("@netless/window-manager");
214
+ function ensure_window_manager(joinRoom) {
215
+ if (!joinRoom.invisiblePlugins || !joinRoom.invisiblePlugins.includes(import_window_manager.WindowManager)) {
216
+ joinRoom.invisiblePlugins = [...joinRoom.invisiblePlugins || [], import_window_manager.WindowManager];
216
217
  }
217
- return {
218
- get value() {
219
- return value;
220
- },
221
- subscribe,
222
- reaction,
223
- setValue,
224
- dispose
225
- };
218
+ return joinRoom;
219
+ }
220
+ function transform_app_status(status) {
221
+ return status === "start" ? "loading" : status === "failed" ? "failed" : "idle";
226
222
  }
227
223
 
228
- // src/impl/app.ts
224
+ // src/impl/FastboardApp.ts
229
225
  var FastboardAppBase = class {
230
226
  constructor(sdk, room, manager, hotKeys) {
231
227
  this.sdk = sdk;
232
228
  this.room = room;
233
229
  this.manager = manager;
234
230
  this.hotKeys = hotKeys;
235
- this._disposers = [];
236
231
  this._destroyed = false;
237
- this.createValue = (...args) => {
238
- const value = createValue(...args);
239
- this._disposers.push(value.dispose);
240
- return value;
241
- };
242
232
  }
243
233
  _assertNotDestroyed() {
244
234
  if (this._destroyed) {
245
- throw new Error("[FastboardApp] Can not call any method on destroyed FastboardApp.");
235
+ throw new Error("FastboardApp has been destroyed");
246
236
  }
247
237
  }
248
238
  _addRoomListener(name, listener) {
@@ -250,10 +240,10 @@ var FastboardAppBase = class {
250
240
  this.room.callbacks.on(name, listener);
251
241
  return () => this.room.callbacks.off(name, listener);
252
242
  }
253
- _addManagerListener(name, set) {
243
+ _addManagerListener(name, listener) {
254
244
  this._assertNotDestroyed();
255
- this.manager.emitter.on(name, set);
256
- return () => this.manager.emitter.off(name, set);
245
+ this.manager.emitter.on(name, listener);
246
+ return () => this.manager.emitter.off(name, listener);
257
247
  }
258
248
  _addMainViewListener(name, listener) {
259
249
  this._assertNotDestroyed();
@@ -261,8 +251,6 @@ var FastboardAppBase = class {
261
251
  return () => this.manager.mainView.callbacks.off(name, listener);
262
252
  }
263
253
  destroy() {
264
- this._disposers.forEach((dispose) => dispose());
265
- this._disposers.length = 0;
266
254
  this._destroyed = true;
267
255
  this.manager.destroy();
268
256
  return this.room.disconnect();
@@ -271,21 +259,18 @@ var FastboardAppBase = class {
271
259
  var FastboardApp = class extends FastboardAppBase {
272
260
  constructor() {
273
261
  super(...arguments);
274
- this.writable = this.createValue(this.room.isWritable, (set) => this._addRoomListener("onEnableWriteNowChanged", () => set(this.room.isWritable)), this.room.setWritable.bind(this.room));
275
- this.boxState = this.createValue(this.manager.boxState, (set) => this._addManagerListener("boxStateChange", set));
276
- this.focusedApp = this.createValue(this.manager.focused, (set) => this._addManagerListener("focusedChange", set));
277
- this.canRedoSteps = this.createValue(this.manager.canRedoSteps, (set) => this._addManagerListener("canRedoStepsChange", set));
278
- this.canUndoSteps = this.createValue(this.manager.canUndoSteps, (set) => this._addManagerListener("canUndoStepsChange", set));
279
- this.camera = this.createValue(this.manager.mainView.camera, (set) => this._addMainViewListener("onCameraUpdated", set));
280
- this.memberState = this.createValue(this.room.state.memberState, (set) => this._addRoomListener("onRoomStateChanged", ({ memberState: m }) => m && set(m)));
281
- this.sceneIndex = this.createValue(this.manager.mainViewSceneIndex, (set) => this._addManagerListener("mainViewSceneIndexChange", set), this.manager.setMainViewSceneIndex.bind(this.manager));
282
- this.sceneLength = this.createValue(this.manager.mainViewScenesLength, (set) => this._addManagerListener("mainViewScenesLengthChange", set));
262
+ this.writable = writable(this.room.isWritable, (set) => this._addRoomListener("onEnableWriteNowChanged", () => set(this.room.isWritable)), this.room.setWritable.bind(this.room));
263
+ this.boxState = readable(this.manager.boxState, (set) => this._addManagerListener("boxStateChange", set));
264
+ this.focusedApp = readable(this.manager.focused, (set) => this._addManagerListener("focusedChange", set));
265
+ this.canRedoSteps = readable(this.manager.canRedoSteps, (set) => this._addManagerListener("canRedoStepsChange", set));
266
+ this.canUndoSteps = readable(this.manager.canUndoSteps, (set) => this._addManagerListener("canUndoStepsChange", set));
267
+ this.camera = readable(this.manager.mainView.camera, (set) => this._addMainViewListener("onCameraUpdated", set));
268
+ this.memberState = readable(this.room.state.memberState, (set) => this._addRoomListener("onRoomStateChanged", ({ memberState: m }) => m && set(m)));
269
+ this.sceneIndex = writable(this.manager.mainViewSceneIndex, (set) => this._addManagerListener("mainViewSceneIndexChange", set), this.manager.setMainViewSceneIndex.bind(this.manager));
270
+ this.sceneLength = readable(this.manager.mainViewScenesLength, (set) => this._addManagerListener("mainViewScenesLengthChange", set));
283
271
  this._appsStatus = {};
284
- this.appsStatus = this.createValue({}, (set) => this._addManagerListener("loadApp", ({ kind, status, reason }) => {
285
- this._appsStatus[kind] = {
286
- status: status === "start" ? "loading" : status === "failed" ? "failed" : "idle",
287
- reason
288
- };
272
+ this.appsStatus = readable({}, (set) => this._addManagerListener("loadApp", ({ kind, status, reason }) => {
273
+ this._appsStatus[kind] = { status: transform_app_status(status), reason };
289
274
  set(this._appsStatus);
290
275
  }));
291
276
  }
@@ -299,11 +284,11 @@ var FastboardApp = class extends FastboardAppBase {
299
284
  }
300
285
  undo() {
301
286
  this._assertNotDestroyed();
302
- this.manager.mainView.undo();
287
+ this.manager.undo();
303
288
  }
304
289
  redo() {
305
290
  this._assertNotDestroyed();
306
- this.manager.mainView.redo();
291
+ this.manager.redo();
307
292
  }
308
293
  moveCamera(camera) {
309
294
  this._assertNotDestroyed();
@@ -319,7 +304,10 @@ var FastboardApp = class extends FastboardAppBase {
319
304
  }
320
305
  setAppliance(appliance, shape) {
321
306
  this._assertNotDestroyed();
322
- this.manager.mainView.setMemberState({ currentApplianceName: appliance, shapeType: shape });
307
+ this.manager.mainView.setMemberState({
308
+ currentApplianceName: appliance,
309
+ shapeType: shape
310
+ });
323
311
  }
324
312
  setStrokeWidth(strokeWidth) {
325
313
  this._assertNotDestroyed();
@@ -329,6 +317,18 @@ var FastboardApp = class extends FastboardAppBase {
329
317
  this._assertNotDestroyed();
330
318
  this.manager.mainView.setMemberState({ strokeColor });
331
319
  }
320
+ prevPage() {
321
+ this._assertNotDestroyed();
322
+ return this.manager.prevPage();
323
+ }
324
+ nextPage() {
325
+ this._assertNotDestroyed();
326
+ return this.manager.nextPage();
327
+ }
328
+ addPage(params) {
329
+ this._assertNotDestroyed();
330
+ return this.manager.addPage(params);
331
+ }
332
332
  async insertImage(url) {
333
333
  this._assertNotDestroyed();
334
334
  await this.manager.switchMainViewToWriter();
@@ -353,19 +353,20 @@ var FastboardApp = class extends FastboardAppBase {
353
353
  this.manager.moveCameraToContain({ originX, originY, width, height });
354
354
  }
355
355
  insertDocs(arg1, arg2) {
356
+ this._assertNotDestroyed();
356
357
  if (typeof arg1 === "object" && "fileType" in arg1) {
357
358
  return this._insertDocsImpl(arg1);
358
359
  } else if (arg2 && arg2.status !== "Finished") {
359
- throw new Error("[FastboardApp] Can not insert a converting doc.");
360
+ throw new Error("FastboardApp cannot insert a converting doc.");
360
361
  } else if (arg2 && arg2.progress) {
361
- const scenes = arg2.progress.convertedFileList.map(convertedFileToScene);
362
+ const title = arg1;
362
363
  const scenePath = `/${arg2.uuid}/${genUID()}`;
363
- const { emptyScenes, taskId, url } = makeSlideParams(scenes);
364
+ const scenes1 = arg2.progress.convertedFileList.map(convertedFileToScene);
365
+ const { scenes, taskId, url } = makeSlideParams(scenes1);
364
366
  if (taskId && url) {
365
- const title = arg1;
366
- return this._insertDocsImpl({ fileType: "pptx", scenePath, taskId, title, url, scenes: emptyScenes });
367
+ return this._insertDocsImpl({ fileType: "pptx", scenePath, scenes, title, taskId, url });
367
368
  } else {
368
- return this._insertDocsImpl({ fileType: "pdf", scenePath, scenes, title: arg1 });
369
+ return this._insertDocsImpl({ fileType: "pdf", scenePath, scenes: scenes1, title });
369
370
  }
370
371
  }
371
372
  }
@@ -379,6 +380,9 @@ var FastboardApp = class extends FastboardAppBase {
379
380
  options: { scenePath, title, scenes }
380
381
  });
381
382
  case "pptx":
383
+ if (scenes && scenes[0].ppt) {
384
+ warn("no-ppt-in-scenes");
385
+ }
382
386
  return this.manager.addApp({
383
387
  kind: "Slide",
384
388
  options: { scenePath, title, scenes },
@@ -403,7 +407,7 @@ var FastboardApp = class extends FastboardAppBase {
403
407
  insertMedia(title, src) {
404
408
  this._assertNotDestroyed();
405
409
  return this.manager.addApp({
406
- kind: import_window_manager4.BuiltinApps.MediaPlayer,
410
+ kind: import_window_manager2.BuiltinApps.MediaPlayer,
407
411
  options: { title },
408
412
  attributes: { src }
409
413
  });
@@ -416,24 +420,61 @@ var FastboardApp = class extends FastboardAppBase {
416
420
  });
417
421
  }
418
422
  };
423
+ async function createFastboard(_a) {
424
+ var _b = _a, {
425
+ sdkConfig,
426
+ joinRoom: _c
427
+ } = _b, _d = _c, { callbacks } = _d, joinRoomParams = __objRest(_d, ["callbacks"]), {
428
+ managerConfig
429
+ } = _b;
430
+ const sdk = new import_white_web_sdk.WhiteWebSdk(__spreadProps(__spreadValues({}, sdkConfig), {
431
+ useMobXState: true
432
+ }));
433
+ const hotKeys = __spreadProps(__spreadValues({}, import_white_web_sdk.DefaultHotKeys), {
434
+ changeToSelector: "s",
435
+ changeToLaserPointer: "z",
436
+ changeToPencil: "p",
437
+ changeToRectangle: "r",
438
+ changeToEllipse: "c",
439
+ changeToEraser: "e",
440
+ changeToText: "t",
441
+ changeToStraight: "l",
442
+ changeToArrow: "a",
443
+ changeToHand: "h"
444
+ });
445
+ const room = await sdk.joinRoom(__spreadProps(__spreadValues({
446
+ floatBar: true,
447
+ hotKeys
448
+ }, ensure_window_manager(joinRoomParams)), {
449
+ useMultiViews: true,
450
+ disableNewPencil: false,
451
+ disableMagixEventDispatchLimit: true
452
+ }), callbacks);
453
+ const manager = await import_window_manager2.WindowManager.mount(__spreadProps(__spreadValues({
454
+ cursor: true
455
+ }, managerConfig), {
456
+ room
457
+ }));
458
+ manager.mainView.setCameraBound({
459
+ minContentMode: (0, import_white_web_sdk.contentModeScale)(0.3),
460
+ maxContentMode: (0, import_white_web_sdk.contentModeScale)(3)
461
+ });
462
+ return new FastboardApp(sdk, room, manager, hotKeys);
463
+ }
419
464
 
420
- // src/impl/player.ts
465
+ // src/impl/FastboardPlayer.ts
466
+ var import_white_web_sdk2 = require("white-web-sdk");
467
+ var import_window_manager3 = require("@netless/window-manager");
421
468
  var FastboardPlayerBase = class {
422
469
  constructor(sdk, player, manager) {
423
470
  this.sdk = sdk;
424
471
  this.player = player;
425
472
  this.manager = manager;
426
- this._disposers = [];
427
473
  this._destroyed = false;
428
- this.createValue = (...args) => {
429
- const value = createValue(...args);
430
- this._disposers.push(value.dispose);
431
- return value;
432
- };
433
474
  }
434
475
  _assertNotDestroyed() {
435
476
  if (this._destroyed) {
436
- throw new Error("[FastboardPlayer] Can not call any method on destroyed FastboardPlayer.");
477
+ throw new Error("FastboardApp has been destroyed");
437
478
  }
438
479
  }
439
480
  _addPlayerListener(name, listener) {
@@ -441,10 +482,10 @@ var FastboardPlayerBase = class {
441
482
  this.player.callbacks.on(name, listener);
442
483
  return () => this.player.callbacks.off(name, listener);
443
484
  }
444
- _addManagerListener(name, set) {
485
+ _addManagerListener(name, listener) {
445
486
  this._assertNotDestroyed();
446
- this.manager.emitter.on(name, set);
447
- return () => this.manager.emitter.off(name, set);
487
+ this.manager.emitter.on(name, listener);
488
+ return () => this.manager.emitter.off(name, listener);
448
489
  }
449
490
  _addMainViewListener(name, listener) {
450
491
  this._assertNotDestroyed();
@@ -452,30 +493,37 @@ var FastboardPlayerBase = class {
452
493
  return () => this.manager.mainView.callbacks.off(name, listener);
453
494
  }
454
495
  destroy() {
455
- this._disposers.forEach((dispose) => dispose());
456
- this._disposers.length = 0;
457
496
  this._destroyed = true;
458
497
  this.manager.destroy();
459
- this.player.callbacks.off();
498
+ return this.player.callbacks.off();
460
499
  }
461
500
  };
462
501
  var FastboardPlayer = class extends FastboardPlayerBase {
463
502
  constructor() {
464
503
  super(...arguments);
465
- this.currentTime = this.createValue(this.player.progressTime, (set) => this._addPlayerListener("onProgressTimeChanged", set), this.player.seekToProgressTime.bind(this.player));
466
- this.phase = this.createValue(this.player.phase, (set) => this._addPlayerListener("onPhaseChanged", set));
467
- this.canplay = this.createValue(this.player.isPlayable, (set) => this._addPlayerListener("onIsPlayableChanged", set));
468
- this.speed = this.createValue(this.player.playbackSpeed, (set) => {
504
+ this.currentTime = writable(this.player.progressTime, (set) => this._addPlayerListener("onProgressTimeChanged", set), this.player.seekToProgressTime.bind(this.player));
505
+ this.phase = readable(this.player.phase, (set) => this._addPlayerListener("onPhaseChanged", set));
506
+ this.canplay = readable(this.player.isPlayable, (set) => this._addPlayerListener("onIsPlayableChanged", set));
507
+ this.speed = writable(this.player.playbackSpeed, (set) => {
469
508
  this._setSpeed = set;
470
509
  }, (value) => {
471
510
  this.player.playbackSpeed = value;
472
511
  this._setSpeed(value);
473
512
  });
474
- this.state = this.createValue(null, (set) => {
513
+ this.ready = readable(false, (set) => {
514
+ this._setReady = set;
515
+ });
516
+ this.duration = readable(0, (set) => {
517
+ this._setDuration = set;
518
+ });
519
+ this.state = readable(null, (set) => {
475
520
  const update = () => set(this.player.state);
476
- const dispose1 = this._addPlayerListener("onLoadFirstFrame", update);
477
- const dispose2 = this._addPlayerListener("onPlayerStateChanged", update);
478
- return () => (dispose1(), dispose2());
521
+ this.player.callbacks.once("onLoadFirstFrame", () => {
522
+ this._setDuration(this.player.timeDuration);
523
+ this._setReady(true);
524
+ update();
525
+ });
526
+ return this._addPlayerListener("onPlayerStateChanged", update);
479
527
  });
480
528
  }
481
529
  bindContainer(container) {
@@ -502,68 +550,25 @@ var FastboardPlayer = class extends FastboardPlayerBase {
502
550
  this._assertNotDestroyed();
503
551
  this.player.stop();
504
552
  }
553
+ setSpeed(value) {
554
+ this._assertNotDestroyed();
555
+ this.speed.set(value);
556
+ }
505
557
  };
506
-
507
- // src/minimal.ts
508
- async function createFastboard(_a) {
509
- var _b = _a, {
510
- sdkConfig,
511
- joinRoom: _c
512
- } = _b, _d = _c, { callbacks } = _d, joinRoomParams = __objRest(_d, ["callbacks"]), {
513
- managerConfig,
514
- appsConfig = DefaultApps
515
- } = _b;
516
- registerApps(appsConfig);
517
- const sdk = new import_white_web_sdk.WhiteWebSdk(__spreadProps(__spreadValues({}, sdkConfig), {
518
- useMobXState: true
519
- }));
520
- const hotKeys = __spreadProps(__spreadValues({}, import_white_web_sdk.DefaultHotKeys), {
521
- changeToSelector: "s",
522
- changeToLaserPointer: "z",
523
- changeToPencil: "p",
524
- changeToRectangle: "r",
525
- changeToEllipse: "c",
526
- changeToEraser: "e",
527
- changeToText: "t",
528
- changeToStraight: "l",
529
- changeToArrow: "a",
530
- changeToHand: "h"
531
- });
532
- const room = await sdk.joinRoom(__spreadProps(__spreadValues({
533
- floatBar: true,
534
- hotKeys
535
- }, ensureWindowManager(joinRoomParams)), {
536
- useMultiViews: true,
537
- disableNewPencil: false,
538
- disableMagixEventDispatchLimit: true
539
- }), callbacks);
540
- const manager = await import_window_manager5.WindowManager.mount(__spreadProps(__spreadValues({
541
- cursor: true
542
- }, managerConfig), {
543
- room
544
- }));
545
- manager.mainView.setCameraBound({
546
- minContentMode: (0, import_white_web_sdk.contentModeScale)(0.3),
547
- maxContentMode: (0, import_white_web_sdk.contentModeScale)(3)
548
- });
549
- return new FastboardApp(sdk, room, manager, hotKeys);
550
- }
551
558
  async function replayFastboard(_a) {
552
559
  var _b = _a, {
553
560
  sdkConfig,
554
561
  replayRoom: _c
555
562
  } = _b, _d = _c, { callbacks } = _d, replayRoomParams = __objRest(_d, ["callbacks"]), {
556
- managerConfig,
557
- appsConfig = DefaultApps
563
+ managerConfig
558
564
  } = _b;
559
- registerApps(appsConfig);
560
- const sdk = new import_white_web_sdk.WhiteWebSdk(__spreadProps(__spreadValues({}, sdkConfig), {
565
+ const sdk = new import_white_web_sdk2.WhiteWebSdk(__spreadProps(__spreadValues({}, sdkConfig), {
561
566
  useMobXState: true
562
567
  }));
563
- const player = await sdk.replayRoom(__spreadProps(__spreadValues({}, ensureWindowManager(replayRoomParams)), {
568
+ const player = await sdk.replayRoom(__spreadProps(__spreadValues({}, ensure_window_manager(replayRoomParams)), {
564
569
  useMultiViews: true
565
570
  }), callbacks);
566
- const managerPromise = import_window_manager5.WindowManager.mount(__spreadProps(__spreadValues({
571
+ const managerPromise = import_window_manager3.WindowManager.mount(__spreadProps(__spreadValues({
567
572
  cursor: true
568
573
  }, managerConfig), {
569
574
  room: player
@@ -573,5 +578,41 @@ async function replayFastboard(_a) {
573
578
  player.pause();
574
579
  return new FastboardPlayer(sdk, player, manager);
575
580
  }
581
+
582
+ // src/behaviors/index.ts
583
+ var import_window_manager4 = require("@netless/window-manager");
584
+ var import_app_slide = __toESM(require("@netless/app-slide"));
585
+ var DefaultApps = {
586
+ Monaco: {
587
+ src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-monaco/0.1.12/dist/main.iife.js"
588
+ },
589
+ Countdown: {
590
+ src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-countdown/0.0.2/dist/main.iife.js"
591
+ },
592
+ GeoGebra: {
593
+ src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-geogebra/0.0.4/dist/main.iife.js",
594
+ appOptions: {
595
+ HTML5Codebase: "https://flat-storage-cn-hz.whiteboard.agora.io/GeoGebra/HTML5/5.0/web3d"
596
+ }
597
+ },
598
+ EmbeddedPage: {
599
+ src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-embedded-page/0.1.1/dist/main.iife.js"
600
+ },
601
+ Player: {
602
+ name: "NetlessAppMediaPlayer",
603
+ src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-media-player/0.1.1/dist/main.iife.js"
604
+ }
605
+ };
606
+ import_window_manager4.WindowManager.register({
607
+ kind: "Slide",
608
+ appOptions: { debug: false },
609
+ src: import_app_slide.default
610
+ });
611
+ for (const kind in DefaultApps) {
612
+ if (Object.prototype.hasOwnProperty.call(DefaultApps, kind)) {
613
+ const options = DefaultApps[kind];
614
+ import_window_manager4.WindowManager.register(__spreadValues({ kind }, options));
615
+ }
616
+ }
576
617
  module.exports = __toCommonJS(src_exports);
577
618
  //# sourceMappingURL=index.js.map