@paged-media/plugin-sdk 0.2.16-canary.0 → 0.2.17-canary.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 (2) hide show
  1. package/dist/index.js +85 -0
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -984,6 +984,87 @@ function createBundleHost(getEditor, manifest, options) {
984
984
  }
985
985
  }
986
986
  };
987
+ const imageChannel = () => getEditor().images;
988
+ const images = {
989
+ claimImageResource(elementId, opts) {
990
+ requireDeclared(
991
+ hasRendering("resourceProvider"),
992
+ "images.claimImageResource",
993
+ 'capabilities.rendering must include "resourceProvider"'
994
+ );
995
+ const channel = imageChannel();
996
+ if (!channel) {
997
+ log.warn(
998
+ `images.claimImageResource("${elementId}") ignored \u2014 the host wired no resource channel (probe supports("rendering.resourceProvider@1"))`
999
+ );
1000
+ return store.add(toDisposable(() => {
1001
+ }));
1002
+ }
1003
+ let released = false;
1004
+ const off = channel.onResourceTilesNeeded((need) => {
1005
+ if (released || need.imageId !== elementId) return;
1006
+ void (async () => {
1007
+ const tiles = [];
1008
+ for (const [x, y] of need.tiles) {
1009
+ let tile;
1010
+ try {
1011
+ tile = await opts.source(need.level, x, y);
1012
+ } catch (err) {
1013
+ log.warn(
1014
+ `images.source(level ${need.level}, ${x}, ${y}) threw \u2014 tile skipped`,
1015
+ err
1016
+ );
1017
+ continue;
1018
+ }
1019
+ if (!tile) continue;
1020
+ tiles.push({
1021
+ x: tile.x,
1022
+ y: tile.y,
1023
+ width: tile.width,
1024
+ height: tile.height,
1025
+ // The wire carries a plain number[]; Array.from copies the
1026
+ // RGBA8 view (isolate-proxy-safe, like the scene-layer path).
1027
+ rgba: Array.from(tile.rgba)
1028
+ });
1029
+ }
1030
+ if (released || tiles.length === 0) return;
1031
+ try {
1032
+ await channel.submitTiles(
1033
+ elementId,
1034
+ need.level,
1035
+ tiles,
1036
+ need.generation
1037
+ );
1038
+ } catch (err) {
1039
+ log.warn(
1040
+ `images.submitTiles("${elementId}", level ${need.level}) failed`,
1041
+ err
1042
+ );
1043
+ }
1044
+ })();
1045
+ });
1046
+ void channel.claim({
1047
+ imageId: elementId,
1048
+ levels: opts.levels,
1049
+ tileSize: opts.tileSize,
1050
+ baseWidth: opts.baseWidth,
1051
+ baseHeight: opts.baseHeight,
1052
+ revision: opts.revision()
1053
+ }).catch((err) => {
1054
+ log.warn(`images.claim("${elementId}") failed`, err);
1055
+ });
1056
+ return store.add(
1057
+ toDisposable(() => {
1058
+ if (released) return;
1059
+ released = true;
1060
+ off();
1061
+ void channel.release(elementId).catch((err) => {
1062
+ log.warn(`images.release("${elementId}") failed`, err);
1063
+ });
1064
+ })
1065
+ );
1066
+ }
1067
+ };
987
1068
  const blobBackend = options?.blobStore;
988
1069
  const blobQuota = Math.min(
989
1070
  BLOB_BUDGETS.defaultQuotaBytes,
@@ -1084,6 +1165,9 @@ function createBundleHost(getEditor, manifest, options) {
1084
1165
  if (getEditor().sceneLayers) {
1085
1166
  featureSet.add("rendering.sceneLayer@1");
1086
1167
  }
1168
+ if (getEditor().images) {
1169
+ featureSet.add("rendering.resourceProvider@1");
1170
+ }
1087
1171
  if (options?.shell) {
1088
1172
  featureSet.add("shell.openPanel@1");
1089
1173
  featureSet.add("shell.pickFile@1");
@@ -1130,6 +1214,7 @@ function createBundleHost(getEditor, manifest, options) {
1130
1214
  bindings,
1131
1215
  widgets,
1132
1216
  assets,
1217
+ images,
1133
1218
  clipboard,
1134
1219
  supports: (feature) => featureSet.has(feature),
1135
1220
  get editor() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paged-media/plugin-sdk",
3
- "version": "0.2.16-canary.0",
3
+ "version": "0.2.17-canary.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -11,7 +11,7 @@
11
11
  }
12
12
  },
13
13
  "dependencies": {
14
- "@paged-media/plugin-api": "0.2.16-canary.0"
14
+ "@paged-media/plugin-api": "0.2.17-canary.0"
15
15
  },
16
16
  "peerDependencies": {
17
17
  "react": "^18.3.0"