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