@netless/fastboard-core 0.3.4-canary.0 → 0.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +399 -0
- package/dist/index.js +678 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +627 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +2 -2
- package/src/impl/FastboardApp.ts +24 -1
package/dist/index.js
ADDED
|
@@ -0,0 +1,678 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __defProps = Object.defineProperties;
|
|
6
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
7
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
8
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
9
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
10
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
11
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
12
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
13
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
14
|
+
var __spreadValues = (a, b) => {
|
|
15
|
+
for (var prop in b || (b = {}))
|
|
16
|
+
if (__hasOwnProp.call(b, prop))
|
|
17
|
+
__defNormalProp(a, prop, b[prop]);
|
|
18
|
+
if (__getOwnPropSymbols)
|
|
19
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
20
|
+
if (__propIsEnum.call(b, prop))
|
|
21
|
+
__defNormalProp(a, prop, b[prop]);
|
|
22
|
+
}
|
|
23
|
+
return a;
|
|
24
|
+
};
|
|
25
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
26
|
+
var __objRest = (source, exclude) => {
|
|
27
|
+
var target = {};
|
|
28
|
+
for (var prop in source)
|
|
29
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
30
|
+
target[prop] = source[prop];
|
|
31
|
+
if (source != null && __getOwnPropSymbols)
|
|
32
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
33
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
34
|
+
target[prop] = source[prop];
|
|
35
|
+
}
|
|
36
|
+
return target;
|
|
37
|
+
};
|
|
38
|
+
var __export = (target, all) => {
|
|
39
|
+
for (var name in all)
|
|
40
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
41
|
+
};
|
|
42
|
+
var __copyProps = (to, from, except, desc) => {
|
|
43
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
44
|
+
for (let key of __getOwnPropNames(from))
|
|
45
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
46
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
47
|
+
}
|
|
48
|
+
return to;
|
|
49
|
+
};
|
|
50
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod));
|
|
51
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
52
|
+
|
|
53
|
+
// src/index.ts
|
|
54
|
+
var src_exports = {};
|
|
55
|
+
__export(src_exports, {
|
|
56
|
+
FastboardApp: () => FastboardApp,
|
|
57
|
+
FastboardPlayer: () => FastboardPlayer,
|
|
58
|
+
SlideApp: () => import_app_slide.default,
|
|
59
|
+
addSlideHooks: () => import_app_slide.addHooks,
|
|
60
|
+
convertedFileToScene: () => convertedFileToScene,
|
|
61
|
+
createFastboard: () => createFastboard,
|
|
62
|
+
genUID: () => genUID,
|
|
63
|
+
getImageSize: () => getImageSize,
|
|
64
|
+
makeSlideParams: () => makeSlideParams,
|
|
65
|
+
previewSlide: () => import_app_slide.previewSlide,
|
|
66
|
+
readable: () => readable,
|
|
67
|
+
register: () => register,
|
|
68
|
+
replayFastboard: () => replayFastboard,
|
|
69
|
+
slideApps: () => import_app_slide.apps,
|
|
70
|
+
version: () => version,
|
|
71
|
+
warn: () => warn,
|
|
72
|
+
writable: () => writable
|
|
73
|
+
});
|
|
74
|
+
module.exports = __toCommonJS(src_exports);
|
|
75
|
+
|
|
76
|
+
// src/utils/store.ts
|
|
77
|
+
function noop() {
|
|
78
|
+
}
|
|
79
|
+
function safe_not_equal(a, b) {
|
|
80
|
+
return a != a ? b == b : a !== b || a && typeof a === "object" || typeof a === "function";
|
|
81
|
+
}
|
|
82
|
+
function readable(value, start = noop) {
|
|
83
|
+
let stop;
|
|
84
|
+
const subscribers = /* @__PURE__ */ new Set();
|
|
85
|
+
function set(new_value) {
|
|
86
|
+
if (safe_not_equal(value, new_value)) {
|
|
87
|
+
value = new_value;
|
|
88
|
+
if (stop) {
|
|
89
|
+
for (const run of subscribers) {
|
|
90
|
+
run(value);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function subscribe(run) {
|
|
96
|
+
subscribers.add(run);
|
|
97
|
+
if (subscribers.size === 1) {
|
|
98
|
+
stop = start(set) || noop;
|
|
99
|
+
}
|
|
100
|
+
run(value);
|
|
101
|
+
return () => {
|
|
102
|
+
subscribers.delete(run);
|
|
103
|
+
if (subscribers.size === 0) {
|
|
104
|
+
stop && stop();
|
|
105
|
+
stop = void 0;
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
function reaction(run) {
|
|
110
|
+
subscribers.add(run);
|
|
111
|
+
if (subscribers.size === 1) {
|
|
112
|
+
stop = start(set) || noop;
|
|
113
|
+
}
|
|
114
|
+
return () => {
|
|
115
|
+
subscribers.delete(run);
|
|
116
|
+
if (subscribers.size === 0) {
|
|
117
|
+
stop && stop();
|
|
118
|
+
stop = void 0;
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
get value() {
|
|
124
|
+
return value;
|
|
125
|
+
},
|
|
126
|
+
subscribe,
|
|
127
|
+
reaction
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
function writable(value, start = noop, set) {
|
|
131
|
+
const internal = readable(value, start);
|
|
132
|
+
return {
|
|
133
|
+
get value() {
|
|
134
|
+
return internal.value;
|
|
135
|
+
},
|
|
136
|
+
subscribe: internal.subscribe,
|
|
137
|
+
reaction: internal.reaction,
|
|
138
|
+
set,
|
|
139
|
+
update(fn) {
|
|
140
|
+
set(fn(value));
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// src/utils/misc.ts
|
|
146
|
+
function getImageSize(url, fallback) {
|
|
147
|
+
return new Promise((resolve) => {
|
|
148
|
+
const img = new Image();
|
|
149
|
+
img.onload = () => resolve(img);
|
|
150
|
+
img.onerror = () => resolve(fallback);
|
|
151
|
+
img.src = url;
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
function makeSlideParams(scenes) {
|
|
155
|
+
const emptyScenes = [];
|
|
156
|
+
let taskId = "";
|
|
157
|
+
let url = "";
|
|
158
|
+
const pptSrcRE = new RegExp("^pptx?(?<prefix>:\\/\\/\\S+?dynamicConvert)\\/(?<taskId>\\w+)\\/");
|
|
159
|
+
for (const { name, ppt } of scenes) {
|
|
160
|
+
emptyScenes.push({ name });
|
|
161
|
+
if (!ppt || !ppt.src.startsWith("ppt")) {
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
const match = pptSrcRE.exec(ppt.src);
|
|
165
|
+
if (!match || !match.groups) {
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
taskId = match.groups.taskId;
|
|
169
|
+
url = "https" + match.groups.prefix;
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
return { scenes: emptyScenes, taskId, url };
|
|
173
|
+
}
|
|
174
|
+
function convertedFileToScene(f, i) {
|
|
175
|
+
return {
|
|
176
|
+
name: String(i + 1),
|
|
177
|
+
ppt: {
|
|
178
|
+
src: f.conversionFileUrl,
|
|
179
|
+
width: f.width,
|
|
180
|
+
height: f.height,
|
|
181
|
+
previewURL: f.preview
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// src/utils/uid.ts
|
|
187
|
+
var SOUP = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
188
|
+
var SOUP_LEN = 62;
|
|
189
|
+
var ID_LEN = 20;
|
|
190
|
+
var reusedIdCarrier = /* @__PURE__ */ Array(ID_LEN);
|
|
191
|
+
function genUID() {
|
|
192
|
+
for (let i = 0; i < ID_LEN; i++) {
|
|
193
|
+
reusedIdCarrier[i] = SOUP.charAt(Math.random() * SOUP_LEN);
|
|
194
|
+
}
|
|
195
|
+
return reusedIdCarrier.join("");
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// src/utils/warn.ts
|
|
199
|
+
var warnings = {
|
|
200
|
+
"no-ppt-in-scenes": "You're probably inserting the slide app in a wrong way, there shouldn't exist `scenes[0].ppt`."
|
|
201
|
+
};
|
|
202
|
+
var warned = /* @__PURE__ */ new Set();
|
|
203
|
+
function warn(id) {
|
|
204
|
+
if (warned.has(id))
|
|
205
|
+
return;
|
|
206
|
+
warned.add(id);
|
|
207
|
+
console.warn(warnings[id]);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// src/impl/FastboardApp.ts
|
|
211
|
+
var import_white_web_sdk = require("white-web-sdk");
|
|
212
|
+
var import_window_manager3 = require("@netless/window-manager");
|
|
213
|
+
|
|
214
|
+
// src/internal.ts
|
|
215
|
+
var import_window_manager = require("@netless/window-manager");
|
|
216
|
+
function ensure_window_manager(joinRoom) {
|
|
217
|
+
if (!joinRoom.invisiblePlugins || !joinRoom.invisiblePlugins.includes(import_window_manager.WindowManager)) {
|
|
218
|
+
joinRoom.invisiblePlugins = [...joinRoom.invisiblePlugins || [], import_window_manager.WindowManager];
|
|
219
|
+
}
|
|
220
|
+
return joinRoom;
|
|
221
|
+
}
|
|
222
|
+
function transform_app_status(status) {
|
|
223
|
+
return status === "start" ? "loading" : status === "failed" ? "failed" : "idle";
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// src/behaviors/index.ts
|
|
227
|
+
var import_window_manager2 = require("@netless/window-manager");
|
|
228
|
+
var import_app_slide = __toESM(require("@netless/app-slide"));
|
|
229
|
+
var DefaultApps = {
|
|
230
|
+
Monaco: {
|
|
231
|
+
src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-monaco/0.1.12/dist/main.iife.js"
|
|
232
|
+
},
|
|
233
|
+
Countdown: {
|
|
234
|
+
src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-countdown/0.0.2/dist/main.iife.js"
|
|
235
|
+
},
|
|
236
|
+
GeoGebra: {
|
|
237
|
+
src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-geogebra/0.0.4/dist/main.iife.js",
|
|
238
|
+
appOptions: {
|
|
239
|
+
HTML5Codebase: "https://flat-storage-cn-hz.whiteboard.agora.io/GeoGebra/HTML5/5.0/web3d"
|
|
240
|
+
}
|
|
241
|
+
},
|
|
242
|
+
EmbeddedPage: {
|
|
243
|
+
src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-embedded-page/0.1.1/dist/main.iife.js"
|
|
244
|
+
},
|
|
245
|
+
Plyr: {
|
|
246
|
+
src: "https://netless-app.oss-cn-hangzhou.aliyuncs.com/@netless/app-plyr/0.1.3/dist/main.iife.js"
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
import_window_manager2.WindowManager.register({
|
|
250
|
+
kind: "Slide",
|
|
251
|
+
appOptions: { debug: false },
|
|
252
|
+
src: import_app_slide.default,
|
|
253
|
+
addHooks: import_app_slide.addHooks
|
|
254
|
+
});
|
|
255
|
+
for (const kind in DefaultApps) {
|
|
256
|
+
if (Object.prototype.hasOwnProperty.call(DefaultApps, kind)) {
|
|
257
|
+
const options = DefaultApps[kind];
|
|
258
|
+
import_window_manager2.WindowManager.register(__spreadValues({ kind }, options));
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
var register = import_window_manager2.WindowManager.register.bind(import_window_manager2.WindowManager);
|
|
262
|
+
var version = "0.3.4";
|
|
263
|
+
if (typeof window !== "undefined") {
|
|
264
|
+
let str = window.__netlessUA || "";
|
|
265
|
+
str += ` ${"@netless/fastboard"}@${version} `;
|
|
266
|
+
window.__netlessUA = str;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// src/impl/FastboardApp.ts
|
|
270
|
+
var FastboardAppBase = class {
|
|
271
|
+
constructor(sdk, room, manager, hotKeys) {
|
|
272
|
+
this.sdk = sdk;
|
|
273
|
+
this.room = room;
|
|
274
|
+
this.manager = manager;
|
|
275
|
+
this.hotKeys = hotKeys;
|
|
276
|
+
this._destroyed = false;
|
|
277
|
+
}
|
|
278
|
+
_assertNotDestroyed() {
|
|
279
|
+
if (this._destroyed) {
|
|
280
|
+
throw new Error("FastboardApp has been destroyed");
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
_addRoomListener(name, listener) {
|
|
284
|
+
this._assertNotDestroyed();
|
|
285
|
+
this.room.callbacks.on(name, listener);
|
|
286
|
+
return () => this.room.callbacks.off(name, listener);
|
|
287
|
+
}
|
|
288
|
+
_addManagerListener(name, listener) {
|
|
289
|
+
this._assertNotDestroyed();
|
|
290
|
+
this.manager.emitter.on(name, listener);
|
|
291
|
+
return () => this.manager.emitter.off(name, listener);
|
|
292
|
+
}
|
|
293
|
+
_addMainViewListener(name, listener) {
|
|
294
|
+
this._assertNotDestroyed();
|
|
295
|
+
this.manager.mainView.callbacks.on(name, listener);
|
|
296
|
+
return () => this.manager.mainView.callbacks.off(name, listener);
|
|
297
|
+
}
|
|
298
|
+
destroy() {
|
|
299
|
+
this._destroyed = true;
|
|
300
|
+
this.manager.destroy();
|
|
301
|
+
return this.room.disconnect();
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
var FastboardApp = class extends FastboardAppBase {
|
|
305
|
+
constructor() {
|
|
306
|
+
super(...arguments);
|
|
307
|
+
this.writable = writable(this.room.isWritable, (set) => {
|
|
308
|
+
set(this.room.isWritable);
|
|
309
|
+
return this._addRoomListener("onEnableWriteNowChanged", () => set(this.room.isWritable));
|
|
310
|
+
}, this.room.setWritable.bind(this.room));
|
|
311
|
+
this.phase = readable(this.room.phase, (set) => {
|
|
312
|
+
set(this.room.phase);
|
|
313
|
+
return this._addRoomListener("onPhaseChanged", set);
|
|
314
|
+
});
|
|
315
|
+
this.boxState = readable(this.manager.boxState, (set) => {
|
|
316
|
+
set(this.manager.boxState);
|
|
317
|
+
return this._addManagerListener("boxStateChange", set);
|
|
318
|
+
});
|
|
319
|
+
this.focusedApp = readable(this.manager.focused, (set) => {
|
|
320
|
+
set(this.manager.focused);
|
|
321
|
+
return this._addManagerListener("focusedChange", set);
|
|
322
|
+
});
|
|
323
|
+
this.canRedoSteps = readable(this.manager.canRedoSteps, (set) => {
|
|
324
|
+
set(this.manager.canRedoSteps);
|
|
325
|
+
return this._addManagerListener("canRedoStepsChange", set);
|
|
326
|
+
});
|
|
327
|
+
this.canUndoSteps = readable(this.manager.canUndoSteps, (set) => {
|
|
328
|
+
set(this.manager.canUndoSteps);
|
|
329
|
+
return this._addManagerListener("canUndoStepsChange", set);
|
|
330
|
+
});
|
|
331
|
+
this.camera = readable(this.manager.camera, (set) => {
|
|
332
|
+
set(this.manager.camera);
|
|
333
|
+
return this._addMainViewListener("onCameraUpdated", set);
|
|
334
|
+
});
|
|
335
|
+
this.memberState = readable(this.room.state.memberState, (set) => {
|
|
336
|
+
set(this.room.state.memberState);
|
|
337
|
+
return this._addRoomListener("onRoomStateChanged", ({ memberState: m }) => m && set(m));
|
|
338
|
+
});
|
|
339
|
+
this.sceneIndex = writable(this.manager.mainViewSceneIndex, (set) => {
|
|
340
|
+
set(this.manager.mainViewSceneIndex);
|
|
341
|
+
return this._addManagerListener("mainViewSceneIndexChange", set);
|
|
342
|
+
}, this.manager.setMainViewSceneIndex.bind(this.manager));
|
|
343
|
+
this.sceneLength = readable(this.manager.mainViewScenesLength, (set) => {
|
|
344
|
+
set(this.manager.mainViewScenesLength);
|
|
345
|
+
return this._addManagerListener("mainViewScenesLengthChange", set);
|
|
346
|
+
});
|
|
347
|
+
this._appsStatus = {};
|
|
348
|
+
this.appsStatus = readable({}, (set) => this._addManagerListener("loadApp", ({ kind, status, reason }) => {
|
|
349
|
+
this._appsStatus[kind] = { status: transform_app_status(status), reason };
|
|
350
|
+
set(this._appsStatus);
|
|
351
|
+
}));
|
|
352
|
+
}
|
|
353
|
+
bindContainer(container) {
|
|
354
|
+
this._assertNotDestroyed();
|
|
355
|
+
this.manager.bindContainer(container);
|
|
356
|
+
}
|
|
357
|
+
bindCollector(container) {
|
|
358
|
+
this._assertNotDestroyed();
|
|
359
|
+
this.manager.bindCollectorContainer(container);
|
|
360
|
+
}
|
|
361
|
+
undo() {
|
|
362
|
+
this._assertNotDestroyed();
|
|
363
|
+
this.manager.undo();
|
|
364
|
+
}
|
|
365
|
+
redo() {
|
|
366
|
+
this._assertNotDestroyed();
|
|
367
|
+
this.manager.redo();
|
|
368
|
+
}
|
|
369
|
+
moveCamera(camera) {
|
|
370
|
+
this._assertNotDestroyed();
|
|
371
|
+
this.manager.moveCamera(camera);
|
|
372
|
+
}
|
|
373
|
+
moveCameraToContain(rectangle) {
|
|
374
|
+
this._assertNotDestroyed();
|
|
375
|
+
this.manager.moveCameraToContain(rectangle);
|
|
376
|
+
}
|
|
377
|
+
cleanCurrentScene() {
|
|
378
|
+
this._assertNotDestroyed();
|
|
379
|
+
this.manager.cleanCurrentScene();
|
|
380
|
+
}
|
|
381
|
+
setAppliance(appliance, shape) {
|
|
382
|
+
this._assertNotDestroyed();
|
|
383
|
+
this.manager.mainView.setMemberState({
|
|
384
|
+
currentApplianceName: appliance,
|
|
385
|
+
shapeType: shape
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
setStrokeWidth(strokeWidth) {
|
|
389
|
+
this._assertNotDestroyed();
|
|
390
|
+
this.manager.mainView.setMemberState({ strokeWidth });
|
|
391
|
+
}
|
|
392
|
+
setStrokeColor(strokeColor) {
|
|
393
|
+
this._assertNotDestroyed();
|
|
394
|
+
this.manager.mainView.setMemberState({ strokeColor });
|
|
395
|
+
}
|
|
396
|
+
setTextSize(textSize) {
|
|
397
|
+
this._assertNotDestroyed();
|
|
398
|
+
this.manager.mainView.setMemberState({ textSize });
|
|
399
|
+
}
|
|
400
|
+
setTextColor(textColor) {
|
|
401
|
+
this._assertNotDestroyed();
|
|
402
|
+
this.manager.mainView.setMemberState({ textColor });
|
|
403
|
+
}
|
|
404
|
+
prevPage() {
|
|
405
|
+
this._assertNotDestroyed();
|
|
406
|
+
return this.manager.prevPage();
|
|
407
|
+
}
|
|
408
|
+
nextPage() {
|
|
409
|
+
this._assertNotDestroyed();
|
|
410
|
+
return this.manager.nextPage();
|
|
411
|
+
}
|
|
412
|
+
addPage(params) {
|
|
413
|
+
this._assertNotDestroyed();
|
|
414
|
+
return this.manager.addPage(params);
|
|
415
|
+
}
|
|
416
|
+
removePage(index) {
|
|
417
|
+
this._assertNotDestroyed();
|
|
418
|
+
return this.manager.removePage(index);
|
|
419
|
+
}
|
|
420
|
+
async insertImage(url) {
|
|
421
|
+
this._assertNotDestroyed();
|
|
422
|
+
await this.manager.switchMainViewToWriter();
|
|
423
|
+
const { divElement } = this.manager.mainView;
|
|
424
|
+
const containerSize = {
|
|
425
|
+
width: (divElement == null ? void 0 : divElement.scrollWidth) || window.innerWidth,
|
|
426
|
+
height: (divElement == null ? void 0 : divElement.scrollHeight) || window.innerHeight
|
|
427
|
+
};
|
|
428
|
+
const maxWidth = containerSize.width * 0.8;
|
|
429
|
+
let { width, height } = await getImageSize(url, containerSize);
|
|
430
|
+
const scale = Math.min(maxWidth / width, 1);
|
|
431
|
+
const uuid = genUID();
|
|
432
|
+
const { centerX, centerY } = this.manager.camera;
|
|
433
|
+
width *= scale;
|
|
434
|
+
height *= scale;
|
|
435
|
+
this.manager.mainView.insertImage({ uuid, centerX, centerY, width, height, locked: false });
|
|
436
|
+
this.manager.mainView.completeImageUpload(uuid, url);
|
|
437
|
+
width /= 0.8;
|
|
438
|
+
height /= 0.8;
|
|
439
|
+
const originX = centerX - width / 2;
|
|
440
|
+
const originY = centerY - height / 2;
|
|
441
|
+
this.manager.moveCameraToContain({ originX, originY, width, height });
|
|
442
|
+
}
|
|
443
|
+
insertDocs(arg1, arg2) {
|
|
444
|
+
this._assertNotDestroyed();
|
|
445
|
+
if (typeof arg1 === "object" && "fileType" in arg1) {
|
|
446
|
+
return this._insertDocsImpl(arg1);
|
|
447
|
+
} else if (arg2 && arg2.status !== "Finished") {
|
|
448
|
+
throw new Error("FastboardApp cannot insert a converting doc.");
|
|
449
|
+
} else if (arg2 && arg2.progress) {
|
|
450
|
+
const title = arg1;
|
|
451
|
+
const scenePath = `/${arg2.uuid}/${genUID()}`;
|
|
452
|
+
const scenes1 = arg2.progress.convertedFileList.map(convertedFileToScene);
|
|
453
|
+
const { scenes, taskId, url } = makeSlideParams(scenes1);
|
|
454
|
+
if (taskId && url) {
|
|
455
|
+
return this._insertDocsImpl({ fileType: "pptx", scenePath, scenes, title, taskId, url });
|
|
456
|
+
} else {
|
|
457
|
+
return this._insertDocsImpl({ fileType: "pdf", scenePath, scenes: scenes1, title });
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
_insertDocsImpl(_a) {
|
|
462
|
+
var _b = _a, { fileType, scenePath, title, scenes } = _b, attributes = __objRest(_b, ["fileType", "scenePath", "title", "scenes"]);
|
|
463
|
+
this._assertNotDestroyed();
|
|
464
|
+
switch (fileType) {
|
|
465
|
+
case "pdf":
|
|
466
|
+
return this.manager.addApp({
|
|
467
|
+
kind: "DocsViewer",
|
|
468
|
+
options: { scenePath, title, scenes }
|
|
469
|
+
});
|
|
470
|
+
case "pptx":
|
|
471
|
+
if (scenes && scenes[0].ppt) {
|
|
472
|
+
warn("no-ppt-in-scenes");
|
|
473
|
+
}
|
|
474
|
+
return this.manager.addApp({
|
|
475
|
+
kind: "Slide",
|
|
476
|
+
options: { scenePath, title, scenes },
|
|
477
|
+
attributes
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
insertMedia(title, src) {
|
|
482
|
+
this._assertNotDestroyed();
|
|
483
|
+
return this.manager.addApp({
|
|
484
|
+
kind: import_window_manager3.BuiltinApps.MediaPlayer,
|
|
485
|
+
options: { title },
|
|
486
|
+
attributes: { src }
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
insertCodeEditor() {
|
|
490
|
+
this._assertNotDestroyed();
|
|
491
|
+
return this.manager.addApp({
|
|
492
|
+
kind: "Monaco",
|
|
493
|
+
options: { title: "Code Editor" }
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
insertCountdown() {
|
|
497
|
+
this._assertNotDestroyed();
|
|
498
|
+
return this.manager.addApp({
|
|
499
|
+
kind: "Countdown",
|
|
500
|
+
options: { title: "Countdown" }
|
|
501
|
+
});
|
|
502
|
+
}
|
|
503
|
+
insertGeoGebra() {
|
|
504
|
+
this._assertNotDestroyed();
|
|
505
|
+
return this.manager.addApp({
|
|
506
|
+
kind: "GeoGebra",
|
|
507
|
+
options: { title: "GeoGebra" }
|
|
508
|
+
});
|
|
509
|
+
}
|
|
510
|
+
};
|
|
511
|
+
async function createFastboard(_a) {
|
|
512
|
+
var _b = _a, {
|
|
513
|
+
sdkConfig,
|
|
514
|
+
joinRoom: _c
|
|
515
|
+
} = _b, _d = _c, { callbacks } = _d, joinRoomParams = __objRest(_d, ["callbacks"]), {
|
|
516
|
+
managerConfig,
|
|
517
|
+
netlessApps
|
|
518
|
+
} = _b;
|
|
519
|
+
const sdk = new import_white_web_sdk.WhiteWebSdk(__spreadProps(__spreadValues({}, sdkConfig), {
|
|
520
|
+
useMobXState: true
|
|
521
|
+
}));
|
|
522
|
+
const hotKeys = __spreadProps(__spreadValues({}, import_white_web_sdk.DefaultHotKeys), {
|
|
523
|
+
changeToSelector: "s",
|
|
524
|
+
changeToLaserPointer: "z",
|
|
525
|
+
changeToPencil: "p",
|
|
526
|
+
changeToRectangle: "r",
|
|
527
|
+
changeToEllipse: "c",
|
|
528
|
+
changeToEraser: "e",
|
|
529
|
+
changeToText: "t",
|
|
530
|
+
changeToStraight: "l",
|
|
531
|
+
changeToArrow: "a",
|
|
532
|
+
changeToHand: "h"
|
|
533
|
+
});
|
|
534
|
+
if (netlessApps) {
|
|
535
|
+
netlessApps.forEach((app) => {
|
|
536
|
+
register({ kind: app.kind, src: app });
|
|
537
|
+
});
|
|
538
|
+
}
|
|
539
|
+
const room = await sdk.joinRoom(__spreadProps(__spreadValues({
|
|
540
|
+
floatBar: true,
|
|
541
|
+
hotKeys
|
|
542
|
+
}, ensure_window_manager(joinRoomParams)), {
|
|
543
|
+
useMultiViews: true,
|
|
544
|
+
disableNewPencil: false,
|
|
545
|
+
disableMagixEventDispatchLimit: true
|
|
546
|
+
}), callbacks);
|
|
547
|
+
const manager = await import_window_manager3.WindowManager.mount(__spreadProps(__spreadValues({
|
|
548
|
+
cursor: true
|
|
549
|
+
}, managerConfig), {
|
|
550
|
+
room
|
|
551
|
+
}));
|
|
552
|
+
manager.mainView.setCameraBound({
|
|
553
|
+
minContentMode: (0, import_white_web_sdk.contentModeScale)(0.3),
|
|
554
|
+
maxContentMode: (0, import_white_web_sdk.contentModeScale)(3)
|
|
555
|
+
});
|
|
556
|
+
return new FastboardApp(sdk, room, manager, hotKeys);
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
// src/impl/FastboardPlayer.ts
|
|
560
|
+
var import_white_web_sdk2 = require("white-web-sdk");
|
|
561
|
+
var import_window_manager4 = require("@netless/window-manager");
|
|
562
|
+
var FastboardPlayerBase = class {
|
|
563
|
+
constructor(sdk, player, manager) {
|
|
564
|
+
this.sdk = sdk;
|
|
565
|
+
this.player = player;
|
|
566
|
+
this.manager = manager;
|
|
567
|
+
this._destroyed = false;
|
|
568
|
+
}
|
|
569
|
+
_assertNotDestroyed() {
|
|
570
|
+
if (this._destroyed) {
|
|
571
|
+
throw new Error("FastboardApp has been destroyed");
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
_addPlayerListener(name, listener) {
|
|
575
|
+
this._assertNotDestroyed();
|
|
576
|
+
this.player.callbacks.on(name, listener);
|
|
577
|
+
return () => this.player.callbacks.off(name, listener);
|
|
578
|
+
}
|
|
579
|
+
_addManagerListener(name, listener) {
|
|
580
|
+
this._assertNotDestroyed();
|
|
581
|
+
this.manager.emitter.on(name, listener);
|
|
582
|
+
return () => this.manager.emitter.off(name, listener);
|
|
583
|
+
}
|
|
584
|
+
_addMainViewListener(name, listener) {
|
|
585
|
+
this._assertNotDestroyed();
|
|
586
|
+
this.manager.mainView.callbacks.on(name, listener);
|
|
587
|
+
return () => this.manager.mainView.callbacks.off(name, listener);
|
|
588
|
+
}
|
|
589
|
+
destroy() {
|
|
590
|
+
this._destroyed = true;
|
|
591
|
+
this.manager.destroy();
|
|
592
|
+
return this.player.callbacks.off();
|
|
593
|
+
}
|
|
594
|
+
};
|
|
595
|
+
var FastboardPlayer = class extends FastboardPlayerBase {
|
|
596
|
+
constructor() {
|
|
597
|
+
super(...arguments);
|
|
598
|
+
this.currentTime = writable(this.player.progressTime, (set) => {
|
|
599
|
+
set(this.player.progressTime);
|
|
600
|
+
return this._addPlayerListener("onProgressTimeChanged", set);
|
|
601
|
+
}, this.player.seekToProgressTime.bind(this.player));
|
|
602
|
+
this.phase = readable(this.player.phase, (set) => {
|
|
603
|
+
set(this.player.phase);
|
|
604
|
+
return this._addPlayerListener("onPhaseChanged", set);
|
|
605
|
+
});
|
|
606
|
+
this.canplay = readable(this.player.isPlayable, (set) => {
|
|
607
|
+
set(this.player.isPlayable);
|
|
608
|
+
return this._addPlayerListener("onIsPlayableChanged", set);
|
|
609
|
+
});
|
|
610
|
+
this.playbackRate = writable(this.player.playbackSpeed, (set) => {
|
|
611
|
+
this._setPlaybackRate = set;
|
|
612
|
+
set(this.player.playbackSpeed);
|
|
613
|
+
}, (value) => {
|
|
614
|
+
this.player.playbackSpeed = value;
|
|
615
|
+
this._setPlaybackRate(value);
|
|
616
|
+
});
|
|
617
|
+
this.duration = readable(this.player.timeDuration, (set) => {
|
|
618
|
+
set(this.player.timeDuration);
|
|
619
|
+
});
|
|
620
|
+
this.state = readable(this.player.state, (set) => {
|
|
621
|
+
set(this.player.state);
|
|
622
|
+
return this._addPlayerListener("onPlayerStateChanged", () => set(this.player.state));
|
|
623
|
+
});
|
|
624
|
+
}
|
|
625
|
+
bindContainer(container) {
|
|
626
|
+
this._assertNotDestroyed();
|
|
627
|
+
this.manager.bindContainer(container);
|
|
628
|
+
}
|
|
629
|
+
bindCollector(container) {
|
|
630
|
+
this._assertNotDestroyed();
|
|
631
|
+
this.manager.bindCollectorContainer(container);
|
|
632
|
+
}
|
|
633
|
+
seek(timestamp) {
|
|
634
|
+
this._assertNotDestroyed();
|
|
635
|
+
return this.player.seekToProgressTime(timestamp);
|
|
636
|
+
}
|
|
637
|
+
play() {
|
|
638
|
+
this._assertNotDestroyed();
|
|
639
|
+
this.player.play();
|
|
640
|
+
}
|
|
641
|
+
pause() {
|
|
642
|
+
this._assertNotDestroyed();
|
|
643
|
+
this.player.pause();
|
|
644
|
+
}
|
|
645
|
+
stop() {
|
|
646
|
+
this._assertNotDestroyed();
|
|
647
|
+
this.player.stop();
|
|
648
|
+
}
|
|
649
|
+
setPlaybackRate(value) {
|
|
650
|
+
this._assertNotDestroyed();
|
|
651
|
+
this.playbackRate.set(value);
|
|
652
|
+
}
|
|
653
|
+
};
|
|
654
|
+
async function replayFastboard(_a) {
|
|
655
|
+
var _b = _a, {
|
|
656
|
+
sdkConfig,
|
|
657
|
+
replayRoom: _c
|
|
658
|
+
} = _b, _d = _c, { callbacks } = _d, replayRoomParams = __objRest(_d, ["callbacks"]), {
|
|
659
|
+
managerConfig
|
|
660
|
+
} = _b;
|
|
661
|
+
const sdk = new import_white_web_sdk2.WhiteWebSdk(__spreadProps(__spreadValues({}, sdkConfig), {
|
|
662
|
+
useMobXState: true
|
|
663
|
+
}));
|
|
664
|
+
const player = await sdk.replayRoom(__spreadProps(__spreadValues({}, ensure_window_manager(replayRoomParams)), {
|
|
665
|
+
useMultiViews: true
|
|
666
|
+
}), callbacks);
|
|
667
|
+
const managerPromise = import_window_manager4.WindowManager.mount(__spreadProps(__spreadValues({
|
|
668
|
+
cursor: true
|
|
669
|
+
}, managerConfig), {
|
|
670
|
+
room: player
|
|
671
|
+
}));
|
|
672
|
+
player.play();
|
|
673
|
+
const manager = await managerPromise;
|
|
674
|
+
player.pause();
|
|
675
|
+
await player.seekToProgressTime(0);
|
|
676
|
+
return new FastboardPlayer(sdk, player, manager);
|
|
677
|
+
}
|
|
678
|
+
//# sourceMappingURL=index.js.map
|