@netless/fastboard 0.1.1 → 0.2.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
@@ -1,39 +1,8 @@
1
- var __create = Object.create;
2
1
  var __defProp = Object.defineProperty;
3
- var __defProps = Object.defineProperties;
4
2
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
6
3
  var __getOwnPropNames = Object.getOwnPropertyNames;
7
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
8
- var __getProtoOf = Object.getPrototypeOf;
9
4
  var __hasOwnProp = Object.prototype.hasOwnProperty;
10
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
11
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
12
- var __spreadValues = (a, b) => {
13
- for (var prop in b || (b = {}))
14
- if (__hasOwnProp.call(b, prop))
15
- __defNormalProp(a, prop, b[prop]);
16
- if (__getOwnPropSymbols)
17
- for (var prop of __getOwnPropSymbols(b)) {
18
- if (__propIsEnum.call(b, prop))
19
- __defNormalProp(a, prop, b[prop]);
20
- }
21
- return a;
22
- };
23
- var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
24
5
  var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
25
- var __objRest = (source, exclude) => {
26
- var target = {};
27
- for (var prop in source)
28
- if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
29
- target[prop] = source[prop];
30
- if (source != null && __getOwnPropSymbols)
31
- for (var prop of __getOwnPropSymbols(source)) {
32
- if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
33
- target[prop] = source[prop];
34
- }
35
- return target;
36
- };
37
6
  var __export = (target, all) => {
38
7
  for (var name in all)
39
8
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -46,9 +15,6 @@ var __reExport = (target, module2, copyDefault, desc) => {
46
15
  }
47
16
  return target;
48
17
  };
