@netless/fastboard-core 0.2.0 → 0.2.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.
@@ -0,0 +1,512 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
9
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10
+ var __spreadValues = (a, b) => {
11
+ for (var prop in b || (b = {}))
12
+ if (__hasOwnProp.call(b, prop))
13
+ __defNormalProp(a, prop, b[prop]);
14
+ if (__getOwnPropSymbols)
15
+ for (var prop of __getOwnPropSymbols(b)) {
16
+ if (__propIsEnum.call(b, prop))
17
+ __defNormalProp(a, prop, b[prop]);
18
+ }
19
+ return a;
20
+ };
21
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
22
+ var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
23
+ var __objRest = (source, exclude) => {
24
+ var target = {};
25
+ for (var prop in source)
26
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
27
+ target[prop] = source[prop];
28
+ if (source != null && __getOwnPropSymbols)
29
+ for (var prop of __getOwnPropSymbols(source)) {
30
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
31
+ target[prop] = source[prop];
32
+ }
33
+ return target;
34
+ };
35
+ var __export = (target, all) => {
36
+ for (var name in all)
37
+ __defProp(target, name, { get: all[name], enumerable: true });
38
+ };
39
+ var __reExport = (target, module2, copyDefault, desc) => {
40
+ if (module2 && typeof module2 === "object" || typeof module2 === "function") {
41
+ for (let key of __getOwnPropNames(module2))
42
+ if (!__hasOwnProp.call(target, key) && (copyDefault || key !== "default"))
43
+ __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
44
+ }
45
+ return target;
46
+ };
47
+ var __toCommonJS = /* @__PURE__ */ ((cache) => {
48
+ return (module2, temp) => {
49
+ return cache && cache.get(module2) || (temp = __reExport(__markAsModule({}), module2, 1), cache && cache.set(module2, temp), temp);
50
+ };
51
+ })(typeof WeakMap !== "undefined" ? /* @__PURE__ */ new WeakMap() : 0);
52
+
53
+ // src/minimal.ts
54
+ var minimal_exports = {};
55
+ __export(minimal_exports, {
56
+ createFastboard: () => createFastboard,
57
+ replayFastboard: () => replayFastboard
58
+ });
59
+ var import_white_web_sdk = require("white-web-sdk");
60
+ var import_window_manager4 = require("@netless/window-manager");
61
+
62
+ // src/behaviors/register-apps.ts
63
+ var import_window_manager = require("@netless/window-manager");
64
+ import_window_manager.WindowManager.register({
65
+ kind: "Monaco",
66
+ src: "https://cdn.jsdelivr.net/npm/@netless/app-monaco@latest/dist/main.iife.js"
67
+ });
68
+ import_window_manager.WindowManager.register({
69
+ kind: "Countdown",
70
+ src: "https://cdn.jsdelivr.net/npm/@netless/app-countdown@latest/dist/main.iife.js"
71
+ });
72
+ import_window_manager.WindowManager.register({
73
+ kind: "GeoGebra",
74
+ src: "https://cdn.jsdelivr.net/npm/@netless/app-geogebra@latest/dist/main.iife.js",
75
+ appOptions: {
76
+ HTML5Codebase: "https://flat-storage-cn-hz.whiteboard.agora.io/GeoGebra/HTML5/5.0/web3d"
77
+ }
78
+ });
79
+
80
+ // src/helpers/utils.ts
81
+ var import_window_manager2 = require("@netless/window-manager");
82
+ function noop() {
83
+ }
84
+ function getImageSize(url, fallback) {
85
+ return new Promise((resolve) => {
86
+ const img = new Image();
87
+ img.onload = () => resolve(img);
88
+ img.onerror = () => resolve(fallback);
89
+ img.src = url;
90
+ });
91
+ }
92
+ function makeSlideParams(scenes) {
93
+ const emptyScenes = [];
94
+ let taskId = "";
95
+ let url = "";
96
+ const pptSrcRE = /^pptx?(?<prefix>:\/\/\S+?dynamicConvert)\/(?<taskId>\w+)\//;
97
+ for (const { name, ppt } of scenes) {
98
+ emptyScenes.push({ name });
99
+ if (!ppt || !ppt.src.startsWith("ppt")) {
100
+ continue;
101
+ }
102
+ const match = pptSrcRE.exec(ppt.src);
103
+ if (!match || !match.groups) {
104
+ continue;
105
+ }
106
+ taskId = match.groups.taskId;
107
+ url = "https" + match.groups.prefix;
108
+ break;
109
+ }
110
+ return { emptyScenes, taskId, url };
111
+ }
112
+ function convertedFileToScene(f, i) {
113
+ return {
114
+ name: String(i + 1),
115
+ ppt: {
116
+ src: f.conversionFileUrl,
117
+ width: f.width,
118
+ height: f.height,
119
+ previewURL: f.preview
120
+ }
121
+ };
122
+ }
123
+ function ensureWindowManager(joinRoom) {
124
+ if (!joinRoom.invisiblePlugins || !joinRoom.invisiblePlugins.includes(import_window_manager2.WindowManager)) {
125
+ joinRoom.invisiblePlugins = [...joinRoom.invisiblePlugins || [], import_window_manager2.WindowManager];
126
+ }
127
+ return joinRoom;
128
+ }
129
+ var SOUP = "!#%()*+,-./:;=?@[]^_`{|}~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
130
+ var SOUP_LEN = SOUP.length;
131
+ var ID_LEN = 20;
132
+ var reusedIdCarrier = /* @__PURE__ */ Array(ID_LEN);
133
+ function genUID() {
134
+ for (let i = 0; i < ID_LEN; i++) {
135
+ reusedIdCarrier[i] = SOUP.charAt(Math.random() * SOUP_LEN);
136
+ }
137
+ return reusedIdCarrier.join("");
138
+ }
139
+
140
+ // src/impl/app.ts
141
+ var import_window_manager3 = require("@netless/window-manager");
142
+
143
+ // src/helpers/emitter.ts
144
+ var FastboardEmitter = class {
145
+ constructor() {
146
+ this.listeners = /* @__PURE__ */ new Set();
147
+ }
148
+ get length() {
149
+ return this.listeners.size;
150
+ }
151
+ dispatch(message) {
152
+ this.listeners.forEach((callback) => callback(message));
153
+ }
154
+ addListener(listener) {
155
+ this.listeners.add(listener);
156
+ }
157
+ removeListener(listener) {
158
+ this.listeners.delete(listener);
159
+ }
160
+ };
161
+
162
+ // src/helpers/value.ts
163
+ function createValue(value, effect, setValue = noop) {
164
+ const emitter = new FastboardEmitter();
165
+ function set(newValue) {
166
+ emitter.dispatch(value = newValue);
167
+ }
168
+ const dispose = effect(set) || noop;
169
+ function subscribe(callback) {
170
+ emitter.addListener(callback);
171
+ callback(value);
172
+ return () => emitter.removeListener(callback);
173
+ }
174
+ function reaction(callback) {
175
+ emitter.addListener(callback);
176
+ return () => emitter.removeListener(callback);
177
+ }
178
+ return { value, subscribe, reaction, setValue, dispose };
179
+ }
180
+
181
+ // src/impl/app.ts
182
+ var FastboardAppBase = class {
183
+ constructor(sdk, room, manager, hotKeys) {
184
+ this.sdk = sdk;
185
+ this.room = room;
186
+ this.manager = manager;
187
+ this.hotKeys = hotKeys;
188
+ this._disposers = [];
189
+ this._destroyed = false;
190
+ this.createValue = (...args) => {
191
+ const value = createValue(...args);
192
+ this._disposers.push(value.dispose);
193
+ return value;
194
+ };
195
+ }
196
+ _assertNotDestroyed() {
197
+ if (this._destroyed) {
198
+ throw new Error("[FastboardApp] Can not call any method on destroyed FastboardApp.");
199
+ }
200
+ }
201
+ _addRoomListener(name, listener) {
202
+ this._assertNotDestroyed();
203
+ this.room.callbacks.on(name, listener);
204
+ return () => this.room.callbacks.off(name, listener);
205
+ }
206
+ _addManagerListener(name, set) {
207
+ this._assertNotDestroyed();
208
+ this.manager.emitter.on(name, set);
209
+ return () => this.manager.emitter.off(name, set);
210
+ }
211
+ _addMainViewListener(name, listener) {
212
+ this._assertNotDestroyed();
213
+ this.manager.mainView.callbacks.on(name, listener);
214
+ return () => this.manager.mainView.callbacks.off(name, listener);
215
+ }
216
+ destroy() {
217
+ this._disposers.forEach((dispose) => dispose());
218
+ this._disposers.length = 0;
219
+ this._destroyed = true;
220
+ this.manager.destroy();
221
+ return this.room.disconnect();
222
+ }
223
+ };
224
+ var FastboardApp = class extends FastboardAppBase {
225
+ constructor() {
226
+ super(...arguments);
227
+ this.writable = this.createValue(this.room.isWritable, (set) => this._addRoomListener("onEnableWriteNowChanged", () => set(this.room.isWritable)), this.room.setWritable.bind(this.room));
228
+ this.boxState = this.createValue(this.manager.boxState, (set) => this._addManagerListener("boxStateChange", set));
229
+ this.focusedApp = this.createValue(this.manager.focused, (set) => this._addManagerListener("focusedChange", set));
230
+ this.canRedoSteps = this.createValue(this.manager.canRedoSteps, (set) => this._addManagerListener("canRedoStepsChange", set));
231
+ this.canUndoSteps = this.createValue(this.manager.canUndoSteps, (set) => this._addManagerListener("canUndoStepsChange", set));
232
+ this.camera = this.createValue(this.manager.mainView.camera, (set) => this._addMainViewListener("onCameraUpdated", set));
233
+ this.memberState = this.createValue(this.room.state.memberState, (set) => this._addRoomListener("onRoomStateChanged", ({ memberState: m }) => m && set(m)));
234
+ this.sceneIndex = this.createValue(this.manager.mainViewSceneIndex, (set) => this._addManagerListener("mainViewSceneIndexChange", set), this.manager.setMainViewSceneIndex.bind(this.manager));
235
+ this.sceneLength = this.createValue(this.manager.mainViewScenesLength, (set) => this._addManagerListener("mainViewScenesLengthChange", set));
236
+ }
237
+ bindContainer(container) {
238
+ this._assertNotDestroyed();
239
+ this.manager.bindContainer(container);
240
+ }
241
+ bindCollector(container) {
242
+ this._assertNotDestroyed();
243
+ this.manager.bindCollectorContainer(container);
244
+ }
245
+ undo() {
246
+ this._assertNotDestroyed();
247
+ this.manager.mainView.undo();
248
+ }
249
+ redo() {
250
+ this._assertNotDestroyed();
251
+ this.manager.mainView.redo();
252
+ }
253
+ moveCamera(camera) {
254
+ this._assertNotDestroyed();
255
+ this.manager.moveCamera(camera);
256
+ }
257
+ moveCameraToContain(rectangle) {
258
+ this._assertNotDestroyed();
259
+ this.manager.moveCameraToContain(rectangle);
260
+ }
261
+ cleanCurrentScene() {
262
+ this._assertNotDestroyed();
263
+ this.manager.mainView.cleanCurrentScene();
264
+ }
265
+ setAppliance(appliance, shape) {
266
+ this._assertNotDestroyed();
267
+ this.manager.mainView.setMemberState({ currentApplianceName: appliance, shapeType: shape });
268
+ }
269
+ setStrokeWidth(strokeWidth) {
270
+ this._assertNotDestroyed();
271
+ this.manager.mainView.setMemberState({ strokeWidth });
272
+ }
273
+ setStrokeColor(strokeColor) {
274
+ this._assertNotDestroyed();
275
+ this.manager.mainView.setMemberState({ strokeColor });
276
+ }
277
+ async insertImage(url) {
278
+ this._assertNotDestroyed();
279
+ await this.manager.switchMainViewToWriter();
280
+ const { divElement } = this.manager.mainView;
281
+ const containerSize = {
282
+ width: (divElement == null ? void 0 : divElement.scrollWidth) || window.innerWidth,
283
+ height: (divElement == null ? void 0 : divElement.scrollHeight) || window.innerHeight
284
+ };
285
+ const maxWidth = containerSize.width * 0.8;
286
+ let { width, height } = await getImageSize(url, containerSize);
287
+ const scale = Math.min(maxWidth / width, 1);
288
+ const uuid = genUID();
289
+ const { centerX, centerY } = this.manager.camera;
290
+ width *= scale;
291
+ height *= scale;
292
+ this.manager.mainView.insertImage({ uuid, centerX, centerY, width, height, locked: false });
293
+ this.manager.mainView.completeImageUpload(uuid, url);
294
+ width /= 0.8;
295
+ height /= 0.8;
296
+ const originX = centerX - width / 2;
297
+ const originY = centerY - height / 2;
298
+ this.manager.moveCameraToContain({ originX, originY, width, height });
299
+ }
300
+ insertDocs(arg1, arg2) {
301
+ if (typeof arg1 === "object" && "fileType" in arg1) {
302
+ return this._insertDocsImpl(arg1);
303
+ } else if (arg2 && arg2.status !== "Finished") {
304
+ throw new Error("[FastboardApp] Can not insert a converting doc.");
305
+ } else if (arg2 && arg2.progress) {
306
+ const scenes = arg2.progress.convertedFileList.map(convertedFileToScene);
307
+ const scenePath = `/${arg2.uuid}/${genUID()}`;
308
+ const { emptyScenes, taskId, url } = makeSlideParams(scenes);
309
+ if (taskId && url) {
310
+ const title = arg1;
311
+ return this._insertDocsImpl({ fileType: "pptx", scenePath, taskId, title, url, scenes: emptyScenes });
312
+ } else {
313
+ return this._insertDocsImpl({ fileType: "pdf", scenePath, scenes, title: arg1 });
314
+ }
315
+ }
316
+ }
317
+ _insertDocsImpl(_a) {
318
+ var _b = _a, { fileType, scenePath, title, scenes } = _b, attributes = __objRest(_b, ["fileType", "scenePath", "title", "scenes"]);
319
+ this._assertNotDestroyed();
320
+ switch (fileType) {
321
+ case "pdf":
322
+ case "ppt":
323
+ return this.manager.addApp({
324
+ kind: "DocsViewer",
325
+ options: { scenePath, title, scenes }
326
+ });
327
+ case "pptx":
328
+ return this.manager.addApp({
329
+ kind: "Slide",
330
+ options: { scenePath, title, scenes },
331
+ attributes
332
+ });
333
+ }
334
+ }
335
+ insertCodeEditor() {
336
+ this._assertNotDestroyed();
337
+ return this.manager.addApp({
338
+ kind: "Monaco",
339
+ options: { title: "Code Editor" }
340
+ });
341
+ }
342
+ insertCountdown() {
343
+ this._assertNotDestroyed();
344
+ return this.manager.addApp({
345
+ kind: "Countdown",
346
+ options: { title: "Countdown" }
347
+ });
348
+ }
349
+ insertMedia(title, src) {
350
+ this._assertNotDestroyed();
351
+ return this.manager.addApp({
352
+ kind: import_window_manager3.BuiltinApps.MediaPlayer,
353
+ options: { title },
354
+ attributes: { src }
355
+ });
356
+ }
357
+ insertGeoGebra() {
358
+ this._assertNotDestroyed();
359
+ return this.manager.addApp({
360
+ kind: "GeoGebra",
361
+ options: { title: "GeoGebra" }
362
+ });
363
+ }
364
+ };
365
+
366
+ // src/impl/player.ts
367
+ var FastboardPlayerBase = class {
368
+ constructor(sdk, player, manager) {
369
+ this.sdk = sdk;
370
+ this.player = player;
371
+ this.manager = manager;
372
+ this._disposers = [];
373
+ this._destroyed = false;
374
+ this.createValue = (...args) => {
375
+ const value = createValue(...args);
376
+ this._disposers.push(value.dispose);
377
+ return value;
378
+ };
379
+ }
380
+ _assertNotDestroyed() {
381
+ if (this._destroyed) {
382
+ throw new Error("[FastboardPlayer] Can not call any method on destroyed FastboardPlayer.");
383
+ }
384
+ }
385
+ _addPlayerListener(name, listener) {
386
+ this._assertNotDestroyed();
387
+ this.player.callbacks.on(name, listener);
388
+ return () => this.player.callbacks.off(name, listener);
389
+ }
390
+ _addManagerListener(name, set) {
391
+ this._assertNotDestroyed();
392
+ this.manager.emitter.on(name, set);
393
+ return () => this.manager.emitter.off(name, set);
394
+ }
395
+ _addMainViewListener(name, listener) {
396
+ this._assertNotDestroyed();
397
+ this.manager.mainView.callbacks.on(name, listener);
398
+ return () => this.manager.mainView.callbacks.off(name, listener);
399
+ }
400
+ destroy() {
401
+ this._disposers.forEach((dispose) => dispose());
402
+ this._disposers.length = 0;
403
+ this._destroyed = true;
404
+ this.manager.destroy();
405
+ this.player.callbacks.off();
406
+ }
407
+ };
408
+ var FastboardPlayer = class extends FastboardPlayerBase {
409
+ constructor() {
410
+ super(...arguments);
411
+ this.currentTime = this.createValue(this.player.progressTime, (set) => this._addPlayerListener("onProgressTimeChanged", set), this.player.seekToProgressTime.bind(this.player));
412
+ this.phase = this.createValue(this.player.phase, (set) => this._addPlayerListener("onPhaseChanged", set));
413
+ this.canplay = this.createValue(this.player.isPlayable, (set) => this._addPlayerListener("onIsPlayableChanged", set));
414
+ this.speed = this.createValue(this.player.playbackSpeed, (set) => {
415
+ this._setSpeed = set;
416
+ }, (value) => {
417
+ this.player.playbackSpeed = value;
418
+ this._setSpeed(value);
419
+ });
420
+ this.state = this.createValue(null, (set) => {
421
+ const update = () => set(this.player.state);
422
+ const dispose1 = this._addPlayerListener("onLoadFirstFrame", update);
423
+ const dispose2 = this._addPlayerListener("onPlayerStateChanged", update);
424
+ return () => (dispose1(), dispose2());
425
+ });
426
+ }
427
+ bindContainer(container) {
428
+ this._assertNotDestroyed();
429
+ this.manager.bindContainer(container);
430
+ }
431
+ bindCollector(container) {
432
+ this._assertNotDestroyed();
433
+ this.manager.bindCollectorContainer(container);
434
+ }
435
+ seek(timestamp) {
436
+ this._assertNotDestroyed();
437
+ return this.player.seekToProgressTime(timestamp);
438
+ }
439
+ play() {
440
+ this._assertNotDestroyed();
441
+ this.player.play();
442
+ }
443
+ pause() {
444
+ this._assertNotDestroyed();
445
+ this.player.pause();
446
+ }
447
+ stop() {
448
+ this._assertNotDestroyed();
449
+ this.player.stop();
450
+ }
451
+ };
452
+
453
+ // src/minimal.ts
454
+ async function createFastboard(_a) {
455
+ var _b = _a, {
456
+ sdkConfig,
457
+ joinRoom: _c
458
+ } = _b, _d = _c, { callbacks } = _d, joinRoomParams = __objRest(_d, ["callbacks"]), {
459
+ managerConfig
460
+ } = _b;
461
+ const sdk = new import_white_web_sdk.WhiteWebSdk(__spreadProps(__spreadValues({}, sdkConfig), {
462
+ useMobXState: true
463
+ }));
464
+ const hotKeys = __spreadProps(__spreadValues({}, import_white_web_sdk.DefaultHotKeys), {
465
+ changeToSelector: "s",
466
+ changeToLaserPointer: "z",
467
+ changeToPencil: "p",
468
+ changeToRectangle: "r",
469
+ changeToEllipse: "c",
470
+ changeToEraser: "e",
471
+ changeToText: "t",
472
+ changeToStraight: "l",
473
+ changeToArrow: "a",
474
+ changeToHand: "h"
475
+ });
476
+ const room = await sdk.joinRoom(__spreadProps(__spreadValues({
477
+ floatBar: true,
478
+ hotKeys
479
+ }, ensureWindowManager(joinRoomParams)), {
480
+ useMultiViews: true,
481
+ disableNewPencil: false,
482
+ disableMagixEventDispatchLimit: true
483
+ }), callbacks);
484
+ const manager = await import_window_manager4.WindowManager.mount(__spreadProps(__spreadValues({
485
+ cursor: true
486
+ }, managerConfig), {
487
+ room
488
+ }));
489
+ return new FastboardApp(sdk, room, manager, hotKeys);
490
+ }
491
+ async function replayFastboard(_a) {
492
+ var _b = _a, {
493
+ sdkConfig,
494
+ replayRoom: _c
495
+ } = _b, _d = _c, { callbacks } = _d, replayRoomParams = __objRest(_d, ["callbacks"]), {
496
+ managerConfig
497
+ } = _b;
498
+ const sdk = new import_white_web_sdk.WhiteWebSdk(__spreadProps(__spreadValues({}, sdkConfig), {
499
+ useMobXState: true
500
+ }));
501
+ const player = await sdk.replayRoom(__spreadProps(__spreadValues({}, ensureWindowManager(replayRoomParams)), {
502
+ useMultiViews: true
503
+ }), callbacks);
504
+ const manager = await import_window_manager4.WindowManager.mount(__spreadProps(__spreadValues({
505
+ cursor: true
506
+ }, managerConfig), {
507
+ room: player
508
+ }));
509
+ return new FastboardPlayer(sdk, player, manager);
510
+ }
511
+ module.exports = __toCommonJS(minimal_exports);
512
+ //# sourceMappingURL=minimal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/minimal.ts","../src/behaviors/register-apps.ts","../src/helpers/utils.ts","../src/impl/app.ts","../src/helpers/emitter.ts","../src/helpers/value.ts","../src/impl/player.ts"],"sourcesContent":["import type {\n Displayer,\n HotKeys,\n JoinRoomParams,\n PlayerCallbacks,\n ReplayRoomParams,\n Room,\n RoomCallbacks,\n WhiteWebSdkConfiguration,\n} from \"white-web-sdk\";\nimport type { MountParams } from \"@netless/window-manager\";\n\nimport { DefaultHotKeys, WhiteWebSdk } from \"white-web-sdk\";\nimport { WindowManager } from \"@netless/window-manager\";\n\nimport \"./behaviors/register-apps\";\nimport { ensureWindowManager } from \"./helpers/utils\";\nimport { FastboardApp } from \"./impl/app\";\nimport { FastboardPlayer } from \"./impl/player\";\n\nexport type { FastboardReadable, FastboardWritable } from \"./helpers/value\";\n\nexport type { FastboardApp };\n\nexport interface FastboardOptions {\n sdkConfig: Omit<WhiteWebSdkConfiguration, \"useMobXState\">;\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 * },\n * joinRoom: {\n * uid: unique_id,\n * uuid: import.meta.env.VITE_ROOM_UUID,\n * roomToken: import.meta.env.VITE_ROOM_TOKEN,\n * },\n * })\n */\nexport async function createFastboard({\n sdkConfig,\n joinRoom: { callbacks, ...joinRoomParams },\n managerConfig,\n}: FastboardOptions) {\n const sdk = new WhiteWebSdk({\n ...sdkConfig,\n useMobXState: true,\n });\n\n const hotKeys: Partial<HotKeys> = {\n ...DefaultHotKeys,\n changeToSelector: \"s\",\n changeToLaserPointer: \"z\",\n changeToPencil: \"p\",\n changeToRectangle: \"r\",\n changeToEllipse: \"c\",\n changeToEraser: \"e\",\n changeToText: \"t\",\n changeToStraight: \"l\",\n changeToArrow: \"a\",\n changeToHand: \"h\",\n };\n\n const room = await sdk.joinRoom(\n {\n floatBar: true,\n hotKeys,\n ...ensureWindowManager(joinRoomParams),\n useMultiViews: true,\n disableNewPencil: false,\n disableMagixEventDispatchLimit: true,\n },\n callbacks\n );\n\n const manager = await WindowManager.mount({\n cursor: true,\n ...managerConfig,\n room,\n });\n\n return new FastboardApp(sdk, room, manager, hotKeys);\n}\n\nexport interface FastboardReplayOptions {\n sdkConfig: Omit<WhiteWebSdkConfiguration, \"useMobXState\">;\n replayRoom: Omit<ReplayRoomParams, \"useMultiViews\"> & {\n callbacks?: Partial<PlayerCallbacks>;\n };\n managerConfig?: Omit<MountParams, \"room\">;\n}\n\n/**\n * Create a FastboardPlayer instance.\n * @example\n * let app = await replayFastboard({\n * sdkConfig: {\n * appIdentifier: import.meta.env.VITE_APPID,\n * },\n * replayRoom: {\n * uid: unique_id,\n * uuid: import.meta.env.VITE_ROOM_UUID,\n * roomToken: import.meta.env.VITE_ROOM_TOKEN,\n * },\n * })\n */\nexport async function replayFastboard({\n sdkConfig,\n replayRoom: { callbacks, ...replayRoomParams },\n managerConfig,\n}: FastboardReplayOptions) {\n const sdk = new WhiteWebSdk({\n ...sdkConfig,\n useMobXState: true,\n });\n\n const player = await sdk.replayRoom(\n {\n ...ensureWindowManager(replayRoomParams),\n useMultiViews: true,\n },\n callbacks\n );\n\n const manager = await WindowManager.mount({\n cursor: true,\n ...managerConfig,\n room: player as Displayer as Room,\n });\n\n return new FastboardPlayer(sdk, player, manager);\n}\n","import { WindowManager } from \"@netless/window-manager\";\n\nWindowManager.register({\n kind: \"Monaco\",\n src: \"https://cdn.jsdelivr.net/npm/@netless/app-monaco@latest/dist/main.iife.js\",\n});\n\nWindowManager.register({\n kind: \"Countdown\",\n src: \"https://cdn.jsdelivr.net/npm/@netless/app-countdown@latest/dist/main.iife.js\",\n});\n\nWindowManager.register({\n kind: \"GeoGebra\",\n src: \"https://cdn.jsdelivr.net/npm/@netless/app-geogebra@latest/dist/main.iife.js\",\n appOptions: {\n HTML5Codebase: \"https://flat-storage-cn-hz.whiteboard.agora.io/GeoGebra/HTML5/5.0/web3d\",\n },\n});\n","import type { ConvertedFile, JoinRoomParams, ReplayRoomParams, SceneDefinition, Size } from \"white-web-sdk\";\nimport { WindowManager } from \"@netless/window-manager\";\n\nexport function noop() {\n /* noop */\n}\n\nexport function getImageSize(url: string, fallback: Size) {\n return new Promise<Size>(resolve => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = () => resolve(fallback);\n img.src = url;\n });\n}\n\nexport function makeSlideParams(scenes: SceneDefinition[]) {\n const emptyScenes: SceneDefinition[] = [];\n let taskId = \"\";\n let url = \"\";\n\n // e.g. \"ppt(x)://cdn/prefix/dynamicConvert/{taskId}/1.slide\"\n const pptSrcRE = /^pptx?(?<prefix>:\\/\\/\\S+?dynamicConvert)\\/(?<taskId>\\w+)\\//;\n\n for (const { name, ppt } of scenes) {\n // make sure scenesWithoutPPT.length === scenes.length\n emptyScenes.push({ name });\n\n if (!ppt || !ppt.src.startsWith(\"ppt\")) {\n continue;\n }\n const match = pptSrcRE.exec(ppt.src);\n if (!match || !match.groups) {\n continue;\n }\n taskId = match.groups.taskId;\n url = \"https\" + match.groups.prefix;\n break;\n }\n\n return { emptyScenes, taskId, url };\n}\n\nexport function convertedFileToScene(f: ConvertedFile, i: number) {\n return {\n name: String(i + 1),\n ppt: {\n src: f.conversionFileUrl,\n width: f.width,\n height: f.height,\n previewURL: f.preview,\n },\n };\n}\n\nexport function ensureWindowManager<T extends JoinRoomParams | ReplayRoomParams>(joinRoom: T): T {\n if (!joinRoom.invisiblePlugins || !joinRoom.invisiblePlugins.includes(WindowManager)) {\n joinRoom.invisiblePlugins = [...(joinRoom.invisiblePlugins || []), WindowManager];\n }\n return joinRoom;\n}\n\n// Copy from https://github.com/crimx/side-effect-manager/blob/main/src/gen-uid.ts\nconst SOUP = \"!#%()*+,-./:;=?@[]^_`{|}~\" + \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\nconst SOUP_LEN = SOUP.length;\nconst ID_LEN = 20;\nconst reusedIdCarrier = /* @__PURE__ */ Array(ID_LEN);\n\nexport function genUID() {\n for (let i = 0; i < ID_LEN; i++) {\n reusedIdCarrier[i] = SOUP.charAt(Math.random() * SOUP_LEN);\n }\n return reusedIdCarrier.join(\"\");\n}\n","import type { PublicEvent, WindowManager } from \"@netless/window-manager\";\nimport type {\n AnimationMode,\n ApplianceNames,\n Camera,\n Color,\n ConversionResponse,\n HotKeys,\n MemberState,\n Rectangle,\n Room,\n RoomCallbacks,\n RoomState,\n SceneDefinition,\n ShapeType,\n ViewCallbacks,\n WhiteWebSdk,\n} from \"white-web-sdk\";\nimport type { FastboardDisposer, FastboardInternalValue } from \"../helpers/value\";\n\nimport { BuiltinApps } from \"@netless/window-manager\";\nimport { convertedFileToScene, genUID, getImageSize, makeSlideParams } from \"../helpers/utils\";\nimport { createValue } from \"../helpers/value\";\n\nclass FastboardAppBase {\n public constructor(\n readonly sdk: WhiteWebSdk,\n readonly room: Room,\n readonly manager: WindowManager,\n readonly hotKeys: Partial<HotKeys>\n ) {}\n\n protected readonly _disposers: FastboardDisposer[] = [];\n protected _destroyed = false;\n protected _assertNotDestroyed() {\n if (this._destroyed) {\n throw new Error(\"[FastboardApp] Can not call any method on destroyed FastboardApp.\");\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected createValue: typeof createValue = (...args: [any, any]): any => {\n const value = createValue(...args);\n this._disposers.push((value as FastboardInternalValue<unknown>).dispose);\n return value;\n };\n\n protected _addRoomListener<K extends keyof RoomCallbacks, T = RoomCallbacks[K]>(name: K, listener: T) {\n this._assertNotDestroyed();\n this.room.callbacks.on(name, listener);\n return () => this.room.callbacks.off(name, listener);\n }\n\n protected _addManagerListener<K extends keyof PublicEvent>(name: K, set: (value: PublicEvent[K]) => void) {\n this._assertNotDestroyed();\n this.manager.emitter.on(name, set);\n return () => this.manager.emitter.off(name, set);\n }\n\n protected _addMainViewListener<K extends keyof ViewCallbacks, T = ViewCallbacks[K]>(name: K, listener: T) {\n this._assertNotDestroyed();\n this.manager.mainView.callbacks.on(name, listener);\n return () => this.manager.mainView.callbacks.off(name, listener);\n }\n\n public destroy() {\n this._disposers.forEach(dispose => dispose());\n this._disposers.length = 0;\n this._destroyed = true;\n this.manager.destroy();\n return this.room.disconnect();\n }\n}\n\nexport interface InsertDocsStatic {\n readonly fileType: \"pdf\" | \"ppt\";\n readonly scenePath: string;\n readonly scenes: SceneDefinition[];\n readonly title?: string;\n}\n\nexport interface InsertDocsDynamic {\n readonly fileType: \"pptx\";\n readonly scenePath: string;\n readonly taskId: string;\n readonly title?: string;\n readonly url?: string;\n /** @example [{ name: '1' }, { name: '2' }, { name: '3' }] */\n readonly scenes?: SceneDefinition[];\n}\n\nexport type InsertDocsParams = InsertDocsStatic | InsertDocsDynamic;\n\nexport type SetMemberStateFn = (partialMemberState: Partial<MemberState>) => void;\n\nexport type RoomStateChanged = (diff: Partial<RoomState>) => void;\n\nexport class FastboardApp extends FastboardAppBase {\n /**\n * Render this app to some DOM.\n */\n bindContainer(container: HTMLElement) {\n this._assertNotDestroyed();\n this.manager.bindContainer(container);\n }\n\n /**\n * Move window-manager's collector to some place.\n */\n bindCollector(container: HTMLElement) {\n this._assertNotDestroyed();\n this.manager.bindCollectorContainer(container);\n }\n\n /**\n * Is current room writable?\n */\n readonly writable = this.createValue(\n this.room.isWritable,\n set => this._addRoomListener(\"onEnableWriteNowChanged\", () => set(this.room.isWritable)),\n this.room.setWritable.bind(this.room)\n );\n\n /**\n * Current window-manager's windows' state (is it maximized?).\n */\n readonly boxState = this.createValue(this.manager.boxState, set =>\n this._addManagerListener(\"boxStateChange\", set)\n );\n\n /**\n * Current window-manager's focused app's id.\n * @example \"HelloWorld-1A2b3C4d\"\n */\n readonly focusedApp = this.createValue(this.manager.focused, set =>\n this._addManagerListener(\"focusedChange\", set)\n );\n\n /**\n * How many times can I call `app.redo()`?\n */\n readonly canRedoSteps = this.createValue(this.manager.canRedoSteps, set =>\n this._addManagerListener(\"canRedoStepsChange\", set)\n );\n\n /**\n * How many times can I call `app.undo()`?\n */\n readonly canUndoSteps = this.createValue(this.manager.canUndoSteps, set =>\n this._addManagerListener(\"canUndoStepsChange\", set)\n );\n\n /**\n * Current camera information of main view.\n */\n readonly camera = this.createValue(this.manager.mainView.camera, set =>\n this._addMainViewListener(\"onCameraUpdated\", set)\n );\n\n /**\n * Current tool's info, like \"is using pencil?\", \"what color?\".\n */\n readonly memberState = this.createValue(this.room.state.memberState, set =>\n this._addRoomListener(\"onRoomStateChanged\", ({ memberState: m }) => m && set(m))\n );\n\n /**\n * 0..n-1, current index of main view scenes.\n */\n readonly sceneIndex = this.createValue(\n this.manager.mainViewSceneIndex,\n set => this._addManagerListener(\"mainViewSceneIndexChange\", set),\n this.manager.setMainViewSceneIndex.bind(this.manager)\n );\n\n /**\n * How many pages are in the main view?\n */\n readonly sceneLength = this.createValue(this.manager.mainViewScenesLength, set =>\n this._addManagerListener(\"mainViewScenesLengthChange\", set)\n );\n\n /**\n * Undo a step on main view.\n */\n undo() {\n this._assertNotDestroyed();\n this.manager.mainView.undo();\n }\n\n /**\n * Redo a step on main view.\n */\n redo() {\n this._assertNotDestroyed();\n this.manager.mainView.redo();\n }\n\n /**\n * Move current main view's camera position.\n */\n moveCamera(camera: Partial<Camera> & { animationMode?: AnimationMode | undefined }) {\n this._assertNotDestroyed();\n this.manager.moveCamera(camera);\n }\n\n /**\n * Move current main view's camera to include a rectangle.\n */\n moveCameraToContain(rectangle: Rectangle & { animationMode?: AnimationMode }) {\n this._assertNotDestroyed();\n this.manager.moveCameraToContain(rectangle);\n }\n\n /**\n * Delete all things on the main view.\n */\n cleanCurrentScene() {\n this._assertNotDestroyed();\n this.manager.mainView.cleanCurrentScene();\n }\n\n /**\n * Set current tool, like \"pencil\".\n */\n setAppliance(appliance: ApplianceNames, shape?: ShapeType) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ currentApplianceName: appliance, shapeType: shape });\n }\n\n setStrokeWidth(strokeWidth: number) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ strokeWidth });\n }\n\n setStrokeColor(strokeColor: Color) {\n this._assertNotDestroyed();\n this.manager.mainView.setMemberState({ strokeColor });\n }\n\n /**\n * Insert an image to the main view.\n */\n async insertImage(url: string) {\n this._assertNotDestroyed();\n await this.manager.switchMainViewToWriter();\n\n const { divElement } = this.manager.mainView;\n const containerSize = {\n width: divElement?.scrollWidth || window.innerWidth,\n height: divElement?.scrollHeight || window.innerHeight,\n };\n\n // 1. shrink the image a little to fit container **width**\n const maxWidth = containerSize.width * 0.8;\n let { width, height } = await getImageSize(url, containerSize);\n const scale = Math.min(maxWidth / width, 1);\n const uuid = genUID();\n const { centerX, centerY } = this.manager.camera;\n width *= scale;\n height *= scale;\n this.manager.mainView.insertImage({ uuid, centerX, centerY, width, height, locked: false });\n this.manager.mainView.completeImageUpload(uuid, url);\n\n // 2. move camera to fit image **height**\n width /= 0.8;\n height /= 0.8;\n const originX = centerX - width / 2;\n const originY = centerY - height / 2;\n this.manager.moveCameraToContain({ originX, originY, width, height });\n }\n\n /**\n * Insert PDF/PPTX from conversion result.\n * @param status https://developer.netless.link/server-en/home/server-conversion#get-query-task-conversion-progress\n */\n insertDocs(filename: string, status: ConversionResponse): Promise<string | undefined>;\n\n /**\n * Manual way.\n * @example\n * app.insertDocs({\n * fileType: 'pptx',\n * scenePath: `/pptx/${conversion.taskId}`,\n * taskId: conversion.taskId,\n * title: 'Title',\n * })\n */\n insertDocs(params: InsertDocsParams): Promise<string | undefined>;\n\n insertDocs(arg1: string | InsertDocsParams, arg2?: ConversionResponse) {\n if (typeof arg1 === \"object\" && \"fileType\" in arg1) {\n return this._insertDocsImpl(arg1);\n } else if (arg2 && arg2.status !== \"Finished\") {\n throw new Error(\"[FastboardApp] Can not insert a converting doc.\");\n } else if (arg2 && arg2.progress) {\n const scenes: SceneDefinition[] = arg2.progress.convertedFileList.map(convertedFileToScene);\n const scenePath = `/${arg2.uuid}/${genUID()}`;\n const { emptyScenes, taskId, url } = makeSlideParams(scenes);\n if (taskId && url) {\n const title = arg1;\n return this._insertDocsImpl({ fileType: \"pptx\", scenePath, taskId, title, url, scenes: emptyScenes });\n } else {\n return this._insertDocsImpl({ fileType: \"pdf\", scenePath, scenes, title: arg1 });\n }\n }\n }\n\n private _insertDocsImpl({ fileType, scenePath, title, scenes, ...attributes }: InsertDocsParams) {\n this._assertNotDestroyed();\n switch (fileType) {\n case \"pdf\":\n case \"ppt\":\n return this.manager.addApp({\n kind: \"DocsViewer\",\n options: { scenePath, title, scenes },\n });\n case \"pptx\":\n return this.manager.addApp({\n kind: \"Slide\",\n options: { scenePath, title, scenes },\n attributes,\n });\n }\n }\n\n /**\n * Insert the Monaco Code Editor app.\n */\n insertCodeEditor() {\n this._assertNotDestroyed();\n return this.manager.addApp({\n kind: \"Monaco\",\n options: { title: \"Code Editor\" },\n });\n }\n\n /**\n * Insert the Countdown app.\n */\n insertCountdown() {\n this._assertNotDestroyed();\n return this.manager.addApp({\n kind: \"Countdown\",\n options: { title: \"Countdown\" },\n });\n }\n\n /**\n * Insert the Media Player app.\n */\n insertMedia(title: string, src: string) {\n this._assertNotDestroyed();\n return this.manager.addApp({\n kind: BuiltinApps.MediaPlayer,\n options: { title },\n attributes: { src },\n });\n }\n\n /**\n * Insert the GeoGebra app.\n */\n insertGeoGebra() {\n this._assertNotDestroyed();\n return this.manager.addApp({\n kind: \"GeoGebra\",\n options: { title: \"GeoGebra\" },\n });\n }\n}\n","export type FastboardListener<T> = (event: T) => void;\n\nexport class FastboardEmitter<T> {\n listeners = new Set<FastboardListener<T>>();\n\n get length(): number {\n return this.listeners.size;\n }\n\n dispatch(message: T) {\n this.listeners.forEach(callback => callback(message));\n }\n\n addListener(listener: FastboardListener<T>) {\n this.listeners.add(listener);\n }\n\n removeListener(listener: FastboardListener<T>) {\n this.listeners.delete(listener);\n }\n}\n","import { FastboardEmitter } from \"./emitter\";\nimport { noop } from \"./utils\";\n\nexport type FastboardDisposer = () => void;\n\nexport interface FastboardReadable<T> {\n readonly value: T;\n subscribe(callback: (value: T) => void): FastboardDisposer;\n reaction(callback: (value: T) => void): FastboardDisposer;\n}\n\nexport interface FastboardWritable<T, SetFn = (value: T) => void> extends FastboardReadable<T> {\n setValue: SetFn;\n}\n\nexport interface FastboardInternalValue<T> extends FastboardWritable<T> {\n dispose: FastboardDisposer;\n}\n\n/**\n * Create a readonly, reactive value.\n * @example\n * createValue(manager.getMainViewSceneIndex(), (set) => {\n * manager.emitter.on(\"mainViewSceneIndexChanged\", set)\n * return () => manager.emitter.off(\"mainViewSceneIndexChanged\", set)\n * })\n */\nexport function createValue<T>(\n value: T,\n effect: (set: (value: T) => void) => FastboardDisposer | void\n): FastboardReadable<T>;\n\n/**\n * Create a writable, reactive value.\n * @example\n * createValue(manager.getMainViewSceneIndex(), (set) => {\n * manager.emitter.on(\"mainViewSceneIndexChanged\", set)\n * return () => manager.emitter.off(\"mainViewSceneIndexChanged\", set)\n * }, (newValue) => {\n * manager.setMainViewSceneIndex(newValue)\n * })\n */\nexport function createValue<T, SetFn = (value: T) => void>(\n value: T,\n effect: (set: (value: T) => void) => FastboardDisposer | void,\n set: (value: T) => void\n): FastboardWritable<T, SetFn>;\n\nexport function createValue<T>(\n value: T,\n effect: (set: (value: T) => void) => FastboardDisposer | void,\n setValue: (value: T) => void = noop\n): FastboardInternalValue<T> {\n const emitter = new FastboardEmitter<T>();\n\n function set(newValue: T) {\n emitter.dispatch((value = newValue));\n }\n\n const dispose = effect(set) || noop;\n\n function subscribe(callback: (value: T) => void) {\n emitter.addListener(callback);\n callback(value);\n return () => emitter.removeListener(callback);\n }\n\n function reaction(callback: (value: T) => void) {\n emitter.addListener(callback);\n return () => emitter.removeListener(callback);\n }\n\n return { value, subscribe, reaction, setValue, dispose };\n}\n","import type { Player, PlayerCallbacks, PlayerState, ViewCallbacks, WhiteWebSdk } from \"white-web-sdk\";\nimport type { PublicEvent, WindowManager } from \"@netless/window-manager\";\nimport type { FastboardDisposer, FastboardInternalValue } from \"../helpers/value\";\n\nimport { createValue } from \"../helpers/value\";\n\nclass FastboardPlayerBase {\n public constructor(readonly sdk: WhiteWebSdk, readonly player: Player, readonly manager: WindowManager) {}\n\n protected readonly _disposers: FastboardDisposer[] = [];\n protected _destroyed = false;\n protected _assertNotDestroyed() {\n if (this._destroyed) {\n throw new Error(\"[FastboardPlayer] Can not call any method on destroyed FastboardPlayer.\");\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected createValue: typeof createValue = (...args: [any, any]): any => {\n const value = createValue(...args);\n this._disposers.push((value as FastboardInternalValue<unknown>).dispose);\n return value;\n };\n\n protected _addPlayerListener<K extends keyof PlayerCallbacks, T = PlayerCallbacks[K]>(\n name: K,\n listener: T\n ) {\n this._assertNotDestroyed();\n this.player.callbacks.on(name, listener);\n return () => this.player.callbacks.off(name, listener);\n }\n\n protected _addManagerListener<K extends keyof PublicEvent>(name: K, set: (value: PublicEvent[K]) => void) {\n this._assertNotDestroyed();\n this.manager.emitter.on(name, set);\n return () => this.manager.emitter.off(name, set);\n }\n\n protected _addMainViewListener<K extends keyof ViewCallbacks, T = ViewCallbacks[K]>(name: K, listener: T) {\n this._assertNotDestroyed();\n this.manager.mainView.callbacks.on(name, listener);\n return () => this.manager.mainView.callbacks.off(name, listener);\n }\n\n public destroy() {\n this._disposers.forEach(dispose => dispose());\n this._disposers.length = 0;\n this._destroyed = true;\n this.manager.destroy();\n this.player.callbacks.off();\n }\n}\n\nexport class FastboardPlayer extends FastboardPlayerBase {\n /**\n * Render this player to some DOM.\n */\n bindContainer(container: HTMLElement) {\n this._assertNotDestroyed();\n this.manager.bindContainer(container);\n }\n\n /**\n * Move window-manager's collector to some place.\n */\n bindCollector(container: HTMLElement) {\n this._assertNotDestroyed();\n this.manager.bindCollectorContainer(container);\n }\n\n readonly currentTime = this.createValue(\n this.player.progressTime,\n set => this._addPlayerListener(\"onProgressTimeChanged\", set),\n this.player.seekToProgressTime.bind(this.player)\n );\n\n readonly phase = this.createValue(this.player.phase, set => this._addPlayerListener(\"onPhaseChanged\", set));\n\n readonly canplay = this.createValue(this.player.isPlayable, set =>\n this._addPlayerListener(\"onIsPlayableChanged\", set)\n );\n\n private _setSpeed!: (value: number) => void;\n readonly speed = this.createValue(\n this.player.playbackSpeed,\n set => {\n this._setSpeed = set;\n },\n value => {\n this.player.playbackSpeed = value;\n this._setSpeed(value);\n }\n );\n\n readonly state = this.createValue<PlayerState | null>(null, set => {\n const update = () => set(this.player.state);\n const dispose1 = this._addPlayerListener(\"onLoadFirstFrame\", update);\n const dispose2 = this._addPlayerListener(\"onPlayerStateChanged\", update);\n return () => (dispose1(), dispose2());\n });\n\n seek(timestamp: number) {\n this._assertNotDestroyed();\n return this.player.seekToProgressTime(timestamp);\n }\n\n play() {\n this._assertNotDestroyed();\n this.player.play();\n }\n\n pause() {\n this._assertNotDestroyed();\n this.player.pause();\n }\n\n stop() {\n this._assertNotDestroyed();\n this.player.stop();\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,9 @@
1
+ import {
2
+ createFastboard,
3
+ replayFastboard
4
+ } from "./chunk-ERMK3Q77.mjs";
5
+ export {
6
+ createFastboard,
7
+ replayFastboard
8
+ };
9
+ //# sourceMappingURL=minimal.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/minimal.mjs ADDED
@@ -0,0 +1 @@
1
+ export * from "./dist/minimal.mjs";
package/package.json CHANGED
@@ -1,27 +1,25 @@
1
1
  {
2
2
  "name": "@netless/fastboard-core",
3
- "version": "0.2.0",
3
+ "version": "0.2.4",
4
4
  "description": "A tiny wrapper of white-web-sdk and @netless/window-manager.",
5
5
  "main": "dist/index.js",
6
6
  "files": [
7
7
  "src",
8
- "dist"
8
+ "dist",
9
+ "minimal.mjs",
10
+ "minimal.ts"
9
11
  ],
12
+ "dependencies": {
13
+ "@netless/app-slide": "^0.0.56"
14
+ },
10
15
  "peerDependencies": {
11
- "@netless/app-slide": "*",
12
16
  "@netless/window-manager": ">=0.4.0",
13
17
  "white-web-sdk": ">=2.16.0"
14
18
  },
15
- "peerDependenciesMeta": {
16
- "@netless/app-slide": {
17
- "optional": true
18
- }
19
- },
20
19
  "devDependencies": {
21
- "@netless/app-slide": "^0.0.56",
22
- "@netless/window-manager": "^0.4.0-canary.24",
20
+ "@netless/window-manager": "^0.4.0-canary.31",
23
21
  "tsup": "^5.11.11",
24
- "white-web-sdk": "^2.16.1"
22
+ "white-web-sdk": "^2.16.5"
25
23
  },
26
24
  "publishConfig": {
27
25
  "main": "dist/index.js",
@@ -1,17 +1,5 @@
1
1
  import { WindowManager } from "@netless/window-manager";
2
2
 
3
- WindowManager.register({
4
- kind: "Slide",
5
- appOptions: {
6
- // turn on to show debug controller
7
- debug: false,
8
- },
9
- src: async () => {
10
- const app = await import("@netless/app-slide");
11
- return app.default ?? app;
12
- },
13
- });
14
-
15
3
  WindowManager.register({
16
4
  kind: "Monaco",
17
5
  src: "https://cdn.jsdelivr.net/npm/@netless/app-monaco@latest/dist/main.iife.js",
@@ -0,0 +1,11 @@
1
+ import { WindowManager } from "@netless/window-manager";
2
+ import AppSlide from "@netless/app-slide";
3
+
4
+ WindowManager.register({
5
+ kind: "Slide",
6
+ appOptions: {
7
+ // turn on to show debug controller
8
+ debug: false,
9
+ },
10
+ src: AppSlide,
11
+ });
File without changes