@takumi-rs/wasm 1.0.9 → 1.0.11

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 CHANGED
@@ -2,6 +2,6 @@
2
2
 
3
3
  Takumi is a **image rendering engine** written in Rust and this package provides WebAssembly bindings.
4
4
 
5
- Please refer to the [WebAssembly (In Browser)](https://takumi.kane.tw/docs/integrations/wasm-web) page in our official documentation for more details.
5
+ Please refer to the [Integration](https://takumi.kane.tw/docs/integration) page in our official documentation for more details.
6
6
 
7
7
  If you are looking for Node.js bindings, take a look at the [@takumi-rs/core](https://npmjs.com/package/@takumi-rs/core) package.
package/dist/export.cjs CHANGED
@@ -543,14 +543,31 @@ async function __wbg_init(module_or_path) {
543
543
  var Renderer = class extends Renderer$1 {
544
544
  fontsMark = /* @__PURE__ */ new Set();
545
545
  fontBuffersMark = /* @__PURE__ */ new WeakSet();
546
+ persistentImageSrcMark = /* @__PURE__ */ new Set();
547
+ pendingPersistentImages = /* @__PURE__ */ new Map();
546
548
  putPersistentImage(data, signal) {
547
549
  if (signal?.aborted) return;
550
+ if (!this.isNewPersistentImage(data.src)) return this.pendingPersistentImages.get(data.src);
548
551
  const resolved = resolveImageLoader(data);
549
- if (isPromise(resolved)) return resolved.then((value) => {
550
- if (signal?.aborted) return;
551
- super.putPersistentImage(value);
552
- });
552
+ if (isPromise(resolved)) {
553
+ const pending = resolved.then((value) => {
554
+ if (signal?.aborted) return;
555
+ super.putPersistentImage(value);
556
+ this.persistentImageSrcMark.add(data.src);
557
+ }).finally(() => {
558
+ this.pendingPersistentImages.delete(data.src);
559
+ });
560
+ this.pendingPersistentImages.set(data.src, pending);
561
+ return pending;
562
+ }
563
+ if (signal?.aborted) return;
553
564
  super.putPersistentImage(resolved);
565
+ this.persistentImageSrcMark.add(data.src);
566
+ }
567
+ clearImageStore() {
568
+ super.clearImageStore();
569
+ this.persistentImageSrcMark.clear();
570
+ this.pendingPersistentImages.clear();
554
571
  }
555
572
  async loadFonts(fonts, signal) {
556
573
  let loaded = 0;
@@ -602,6 +619,9 @@ var Renderer = class extends Renderer$1 {
602
619
  }
603
620
  this.fontsMark.delete(key);
604
621
  }
622
+ isNewPersistentImage(src) {
623
+ return !this.persistentImageSrcMark.has(src) && !this.pendingPersistentImages.has(src);
624
+ }
605
625
  };
606
626
  function createFontKey(font) {
607
627
  if ("key" in font && font.key) return font.key;
package/dist/export.d.cts CHANGED
@@ -278,14 +278,18 @@ type FontLoaderSync = Font | (Omit<FontDetails, "data"> & {
278
278
  declare class Renderer extends Renderer$1 {
279
279
  private fontsMark;
280
280
  private fontBuffersMark;
281
+ private persistentImageSrcMark;
282
+ private pendingPersistentImages;
281
283
  putPersistentImage(data: ImageSourceLoaderSync, signal?: AbortSignal): void;
282
284
  putPersistentImage(data: ImageSourceLoader, signal?: AbortSignal): Promise<void>;
285
+ clearImageStore(): void;
283
286
  loadFonts(fonts: FontLoader[], signal?: AbortSignal): Promise<number>;
284
287
  loadFont(data: FontLoaderSync, signal?: AbortSignal): void;
285
288
  loadFont(data: FontLoader, signal?: AbortSignal): Promise<void>;
286
289
  private loadFontInternal;
287
290
  private checkAndMarkFont;
288
291
  private unmarkFont;
292
+ private isNewPersistentImage;
289
293
  }
290
294
  //#endregion
291
295
  export { AnimationFrameSource, AnimationSceneSource, ByteBuf, ConstructRendererOptions, ContainerNode, EncodeFramesOptions, Font, FontDetails, FontLoader, FontLoaderSync, ImageNode, ImageSource, ImageSourceLoader, ImageSourceLoaderSync, InitInput, InitOutput, KeyframeRule, Keyframes, KeyframesMap, KeyframesRule, KeyframesRuleList, MeasuredNode, MeasuredTextRun, Node, NodeMetadata, RenderAnimationOptions, RenderOptions, Renderer, SyncInitInput, TextNode, __wbg_init as default, extractResourceUrls, initSync };
package/dist/export.d.mts CHANGED
@@ -278,14 +278,18 @@ type FontLoaderSync = Font | (Omit<FontDetails, "data"> & {
278
278
  declare class Renderer extends Renderer$1 {
279
279
  private fontsMark;
280
280
  private fontBuffersMark;
281
+ private persistentImageSrcMark;
282
+ private pendingPersistentImages;
281
283
  putPersistentImage(data: ImageSourceLoaderSync, signal?: AbortSignal): void;
282
284
  putPersistentImage(data: ImageSourceLoader, signal?: AbortSignal): Promise<void>;
285
+ clearImageStore(): void;
283
286
  loadFonts(fonts: FontLoader[], signal?: AbortSignal): Promise<number>;
284
287
  loadFont(data: FontLoaderSync, signal?: AbortSignal): void;
285
288
  loadFont(data: FontLoader, signal?: AbortSignal): Promise<void>;
286
289
  private loadFontInternal;
287
290
  private checkAndMarkFont;
288
291
  private unmarkFont;
292
+ private isNewPersistentImage;
289
293
  }
290
294
  //#endregion
291
295
  export { AnimationFrameSource, AnimationSceneSource, ByteBuf, ConstructRendererOptions, ContainerNode, EncodeFramesOptions, Font, FontDetails, FontLoader, FontLoaderSync, ImageNode, ImageSource, ImageSourceLoader, ImageSourceLoaderSync, InitInput, InitOutput, KeyframeRule, Keyframes, KeyframesMap, KeyframesRule, KeyframesRuleList, MeasuredNode, MeasuredTextRun, Node, NodeMetadata, RenderAnimationOptions, RenderOptions, Renderer, SyncInitInput, TextNode, __wbg_init as default, extractResourceUrls, initSync };
package/dist/export.mjs CHANGED
@@ -539,14 +539,31 @@ async function __wbg_init(module_or_path) {
539
539
  var Renderer = class extends Renderer$1 {
540
540
  fontsMark = /* @__PURE__ */ new Set();
541
541
  fontBuffersMark = /* @__PURE__ */ new WeakSet();
542
+ persistentImageSrcMark = /* @__PURE__ */ new Set();
543
+ pendingPersistentImages = /* @__PURE__ */ new Map();
542
544
  putPersistentImage(data, signal) {
543
545
  if (signal?.aborted) return;
546
+ if (!this.isNewPersistentImage(data.src)) return this.pendingPersistentImages.get(data.src);
544
547
  const resolved = resolveImageLoader(data);
545
- if (isPromise(resolved)) return resolved.then((value) => {
546
- if (signal?.aborted) return;
547
- super.putPersistentImage(value);
548
- });
548
+ if (isPromise(resolved)) {
549
+ const pending = resolved.then((value) => {
550
+ if (signal?.aborted) return;
551
+ super.putPersistentImage(value);
552
+ this.persistentImageSrcMark.add(data.src);
553
+ }).finally(() => {
554
+ this.pendingPersistentImages.delete(data.src);
555
+ });
556
+ this.pendingPersistentImages.set(data.src, pending);
557
+ return pending;
558
+ }
559
+ if (signal?.aborted) return;
549
560
  super.putPersistentImage(resolved);
561
+ this.persistentImageSrcMark.add(data.src);
562
+ }
563
+ clearImageStore() {
564
+ super.clearImageStore();
565
+ this.persistentImageSrcMark.clear();
566
+ this.pendingPersistentImages.clear();
550
567
  }
551
568
  async loadFonts(fonts, signal) {
552
569
  let loaded = 0;
@@ -598,6 +615,9 @@ var Renderer = class extends Renderer$1 {
598
615
  }
599
616
  this.fontsMark.delete(key);
600
617
  }
618
+ isNewPersistentImage(src) {
619
+ return !this.persistentImageSrcMark.has(src) && !this.pendingPersistentImages.has(src);
620
+ }
601
621
  };
602
622
  function createFontKey(font) {
603
623
  if ("key" in font && font.key) return font.key;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@takumi-rs/wasm",
3
- "version": "1.0.9",
3
+ "version": "1.0.11",
4
4
  "keywords": [
5
5
  "css",
6
6
  "image",
@@ -76,7 +76,7 @@
76
76
  "prepublishOnly": "jq '.dependencies[\"@takumi-rs/helpers\"] = .version' package.json > tmp.json && mv tmp.json package.json"
77
77
  },
78
78
  "dependencies": {
79
- "@takumi-rs/helpers": "1.0.9"
79
+ "@takumi-rs/helpers": "1.0.11"
80
80
  },
81
81
  "devDependencies": {
82
82
  "@types/bun": "catalog:",
Binary file