@paroicms/server-image-cache-engine 1.22.5 → 1.23.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.
- package/ddl/image-cache.ddl.sql +16 -15
- package/dist/compute-variant-size.d.ts +4 -9
- package/dist/compute-variant-size.js +28 -38
- package/dist/compute-variant-size.js.map +1 -1
- package/dist/constants.d.ts +3 -0
- package/dist/constants.js +8 -0
- package/dist/constants.js.map +1 -1
- package/dist/db-init/ddl-migration.d.ts +1 -1
- package/dist/db-init/ddl-migration.js +1 -1
- package/dist/db-init/ddl-migration.js.map +1 -1
- package/dist/default-bo-favicon.js +2 -2
- package/dist/default-bo-favicon.js.map +1 -1
- package/dist/engine-types.d.ts +42 -19
- package/dist/image-cache-engine.d.ts +42 -36
- package/dist/image-cache-engine.js +107 -138
- package/dist/image-cache-engine.js.map +1 -1
- package/dist/image-utils.d.ts +6 -0
- package/dist/image-utils.js +12 -0
- package/dist/image-utils.js.map +1 -0
- package/dist/{api.d.ts → index.d.ts} +2 -1
- package/dist/{api.js → index.js} +3 -2
- package/dist/index.js.map +1 -0
- package/dist/internal/engine-context.d.ts +12 -6
- package/dist/internal/engine-context.js +1 -2
- package/dist/internal/engine-context.js.map +1 -1
- package/dist/internal/internal.types.d.ts +36 -16
- package/dist/internal/queries.d.ts +64 -38
- package/dist/internal/queries.js +246 -106
- package/dist/internal/queries.js.map +1 -1
- package/dist/internal/resizer.d.ts +6 -6
- package/dist/internal/resizer.js +9 -9
- package/dist/internal/resizer.js.map +1 -1
- package/dist/internal/task-processor.js +37 -34
- package/dist/internal/task-processor.js.map +1 -1
- package/dist/internal/utils.d.ts +16 -0
- package/dist/internal/utils.js +34 -0
- package/dist/internal/utils.js.map +1 -0
- package/dist/original-images-processing.d.ts +2 -2
- package/dist/original-images-processing.js +27 -14
- package/dist/original-images-processing.js.map +1 -1
- package/dist/owner-transaction/make-t-image-available.d.ts +7 -0
- package/dist/owner-transaction/make-t-image-available.js +122 -0
- package/dist/owner-transaction/make-t-image-available.js.map +1 -0
- package/dist/owner-transaction/owner-batch.d.ts +10 -0
- package/dist/owner-transaction/owner-batch.js +85 -0
- package/dist/owner-transaction/owner-batch.js.map +1 -0
- package/dist/owner-transaction/owner-image-manager.d.ts +11 -0
- package/dist/owner-transaction/owner-image-manager.js +44 -0
- package/dist/owner-transaction/owner-image-manager.js.map +1 -0
- package/dist/owner-transaction/owner-transaction-types.d.ts +12 -0
- package/dist/owner-transaction/owner-transaction-types.js +2 -0
- package/dist/owner-transaction/owner-transaction-types.js.map +1 -0
- package/dist/owner-transaction/owner-transaction.d.ts +13 -0
- package/dist/owner-transaction/owner-transaction.js +60 -0
- package/dist/owner-transaction/owner-transaction.js.map +1 -0
- package/dist/owner-transaction/owner-utils.d.ts +1 -0
- package/dist/owner-transaction/owner-utils.js +10 -0
- package/dist/owner-transaction/owner-utils.js.map +1 -0
- package/package.json +8 -8
- package/dist/api.js.map +0 -1
|
@@ -1,66 +1,69 @@
|
|
|
1
|
-
import { fetchImageVariantWithBinary, insertIntoImageVariant,
|
|
1
|
+
import { fetchImageVariantWithBinary, insertIntoImageVariant, insertIntoPaImageCacheOwner, } from "./queries.js";
|
|
2
2
|
import { resizeImage } from "./resizer.js";
|
|
3
3
|
export async function processAllPending(context) {
|
|
4
4
|
while (true) {
|
|
5
|
-
const
|
|
6
|
-
if (!
|
|
5
|
+
const taskKey = context.queue.shift();
|
|
6
|
+
if (!taskKey)
|
|
7
7
|
break;
|
|
8
|
-
const pth = context.pendingTasks.get(
|
|
8
|
+
const pth = context.pendingTasks.get(taskKey);
|
|
9
9
|
if (!pth) {
|
|
10
|
-
context.logger.error(`Missing pending variant '${
|
|
10
|
+
context.logger.error(`Missing pending variant '${taskKey}'`);
|
|
11
11
|
continue;
|
|
12
12
|
}
|
|
13
|
+
const { task, resolve, reject } = pth;
|
|
13
14
|
try {
|
|
14
|
-
const result = await
|
|
15
|
-
|
|
15
|
+
const result = await executeTask(task, context);
|
|
16
|
+
resolve(result);
|
|
16
17
|
}
|
|
17
18
|
catch (error) {
|
|
18
|
-
context.logger.error(`[image-cache-engine] image '${task.
|
|
19
|
-
|
|
19
|
+
context.logger.error(`[image-cache-engine] image '${task.variant.mediaId}', '${task.variant.rawSizeName}':`, error, task);
|
|
20
|
+
reject(error);
|
|
21
|
+
}
|
|
22
|
+
context.pendingTasks.delete(taskKey);
|
|
23
|
+
for (const oneOwnerKey of pth.ownerKeys) {
|
|
24
|
+
context.pendingTaskByOwnerKeys.delete(oneOwnerKey);
|
|
20
25
|
}
|
|
21
|
-
context.pendingTasks.delete(task.taskKey);
|
|
22
26
|
}
|
|
23
27
|
}
|
|
24
|
-
async function
|
|
25
|
-
const found = await fetchImageVariantWithBinary(ctx,
|
|
26
|
-
imageUid: task.imageUid,
|
|
27
|
-
variantName: task.variantName,
|
|
28
|
-
});
|
|
28
|
+
async function executeTask(task, ctx) {
|
|
29
|
+
const found = await fetchImageVariantWithBinary(ctx, task.variant);
|
|
29
30
|
if (found) {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
if (task.owners.size > 0) {
|
|
32
|
+
await insertIntoPaImageCacheOwner(ctx, {
|
|
33
|
+
imageCacheId: found.id,
|
|
34
|
+
owners: Array.from(task.owners.values()),
|
|
35
|
+
});
|
|
36
|
+
}
|
|
34
37
|
return found.variant;
|
|
35
38
|
}
|
|
36
|
-
const origBinaryFile = await ctx.getOriginalImage(task.
|
|
39
|
+
const origBinaryFile = await ctx.getOriginalImage(task.variant.mediaId);
|
|
37
40
|
const result = await resizeImage({
|
|
38
41
|
binaryFile: origBinaryFile,
|
|
39
|
-
|
|
40
|
-
formatTo: task.
|
|
42
|
+
rawSize: task.variant,
|
|
43
|
+
formatTo: task.variant.mediaType !== task.input.sourceImage.mediaType
|
|
41
44
|
? {
|
|
42
|
-
mediaType: task.
|
|
45
|
+
mediaType: task.variant.mediaType,
|
|
43
46
|
}
|
|
44
47
|
: undefined,
|
|
45
48
|
qualityPolicy: ctx.qualityPolicy,
|
|
46
49
|
});
|
|
47
|
-
const { lastModified } = await insertIntoImageVariant(ctx
|
|
48
|
-
resourceVersion: task.resourceVersion,
|
|
49
|
-
|
|
50
|
-
slug: task.slug,
|
|
50
|
+
const { lastModified } = await insertIntoImageVariant(ctx, {
|
|
51
|
+
resourceVersion: task.variant.resourceVersion,
|
|
52
|
+
mediaId: task.variant.mediaId,
|
|
51
53
|
mediaType: result.mediaType,
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
height: result.height,
|
|
54
|
+
rawWidth: result.rawWidth,
|
|
55
|
+
rawHeight: result.rawHeight,
|
|
55
56
|
weightB: result.weightB,
|
|
56
57
|
binaryFile: result.binaryFile,
|
|
57
|
-
|
|
58
|
+
slug: task.variant.slug,
|
|
59
|
+
}, Array.from(task.owners.values()));
|
|
58
60
|
return {
|
|
59
61
|
...result,
|
|
62
|
+
mediaId: task.variant.mediaId,
|
|
63
|
+
resourceVersion: task.variant.resourceVersion,
|
|
64
|
+
rawSizeName: task.variant.rawSizeName,
|
|
65
|
+
slug: task.variant.slug,
|
|
60
66
|
lastModified,
|
|
61
|
-
resourceVersion: task.resourceVersion,
|
|
62
|
-
slug: task.slug,
|
|
63
|
-
variantName: task.variantName,
|
|
64
67
|
};
|
|
65
68
|
}
|
|
66
69
|
//# sourceMappingURL=task-processor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-processor.js","sourceRoot":"","sources":["../../src/internal/task-processor.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,2BAA2B,EAC3B,sBAAsB,EACtB,
|
|
1
|
+
{"version":3,"file":"task-processor.js","sourceRoot":"","sources":["../../src/internal/task-processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ResizeRule, SizeName } from "@paroicms/public-anywhere-lib";
|
|
2
|
+
import type { NewVariantInput } from "../engine-types.js";
|
|
3
|
+
import type { CompletedInput, OwnerKey, StoredCacheItem, TaskKey, TransactionCacheItem } from "./internal.types.js";
|
|
4
|
+
export declare function makeTaskKey(v: {
|
|
5
|
+
mediaId: string;
|
|
6
|
+
mediaType: string;
|
|
7
|
+
rawSizeName: SizeName;
|
|
8
|
+
}): TaskKey;
|
|
9
|
+
export declare function makeOwnerKey(v: {
|
|
10
|
+
mediaId: string;
|
|
11
|
+
mediaType: string;
|
|
12
|
+
ownerHandle: string;
|
|
13
|
+
rawResizeR: ResizeRule;
|
|
14
|
+
}): OwnerKey;
|
|
15
|
+
export declare function completeInput(input: NewVariantInput): CompletedInput;
|
|
16
|
+
export declare function toTransactionCacheItem(item: StoredCacheItem): TransactionCacheItem;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { computeImageVariantSize } from "../compute-variant-size.js";
|
|
2
|
+
export function makeTaskKey(v) {
|
|
3
|
+
return `${v.mediaId}:${v.rawSizeName}:${v.mediaType}`;
|
|
4
|
+
}
|
|
5
|
+
export function makeOwnerKey(v) {
|
|
6
|
+
return `${v.ownerHandle}:${v.mediaId}:${v.rawResizeR}:${v.mediaType}`;
|
|
7
|
+
}
|
|
8
|
+
export function completeInput(input) {
|
|
9
|
+
const { sourceImage, rawResizeR, autoCrop } = input;
|
|
10
|
+
const variantSize = computeImageVariantSize(input);
|
|
11
|
+
const { rawSizeName, rawWidth, rawHeight } = variantSize;
|
|
12
|
+
const mediaId = sourceImage.mediaId;
|
|
13
|
+
const mediaType = input.mediaType ?? sourceImage.mediaType;
|
|
14
|
+
return {
|
|
15
|
+
taskKey: makeTaskKey({ mediaId, mediaType, rawSizeName }),
|
|
16
|
+
sourceImage,
|
|
17
|
+
requestedVariant: {
|
|
18
|
+
rawSizeName,
|
|
19
|
+
mediaType,
|
|
20
|
+
rawWidth,
|
|
21
|
+
rawHeight,
|
|
22
|
+
},
|
|
23
|
+
rawResizeR,
|
|
24
|
+
autoCrop,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export function toTransactionCacheItem(item) {
|
|
28
|
+
const { variant, ...stored } = item;
|
|
29
|
+
return {
|
|
30
|
+
variant: item.variant,
|
|
31
|
+
stored,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/internal/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAUrE,MAAM,UAAU,WAAW,CAAC,CAI3B;IACC,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAK5B;IACC,OAAO,GAAG,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAsB;IAClD,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IACpD,MAAM,WAAW,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,WAAW,CAAC;IACzD,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;IACpC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,WAAW,CAAC,SAAS,CAAC;IAC3D,OAAO;QACL,OAAO,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;QACzD,WAAW;QACX,gBAAgB,EAAE;YAChB,WAAW;YACX,SAAS;YACT,QAAQ;YACR,SAAS;SACV;QACD,UAAU;QACV,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAqB;IAC1D,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IACpC,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,MAAM;KACP,CAAC;AACJ,CAAC"}
|
|
@@ -22,17 +22,31 @@ export async function processOriginalImage({ binaryFile, mediaType, ApiError, po
|
|
|
22
22
|
if (weightLimitB && weightB > weightLimitB) {
|
|
23
23
|
throw new ApiError("Image weight exceeds limit", 400);
|
|
24
24
|
}
|
|
25
|
-
return {
|
|
25
|
+
return {
|
|
26
|
+
binaryFile,
|
|
27
|
+
rawWidth: width,
|
|
28
|
+
rawHeight: height,
|
|
29
|
+
mediaType,
|
|
30
|
+
weightB,
|
|
31
|
+
lossless: undefined,
|
|
32
|
+
};
|
|
26
33
|
}
|
|
27
34
|
const input = {
|
|
28
|
-
width,
|
|
29
|
-
height,
|
|
35
|
+
rawWidth: width,
|
|
36
|
+
rawHeight: height,
|
|
30
37
|
mediaType,
|
|
31
38
|
sharpInst,
|
|
32
39
|
};
|
|
33
40
|
if (mediaType === "image/webp") {
|
|
34
41
|
if (weightLimitB === undefined || weightB <= weightLimitB) {
|
|
35
|
-
return {
|
|
42
|
+
return {
|
|
43
|
+
binaryFile,
|
|
44
|
+
rawWidth: width,
|
|
45
|
+
rawHeight: height,
|
|
46
|
+
mediaType,
|
|
47
|
+
weightB,
|
|
48
|
+
lossless: undefined,
|
|
49
|
+
};
|
|
36
50
|
}
|
|
37
51
|
return await convertToWebp({ input, qualityPolicy, areaLimitPx, lossless: false });
|
|
38
52
|
}
|
|
@@ -49,19 +63,18 @@ export async function processOriginalImage({ binaryFile, mediaType, ApiError, po
|
|
|
49
63
|
return await convertToWebp({ input, qualityPolicy, areaLimitPx, lossless: false });
|
|
50
64
|
}
|
|
51
65
|
async function convertToWebp({ input, qualityPolicy, areaLimitPx, lossless, }) {
|
|
52
|
-
const {
|
|
53
|
-
const
|
|
54
|
-
const quality = getQuality(size, qualityPolicy);
|
|
66
|
+
const { rawWidth, rawHeight } = areaLimitPx === undefined ? input : computeOriginalSize(input, areaLimitPx);
|
|
67
|
+
const quality = getQuality({ rawWidth, rawHeight }, qualityPolicy);
|
|
55
68
|
const { data, info } = await sharpQueue(() => input.sharpInst
|
|
56
|
-
.resize(
|
|
69
|
+
.resize({ width: rawWidth, height: rawHeight })
|
|
57
70
|
.webp({
|
|
58
71
|
lossless,
|
|
59
72
|
quality,
|
|
60
73
|
})
|
|
61
74
|
.toBuffer({ resolveWithObject: true }));
|
|
62
75
|
return {
|
|
63
|
-
|
|
64
|
-
|
|
76
|
+
rawWidth: info.width,
|
|
77
|
+
rawHeight: info.height,
|
|
65
78
|
weightB: data.byteLength,
|
|
66
79
|
mediaType: "image/webp",
|
|
67
80
|
lossless,
|
|
@@ -69,12 +82,12 @@ async function convertToWebp({ input, qualityPolicy, areaLimitPx, lossless, }) {
|
|
|
69
82
|
};
|
|
70
83
|
}
|
|
71
84
|
function computeOriginalSize(input, areaLimitPx) {
|
|
72
|
-
const inputArea = input.
|
|
85
|
+
const inputArea = input.rawWidth * input.rawHeight;
|
|
73
86
|
if (inputArea <= areaLimitPx)
|
|
74
87
|
return input;
|
|
75
|
-
const ratio = input.
|
|
88
|
+
const ratio = input.rawWidth / input.rawHeight;
|
|
76
89
|
const width = Math.trunc(Math.sqrt(areaLimitPx * ratio));
|
|
77
|
-
const height = Math.round((input.
|
|
78
|
-
return { width, height };
|
|
90
|
+
const height = Math.round((input.rawHeight / input.rawWidth) * width);
|
|
91
|
+
return { rawWidth: width, rawHeight: height };
|
|
79
92
|
}
|
|
80
93
|
//# sourceMappingURL=original-images-processing.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"original-images-processing.js","sourceRoot":"","sources":["../src/original-images-processing.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"original-images-processing.js","sourceRoot":"","sources":["../src/original-images-processing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ImageVariant, NewVariantInput } from "../engine-types.js";
|
|
2
|
+
import type { OwnerTransactionContext } from "./owner-transaction-types.js";
|
|
3
|
+
export declare function makeTransactionImageAvailable(otContext: OwnerTransactionContext, inputs: NewVariantInput[], { optimizeForBatch, }: {
|
|
4
|
+
optimizeForBatch?: {
|
|
5
|
+
getMoreInputsForBatch: (filter: (input: NewVariantInput) => boolean) => NewVariantInput[];
|
|
6
|
+
};
|
|
7
|
+
}): Promise<ImageVariant[]>;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { completeInput, makeOwnerKey } from "../internal/utils.js";
|
|
2
|
+
import { makeBatchOfImagesAvailable } from "./owner-batch.js";
|
|
3
|
+
import { promiseToHandleSafely } from "./owner-utils.js";
|
|
4
|
+
export async function makeTransactionImageAvailable(otContext, inputs, { optimizeForBatch, }) {
|
|
5
|
+
const { engineContext, ownerHandle, canBeRetrievedByOwner, localCache } = otContext;
|
|
6
|
+
const completedInputs = inputs.map(completeInput);
|
|
7
|
+
let unresolvedInputs = completedInputs.filter((input) => !localCache.has(input.taskKey));
|
|
8
|
+
const pendingVariants = new Map();
|
|
9
|
+
for (const input of unresolvedInputs) {
|
|
10
|
+
const pt = engineContext.pendingTasks.get(input.taskKey);
|
|
11
|
+
if (pt) {
|
|
12
|
+
pt.task.owners.set(ownerHandle, { ownerHandle, rawResizeR: input.rawResizeR });
|
|
13
|
+
pendingVariants.set(input.taskKey, pt.task.variant);
|
|
14
|
+
if (canBeRetrievedByOwner) {
|
|
15
|
+
pt.ownerKeys.add(makeOwnerKey({
|
|
16
|
+
mediaId: input.sourceImage.mediaId,
|
|
17
|
+
mediaType: input.requestedVariant.mediaType,
|
|
18
|
+
ownerHandle,
|
|
19
|
+
rawResizeR: input.rawResizeR,
|
|
20
|
+
}));
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
unresolvedInputs = unresolvedInputs.filter((input) => !pendingVariants.has(input.taskKey));
|
|
25
|
+
if (unresolvedInputs.length > 0) {
|
|
26
|
+
const unresolvedTaskKeys = new Set(unresolvedInputs.map((i) => i.taskKey));
|
|
27
|
+
let augmentedInputs = unresolvedInputs;
|
|
28
|
+
if (optimizeForBatch) {
|
|
29
|
+
const newItems = optimizeForBatch
|
|
30
|
+
.getMoreInputsForBatch((candidate) => {
|
|
31
|
+
return unresolvedTaskKeys.has(completeInput(candidate).taskKey);
|
|
32
|
+
})
|
|
33
|
+
.map(completeInput);
|
|
34
|
+
augmentedInputs = augmentedInputs.concat(newItems);
|
|
35
|
+
}
|
|
36
|
+
await makeBatchOfImagesAvailable(otContext, augmentedInputs);
|
|
37
|
+
}
|
|
38
|
+
createTasksAndCollectImageOwners(otContext, completedInputs, canBeRetrievedByOwner);
|
|
39
|
+
return completedInputs.map((input) => {
|
|
40
|
+
const pending = pendingVariants.get(input.taskKey);
|
|
41
|
+
if (pending)
|
|
42
|
+
return pending;
|
|
43
|
+
const v = localCache.get(input.taskKey);
|
|
44
|
+
if (!v) {
|
|
45
|
+
throw new Error(`Missing image variant for task "${input.taskKey}" (ownerHandle: ${ownerHandle})`);
|
|
46
|
+
}
|
|
47
|
+
v.usedBy = input;
|
|
48
|
+
return v.variant;
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
function createTasksAndCollectImageOwners(otContext, completedInputs, canBeRetrievedByOwner) {
|
|
52
|
+
const { startQueue } = otContext;
|
|
53
|
+
let hasCreatedTask = false;
|
|
54
|
+
for (const input of completedInputs) {
|
|
55
|
+
const taskCreated = processImageInput(otContext, input, canBeRetrievedByOwner);
|
|
56
|
+
if (taskCreated) {
|
|
57
|
+
hasCreatedTask = true;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (hasCreatedTask) {
|
|
61
|
+
startQueue();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* @returns `true` if a new task was created.
|
|
66
|
+
*/
|
|
67
|
+
function processImageInput(otContext, input, canBeRetrievedByOwner) {
|
|
68
|
+
const { engineContext, ownerHandle } = otContext;
|
|
69
|
+
const cacheItem = otContext.localCache.get(input.taskKey);
|
|
70
|
+
if (!cacheItem)
|
|
71
|
+
return false;
|
|
72
|
+
const { stored } = cacheItem;
|
|
73
|
+
if (stored) {
|
|
74
|
+
// Item is already stored - add to owner image manager if not already owned
|
|
75
|
+
if (!stored.alreadyOwned) {
|
|
76
|
+
otContext.ownerImageManager.add(stored.imageCacheId, input.rawResizeR);
|
|
77
|
+
}
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
// Item needs a task - check if task already exists
|
|
81
|
+
const pending = engineContext.pendingTasks.get(input.taskKey);
|
|
82
|
+
if (pending) {
|
|
83
|
+
pending.task.owners.set(ownerHandle, { ownerHandle, rawResizeR: input.rawResizeR });
|
|
84
|
+
if (canBeRetrievedByOwner) {
|
|
85
|
+
const ownerKey = makeOwnerKey({
|
|
86
|
+
mediaId: input.sourceImage.mediaId,
|
|
87
|
+
mediaType: input.requestedVariant.mediaType,
|
|
88
|
+
ownerHandle,
|
|
89
|
+
rawResizeR: input.rawResizeR,
|
|
90
|
+
});
|
|
91
|
+
pending.ownerKeys.add(ownerKey);
|
|
92
|
+
}
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
// Create new task
|
|
96
|
+
const ownerKey = canBeRetrievedByOwner
|
|
97
|
+
? makeOwnerKey({
|
|
98
|
+
mediaId: input.sourceImage.mediaId,
|
|
99
|
+
mediaType: input.requestedVariant.mediaType,
|
|
100
|
+
ownerHandle,
|
|
101
|
+
rawResizeR: input.rawResizeR,
|
|
102
|
+
})
|
|
103
|
+
: undefined;
|
|
104
|
+
const task = {
|
|
105
|
+
variant: cacheItem.variant,
|
|
106
|
+
input,
|
|
107
|
+
owners: new Map([[ownerHandle, { ownerHandle, rawResizeR: input.rawResizeR }]]),
|
|
108
|
+
};
|
|
109
|
+
const pendingTask = {
|
|
110
|
+
...promiseToHandleSafely(),
|
|
111
|
+
task,
|
|
112
|
+
ownerKeys: new Set(),
|
|
113
|
+
};
|
|
114
|
+
engineContext.queue.push(input.taskKey);
|
|
115
|
+
engineContext.pendingTasks.set(input.taskKey, pendingTask);
|
|
116
|
+
if (ownerKey) {
|
|
117
|
+
pendingTask.ownerKeys.add(ownerKey);
|
|
118
|
+
engineContext.pendingTaskByOwnerKeys.set(ownerKey, pendingTask);
|
|
119
|
+
}
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=make-t-image-available.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"make-t-image-available.js","sourceRoot":"","sources":["../../src/owner-transaction/make-t-image-available.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAE9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,SAAkC,EAClC,MAAyB,EACzB,EACE,gBAAgB,GAKjB;IAED,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,qBAAqB,EAAE,UAAU,EAAE,GAAG,SAAS,CAAC;IACpF,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAElD,IAAI,gBAAgB,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAEzF,MAAM,eAAe,GAAG,IAAI,GAAG,EAAyB,CAAC;IACzD,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,aAAa,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzD,IAAI,EAAE,EAAE,CAAC;YACP,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;YAC/E,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpD,IAAI,qBAAqB,EAAE,CAAC;gBAC1B,EAAE,CAAC,SAAS,CAAC,GAAG,CACd,YAAY,CAAC;oBACX,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,OAAO;oBAClC,SAAS,EAAE,KAAK,CAAC,gBAAgB,CAAC,SAAS;oBAC3C,WAAW;oBACX,UAAU,EAAE,KAAK,CAAC,UAAU;iBAC7B,CAAC,CACH,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,gBAAgB,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAE3F,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAE3E,IAAI,eAAe,GAAG,gBAAgB,CAAC;QACvC,IAAI,gBAAgB,EAAE,CAAC;YACrB,MAAM,QAAQ,GAAG,gBAAgB;iBAC9B,qBAAqB,CAAC,CAAC,SAAS,EAAE,EAAE;gBACnC,OAAO,kBAAkB,CAAC,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC;YAClE,CAAC,CAAC;iBACD,GAAG,CAAC,aAAa,CAAC,CAAC;YACtB,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,0BAA0B,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAC/D,CAAC;IAED,gCAAgC,CAAC,SAAS,EAAE,eAAe,EAAE,qBAAqB,CAAC,CAAC;IAEpF,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACnC,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;QAE5B,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,IAAI,KAAK,CACb,mCAAmC,KAAK,CAAC,OAAO,mBAAmB,WAAW,GAAG,CAClF,CAAC;QACJ,CAAC;QACD,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC;QACjB,OAAO,CAAC,CAAC,OAAO,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gCAAgC,CACvC,SAAkC,EAClC,eAAiC,EACjC,qBAA8B;IAE9B,MAAM,EAAE,UAAU,EAAE,GAAG,SAAS,CAAC;IACjC,IAAI,cAAc,GAAG,KAAK,CAAC;IAE3B,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;QACpC,MAAM,WAAW,GAAG,iBAAiB,CAAC,SAAS,EAAE,KAAK,EAAE,qBAAqB,CAAC,CAAC;QAC/E,IAAI,WAAW,EAAE,CAAC;YAChB,cAAc,GAAG,IAAI,CAAC;QACxB,CAAC;IACH,CAAC;IAED,IAAI,cAAc,EAAE,CAAC;QACnB,UAAU,EAAE,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CACxB,SAAkC,EAClC,KAAqB,EACrB,qBAA8B;IAE9B,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;IACjD,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC1D,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAE7B,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAE7B,IAAI,MAAM,EAAE,CAAC;QACX,2EAA2E;QAC3E,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YACzB,SAAS,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,mDAAmD;IACnD,MAAM,OAAO,GAAG,aAAa,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9D,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;QACpF,IAAI,qBAAqB,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,YAAY,CAAC;gBAC5B,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,OAAO;gBAClC,SAAS,EAAE,KAAK,CAAC,gBAAgB,CAAC,SAAS;gBAC3C,WAAW;gBACX,UAAU,EAAE,KAAK,CAAC,UAAU;aAC7B,CAAC,CAAC;YACH,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,kBAAkB;IAClB,MAAM,QAAQ,GAAG,qBAAqB;QACpC,CAAC,CAAC,YAAY,CAAC;YACX,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,OAAO;YAClC,SAAS,EAAE,KAAK,CAAC,gBAAgB,CAAC,SAAS;YAC3C,WAAW;YACX,UAAU,EAAE,KAAK,CAAC,UAAU;SAC7B,CAAC;QACJ,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,IAAI,GAAa;QACrB,OAAO,EAAE,SAAS,CAAC,OAAO;QAC1B,KAAK;QACL,MAAM,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;KAChF,CAAC;IAEF,MAAM,WAAW,GAAgB;QAC/B,GAAG,qBAAqB,EAAE;QAC1B,IAAI;QACJ,SAAS,EAAE,IAAI,GAAG,EAAE;KACrB,CAAC;IAEF,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACxC,aAAa,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAE3D,IAAI,QAAQ,EAAE,CAAC;QACb,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpC,aAAa,CAAC,sBAAsB,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { RequestedImageVariantWithSize, SourceImageRef } from "../engine-types.js";
|
|
2
|
+
import type { CompletedInput } from "../internal/internal.types.js";
|
|
3
|
+
import type { OwnerTransactionContext } from "./owner-transaction-types.js";
|
|
4
|
+
export declare function makeBatchOfImagesAvailable(otContext: OwnerTransactionContext, inputs: CompletedInput[]): Promise<void>;
|
|
5
|
+
export interface GroupedInputsByImage {
|
|
6
|
+
image: SourceImageRef;
|
|
7
|
+
requestedVariants: RequestedImageVariantWithSize[];
|
|
8
|
+
requestedListKey: string;
|
|
9
|
+
inputs: CompletedInput[];
|
|
10
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { generateResourceVersion } from "@paroicms/internal-server-lib";
|
|
2
|
+
import { fetchBatchOfStoredCacheItems } from "../internal/queries.js";
|
|
3
|
+
import { makeTaskKey, toTransactionCacheItem } from "../internal/utils.js";
|
|
4
|
+
export async function makeBatchOfImagesAvailable(otContext, inputs) {
|
|
5
|
+
const { engineContext, ownerHandle, localCache } = otContext;
|
|
6
|
+
const groups1 = groupInputsByImages(inputs);
|
|
7
|
+
const groups2 = groupInputsByRequestedKeys(groups1);
|
|
8
|
+
const list = await fetchBatchOfStoredCacheItems(engineContext, groups2.map((grouped) => ({
|
|
9
|
+
mediaIds: grouped.images.map((image) => image.mediaId),
|
|
10
|
+
requestedVariants: grouped.requestedVariants,
|
|
11
|
+
})), ownerHandle);
|
|
12
|
+
const fetchedVariants = new Map(list.map((v) => [makeTaskKey(v.variant), v]));
|
|
13
|
+
for (const input of inputs) {
|
|
14
|
+
localCache.set(input.taskKey, createTransactionCacheItem(input, fetchedVariants));
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function createTransactionCacheItem(input, fetchedVariants) {
|
|
18
|
+
const existing = fetchedVariants.get(input.taskKey);
|
|
19
|
+
if (existing)
|
|
20
|
+
return toTransactionCacheItem(existing);
|
|
21
|
+
const resourceVersion = generateResourceVersion();
|
|
22
|
+
const { sourceImage, requestedVariant } = input;
|
|
23
|
+
return {
|
|
24
|
+
variant: {
|
|
25
|
+
mediaId: sourceImage.mediaId,
|
|
26
|
+
resourceVersion,
|
|
27
|
+
mediaType: requestedVariant.mediaType,
|
|
28
|
+
rawWidth: requestedVariant.rawWidth,
|
|
29
|
+
rawHeight: requestedVariant.rawHeight,
|
|
30
|
+
rawSizeName: requestedVariant.rawSizeName,
|
|
31
|
+
slug: sourceImage.slug,
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function groupInputsByRequestedKeys(groupedInputs) {
|
|
36
|
+
const map = new Map();
|
|
37
|
+
for (const entry of groupedInputs) {
|
|
38
|
+
let group = map.get(entry.requestedListKey);
|
|
39
|
+
if (!group) {
|
|
40
|
+
group = {
|
|
41
|
+
requestedVariants: entry.requestedVariants,
|
|
42
|
+
images: new Map(),
|
|
43
|
+
};
|
|
44
|
+
map.set(entry.requestedListKey, group);
|
|
45
|
+
}
|
|
46
|
+
group.images.set(entry.image.mediaId, entry.image);
|
|
47
|
+
}
|
|
48
|
+
return Array.from(map.values()).map((group) => ({
|
|
49
|
+
requestedVariants: group.requestedVariants,
|
|
50
|
+
images: Array.from(group.images.values()),
|
|
51
|
+
}));
|
|
52
|
+
}
|
|
53
|
+
function groupInputsByImages(inputs) {
|
|
54
|
+
const map = new Map();
|
|
55
|
+
for (let index = 0; index < inputs.length; ++index) {
|
|
56
|
+
const input = inputs[index];
|
|
57
|
+
const { sourceImage, requestedVariant } = input;
|
|
58
|
+
let entry = map.get(sourceImage.mediaId);
|
|
59
|
+
if (!entry) {
|
|
60
|
+
entry = {
|
|
61
|
+
image: sourceImage,
|
|
62
|
+
requestedVariants: [],
|
|
63
|
+
inputs: [],
|
|
64
|
+
};
|
|
65
|
+
map.set(sourceImage.mediaId, entry);
|
|
66
|
+
}
|
|
67
|
+
entry.inputs.push(input);
|
|
68
|
+
if (entry.requestedVariants.findIndex((v) => v.rawSizeName === requestedVariant.rawSizeName &&
|
|
69
|
+
v.mediaType === requestedVariant.mediaType) === -1) {
|
|
70
|
+
entry.requestedVariants.push(requestedVariant);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return Array.from(map.values()).map((entry) => {
|
|
74
|
+
const list = entry.requestedVariants.map(makeRequestedImageVariantKey);
|
|
75
|
+
const requestedListKey = JSON.stringify(list.sort());
|
|
76
|
+
return {
|
|
77
|
+
...entry,
|
|
78
|
+
requestedListKey,
|
|
79
|
+
};
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
function makeRequestedImageVariantKey(r) {
|
|
83
|
+
return `${r.rawSizeName}:${r.mediaType}`;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=owner-batch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"owner-batch.js","sourceRoot":"","sources":["../../src/owner-transaction/owner-batch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ResizeRule } from "@paroicms/public-anywhere-lib";
|
|
2
|
+
import type { VariantEngineContext } from "../internal/engine-context.js";
|
|
3
|
+
export interface OwnerImageManager {
|
|
4
|
+
add(imageCacheId: string, rawResizeR: ResizeRule): void;
|
|
5
|
+
flush(): Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export declare function createOwnerImageManager({ ownerHandle, isHandleReusable, engineContext, }: {
|
|
8
|
+
ownerHandle: string;
|
|
9
|
+
isHandleReusable: boolean;
|
|
10
|
+
engineContext: VariantEngineContext;
|
|
11
|
+
}): OwnerImageManager;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { associateOwnerToImages } from "../internal/queries.js";
|
|
2
|
+
export function createOwnerImageManager({ ownerHandle, isHandleReusable, engineContext, }) {
|
|
3
|
+
const pendingData = new Map(); // key: imageCacheId, value: rawResizeR
|
|
4
|
+
let flushTimeout;
|
|
5
|
+
function startFlushTimeout() {
|
|
6
|
+
if (flushTimeout)
|
|
7
|
+
return;
|
|
8
|
+
flushTimeout = setTimeout(() => {
|
|
9
|
+
flushTimeout = undefined;
|
|
10
|
+
void flush().catch((error) => {
|
|
11
|
+
engineContext.logger.error("Error during auto-flush:", error);
|
|
12
|
+
});
|
|
13
|
+
}, 2_000);
|
|
14
|
+
}
|
|
15
|
+
async function flush() {
|
|
16
|
+
if (pendingData.size === 0)
|
|
17
|
+
return;
|
|
18
|
+
clearFlushTimeout();
|
|
19
|
+
const cacheImages = Array.from(pendingData).map(([imageCacheId, rawResizeR]) => ({
|
|
20
|
+
imageCacheId,
|
|
21
|
+
rawResizeR,
|
|
22
|
+
}));
|
|
23
|
+
pendingData.clear();
|
|
24
|
+
await associateOwnerToImages(engineContext, {
|
|
25
|
+
ownerHandle,
|
|
26
|
+
cacheImages,
|
|
27
|
+
isHandleReusable,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
function clearFlushTimeout() {
|
|
31
|
+
if (flushTimeout) {
|
|
32
|
+
clearTimeout(flushTimeout);
|
|
33
|
+
flushTimeout = undefined;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
add(imageCacheId, rawResizeR) {
|
|
38
|
+
pendingData.set(imageCacheId, rawResizeR);
|
|
39
|
+
startFlushTimeout();
|
|
40
|
+
},
|
|
41
|
+
flush,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=owner-image-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"owner-image-manager.js","sourceRoot":"","sources":["../../src/owner-transaction/owner-image-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAOhE,MAAM,UAAU,uBAAuB,CAAC,EACtC,WAAW,EACX,gBAAgB,EAChB,aAAa,GAKd;IACC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAsB,CAAC,CAAC,uCAAuC;IAC1F,IAAI,YAAwC,CAAC;IAE7C,SAAS,iBAAiB;QACxB,IAAI,YAAY;YAAE,OAAO;QACzB,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;YAC7B,YAAY,GAAG,SAAS,CAAC;YACzB,KAAK,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC3B,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;YAChE,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,KAAK,CAAC,CAAC;IACZ,CAAC;IAED,KAAK,UAAU,KAAK;QAClB,IAAI,WAAW,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO;QACnC,iBAAiB,EAAE,CAAC;QAEpB,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/E,YAAY;YACZ,UAAU;SACX,CAAC,CAAC,CAAC;QACJ,WAAW,CAAC,KAAK,EAAE,CAAC;QAEpB,MAAM,sBAAsB,CAAC,aAAa,EAAE;YAC1C,WAAW;YACX,WAAW;YACX,gBAAgB;SACjB,CAAC,CAAC;IACL,CAAC;IAED,SAAS,iBAAiB;QACxB,IAAI,YAAY,EAAE,CAAC;YACjB,YAAY,CAAC,YAAY,CAAC,CAAC;YAC3B,YAAY,GAAG,SAAS,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,OAAO;QACL,GAAG,CAAC,YAAoB,EAAE,UAAsB;YAC9C,WAAW,CAAC,GAAG,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;YAC1C,iBAAiB,EAAE,CAAC;QACtB,CAAC;QAED,KAAK;KACN,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { VariantEngineContext } from "../internal/engine-context.js";
|
|
2
|
+
import type { TaskKey, TransactionCacheItem } from "../internal/internal.types.js";
|
|
3
|
+
import type { OwnerImageManager } from "./owner-image-manager.js";
|
|
4
|
+
export interface OwnerTransactionContext {
|
|
5
|
+
engineContext: VariantEngineContext;
|
|
6
|
+
startQueue: () => void;
|
|
7
|
+
ownerHandle: string;
|
|
8
|
+
isHandleReusable: boolean;
|
|
9
|
+
canBeRetrievedByOwner: boolean;
|
|
10
|
+
ownerImageManager: OwnerImageManager;
|
|
11
|
+
localCache: Map<TaskKey, TransactionCacheItem>;
|
|
12
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"owner-transaction-types.js","sourceRoot":"","sources":["../../src/owner-transaction/owner-transaction-types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ImageCacheOwnerTransaction } from "../engine-types.js";
|
|
2
|
+
import type { VariantEngineContext } from "../internal/engine-context.js";
|
|
3
|
+
export declare function createOwnerTransaction(options: {
|
|
4
|
+
engine: {
|
|
5
|
+
context: VariantEngineContext;
|
|
6
|
+
startQueue: () => void;
|
|
7
|
+
checkStatus: () => void;
|
|
8
|
+
addPending: (closeNow: () => Promise<void>) => () => void;
|
|
9
|
+
};
|
|
10
|
+
ownerHandle: string;
|
|
11
|
+
isHandleReusable: boolean;
|
|
12
|
+
canBeRetrievedByOwner: boolean;
|
|
13
|
+
}): ImageCacheOwnerTransaction;
|