@netless/window-manager 1.0.0-canary.77 → 1.0.0-canary.79

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.
@@ -11,7 +11,7 @@ import type { View } from "white-web-sdk";
11
11
  import type { CallbacksType } from "./callback";
12
12
  import type { EmitterType } from "./InternalEmitter";
13
13
  import type { AppState } from "./App/type";
14
- import { ReadonlyVal } from "value-enhancer";
14
+ import type { ReadonlyVal } from "value-enhancer";
15
15
  export { TELE_BOX_STATE };
16
16
  export type CreateBoxParams = {
17
17
  appId: string;
@@ -3,7 +3,7 @@ import type { ApplianceIcons, TeleBoxRect } from "../index";
3
3
  import type { PositionType } from "../AttributesDelegate";
4
4
  import type { RoomMember, View } from "white-web-sdk";
5
5
  import type { AppManager } from "../AppManager";
6
- import { Val } from "value-enhancer";
6
+ import type { Val } from "value-enhancer";
7
7
  export type EventType = {
8
8
  type: PositionType;
9
9
  id?: string;
@@ -60,7 +60,9 @@ export declare class MainViewProxy {
60
60
  setMainViewSize: import("lodash").DebouncedFunc<(size: Size) => void>;
61
61
  private addCameraListener;
62
62
  private removeCameraListener;
63
+ private _syncMainViewTimer;
63
64
  private onCameraOrSizeUpdated;
65
+ private syncMainView;
64
66
  stop(): void;
65
67
  destroy(): void;
66
68
  }
@@ -2,7 +2,6 @@ import { SideEffectManager } from "side-effect-manager";
2
2
  import type { ReadonlyVal } from "value-enhancer";
3
3
  import type { AppManager } from "../AppManager";
4
4
  import type { ScrollStorage } from "../storage";
5
- import type { View } from "white-web-sdk";
6
5
  export type ScrollState = {
7
6
  scrollTop: number;
8
7
  page: number;
@@ -21,7 +20,7 @@ export declare class ScrollMode {
21
20
  private baseHeight;
22
21
  readonly scrollStorage: ScrollStorage;
23
22
  readonly scrollState$: ReadonlyVal<ScrollState>;
24
- get mainView(): View;
23
+ get mainView(): import("white-web-sdk").View;
25
24
  setRoot(root: HTMLElement): void;
26
25
  constructor(manager: AppManager);
27
26
  private initScroll;
package/dist/index.js CHANGED
@@ -619,9 +619,14 @@ class AppListeners {
619
619
  this.moveCameraHandler = (payload) => {
620
620
  const size$ = this.manager.mainViewProxy.size$;
621
621
  if (size$.value) {
622
- const size = this.manager.mainView.size;
623
- const diff = Math.max(size.height / size$.value.height, size.width / size$.value.width);
624
- const nextCamera = { ...payload, scale: payload.scale * diff };
622
+ const nextCamera = { ...payload };
623
+ if (nextCamera.scale) {
624
+ const size = this.manager.mainView.size;
625
+ const diff = Math.max(size.height / size$.value.height, size.width / size$.value.width);
626
+ nextCamera.scale *= diff;
627
+ } else {
628
+ delete nextCamera.scale;
629
+ }
625
630
  this.manager.mainView.moveCamera(nextCamera);
626
631
  }
627
632
  };
@@ -2344,8 +2349,18 @@ class MainViewProxy {
2344
2349
  this.setMainViewSize = lodash.debounce((size) => {
2345
2350
  this.store.setMainViewSize({ ...size, id: this.manager.uid });
2346
2351
  }, 50);
2352
+ this._syncMainViewTimer = 0;
2347
2353
  this.onCameraOrSizeUpdated = () => {
2348
2354
  callbacks.emit("cameraStateChange", this.cameraState);
2355
+ if (this.manager.room && this.manager.room.syncMainView) {
2356
+ clearTimeout(this._syncMainViewTimer);
2357
+ this._syncMainViewTimer = setTimeout(this.syncMainView, 100, this.manager.room);
2358
+ }
2359
+ };
2360
+ this.syncMainView = (room) => {
2361
+ if (room.isWritable) {
2362
+ room.syncMainView(this.mainView);
2363
+ }
2349
2364
  };
2350
2365
  this.mainView = this.createMainView();
2351
2366
  emitter.once("mainViewMounted").then(() => {
@@ -6096,6 +6111,9 @@ class BoxManager {
6096
6111
  const { emitter: emitter2, callbacks: callbacks2, boxEmitter: boxEmitter2 } = context;
6097
6112
  this.teleBoxManager = this.setupBoxManager(createTeleBoxManagerConfig);
6098
6113
  this.sideEffectManager.add(() => [
6114
+ this.teleBoxManager.onValChanged("rootRect", (rect) => {
6115
+ emitter2.emit("playgroundSizeChange", rect);
6116
+ }),
6099
6117
  // 使用 _xxx$.reaction 订阅修改的值, 不管有没有 skipUpdate, 修改值都会触发回调
6100
6118
  this.teleBoxManager.onValChanged("state", (state) => {
6101
6119
  callbacks2.emit("boxStateChange", state);
@@ -12643,8 +12661,8 @@ const reconnectRefresher = new ReconnectRefresher({ emitter });
12643
12661
  const _WindowManager = class extends whiteWebSdk.InvisiblePlugin {
12644
12662
  constructor(context) {
12645
12663
  super(context);
12646
- this.version = "1.0.0-canary.77";
12647
- this.dependencies = { "dependencies": { "@juggle/resize-observer": "^3.4.0", "@netless/synced-store": "^2.0.7", "@netless/telebox-insider": "1.0.0-alpha.37", "emittery": "^0.11.0", "jspdf": "^2.5.1", "lodash": "^4.17.21", "p-retry": "^5.1.2", "side-effect-manager": "^1.2.1", "uuid": "^9.0.0", "value-enhancer": "^1.3.2" }, "peerDependencies": { "white-web-sdk": "^2.16.0" }, "devDependencies": { "@netless/app-docs-viewer": "1.0.0-canary.6", "@netless/app-plyr": "^0.2.4", "@playwright/test": "^1.33.0", "@rollup/plugin-commonjs": "^24.1.0", "@rollup/plugin-node-resolve": "^15.0.2", "@rollup/plugin-url": "^8.0.1", "@sveltejs/vite-plugin-svelte": "^2.2.0", "@tsconfig/svelte": "^4.0.1", "@types/debug": "^4.1.7", "@types/node": "^18.0.3", "@types/lodash": "^4.14.194", "@types/lodash-es": "^4.17.7", "@types/uuid": "^9.0.1", "@typescript-eslint/eslint-plugin": "^5.59.5", "@typescript-eslint/parser": "^5.59.5", "@vitest/ui": "^0.31.0", "cypress": "^12.12.0", "dotenv": "^16.0.3", "eslint": "^8.40.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-svelte3": "^4.0.0", "jsdom": "^22.0.0", "less": "^4.1.3", "prettier": "^2.8.8", "prettier-plugin-svelte": "^2.10.0", "rollup-plugin-analyzer": "^4.0.0", "rollup-plugin-styles": "^4.0.0", "svelte": "^3.59.1", "typescript": "^5.0.4", "vite": "^4.3.5", "vite-plugin-dts": "^2.3.0", "vitest": "^0.31.0", "white-web-sdk": "^2.16.42" } };
12664
+ this.version = "1.0.0-canary.79";
12665
+ this.dependencies = { "dependencies": { "@juggle/resize-observer": "^3.4.0", "@netless/synced-store": "^2.0.7", "@netless/telebox-insider": "1.0.0-alpha.37", "emittery": "^0.11.0", "jspdf": "^2.5.1", "lodash": "^4.17.21", "p-retry": "^5.1.2", "side-effect-manager": "^1.2.1", "uuid": "^9.0.0", "value-enhancer": "^1.3.2" }, "peerDependencies": { "white-web-sdk": "^2.16.0" }, "devDependencies": { "@netless/app-docs-viewer": "1.0.0-canary.6", "@netless/app-plyr": "^0.2.4", "@playwright/test": "^1.33.0", "@rollup/plugin-commonjs": "^24.1.0", "@rollup/plugin-node-resolve": "^15.0.2", "@rollup/plugin-url": "^8.0.1", "@sveltejs/vite-plugin-svelte": "^2.2.0", "@tsconfig/svelte": "^4.0.1", "@types/debug": "^4.1.7", "@types/node": "^18.0.3", "@types/lodash": "^4.14.194", "@types/lodash-es": "^4.17.7", "@types/uuid": "^9.0.1", "@typescript-eslint/eslint-plugin": "^5.59.5", "@typescript-eslint/parser": "^5.59.5", "@vitest/ui": "^0.31.0", "cypress": "^12.12.0", "dotenv": "^16.0.3", "eslint": "^8.40.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-svelte3": "^4.0.0", "jsdom": "^22.0.0", "less": "^4.1.3", "prettier": "^2.8.8", "prettier-plugin-svelte": "^2.10.0", "rollup-plugin-analyzer": "^4.0.0", "rollup-plugin-styles": "^4.0.0", "svelte": "^3.59.1", "typescript": "^5.0.4", "vite": "^4.3.5", "vite-plugin-dts": "^2.3.0", "vitest": "^0.31.0", "white-web-sdk": "^2.16.43" } };
12648
12666
  this.emitter = callbacks;
12649
12667
  this.viewMode$ = new valueEnhancer.Val(whiteWebSdk.ViewMode.Broadcaster);
12650
12668
  this.playground$ = new valueEnhancer.Val(void 0);
@@ -12660,7 +12678,7 @@ const _WindowManager = class extends whiteWebSdk.InvisiblePlugin {
12660
12678
  (_b = this.appManager) == null ? void 0 : _b.dispatchInternalEvent(Events.MoveCamera, camera);
12661
12679
  };
12662
12680
  _WindowManager.displayer = context.displayer;
12663
- window.NETLESS_DEPS = { "dependencies": { "@juggle/resize-observer": "^3.4.0", "@netless/synced-store": "^2.0.7", "@netless/telebox-insider": "1.0.0-alpha.37", "emittery": "^0.11.0", "jspdf": "^2.5.1", "lodash": "^4.17.21", "p-retry": "^5.1.2", "side-effect-manager": "^1.2.1", "uuid": "^9.0.0", "value-enhancer": "^1.3.2" }, "peerDependencies": { "white-web-sdk": "^2.16.0" }, "devDependencies": { "@netless/app-docs-viewer": "1.0.0-canary.6", "@netless/app-plyr": "^0.2.4", "@playwright/test": "^1.33.0", "@rollup/plugin-commonjs": "^24.1.0", "@rollup/plugin-node-resolve": "^15.0.2", "@rollup/plugin-url": "^8.0.1", "@sveltejs/vite-plugin-svelte": "^2.2.0", "@tsconfig/svelte": "^4.0.1", "@types/debug": "^4.1.7", "@types/node": "^18.0.3", "@types/lodash": "^4.14.194", "@types/lodash-es": "^4.17.7", "@types/uuid": "^9.0.1", "@typescript-eslint/eslint-plugin": "^5.59.5", "@typescript-eslint/parser": "^5.59.5", "@vitest/ui": "^0.31.0", "cypress": "^12.12.0", "dotenv": "^16.0.3", "eslint": "^8.40.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-svelte3": "^4.0.0", "jsdom": "^22.0.0", "less": "^4.1.3", "prettier": "^2.8.8", "prettier-plugin-svelte": "^2.10.0", "rollup-plugin-analyzer": "^4.0.0", "rollup-plugin-styles": "^4.0.0", "svelte": "^3.59.1", "typescript": "^5.0.4", "vite": "^4.3.5", "vite-plugin-dts": "^2.3.0", "vitest": "^0.31.0", "white-web-sdk": "^2.16.42" } };
12681
+ window.NETLESS_DEPS = { "dependencies": { "@juggle/resize-observer": "^3.4.0", "@netless/synced-store": "^2.0.7", "@netless/telebox-insider": "1.0.0-alpha.37", "emittery": "^0.11.0", "jspdf": "^2.5.1", "lodash": "^4.17.21", "p-retry": "^5.1.2", "side-effect-manager": "^1.2.1", "uuid": "^9.0.0", "value-enhancer": "^1.3.2" }, "peerDependencies": { "white-web-sdk": "^2.16.0" }, "devDependencies": { "@netless/app-docs-viewer": "1.0.0-canary.6", "@netless/app-plyr": "^0.2.4", "@playwright/test": "^1.33.0", "@rollup/plugin-commonjs": "^24.1.0", "@rollup/plugin-node-resolve": "^15.0.2", "@rollup/plugin-url": "^8.0.1", "@sveltejs/vite-plugin-svelte": "^2.2.0", "@tsconfig/svelte": "^4.0.1", "@types/debug": "^4.1.7", "@types/node": "^18.0.3", "@types/lodash": "^4.14.194", "@types/lodash-es": "^4.17.7", "@types/uuid": "^9.0.1", "@typescript-eslint/eslint-plugin": "^5.59.5", "@typescript-eslint/parser": "^5.59.5", "@vitest/ui": "^0.31.0", "cypress": "^12.12.0", "dotenv": "^16.0.3", "eslint": "^8.40.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-svelte3": "^4.0.0", "jsdom": "^22.0.0", "less": "^4.1.3", "prettier": "^2.8.8", "prettier-plugin-svelte": "^2.10.0", "rollup-plugin-analyzer": "^4.0.0", "rollup-plugin-styles": "^4.0.0", "svelte": "^3.59.1", "typescript": "^5.0.4", "vite": "^4.3.5", "vite-plugin-dts": "^2.3.0", "vitest": "^0.31.0", "white-web-sdk": "^2.16.43" } };
12664
12682
  }
12665
12683
  static async mount(params) {
12666
12684
  var _a;
@@ -12699,7 +12717,7 @@ const _WindowManager = class extends whiteWebSdk.InvisiblePlugin {
12699
12717
  throw new Error();
12700
12718
  }
12701
12719
  },
12702
- { retries: 10 }
12720
+ { retries: 10, maxTimeout: 5e3 }
12703
12721
  );
12704
12722
  }
12705
12723
  if (!manager) {
package/dist/index.mjs CHANGED
@@ -595,9 +595,14 @@ class AppListeners {
595
595
  this.moveCameraHandler = (payload) => {
596
596
  const size$ = this.manager.mainViewProxy.size$;
597
597
  if (size$.value) {
598
- const size = this.manager.mainView.size;
599
- const diff = Math.max(size.height / size$.value.height, size.width / size$.value.width);
600
- const nextCamera = { ...payload, scale: payload.scale * diff };
598
+ const nextCamera = { ...payload };
599
+ if (nextCamera.scale) {
600
+ const size = this.manager.mainView.size;
601
+ const diff = Math.max(size.height / size$.value.height, size.width / size$.value.width);
602
+ nextCamera.scale *= diff;
603
+ } else {
604
+ delete nextCamera.scale;
605
+ }
601
606
  this.manager.mainView.moveCamera(nextCamera);
602
607
  }
603
608
  };
@@ -2320,8 +2325,18 @@ class MainViewProxy {
2320
2325
  this.setMainViewSize = debounce((size) => {
2321
2326
  this.store.setMainViewSize({ ...size, id: this.manager.uid });
2322
2327
  }, 50);
2328
+ this._syncMainViewTimer = 0;
2323
2329
  this.onCameraOrSizeUpdated = () => {
2324
2330
  callbacks.emit("cameraStateChange", this.cameraState);
2331
+ if (this.manager.room && this.manager.room.syncMainView) {
2332
+ clearTimeout(this._syncMainViewTimer);
2333
+ this._syncMainViewTimer = setTimeout(this.syncMainView, 100, this.manager.room);
2334
+ }
2335
+ };
2336
+ this.syncMainView = (room) => {
2337
+ if (room.isWritable) {
2338
+ room.syncMainView(this.mainView);
2339
+ }
2325
2340
  };
2326
2341
  this.mainView = this.createMainView();
2327
2342
  emitter.once("mainViewMounted").then(() => {
@@ -6072,6 +6087,9 @@ class BoxManager {
6072
6087
  const { emitter: emitter2, callbacks: callbacks2, boxEmitter: boxEmitter2 } = context;
6073
6088
  this.teleBoxManager = this.setupBoxManager(createTeleBoxManagerConfig);
6074
6089
  this.sideEffectManager.add(() => [
6090
+ this.teleBoxManager.onValChanged("rootRect", (rect) => {
6091
+ emitter2.emit("playgroundSizeChange", rect);
6092
+ }),
6075
6093
  // 使用 _xxx$.reaction 订阅修改的值, 不管有没有 skipUpdate, 修改值都会触发回调
6076
6094
  this.teleBoxManager.onValChanged("state", (state) => {
6077
6095
  callbacks2.emit("boxStateChange", state);
@@ -12619,8 +12637,8 @@ const reconnectRefresher = new ReconnectRefresher({ emitter });
12619
12637
  const _WindowManager = class extends InvisiblePlugin {
12620
12638
  constructor(context) {
12621
12639
  super(context);
12622
- this.version = "1.0.0-canary.77";
12623
- this.dependencies = { "dependencies": { "@juggle/resize-observer": "^3.4.0", "@netless/synced-store": "^2.0.7", "@netless/telebox-insider": "1.0.0-alpha.37", "emittery": "^0.11.0", "jspdf": "^2.5.1", "lodash": "^4.17.21", "p-retry": "^5.1.2", "side-effect-manager": "^1.2.1", "uuid": "^9.0.0", "value-enhancer": "^1.3.2" }, "peerDependencies": { "white-web-sdk": "^2.16.0" }, "devDependencies": { "@netless/app-docs-viewer": "1.0.0-canary.6", "@netless/app-plyr": "^0.2.4", "@playwright/test": "^1.33.0", "@rollup/plugin-commonjs": "^24.1.0", "@rollup/plugin-node-resolve": "^15.0.2", "@rollup/plugin-url": "^8.0.1", "@sveltejs/vite-plugin-svelte": "^2.2.0", "@tsconfig/svelte": "^4.0.1", "@types/debug": "^4.1.7", "@types/node": "^18.0.3", "@types/lodash": "^4.14.194", "@types/lodash-es": "^4.17.7", "@types/uuid": "^9.0.1", "@typescript-eslint/eslint-plugin": "^5.59.5", "@typescript-eslint/parser": "^5.59.5", "@vitest/ui": "^0.31.0", "cypress": "^12.12.0", "dotenv": "^16.0.3", "eslint": "^8.40.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-svelte3": "^4.0.0", "jsdom": "^22.0.0", "less": "^4.1.3", "prettier": "^2.8.8", "prettier-plugin-svelte": "^2.10.0", "rollup-plugin-analyzer": "^4.0.0", "rollup-plugin-styles": "^4.0.0", "svelte": "^3.59.1", "typescript": "^5.0.4", "vite": "^4.3.5", "vite-plugin-dts": "^2.3.0", "vitest": "^0.31.0", "white-web-sdk": "^2.16.42" } };
12640
+ this.version = "1.0.0-canary.79";
12641
+ this.dependencies = { "dependencies": { "@juggle/resize-observer": "^3.4.0", "@netless/synced-store": "^2.0.7", "@netless/telebox-insider": "1.0.0-alpha.37", "emittery": "^0.11.0", "jspdf": "^2.5.1", "lodash": "^4.17.21", "p-retry": "^5.1.2", "side-effect-manager": "^1.2.1", "uuid": "^9.0.0", "value-enhancer": "^1.3.2" }, "peerDependencies": { "white-web-sdk": "^2.16.0" }, "devDependencies": { "@netless/app-docs-viewer": "1.0.0-canary.6", "@netless/app-plyr": "^0.2.4", "@playwright/test": "^1.33.0", "@rollup/plugin-commonjs": "^24.1.0", "@rollup/plugin-node-resolve": "^15.0.2", "@rollup/plugin-url": "^8.0.1", "@sveltejs/vite-plugin-svelte": "^2.2.0", "@tsconfig/svelte": "^4.0.1", "@types/debug": "^4.1.7", "@types/node": "^18.0.3", "@types/lodash": "^4.14.194", "@types/lodash-es": "^4.17.7", "@types/uuid": "^9.0.1", "@typescript-eslint/eslint-plugin": "^5.59.5", "@typescript-eslint/parser": "^5.59.5", "@vitest/ui": "^0.31.0", "cypress": "^12.12.0", "dotenv": "^16.0.3", "eslint": "^8.40.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-svelte3": "^4.0.0", "jsdom": "^22.0.0", "less": "^4.1.3", "prettier": "^2.8.8", "prettier-plugin-svelte": "^2.10.0", "rollup-plugin-analyzer": "^4.0.0", "rollup-plugin-styles": "^4.0.0", "svelte": "^3.59.1", "typescript": "^5.0.4", "vite": "^4.3.5", "vite-plugin-dts": "^2.3.0", "vitest": "^0.31.0", "white-web-sdk": "^2.16.43" } };
12624
12642
  this.emitter = callbacks;
12625
12643
  this.viewMode$ = new Val(ViewMode.Broadcaster);
12626
12644
  this.playground$ = new Val(void 0);
@@ -12636,7 +12654,7 @@ const _WindowManager = class extends InvisiblePlugin {
12636
12654
  (_b = this.appManager) == null ? void 0 : _b.dispatchInternalEvent(Events.MoveCamera, camera);
12637
12655
  };
12638
12656
  _WindowManager.displayer = context.displayer;
12639
- window.NETLESS_DEPS = { "dependencies": { "@juggle/resize-observer": "^3.4.0", "@netless/synced-store": "^2.0.7", "@netless/telebox-insider": "1.0.0-alpha.37", "emittery": "^0.11.0", "jspdf": "^2.5.1", "lodash": "^4.17.21", "p-retry": "^5.1.2", "side-effect-manager": "^1.2.1", "uuid": "^9.0.0", "value-enhancer": "^1.3.2" }, "peerDependencies": { "white-web-sdk": "^2.16.0" }, "devDependencies": { "@netless/app-docs-viewer": "1.0.0-canary.6", "@netless/app-plyr": "^0.2.4", "@playwright/test": "^1.33.0", "@rollup/plugin-commonjs": "^24.1.0", "@rollup/plugin-node-resolve": "^15.0.2", "@rollup/plugin-url": "^8.0.1", "@sveltejs/vite-plugin-svelte": "^2.2.0", "@tsconfig/svelte": "^4.0.1", "@types/debug": "^4.1.7", "@types/node": "^18.0.3", "@types/lodash": "^4.14.194", "@types/lodash-es": "^4.17.7", "@types/uuid": "^9.0.1", "@typescript-eslint/eslint-plugin": "^5.59.5", "@typescript-eslint/parser": "^5.59.5", "@vitest/ui": "^0.31.0", "cypress": "^12.12.0", "dotenv": "^16.0.3", "eslint": "^8.40.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-svelte3": "^4.0.0", "jsdom": "^22.0.0", "less": "^4.1.3", "prettier": "^2.8.8", "prettier-plugin-svelte": "^2.10.0", "rollup-plugin-analyzer": "^4.0.0", "rollup-plugin-styles": "^4.0.0", "svelte": "^3.59.1", "typescript": "^5.0.4", "vite": "^4.3.5", "vite-plugin-dts": "^2.3.0", "vitest": "^0.31.0", "white-web-sdk": "^2.16.42" } };
12657
+ window.NETLESS_DEPS = { "dependencies": { "@juggle/resize-observer": "^3.4.0", "@netless/synced-store": "^2.0.7", "@netless/telebox-insider": "1.0.0-alpha.37", "emittery": "^0.11.0", "jspdf": "^2.5.1", "lodash": "^4.17.21", "p-retry": "^5.1.2", "side-effect-manager": "^1.2.1", "uuid": "^9.0.0", "value-enhancer": "^1.3.2" }, "peerDependencies": { "white-web-sdk": "^2.16.0" }, "devDependencies": { "@netless/app-docs-viewer": "1.0.0-canary.6", "@netless/app-plyr": "^0.2.4", "@playwright/test": "^1.33.0", "@rollup/plugin-commonjs": "^24.1.0", "@rollup/plugin-node-resolve": "^15.0.2", "@rollup/plugin-url": "^8.0.1", "@sveltejs/vite-plugin-svelte": "^2.2.0", "@tsconfig/svelte": "^4.0.1", "@types/debug": "^4.1.7", "@types/node": "^18.0.3", "@types/lodash": "^4.14.194", "@types/lodash-es": "^4.17.7", "@types/uuid": "^9.0.1", "@typescript-eslint/eslint-plugin": "^5.59.5", "@typescript-eslint/parser": "^5.59.5", "@vitest/ui": "^0.31.0", "cypress": "^12.12.0", "dotenv": "^16.0.3", "eslint": "^8.40.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-svelte3": "^4.0.0", "jsdom": "^22.0.0", "less": "^4.1.3", "prettier": "^2.8.8", "prettier-plugin-svelte": "^2.10.0", "rollup-plugin-analyzer": "^4.0.0", "rollup-plugin-styles": "^4.0.0", "svelte": "^3.59.1", "typescript": "^5.0.4", "vite": "^4.3.5", "vite-plugin-dts": "^2.3.0", "vitest": "^0.31.0", "white-web-sdk": "^2.16.43" } };
12640
12658
  }
12641
12659
  static async mount(params) {
12642
12660
  var _a;
@@ -12675,7 +12693,7 @@ const _WindowManager = class extends InvisiblePlugin {
12675
12693
  throw new Error();
12676
12694
  }
12677
12695
  },
12678
- { retries: 10 }
12696
+ { retries: 10, maxTimeout: 5e3 }
12679
12697
  );
12680
12698
  }
12681
12699
  if (!manager) {
package/dist/index.umd.js CHANGED
@@ -590,9 +590,14 @@
590
590
  this.moveCameraHandler = (payload) => {
591
591
  const size$ = this.manager.mainViewProxy.size$;
592
592
  if (size$.value) {
593
- const size = this.manager.mainView.size;
594
- const diff = Math.max(size.height / size$.value.height, size.width / size$.value.width);
595
- const nextCamera = { ...payload, scale: payload.scale * diff };
593
+ const nextCamera = { ...payload };
594
+ if (nextCamera.scale) {
595
+ const size = this.manager.mainView.size;
596
+ const diff = Math.max(size.height / size$.value.height, size.width / size$.value.width);
597
+ nextCamera.scale *= diff;
598
+ } else {
599
+ delete nextCamera.scale;
600
+ }
596
601
  this.manager.mainView.moveCamera(nextCamera);
597
602
  }
598
603
  };
@@ -2315,8 +2320,18 @@
2315
2320
  this.setMainViewSize = lodash.debounce((size) => {
2316
2321
  this.store.setMainViewSize({ ...size, id: this.manager.uid });
2317
2322
  }, 50);
2323
+ this._syncMainViewTimer = 0;
2318
2324
  this.onCameraOrSizeUpdated = () => {
2319
2325
  callbacks.emit("cameraStateChange", this.cameraState);
2326
+ if (this.manager.room && this.manager.room.syncMainView) {
2327
+ clearTimeout(this._syncMainViewTimer);
2328
+ this._syncMainViewTimer = setTimeout(this.syncMainView, 100, this.manager.room);
2329
+ }
2330
+ };
2331
+ this.syncMainView = (room) => {
2332
+ if (room.isWritable) {
2333
+ room.syncMainView(this.mainView);
2334
+ }
2320
2335
  };
2321
2336
  this.mainView = this.createMainView();
2322
2337
  emitter.once("mainViewMounted").then(() => {
@@ -6067,6 +6082,9 @@
6067
6082
  const { emitter: emitter2, callbacks: callbacks2, boxEmitter: boxEmitter2 } = context;
6068
6083
  this.teleBoxManager = this.setupBoxManager(createTeleBoxManagerConfig);
6069
6084
  this.sideEffectManager.add(() => [
6085
+ this.teleBoxManager.onValChanged("rootRect", (rect) => {
6086
+ emitter2.emit("playgroundSizeChange", rect);
6087
+ }),
6070
6088
  // 使用 _xxx$.reaction 订阅修改的值, 不管有没有 skipUpdate, 修改值都会触发回调
6071
6089
  this.teleBoxManager.onValChanged("state", (state) => {
6072
6090
  callbacks2.emit("boxStateChange", state);
@@ -12614,8 +12632,8 @@
12614
12632
  const _WindowManager = class extends whiteWebSdk.InvisiblePlugin {
12615
12633
  constructor(context) {
12616
12634
  super(context);
12617
- this.version = "1.0.0-canary.77";
12618
- this.dependencies = { "dependencies": { "@juggle/resize-observer": "^3.4.0", "@netless/synced-store": "^2.0.7", "@netless/telebox-insider": "1.0.0-alpha.37", "emittery": "^0.11.0", "jspdf": "^2.5.1", "lodash": "^4.17.21", "p-retry": "^5.1.2", "side-effect-manager": "^1.2.1", "uuid": "^9.0.0", "value-enhancer": "^1.3.2" }, "peerDependencies": { "white-web-sdk": "^2.16.0" }, "devDependencies": { "@netless/app-docs-viewer": "1.0.0-canary.6", "@netless/app-plyr": "^0.2.4", "@playwright/test": "^1.33.0", "@rollup/plugin-commonjs": "^24.1.0", "@rollup/plugin-node-resolve": "^15.0.2", "@rollup/plugin-url": "^8.0.1", "@sveltejs/vite-plugin-svelte": "^2.2.0", "@tsconfig/svelte": "^4.0.1", "@types/debug": "^4.1.7", "@types/node": "^18.0.3", "@types/lodash": "^4.14.194", "@types/lodash-es": "^4.17.7", "@types/uuid": "^9.0.1", "@typescript-eslint/eslint-plugin": "^5.59.5", "@typescript-eslint/parser": "^5.59.5", "@vitest/ui": "^0.31.0", "cypress": "^12.12.0", "dotenv": "^16.0.3", "eslint": "^8.40.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-svelte3": "^4.0.0", "jsdom": "^22.0.0", "less": "^4.1.3", "prettier": "^2.8.8", "prettier-plugin-svelte": "^2.10.0", "rollup-plugin-analyzer": "^4.0.0", "rollup-plugin-styles": "^4.0.0", "svelte": "^3.59.1", "typescript": "^5.0.4", "vite": "^4.3.5", "vite-plugin-dts": "^2.3.0", "vitest": "^0.31.0", "white-web-sdk": "^2.16.42" } };
12635
+ this.version = "1.0.0-canary.79";
12636
+ this.dependencies = { "dependencies": { "@juggle/resize-observer": "^3.4.0", "@netless/synced-store": "^2.0.7", "@netless/telebox-insider": "1.0.0-alpha.37", "emittery": "^0.11.0", "jspdf": "^2.5.1", "lodash": "^4.17.21", "p-retry": "^5.1.2", "side-effect-manager": "^1.2.1", "uuid": "^9.0.0", "value-enhancer": "^1.3.2" }, "peerDependencies": { "white-web-sdk": "^2.16.0" }, "devDependencies": { "@netless/app-docs-viewer": "1.0.0-canary.6", "@netless/app-plyr": "^0.2.4", "@playwright/test": "^1.33.0", "@rollup/plugin-commonjs": "^24.1.0", "@rollup/plugin-node-resolve": "^15.0.2", "@rollup/plugin-url": "^8.0.1", "@sveltejs/vite-plugin-svelte": "^2.2.0", "@tsconfig/svelte": "^4.0.1", "@types/debug": "^4.1.7", "@types/node": "^18.0.3", "@types/lodash": "^4.14.194", "@types/lodash-es": "^4.17.7", "@types/uuid": "^9.0.1", "@typescript-eslint/eslint-plugin": "^5.59.5", "@typescript-eslint/parser": "^5.59.5", "@vitest/ui": "^0.31.0", "cypress": "^12.12.0", "dotenv": "^16.0.3", "eslint": "^8.40.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-svelte3": "^4.0.0", "jsdom": "^22.0.0", "less": "^4.1.3", "prettier": "^2.8.8", "prettier-plugin-svelte": "^2.10.0", "rollup-plugin-analyzer": "^4.0.0", "rollup-plugin-styles": "^4.0.0", "svelte": "^3.59.1", "typescript": "^5.0.4", "vite": "^4.3.5", "vite-plugin-dts": "^2.3.0", "vitest": "^0.31.0", "white-web-sdk": "^2.16.43" } };
12619
12637
  this.emitter = callbacks;
12620
12638
  this.viewMode$ = new valueEnhancer.Val(whiteWebSdk.ViewMode.Broadcaster);
12621
12639
  this.playground$ = new valueEnhancer.Val(void 0);
@@ -12631,7 +12649,7 @@
12631
12649
  (_b = this.appManager) == null ? void 0 : _b.dispatchInternalEvent(Events.MoveCamera, camera);
12632
12650
  };
12633
12651
  _WindowManager.displayer = context.displayer;
12634
- window.NETLESS_DEPS = { "dependencies": { "@juggle/resize-observer": "^3.4.0", "@netless/synced-store": "^2.0.7", "@netless/telebox-insider": "1.0.0-alpha.37", "emittery": "^0.11.0", "jspdf": "^2.5.1", "lodash": "^4.17.21", "p-retry": "^5.1.2", "side-effect-manager": "^1.2.1", "uuid": "^9.0.0", "value-enhancer": "^1.3.2" }, "peerDependencies": { "white-web-sdk": "^2.16.0" }, "devDependencies": { "@netless/app-docs-viewer": "1.0.0-canary.6", "@netless/app-plyr": "^0.2.4", "@playwright/test": "^1.33.0", "@rollup/plugin-commonjs": "^24.1.0", "@rollup/plugin-node-resolve": "^15.0.2", "@rollup/plugin-url": "^8.0.1", "@sveltejs/vite-plugin-svelte": "^2.2.0", "@tsconfig/svelte": "^4.0.1", "@types/debug": "^4.1.7", "@types/node": "^18.0.3", "@types/lodash": "^4.14.194", "@types/lodash-es": "^4.17.7", "@types/uuid": "^9.0.1", "@typescript-eslint/eslint-plugin": "^5.59.5", "@typescript-eslint/parser": "^5.59.5", "@vitest/ui": "^0.31.0", "cypress": "^12.12.0", "dotenv": "^16.0.3", "eslint": "^8.40.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-svelte3": "^4.0.0", "jsdom": "^22.0.0", "less": "^4.1.3", "prettier": "^2.8.8", "prettier-plugin-svelte": "^2.10.0", "rollup-plugin-analyzer": "^4.0.0", "rollup-plugin-styles": "^4.0.0", "svelte": "^3.59.1", "typescript": "^5.0.4", "vite": "^4.3.5", "vite-plugin-dts": "^2.3.0", "vitest": "^0.31.0", "white-web-sdk": "^2.16.42" } };
12652
+ window.NETLESS_DEPS = { "dependencies": { "@juggle/resize-observer": "^3.4.0", "@netless/synced-store": "^2.0.7", "@netless/telebox-insider": "1.0.0-alpha.37", "emittery": "^0.11.0", "jspdf": "^2.5.1", "lodash": "^4.17.21", "p-retry": "^5.1.2", "side-effect-manager": "^1.2.1", "uuid": "^9.0.0", "value-enhancer": "^1.3.2" }, "peerDependencies": { "white-web-sdk": "^2.16.0" }, "devDependencies": { "@netless/app-docs-viewer": "1.0.0-canary.6", "@netless/app-plyr": "^0.2.4", "@playwright/test": "^1.33.0", "@rollup/plugin-commonjs": "^24.1.0", "@rollup/plugin-node-resolve": "^15.0.2", "@rollup/plugin-url": "^8.0.1", "@sveltejs/vite-plugin-svelte": "^2.2.0", "@tsconfig/svelte": "^4.0.1", "@types/debug": "^4.1.7", "@types/node": "^18.0.3", "@types/lodash": "^4.14.194", "@types/lodash-es": "^4.17.7", "@types/uuid": "^9.0.1", "@typescript-eslint/eslint-plugin": "^5.59.5", "@typescript-eslint/parser": "^5.59.5", "@vitest/ui": "^0.31.0", "cypress": "^12.12.0", "dotenv": "^16.0.3", "eslint": "^8.40.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-svelte3": "^4.0.0", "jsdom": "^22.0.0", "less": "^4.1.3", "prettier": "^2.8.8", "prettier-plugin-svelte": "^2.10.0", "rollup-plugin-analyzer": "^4.0.0", "rollup-plugin-styles": "^4.0.0", "svelte": "^3.59.1", "typescript": "^5.0.4", "vite": "^4.3.5", "vite-plugin-dts": "^2.3.0", "vitest": "^0.31.0", "white-web-sdk": "^2.16.43" } };
12635
12653
  }
12636
12654
  static async mount(params) {
12637
12655
  var _a;
@@ -12670,7 +12688,7 @@
12670
12688
  throw new Error();
12671
12689
  }
12672
12690
  },
12673
- { retries: 10 }
12691
+ { retries: 10, maxTimeout: 5e3 }
12674
12692
  );
12675
12693
  }
12676
12694
  if (!manager) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@netless/window-manager",
3
- "version": "1.0.0-canary.77",
3
+ "version": "1.0.0-canary.79",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -57,7 +57,7 @@
57
57
  "vite": "^4.3.5",
58
58
  "vite-plugin-dts": "^2.3.0",
59
59
  "vitest": "^0.31.0",
60
- "white-web-sdk": "^2.16.42"
60
+ "white-web-sdk": "^2.16.43"
61
61
  },
62
62
  "scripts": {
63
63
  "prettier": "prettier --write .",
@@ -134,12 +134,24 @@ export class AppListeners {
134
134
  }
135
135
  }
136
136
 
137
- private moveCameraHandler = (payload: Camera) => {
137
+ private moveCameraHandler = (payload: Partial<Camera>) => {
138
138
  const size$ = this.manager.mainViewProxy.size$;
139
+ // 'size' 存在表示白板已经可见,此时 moveCamera 才有意义
139
140
  if (size$.value) {
140
- const size = this.manager.mainView.size;
141
- const diff = Math.max(size.height / size$.value.height, size.width / size$.value.width);
142
- const nextCamera = { ...payload, scale: payload.scale * diff };
141
+ const nextCamera = { ...payload };
142
+
143
+ // 如果远端移动视角带有缩放,调整以符合本地视角
144
+ if (nextCamera.scale) {
145
+ const size = this.manager.mainView.size;
146
+ const diff = Math.max(size.height / size$.value.height, size.width / size$.value.width);
147
+ nextCamera.scale *= diff;
148
+ }
149
+
150
+ // 有可能传了个 scale = 0, 规避这些无效值
151
+ else {
152
+ delete nextCamera.scale;
153
+ }
154
+
143
155
  this.manager.mainView.moveCamera(nextCamera);
144
156
  }
145
157
  }
package/src/BoxManager.ts CHANGED
@@ -23,7 +23,7 @@ import type { View } from "white-web-sdk";
23
23
  import type { CallbacksType } from "./callback";
24
24
  import type { EmitterType } from "./InternalEmitter";
25
25
  import type { AppState } from "./App/type";
26
- import { ReadonlyVal } from "value-enhancer";
26
+ import type { ReadonlyVal } from "value-enhancer";
27
27
 
28
28
  export { TELE_BOX_STATE };
29
29
 
@@ -108,6 +108,9 @@ export class BoxManager {
108
108
  const { emitter, callbacks, boxEmitter } = context;
109
109
  this.teleBoxManager = this.setupBoxManager(createTeleBoxManagerConfig);
110
110
  this.sideEffectManager.add(() => [
111
+ this.teleBoxManager.onValChanged("rootRect", rect => {
112
+ emitter.emit("playgroundSizeChange", rect);
113
+ }),
111
114
  // 使用 _xxx$.reaction 订阅修改的值, 不管有没有 skipUpdate, 修改值都会触发回调
112
115
  this.teleBoxManager.onValChanged("state", state => {
113
116
  callbacks.emit("boxStateChange", state);
@@ -11,7 +11,7 @@ import type { Point, RoomMember, View } from "white-web-sdk";
11
11
  import type { AppManager } from "../AppManager";
12
12
  import { ApplianceMap } from "./icons";
13
13
  import { findMemberByUid } from "../Helper";
14
- import { Val } from "value-enhancer";
14
+ import type { Val } from "value-enhancer";
15
15
 
16
16
  export type EventType = {
17
17
  type: PositionType;
@@ -10,7 +10,7 @@ import { SideEffectManager } from "side-effect-manager";
10
10
  import { Val } from "value-enhancer";
11
11
  import { ViewSync } from "./ViewSync";
12
12
  import type { ICamera, ISize } from "../AttributesDelegate";
13
- import type { Size, View } from "white-web-sdk";
13
+ import type { Room, Size, View } from "white-web-sdk";
14
14
  import type { AppManager } from "../AppManager";
15
15
  import type { MoveCameraParams } from "../typings";
16
16
 
@@ -320,10 +320,23 @@ export class MainViewProxy {
320
320
  this.view.callbacks.off("onSizeUpdated", this.onCameraOrSizeUpdated);
321
321
  }
322
322
 
323
+ private _syncMainViewTimer = 0;
323
324
  private onCameraOrSizeUpdated = () => {
324
325
  callbacks.emit("cameraStateChange", this.cameraState);
326
+ // sdk >= 2.16.43 的 syncMainView() 可以写入当前 main view 的 camera, 以修复复制粘贴元素的位置
327
+ // 注意到这个操作会发送信令,应当避免频繁调用
328
+ if (this.manager.room && (this.manager.room as any).syncMainView) {
329
+ clearTimeout(this._syncMainViewTimer);
330
+ this._syncMainViewTimer = setTimeout(this.syncMainView, 100, this.manager.room);
331
+ }
325
332
  };
326
333
 
334
+ private syncMainView = (room: Room) => {
335
+ if (room.isWritable) {
336
+ room.syncMainView(this.mainView);
337
+ }
338
+ }
339
+
327
340
  public stop() {
328
341
  this.manager.refresher.remove(Fields.MainViewCamera);
329
342
  this.manager.refresher.remove(Fields.MainViewSize);
@@ -8,7 +8,7 @@ import { round } from "lodash";
8
8
  import type { ReadonlyVal } from "value-enhancer";
9
9
  import type { AppManager } from "../AppManager";
10
10
  import type { ScrollStorage } from "../storage";
11
- import type { Camera, Size, View } from "white-web-sdk";
11
+ import type { Camera, Size } from "white-web-sdk";
12
12
 
13
13
  function clamp(x: number, min: number, max: number): number {
14
14
  return x < min ? min : x > max ? max : x;
package/src/index.ts CHANGED
@@ -241,7 +241,7 @@ export class WindowManager extends InvisiblePlugin<WindowMangerAttributes, any>
241
241
  throw new Error();
242
242
  }
243
243
  },
244
- { retries: 10 }
244
+ { retries: 10, maxTimeout: 5000 }
245
245
  );
246
246
  }
247
247