@neta-art/cohub 12.1.1 → 12.3.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.
Files changed (134) hide show
  1. package/README.md +85 -8
  2. package/dist/board/editor/clipboard.js +1 -1
  3. package/dist/board/editor/creation.js +1 -1
  4. package/dist/board/editor/document.d.ts +3 -1
  5. package/dist/board/editor/document.js +8 -6
  6. package/dist/board/editor/editor.d.ts +8 -3
  7. package/dist/board/editor/editor.js +8 -2
  8. package/dist/board/editor/index.d.ts +3 -3
  9. package/dist/board/editor/index.js +2 -2
  10. package/dist/board/editor/interaction.d.ts +23 -2
  11. package/dist/board/editor/interaction.js +93 -4
  12. package/dist/board/editor/query.d.ts +1 -1
  13. package/dist/board/editor/query.js +3 -7
  14. package/dist/board/editor/selection.js +1 -1
  15. package/dist/board/editor/snapshots.js +5 -57
  16. package/dist/board/editor/tool.d.ts +4 -1
  17. package/dist/board/editor/tool.js +6 -1
  18. package/dist/board/export/index.d.ts +2 -2
  19. package/dist/board/export/index.js +1 -1
  20. package/dist/board/export/node/fonts.js +4 -0
  21. package/dist/board/export/node/index.d.ts +2 -0
  22. package/dist/board/export/node/index.js +8 -1
  23. package/dist/board/export/node/scripts.js +1 -1
  24. package/dist/board/export/scene.d.ts +2 -2
  25. package/dist/board/export/scene.js +2 -2
  26. package/dist/board/model/asset-key.d.ts +24 -0
  27. package/dist/board/model/asset-key.js +104 -0
  28. package/dist/board/model/export-assets.d.ts +7 -3
  29. package/dist/board/model/export-assets.js +34 -13
  30. package/dist/board/model/index.d.ts +9 -7
  31. package/dist/board/model/index.js +22 -20
  32. package/dist/board/model/items/create.js +3 -3
  33. package/dist/board/model/items/definition.d.ts +9 -1
  34. package/dist/board/model/items/index.d.ts +2 -2
  35. package/dist/board/model/items/registry.d.ts +2 -1
  36. package/dist/board/model/items/registry.js +1 -0
  37. package/dist/board/model/media-sizes.d.ts +28 -0
  38. package/dist/board/model/media-sizes.js +64 -0
  39. package/dist/board/model/palette.d.ts +1 -0
  40. package/dist/board/model/palette.js +20 -130
  41. package/dist/board/model/sampling.js +1 -1
  42. package/dist/board/model/text-metrics.d.ts +28 -3
  43. package/dist/board/model/text-metrics.js +36 -2
  44. package/dist/board/model/themes.d.ts +495 -0
  45. package/dist/board/model/themes.js +500 -0
  46. package/dist/board/render/card-tag.js +2 -2
  47. package/dist/board/render/index.d.ts +11 -7
  48. package/dist/board/render/index.js +9 -5
  49. package/dist/board/render/labels.d.ts +15 -0
  50. package/dist/board/render/labels.js +14 -0
  51. package/dist/board/render/lod.d.ts +30 -0
  52. package/dist/board/render/lod.js +33 -0
  53. package/dist/board/render/media-interaction.d.ts +5 -2
  54. package/dist/board/render/media-interaction.js +15 -3
  55. package/dist/board/render/palette.js +2 -25
  56. package/dist/board/render/renderers/arrow-card-renderer.js +7 -5
  57. package/dist/board/render/renderers/audio-card-renderer.js +3 -2
  58. package/dist/board/render/renderers/board-renderer-registry.d.ts +22 -1
  59. package/dist/board/render/renderers/board-renderer-registry.js +9 -4
  60. package/dist/board/render/renderers/custom-card-renderer.js +5 -5
  61. package/dist/board/render/renderers/draw-card-renderer.js +1 -1
  62. package/dist/board/render/renderers/far-plate.d.ts +14 -1
  63. package/dist/board/render/renderers/far-plate.js +31 -8
  64. package/dist/board/render/renderers/file-card-renderer.js +49 -31
  65. package/dist/board/render/renderers/frame-card-renderer.js +9 -3
  66. package/dist/board/render/renderers/image-card-renderer.js +34 -8
  67. package/dist/board/render/renderers/model-card-renderer.js +6 -6
  68. package/dist/board/render/renderers/shape-card-renderer.js +25 -24
  69. package/dist/board/render/renderers/task-card-renderer.js +9 -10
  70. package/dist/board/render/renderers/text-card-renderer.js +86 -41
  71. package/dist/board/render/renderers/video-card-renderer.js +5 -4
  72. package/dist/board/render/script-export.js +1 -1
  73. package/dist/board/render/script-host.js +3 -3
  74. package/dist/board/render/style.d.ts +8 -2
  75. package/dist/board/render/style.js +8 -2
  76. package/dist/board/render/surface.d.ts +5 -0
  77. package/dist/board/render/surface.js +13 -3
  78. package/dist/board/render/text-edit.d.ts +32 -0
  79. package/dist/board/render/text-edit.js +134 -0
  80. package/dist/board/render/text-fit.d.ts +1 -3
  81. package/dist/board/render/text-fit.js +6 -49
  82. package/dist/board/render/text-measurement.d.ts +25 -1
  83. package/dist/board/render/text-measurement.js +157 -19
  84. package/dist/board/render/text-resolution.d.ts +1 -6
  85. package/dist/board/render/text-resolution.js +1 -10
  86. package/dist/board/render/theme.d.ts +15 -0
  87. package/dist/board/render/theme.js +15 -0
  88. package/dist/board/replica/index.d.ts +4 -2
  89. package/dist/board/replica/index.js +28 -17
  90. package/dist/board/replica/indexeddb.d.ts +16 -0
  91. package/dist/board/replica/indexeddb.js +155 -0
  92. package/dist/board/stage/assets.d.ts +28 -5
  93. package/dist/board/stage/assets.js +293 -102
  94. package/dist/board/stage/bench.d.ts +35 -0
  95. package/dist/board/stage/bench.js +153 -0
  96. package/dist/board/stage/device.d.ts +41 -0
  97. package/dist/board/stage/device.js +62 -0
  98. package/dist/board/stage/frame-budget.d.ts +19 -0
  99. package/dist/board/stage/frame-budget.js +69 -0
  100. package/dist/board/stage/idle.d.ts +4 -0
  101. package/dist/board/stage/idle.js +26 -0
  102. package/dist/board/stage/index.d.ts +11 -7
  103. package/dist/board/stage/index.js +7 -4
  104. package/dist/board/stage/lru.d.ts +13 -9
  105. package/dist/board/stage/lru.js +38 -20
  106. package/dist/board/stage/presses.d.ts +21 -0
  107. package/dist/board/stage/presses.js +66 -0
  108. package/dist/board/stage/scene.d.ts +15 -1
  109. package/dist/board/stage/scene.js +248 -141
  110. package/dist/board/stage/stage.d.ts +28 -2
  111. package/dist/board/stage/stage.js +404 -112
  112. package/dist/board/stage/texture-pool.d.ts +10 -1
  113. package/dist/board/stage/texture-pool.js +72 -2
  114. package/dist/chunks/environment.d.ts +6 -0
  115. package/dist/chunks/http.d.ts +9 -1
  116. package/dist/chunks/http.js +791 -4
  117. package/dist/index.d.ts +52 -1
  118. package/dist/index.js +202 -862
  119. package/dist/media.d.ts +3 -27
  120. package/dist/media.js +3 -82
  121. package/dist/protocol/dist/board-constants.js +3 -3
  122. package/dist/protocol/dist/board-layout.d.ts +17 -3
  123. package/dist/protocol/dist/board-layout.js +68 -11
  124. package/dist/protocol/dist/board-model.d.ts +15 -1
  125. package/dist/protocol/dist/board-model.js +12 -2
  126. package/dist/protocol/dist/board-patch.js +1 -1
  127. package/dist/protocol/dist/board-schema.d.ts +2 -1
  128. package/dist/protocol/dist/board-schema.js +4 -1
  129. package/dist/protocol/dist/core/media.d.ts +35 -1
  130. package/dist/protocol/dist/core/media.js +127 -1
  131. package/dist/protocol/dist/index.d.ts +3 -3
  132. package/package.json +4 -2
  133. package/dist/board/model/image-key.d.ts +0 -9
  134. package/dist/board/model/image-key.js +0 -33