49
- var __toESM = (module2, isNodeMode) => {
50
- return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", !isNodeMode && module2 && module2.__esModule ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
51
- };
52
18
  var __toCommonJS = /* @__PURE__ */ ((cache) => {
53
19
  return (module2, temp) => {
54
20
  return cache && cache.get(module2) || (temp = __reExport(__markAsModule({}), module2, 1), cache && cache.set(module2, temp), temp);
@@ -58,371 +24,9 @@ var __toCommonJS = /* @__PURE__ */ ((cache) => {
58
24
  // src/index.ts
59
25
  var src_exports = {};
60
26
  __export(src_exports, {
61
- createFastboard: () => createFastboard
62
- });
63
-
64
- // ../../node_modules/.pnpm/tsup@5.11.11_typescript@4.5.4/node_modules/tsup/assets/cjs_shims.js
65
- var getImportMetaUrl = () => typeof document === "undefined" ? new URL("file:" + __filename).href : document.currentScript && document.currentScript.src || new URL("main.js", document.baseURI).href;
66
- var importMetaUrl = getImportMetaUrl();
67
-
68
- // src/index.ts
69
- var import_white_web_sdk = require("white-web-sdk");
70
- var import_window_manager4 = require("@netless/window-manager");
71
-
72
- // src/register-apps.ts
73
- var import_window_manager = require("@netless/window-manager");
74
- import_window_manager.WindowManager.register({
75
- kind: "Slide",
76
- appOptions: {
77
- debug: false
78
- },
79
- src: async () => {
80
- var _a;
81
- const app = await import("@netless/app-slide");
82
- return (_a = app.default) != null ? _a : app;
83
- }
84
- });
85
- import_window_manager.WindowManager.register({
86
- kind: "Monaco",
87
- src: "https://cdn.jsdelivr.net/npm/@netless/app-monaco@latest/dist/main.iife.js"
88
- });
89
- import_window_manager.WindowManager.register({
90
- kind: "Countdown",
91
- src: "https://cdn.jsdelivr.net/npm/@netless/app-countdown@latest/dist/main.iife.js"
27
+ mount: () => import_fastboard_react.mount
92
28
  });
93
- import_window_manager.WindowManager.register({
94
- kind: "GeoGebra",
95
- src: "https://cdn.jsdelivr.net/npm/@netless/app-geogebra@latest/dist/main.iife.js",
96
- appOptions: {
97
- HTML5Codebase: "https://flat-storage-cn-hz.whiteboard.agora.io/GeoGebra/HTML5/5.0/web3d"
98
- }
99
- });
100
-
101
- // src/core.ts
102
- var import_window_manager3 = require("@netless/window-manager");
103
-
104
- // src/emitter.ts
105
- var FastboardEmitter = class {
106
- constructor() {
107
- this.listeners = /* @__PURE__ */ new Set();
108
- }
109
- get length() {
110
- return this.listeners.size;
111
- }
112
- dispatch(message) {
113
- this.listeners.forEach((callback) => callback(message));
114
- }
115
- addListener(listener) {
116
- this.listeners.add(listener);
117
- }
118
- removeListener(listener) {
119
- this.listeners.delete(listener);
120
- }
121
- };
122
-
123
- // src/utils.ts
124
- var import_window_manager2 = require("@netless/window-manager");
125
- function noop() {
126
- }
127
- function getImageSize(url, fallback) {
128
- return new Promise((resolve) => {
129
- const img = new Image();
130
- img.onload = () => resolve(img);
131
- img.onerror = () => resolve(fallback);
132
- img.src = url;
133
- });
134
- }
135
- function makeSlideParams(scenes) {
136
- const emptyScenes = [];
137
- let taskId = "";
138
- let url = "";
139
- const pptSrcRE = /^pptx?(?<prefix>:\/\/\S+?dynamicConvert)\/(?<taskId>\w+)\//;
140
- for (const { name, ppt } of scenes) {
141
- emptyScenes.push({ name });
142
- if (!ppt || !ppt.src.startsWith("ppt")) {
143
- continue;
144
- }
145
- const match = pptSrcRE.exec(ppt.src);
146
- if (!match || !match.groups) {
147
- continue;
148
- }
149
- taskId = match.groups.taskId;
150
- url = "https" + match.groups.prefix;
151
- break;
152
- }
153
- return { emptyScenes, taskId, url };
154
- }
155
- function convertedFileToScene(f, i) {
156
- return {
157
- name: String(i + 1),
158
- ppt: {
159
- src: f.conversionFileUrl,
160
- width: f.width,
161
- height: f.height,
162
- previewURL: f.preview
163
- }
164
- };
165
- }
166
- function ensureWindowManager(joinRoom) {
167
- if (!joinRoom.invisiblePlugins || !joinRoom.invisiblePlugins.includes(import_window_manager2.WindowManager)) {
168
- joinRoom.invisiblePlugins = [...joinRoom.invisiblePlugins || [], import_window_manager2.WindowManager];
169
- }
170
- return joinRoom;
171
- }
172
- var SOUP = "!#%()*+,-./:;=?@[]^_`{|}~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
173
- var SOUP_LEN = SOUP.length;
174
- var ID_LEN = 20;
175
- var reusedIdCarrier = Array(ID_LEN);
176
- function genUID() {
177
- for (let i = 0; i < ID_LEN; i++) {
178
- reusedIdCarrier[i] = SOUP.charAt(Math.random() * SOUP_LEN);
179
- }
180
- return reusedIdCarrier.join("");
181
- }
182
-
183
- // src/value.ts
184
- function createValue(value, effect, setValue = noop) {
185
- const emitter = new FastboardEmitter();
186
- function set(newValue) {
187
- emitter.dispatch(value = newValue);
188
- }
189
- const dispose = effect(set) || noop;
190
- function subscribe(callback) {
191
- emitter.addListener(callback);
192
- callback(value);
193
- return () => emitter.removeListener(callback);
194
- }
195
- function reaction(callback) {
196
- emitter.addListener(callback);
197
- return () => emitter.removeListener(callback);
198
- }
199
- return { value, subscribe, reaction, setValue, dispose };
200
- }
201
-
202
- // src/base.ts
203
- var FastboardAppBase = class {
204
- constructor(sdk, room, manager, hotKeys) {
205
- this.sdk = sdk;
206
- this.room = room;
207
- this.manager = manager;
208
- this.hotKeys = hotKeys;
209
- this._disposers = [];
210
- this._destroyed = false;
211
- this.createValue = (...args) => {
212
- const value = createValue(...args);
213
- this._disposers.push(value.dispose);
214
- return value;
215
- };
216
- }
217
- _assertNotDestroyed() {
218
- if (this._destroyed) {
219
- throw new Error("[FastboardApp] Can not call any method on destroyed FastboardApp.");
220
- }
221
- }
222
- _addRoomListener(name, listener) {
223
- this._assertNotDestroyed();
224
- this.room.callbacks.on(name, listener);
225
- return () => this.room.callbacks.off(name, listener);
226
- }
227
- _addManagerListener(name, set) {
228
- this._assertNotDestroyed();
229
- this.manager.emitter.on(name, set);
230
- return () => this.manager.emitter.off(name, set);
231
- }
232
- _addMainViewListener(name, listener) {
233
- this._assertNotDestroyed();
234
- this.manager.mainView.callbacks.on(name, listener);
235
- return () => this.manager.mainView.callbacks.off(name, listener);
236
- }
237
- destroy() {
238
- this._disposers.forEach((dispose) => dispose());
239
- this._disposers.length = 0;
240
- this._destroyed = true;
241
- this.manager.destroy();
242
- return this.room.disconnect();
243
- }
244
- };
245
-
246
- // src/core.ts
247
- var FastboardApp = class extends FastboardAppBase {
248
- constructor() {
249
- super(...arguments);
250
- this.writable = this.createValue(this.room.isWritable, (set) => this._addRoomListener("onEnableWriteNowChanged", () => set(this.room.isWritable)), this.room.setWritable.bind(this.room));
251
- this.boxState = this.createValue(this.manager.boxState, (set) => this._addManagerListener("boxStateChange", set));
252
- this.focusedApp = this.createValue(this.manager.focused, (set) => this._addManagerListener("focusedChange", set));
253
- this.canRedoSteps = this.createValue(this.manager.mainView.canRedoSteps, (set) => this._addMainViewListener("onCanRedoStepsUpdate", set));
254
- this.canUndoSteps = this.createValue(this.manager.mainView.canUndoSteps, (set) => this._addMainViewListener("onCanUndoStepsUpdate", set));
255
- this.camera = this.createValue(this.manager.mainView.camera, (set) => this._addMainViewListener("onCameraUpdated", set), this.manager.moveCamera.bind(this.manager));
256
- this.memberState = this.createValue(this.room.state.memberState, (set) => this._addRoomListener("onRoomStateChanged", ({ memberState: m }) => m && set(m)), this.manager.mainView.setMemberState.bind(this.manager.mainView));
257
- this.sceneIndex = this.createValue(this.manager.mainViewSceneIndex, (set) => this._addManagerListener("mainViewSceneIndexChange", set), this.manager.setMainViewSceneIndex.bind(this.manager));
258
- this.sceneLength = this.createValue(this.room.state.sceneState.scenes.length, (set) => this._addRoomListener("onRoomStateChanged", ({ sceneState: s }) => s && set(s.scenes.length)));
259
- }
260
- bindContainer(container) {
261
- this._assertNotDestroyed();
262
- this.manager.bindContainer(container);
263
- }
264
- bindCollector(container) {
265
- this._assertNotDestroyed();
266
- this.manager.bindCollectorContainer(container);
267
- }
268
- undo() {
269
- this._assertNotDestroyed();
270
- this.manager.mainView.undo();
271
- }
272
- redo() {
273
- this._assertNotDestroyed();
274
- this.manager.mainView.redo();
275
- }
276
- moveCamera(camera) {
277
- this._assertNotDestroyed();
278
- this.manager.moveCamera(camera);
279
- }
280
- moveCameraToContain(rectangle) {
281
- this._assertNotDestroyed();
282
- this.manager.moveCameraToContain(rectangle);
283
- }
284
- cleanCurrentScene() {
285
- this._assertNotDestroyed();
286
- this.manager.mainView.cleanCurrentScene();
287
- }
288
- setAppliance(appliance, shape) {
289
- this._assertNotDestroyed();
290
- this.manager.mainView.setMemberState({ currentApplianceName: appliance, shapeType: shape });
291
- }
292
- setStrokeWidth(strokeWidth) {
293
- this._assertNotDestroyed();
294
- this.manager.mainView.setMemberState({ strokeWidth });
295
- }
296
- setStrokeColor(strokeColor) {
297
- this._assertNotDestroyed();
298
- this.manager.mainView.setMemberState({ strokeColor });
299
- }
300
- async insertImage(url) {
301
- this._assertNotDestroyed();
302
- await this.manager.switchMainViewToWriter();
303
- const { divElement } = this.manager.mainView;
304
- const containerSize = {
305
- width: (divElement == null ? void 0 : divElement.scrollWidth) || window.innerWidth,
306
- height: (divElement == null ? void 0 : divElement.scrollHeight) || window.innerHeight
307
- };
308
- const maxWidth = containerSize.width * 0.8;
309
- let { width, height } = await getImageSize(url, containerSize);
310
- const scale = Math.min(maxWidth / width, 1);
311
- const uuid = genUID();
312
- const { centerX, centerY } = this.manager.camera;
313
- width *= scale;
314
- height *= scale;
315
- this.manager.mainView.insertImage({ uuid, centerX, centerY, width, height, locked: false });
316
- this.manager.mainView.completeImageUpload(uuid, url);
317
- width /= 0.8;
318
- height /= 0.8;
319
- const originX = centerX - width / 2;
320
- const originY = centerY - height / 2;
321
- this.manager.moveCameraToContain({ originX, originY, width, height });
322
- }
323
- insertDocs(arg1, arg2) {
324
- if (typeof arg1 === "object" && "fileType" in arg1) {
325
- return this._insertDocsImpl(arg1);
326
- } else if (arg2 && arg2.status !== "Finished") {
327
- throw new Error("[FastboardApp] Can not insert a converting doc.");
328
- } else if (arg2 && arg2.progress) {
329
- const scenes = arg2.progress.convertedFileList.map(convertedFileToScene);
330
- const scenePath = `/${arg2.uuid}/${genUID()}`;
331
- const { emptyScenes, taskId, url } = makeSlideParams(scenes);
332
- if (taskId && url) {
333
- const title = arg1;
334
- return this._insertDocsImpl({ fileType: "pptx", scenePath, taskId, title, url, scenes: emptyScenes });
335
- } else {
336
- return this._insertDocsImpl({ fileType: "pdf", scenePath, scenes, title: arg1 });
337
- }
338
- }
339
- }
340
- _insertDocsImpl(_a) {
341
- var _b = _a, { fileType, scenePath, title, scenes } = _b, attributes = __objRest(_b, ["fileType", "scenePath", "title", "scenes"]);
342
- this._assertNotDestroyed();
343
- switch (fileType) {
344
- case "pdf":
345
- case "ppt":
346
- return this.manager.addApp({
347
- kind: "DocsViewer",
348
- options: { scenePath, title, scenes }
349
- });
350
- case "pptx":
351
- return this.manager.addApp({
352
- kind: "Slide",
353
- options: { scenePath, title, scenes },
354
- attributes
355
- });
356
- }
357
- }
358
- insertCodeEditor() {
359
- this._assertNotDestroyed();
360
- return this.manager.addApp({
361
- kind: "Monaco",
362
- options: { title: "Code Editor" }
363
- });
364
- }
365
- insertCountdown() {
366
- this._assertNotDestroyed();
367
- return this.manager.addApp({
368
- kind: "Countdown",
369
- options: { title: "Countdown" }
370
- });
371
- }
372
- insertMedia(title, src) {
373
- this._assertNotDestroyed();
374
- return this.manager.addApp({
375
- kind: import_window_manager3.BuiltinApps.MediaPlayer,
376
- options: { title },
377
- attributes: { src }
378
- });
379
- }
380
- insertGeoGebra() {
381
- this._assertNotDestroyed();
382
- return this.manager.addApp({
383
- kind: "GeoGebra",
384
- options: { title: "GeoGebra" }
385
- });
386
- }
387
- };
388
-
389
- // src/index.ts
390
- async function createFastboard(_a) {
391
- var _b = _a, {
392
- sdkConfig,
393
- joinRoom: _c
394
- } = _b, _d = _c, { callbacks } = _d, joinRoomParams = __objRest(_d, ["callbacks"]), {
395
- managerConfig
396
- } = _b;
397
- const sdk = new import_white_web_sdk.WhiteWebSdk(__spreadProps(__spreadValues({}, sdkConfig), {
398
- useMobXState: true
399
- }));
400
- const hotKeys = __spreadProps(__spreadValues({}, import_white_web_sdk.DefaultHotKeys), {
401
- changeToSelector: "s",
402
- changeToLaserPointer: "z",
403
- changeToPencil: "p",
404
- changeToRectangle: "r",
405
- changeToEllipse: "c",
406
- changeToEraser: "e",
407
- changeToText: "t",
408
- changeToStraight: "l",
409
- changeToArrow: "a",
410
- changeToHand: "h"
411
- });
412
- const room = await sdk.joinRoom(__spreadProps(__spreadValues({
413
- floatBar: true,
414
- hotKeys
415
- }, ensureWindowManager(joinRoomParams)), {
416
- useMultiViews: true,
417
- disableNewPencil: false,
418
- disableMagixEventDispatchLimit: true
419
- }), callbacks);
420
- const manager = await import_window_manager4.WindowManager.mount(__spreadProps(__spreadValues({
421
- cursor: true
422
- }, managerConfig), {
423
- room
424
- }));
425
- return new FastboardApp(sdk, room, manager, hotKeys);
426
- }
29
+ __reExport(src_exports, require("@netless/fastboard-core"));
30
+ var import_fastboard_react = require("@netless/fastboard-react");
427
31
  module.exports = __toCommonJS(src_exports);
428
32
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../../../node_modules/.pnpm/tsup@5.11.11_typescript@4.5.4/node_modules/tsup/assets/cjs_shims.js","../src/register-apps.ts","../src/core.ts","../src/emitter.ts","../src/utils.ts","../src/value.ts","../src/base.ts"],"sourcesContent":["import type { HotKeys, JoinRoomParams, RoomCallbacks, WhiteWebSdkConfiguration } 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 \"./register-apps\";\nimport { FastboardApp } from \"./core\";\nimport { ensureWindowManager } from \"./utils\";\n\nexport type { FastboardReadable, FastboardWritable } from \"./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","// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () =>\n typeof document === 'undefined'\n ? new URL('file:' + __filename).href\n : (document.currentScript && document.currentScript.src) ||\n new URL('main.js', document.baseURI).href\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","import { WindowManager } from \"@netless/window-manager\";\n\nWindowManager.register({\n kind: \"Slide\",\n appOptions: {\n // turn on to show debug controller\n debug: false,\n },\n src: async () => {\n const app = await import(\"@netless/app-slide\");\n return app.default ?? app;\n },\n});\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 {\n AnimationMode,\n ApplianceNames,\n Camera,\n Color,\n ConversionResponse,\n MemberState,\n Rectangle,\n RoomState,\n SceneDefinition,\n ShapeType,\n} from \"white-web-sdk\";\n\nimport { BuiltinApps } from \"@netless/window-manager\";\nimport { FastboardAppBase } from \"./base\";\nimport { convertedFileToScene, genUID, getImageSize, makeSlideParams } from \"./utils\";\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.mainView.canRedoSteps, set =>\n this._addMainViewListener(\"onCanRedoStepsUpdate\", set)\n );\n\n /**\n * How many times can I call `app.undo()`?\n */\n readonly canUndoSteps = this.createValue(this.manager.mainView.canUndoSteps, set =>\n this._addMainViewListener(\"onCanUndoStepsUpdate\", set)\n );\n\n /**\n * Current camera information of main view.\n */\n readonly camera = this.createValue(\n this.manager.mainView.camera,\n set => this._addMainViewListener(\"onCameraUpdated\", set),\n this.manager.moveCamera.bind(this.manager)\n );\n\n /**\n * Current tool's info, like \"is using pencil?\", \"what color?\".\n */\n readonly memberState = this.createValue<MemberState, SetMemberStateFn>(\n this.room.state.memberState,\n set => this._addRoomListener<RoomStateChanged>(\"onRoomStateChanged\", ({ memberState: m }) => m && set(m)),\n this.manager.mainView.setMemberState.bind(this.manager.mainView)\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 // TODO: upgrade window-manager\n /**\n * How many pages are in the main view?\n */\n readonly sceneLength = this.createValue(this.room.state.sceneState.scenes.length, set =>\n this._addRoomListener<RoomStateChanged>(\n \"onRoomStateChanged\",\n ({ sceneState: s }) => s && set(s.scenes.length)\n )\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 type { ConvertedFile, JoinRoomParams, 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(joinRoom: JoinRoomParams) {\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 { 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 { PublicEvent, Room, WindowManager } from \"@netless/window-manager\";\nimport type { HotKeys, WhiteWebSdk } from \"white-web-sdk\";\nimport type { FastboardDisposer, FastboardInternalValue } from \"./value\";\n\nimport { createValue } from \"./value\";\n\nexport class 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<T = unknown>(name: string, 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<T = unknown>(name: string, 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"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from \"@netless/fastboard-core\";\nexport { mount } from \"@netless/fastboard-react\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAc;AACd,6BAAsB;","names":[]}