@@ -0,0 +1,155 @@
1
+ //#region src/board/replica/indexeddb.ts
2
+ const DATABASE = "cohub-board";
3
+ const VERSION = 1;
4
+ const OPEN_TIMEOUT_MS = 3e3;
5
+ const connections = /* @__PURE__ */ new Map();
6
+ function open(name) {
7
+ const existing = connections.get(name);
8
+ if (existing) return existing;
9
+ const opening = new Promise((resolve, reject) => {
10
+ const factory = globalThis.indexedDB;
11
+ if (!factory) {
12
+ reject(/* @__PURE__ */ new Error("IndexedDB is unavailable."));
13
+ return;
14
+ }
15
+ let late = false;
16
+ const timer = setTimeout(() => {
17
+ late = true;
18
+ reject(/* @__PURE__ */ new Error("IndexedDB did not open in time."));
19
+ }, OPEN_TIMEOUT_MS);
20
+ const request = factory.open(name, VERSION);
21
+ request.onupgradeneeded = () => {
22
+ const db = request.result;
23
+ db.createObjectStore("documents", { keyPath: "board" }).createIndex("user", "userKey");
24
+ const pending = db.createObjectStore("pending", { keyPath: ["board", "mutationId"] });
25
+ pending.createIndex("board", "board");
26
+ pending.createIndex("user", "userKey");
27
+ };
28
+ request.onsuccess = () => {
29
+ clearTimeout(timer);
30
+ const db = request.result;
31
+ if (late) {
32
+ db.close();
33
+ return;
34
+ }
35
+ const forget = () => {
36
+ if (connections.get(name) === opening) connections.delete(name);
37
+ };
38
+ db.onversionchange = () => {
39
+ db.close();
40
+ forget();
41
+ };
42
+ db.onclose = forget;
43
+ resolve(db);
44
+ };
45
+ request.onerror = () => {
46
+ clearTimeout(timer);
47
+ reject(request.error ?? /* @__PURE__ */ new Error("IndexedDB failed to open."));
48
+ };
49
+ });
50
+ connections.set(name, opening);
51
+ opening.catch(() => {
52
+ if (connections.get(name) === opening) connections.delete(name);
53
+ });
54
+ return opening;
55
+ }
56
+ async function transact(name, stores, mode, work, retry = true) {
57
+ const db = await open(name);
58
+ let tx;
59
+ try {
60
+ tx = db.transaction(stores, mode);
61
+ } catch (error) {
62
+ if (!retry) throw error;
63
+ db.close();
64
+ connections.delete(name);
65
+ return transact(name, stores, mode, work, false);
66
+ }
67
+ return new Promise((resolve, reject) => {
68
+ const result = work(tx);
69
+ tx.oncomplete = () => resolve(result());
70
+ tx.onerror = () => reject(tx.error ?? /* @__PURE__ */ new Error("IndexedDB transaction failed."));
71
+ tx.onabort = () => reject(tx.error ?? /* @__PURE__ */ new Error("IndexedDB transaction aborted."));
72
+ });
73
+ }
74
+ function deleteByIndex(store, index, key) {
75
+ const request = store.index(index).openKeyCursor(IDBKeyRange.only(key));
76
+ request.onsuccess = () => {
77
+ const cursor = request.result;
78
+ if (!cursor) return;
79
+ store.delete(cursor.primaryKey);
80
+ cursor.continue();
81
+ };
82
+ }
83
+ let lastOrder = 0;
84
+ function createIndexedDbBoardReplicaStorage(scope, options = {}) {
85
+ const name = options.database ?? DATABASE;
86
+ const board = JSON.stringify([
87
+ scope.userKey,
88
+ scope.spaceId,
89
+ scope.boardId
90
+ ]);
91
+ return {
92
+ listPending: () => transact(name, ["pending"], "readonly", (tx) => {
93
+ const request = tx.objectStore("pending").index("board").getAll(IDBKeyRange.only(board));
94
+ return () => request.result.sort((a, b) => a.order - b.order).map(({ mutationId, patch }) => ({
95
+ mutationId,
96
+ patch
97
+ }));
98
+ }),
99
+ putPending: ({ mutationId, patch }) => transact(name, ["pending"], "readwrite", (tx) => {
100
+ lastOrder = Math.max(Date.now(), lastOrder + 1);
101
+ const record = {
102
+ board,
103
+ mutationId,
104
+ userKey: scope.userKey,
105
+ order: lastOrder,
106
+ patch
107
+ };
108
+ tx.objectStore("pending").put(record);
109
+ return () => void 0;
110
+ }),
111
+ deletePending: (mutationId) => transact(name, ["pending"], "readwrite", (tx) => {
112
+ tx.objectStore("pending").delete([board, mutationId]);
113
+ return () => void 0;
114
+ }),
115
+ readDocument: () => transact(name, ["documents"], "readonly", (tx) => {
116
+ const request = tx.objectStore("documents").get(board);
117
+ return () => {
118
+ const record = request.result;
119
+ return record ? {
120
+ version: record.version,
121
+ document: record.document
122
+ } : null;
123
+ };
124
+ }),
125
+ writeDocument: (version, document) => transact(name, ["documents"], "readwrite", (tx) => {
126
+ const store = tx.objectStore("documents");
127
+ const request = store.get(board);
128
+ request.onsuccess = () => {
129
+ const current = request.result;
130
+ if (current && current.version > version) return;
131
+ const record = {
132
+ board,
133
+ userKey: scope.userKey,
134
+ version,
135
+ document
136
+ };
137
+ store.put(record);
138
+ };
139
+ return () => void 0;
140
+ })
141
+ };
142
+ }
143
+ async function clearBoardReplicaStorage(options = {}) {
144
+ const { userKey } = options;
145
+ await transact(options.database ?? DATABASE, ["documents", "pending"], "readwrite", (tx) => {
146
+ for (const name of ["documents", "pending"]) {
147
+ const store = tx.objectStore(name);
148
+ if (userKey === void 0) store.clear();
149
+ else deleteByIndex(store, "user", userKey);
150
+ }
151
+ return () => void 0;
152
+ });
153
+ }
154
+ //#endregion
155
+ export { clearBoardReplicaStorage, createIndexedDbBoardReplicaStorage };
@@ -1,5 +1,6 @@
1
1
  import { ModelFormat } from "../../protocol/dist/fs/mime.js";
2
2
  import { BoardSceneItem } from "../model/scene.js";
3
+ import { BoardAssetMedia, BoardAssetRef } from "../model/asset-key.js";
3
4
  import { BoardAssetUrlOptions } from "../model/media-playback.js";
4
5
  import "../model/index.js";
5
6
  import { LruBudget } from "./lru.js";
@@ -7,9 +8,6 @@ import { BoardImageTexturePool } from "./texture-pool.js";
7
8
  import { Texture } from "pixi.js";
8
9
  //#region src/board/stage/assets.d.ts
9
10
  type BoardUrlMedia = "image" | "video";
10
- type BoardAssetMedia = BoardUrlMedia | "model";
11
- declare function boardTextureEdge(item: BoardSceneItem, scale: number): number;
12
- declare function boardAssetKey(item: BoardSceneItem): string | null;
13
11
  type Size = {
14
12
  width: number;
15
13
  height: number;
@@ -27,22 +25,44 @@ type BoardModelPreviews = {
27
25
  type BoardAssetManager = {
28
26
  assetKey: (item: BoardSceneItem) => string | null;
29
27
  invalidatePath: (path: string) => void;
28
+ invalidateItemAssets: () => void;
30
29
  requestItem: (item: BoardSceneItem, edge?: number) => void;
30
+ /** World point used to prioritize queued loads. */
31
+ focus: (point: {
32
+ x: number;
33
+ y: number;
34
+ } | null) => void;
31
35
  getTexture: (key: string) => Texture | null;
32
36
  getNaturalSize: (key: string) => Size | null;
37
+ getTone: (key: string) => number | null;
33
38
  hasError: (key: string) => boolean;
34
39
  acquire: (key: string) => void;
35
40
  release: (key: string) => void;
41
+ prefetch?: (requests: readonly BoardAssetPrefetch[]) => void;
36
42
  withTextures: <T>(items: BoardSceneItem[], use: (textures: Map<string, Texture>) => T | Promise<T>, options?: {
37
43
  timeoutMs?: number;
38
44
  edge?: (item: BoardSceneItem) => number;
39
45
  }) => Promise<T>;
40
- subscribe: (listener: (key: string) => void) => () => void;
46
+ subscribe: (listener: (key: string, change: BoardAssetChange) => void) => () => void;
47
+ stats: () => {
48
+ textures: number;
49
+ cooling: number;
50
+ bytes: number;
51
+ loading?: number;
52
+ prefetching?: number;
53
+ };
41
54
  destroy: () => void;
42
55
  };
56
+ type BoardAssetPrefetch = {
57
+ item: BoardSceneItem;
58
+ edge: number;
59
+ };
60
+ type BoardAssetChange = "texture" | "tone";
43
61
  type BoardAssetManagerOptions = {
44
62
  /** Resolve a Space file path to a URL a texture can load from; null when unavailable. */
45
63
  resolveFileUrl: (path: string, options?: BoardAssetUrlOptions) => Promise<string | null>;
64
+ /** undefined keeps the built-in rule, null shows none; cached until `invalidateItemAssets`. */
65
+ itemAsset?: (item: BoardSceneItem) => BoardAssetRef | null | undefined;
46
66
  concurrency?: number;
47
67
  videoConcurrency?: number;
48
68
  loadVideoPreviews?: boolean;
@@ -51,8 +71,11 @@ type BoardAssetManagerOptions = {
51
71
  imageTexturePool?: BoardImageTexturePool;
52
72
  loadTexture?: (url: string, media: BoardUrlMedia) => Promise<Texture | null>;
53
73
  unloadTexture?: (url: string, texture: Texture | null, media: BoardAssetMedia) => Promise<void>;
74
+ /** An unshared copy of an image texture at `edge`; null keeps evicting outright. */
75
+ shrinkTexture?: (texture: Texture, edge: number) => Promise<Texture | null>;
76
+ readTone?: ((texture: Texture) => Promise<number | null>) | null;
54
77
  now?: () => number;
55
78
  };
56
79
  declare function createBoardAssetManager(options: BoardAssetManagerOptions): BoardAssetManager;
57
80
  //#endregion
58
- export { BoardAssetManager, BoardAssetManagerOptions, BoardModelPreviewRequest, BoardModelPreviews, boardAssetKey, boardTextureEdge, createBoardAssetManager };
81
+ export { BoardAssetChange, BoardAssetManager, BoardAssetManagerOptions, BoardAssetPrefetch, BoardModelPreviewRequest, BoardModelPreviews, createBoardAssetManager };