jazz-tools 0.16.6 → 0.17.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 (132) hide show
  1. package/.svelte-kit/__package__/index.d.ts +1 -0
  2. package/.svelte-kit/__package__/index.d.ts.map +1 -1
  3. package/.svelte-kit/__package__/index.js +1 -0
  4. package/.svelte-kit/__package__/media/image.svelte +131 -0
  5. package/.svelte-kit/__package__/media/image.svelte.d.ts +10 -0
  6. package/.svelte-kit/__package__/media/image.svelte.d.ts.map +1 -0
  7. package/.svelte-kit/__package__/media/index.d.ts +2 -0
  8. package/.svelte-kit/__package__/media/index.d.ts.map +1 -0
  9. package/.svelte-kit/__package__/media/index.js +1 -0
  10. package/.svelte-kit/__package__/tests/media/image.svelte.test.d.ts +2 -0
  11. package/.svelte-kit/__package__/tests/media/image.svelte.test.d.ts.map +1 -0
  12. package/.svelte-kit/__package__/tests/media/image.svelte.test.js +430 -0
  13. package/.svelte-kit/__package__/tests/testUtils.d.ts +11 -0
  14. package/.svelte-kit/__package__/tests/testUtils.d.ts.map +1 -0
  15. package/.svelte-kit/__package__/tests/testUtils.js +17 -0
  16. package/.svelte-kit/__package__/tests/types.d.ts +3 -0
  17. package/.turbo/turbo-build.log +42 -46
  18. package/CHANGELOG.md +12 -0
  19. package/dist/{chunk-R2VNCMG6.js → chunk-2SH44VLX.js} +33 -38
  20. package/dist/chunk-2SH44VLX.js.map +1 -0
  21. package/dist/index.js +1 -1
  22. package/dist/media/chunk-BBSS3NEY.js +211 -0
  23. package/dist/media/chunk-BBSS3NEY.js.map +1 -0
  24. package/dist/media/create-image.d.ts +48 -0
  25. package/dist/media/create-image.d.ts.map +1 -0
  26. package/dist/media/create-image.test.d.ts +2 -0
  27. package/dist/media/create-image.test.d.ts.map +1 -0
  28. package/dist/media/index.browser.d.ts +15 -0
  29. package/dist/media/index.browser.d.ts.map +1 -0
  30. package/dist/media/index.browser.js +113 -0
  31. package/dist/media/index.browser.js.map +1 -0
  32. package/dist/media/index.d.ts +53 -0
  33. package/dist/media/index.d.ts.map +1 -0
  34. package/dist/media/index.js +13 -0
  35. package/dist/media/index.js.map +1 -0
  36. package/dist/media/index.native.d.ts +17 -0
  37. package/dist/media/index.native.d.ts.map +1 -0
  38. package/dist/media/index.native.js +126 -0
  39. package/dist/media/index.native.js.map +1 -0
  40. package/dist/media/utils.d.ts +17 -0
  41. package/dist/media/utils.d.ts.map +1 -0
  42. package/dist/media/utils.test.d.ts +2 -0
  43. package/dist/media/utils.test.d.ts.map +1 -0
  44. package/dist/react/index.d.ts +1 -2
  45. package/dist/react/index.d.ts.map +1 -1
  46. package/dist/react/index.js +176 -59
  47. package/dist/react/index.js.map +1 -1
  48. package/dist/react/media/image.d.ts +62 -0
  49. package/dist/react/media/image.d.ts.map +1 -0
  50. package/dist/react/tests/media/image.test.d.ts +2 -0
  51. package/dist/react/tests/media/image.test.d.ts.map +1 -0
  52. package/dist/react-core/tests/useDemoAuth.test.d.ts +2 -0
  53. package/dist/react-core/tests/useDemoAuth.test.d.ts.map +1 -0
  54. package/dist/react-native-core/index.d.ts +1 -1
  55. package/dist/react-native-core/index.d.ts.map +1 -1
  56. package/dist/react-native-core/index.js +84 -66
  57. package/dist/react-native-core/index.js.map +1 -1
  58. package/dist/react-native-core/media/image.d.ts +93 -0
  59. package/dist/react-native-core/media/image.d.ts.map +1 -0
  60. package/dist/react-native-core/testing.d.ts +2 -0
  61. package/dist/react-native-core/testing.d.ts.map +1 -0
  62. package/dist/svelte/index.d.ts +1 -0
  63. package/dist/svelte/index.d.ts.map +1 -1
  64. package/dist/svelte/index.js +1 -0
  65. package/dist/svelte/media/image.svelte +131 -0
  66. package/dist/svelte/media/image.svelte.d.ts +10 -0
  67. package/dist/svelte/media/image.svelte.d.ts.map +1 -0
  68. package/dist/svelte/media/index.d.ts +2 -0
  69. package/dist/svelte/media/index.d.ts.map +1 -0
  70. package/dist/svelte/media/index.js +1 -0
  71. package/dist/svelte/tests/media/image.svelte.test.d.ts +2 -0
  72. package/dist/svelte/tests/media/image.svelte.test.d.ts.map +1 -0
  73. package/dist/svelte/tests/media/image.svelte.test.js +430 -0
  74. package/dist/svelte/tests/testUtils.d.ts +11 -0
  75. package/dist/svelte/tests/testUtils.d.ts.map +1 -0
  76. package/dist/svelte/tests/testUtils.js +17 -0
  77. package/dist/svelte/tests/types.d.ts +3 -0
  78. package/dist/testing.js +1 -1
  79. package/dist/tools/coValues/coFeed.d.ts +15 -0
  80. package/dist/tools/coValues/coFeed.d.ts.map +1 -1
  81. package/dist/tools/coValues/extensions/imageDef.d.ts +3 -9
  82. package/dist/tools/coValues/extensions/imageDef.d.ts.map +1 -1
  83. package/dist/tools/implementation/zodSchema/schemaTypes/FileStreamSchema.d.ts +1 -0
  84. package/dist/tools/implementation/zodSchema/schemaTypes/FileStreamSchema.d.ts.map +1 -1
  85. package/package.json +12 -12
  86. package/src/media/create-image.test.ts +195 -0
  87. package/src/media/create-image.ts +180 -0
  88. package/src/media/index.browser.ts +150 -0
  89. package/src/media/index.native.ts +153 -0
  90. package/src/media/index.ts +61 -0
  91. package/src/media/utils.test.ts +327 -0
  92. package/src/media/utils.ts +202 -0
  93. package/src/react/index.ts +1 -2
  94. package/src/react/media/image.tsx +210 -0
  95. package/src/react/tests/media/image.test.tsx +588 -0
  96. package/src/react-native-core/index.ts +1 -1
  97. package/src/react-native-core/media/image.tsx +159 -0
  98. package/src/svelte/index.ts +1 -0
  99. package/src/svelte/media/image.svelte +131 -0
  100. package/src/svelte/media/index.ts +1 -0
  101. package/src/svelte/tests/media/image.svelte.test.ts +583 -0
  102. package/src/svelte/tests/testUtils.ts +33 -0
  103. package/src/svelte/tests/types.d.ts +3 -0
  104. package/src/tools/coValues/coFeed.ts +37 -5
  105. package/src/tools/coValues/extensions/imageDef.ts +3 -49
  106. package/src/tools/implementation/zodSchema/schemaTypes/FileStreamSchema.ts +6 -0
  107. package/src/tools/tests/coMap.record.test.ts +3 -2
  108. package/src/tools/tests/coOptional.test.ts +3 -1
  109. package/tsconfig.json +1 -0
  110. package/tsup.config.ts +4 -9
  111. package/vitest.config.ts +14 -1
  112. package/dist/browser-media-images/index.d.ts +0 -9
  113. package/dist/browser-media-images/index.d.ts.map +0 -1
  114. package/dist/browser-media-images/index.js +0 -72
  115. package/dist/browser-media-images/index.js.map +0 -1
  116. package/dist/chunk-R2VNCMG6.js.map +0 -1
  117. package/dist/react/media.d.ts +0 -24
  118. package/dist/react/media.d.ts.map +0 -1
  119. package/dist/react-native-core/media.d.ts +0 -24
  120. package/dist/react-native-core/media.d.ts.map +0 -1
  121. package/dist/react-native-media-images/index.d.ts +0 -7
  122. package/dist/react-native-media-images/index.d.ts.map +0 -1
  123. package/dist/react-native-media-images/index.js +0 -177
  124. package/dist/react-native-media-images/index.js.map +0 -1
  125. package/dist/tools/tests/imageDef.test.d.ts +0 -2
  126. package/dist/tools/tests/imageDef.test.d.ts.map +0 -1
  127. package/src/browser-media-images/index.ts +0 -131
  128. package/src/react/media.tsx +0 -74
  129. package/src/react/scratch.tsx +0 -50
  130. package/src/react-native-core/media.tsx +0 -79
  131. package/src/react-native-media-images/index.ts +0 -238
  132. package/src/tools/tests/imageDef.test.ts +0 -278
@@ -1,238 +0,0 @@
1
- import ImageResizer from "@bam.tech/react-native-image-resizer";
2
- import * as FileSystem from "expo-file-system";
3
- import {
4
- Account,
5
- FileStream,
6
- Group,
7
- ImageDefinition,
8
- Loaded,
9
- } from "jazz-tools";
10
- import { Image } from "react-native";
11
-
12
- function arrayBuffer(blob: Blob): Promise<ArrayBuffer> {
13
- return new Promise((resolve, reject) => {
14
- const reader = new FileReader();
15
- reader.onloadend = () => {
16
- resolve(reader.result as ArrayBuffer);
17
- };
18
- reader.onerror = (error) => {
19
- reject(error);
20
- };
21
- reader.readAsArrayBuffer(blob);
22
- });
23
- }
24
-
25
- async function fileUriToBlob(uri: string): Promise<Blob> {
26
- try {
27
- const response = await fetch(uri);
28
- const blob = await response.blob();
29
- blob.arrayBuffer = () => arrayBuffer(blob);
30
- return blob;
31
- } catch (error) {
32
- console.error("Failed to convert file URI to Blob:", error);
33
- throw new Error("Failed to convert file URI to Blob");
34
- }
35
- }
36
-
37
- async function convertFileContentsToBase64DataURI(
38
- fileUri: string,
39
- contentType: string,
40
- ) {
41
- try {
42
- const base64 = await FileSystem.readAsStringAsync(fileUri, {
43
- encoding: FileSystem.EncodingType.Base64,
44
- });
45
- return `data:${contentType};base64,${base64}`;
46
- } catch (error) {
47
- console.error("Failed to convert file to base64:", error);
48
- return null;
49
- }
50
- }
51
-
52
- function base64DataURIToParts(base64Data: string) {
53
- const parts = base64Data.split(",");
54
- const contentType = parts[0]?.split(":")?.[1]?.split(";")?.[0] || "";
55
- const data = parts[1] || "";
56
- return { contentType, data };
57
- }
58
-
59
- function contentTypeToFormat(contentType: string) {
60
- if (contentType.includes("image/png")) return "PNG";
61
- if (contentType.includes("image/jpeg")) return "JPEG";
62
- if (contentType.includes("image/webp")) return "WEBP";
63
- return "PNG";
64
- }
65
-
66
- async function base64DataURIToBlob(base64Data: string) {
67
- const { contentType, data } = base64DataURIToParts(base64Data);
68
- const byteCharacters = atob(data);
69
-
70
- const byteNumbers = new Array(byteCharacters.length);
71
- for (let i = 0; i < byteCharacters.length; i++) {
72
- byteNumbers[i] = byteCharacters.charCodeAt(i);
73
- }
74
- const byteArray = new Uint8Array(byteNumbers);
75
-
76
- // @ts-expect-error byteArray has data
77
- const blob = new Blob(byteArray, { type: contentType });
78
- blob.arrayBuffer = () => arrayBuffer(blob);
79
- return blob;
80
- }
81
-
82
- async function getImageDimensions(
83
- uri: string,
84
- ): Promise<{ width: number; height: number }> {
85
- return new Promise((resolve, reject) => {
86
- Image.getSize(
87
- uri,
88
- (width, height) => resolve({ width, height }),
89
- (error) => {
90
- console.error("Failed to get image dimensions:", error);
91
- reject(new Error("Failed to get image dimensions"));
92
- },
93
- );
94
- });
95
- }
96
-
97
- /** @category Image creation */
98
- export async function createImageNative(
99
- base64ImageDataURI: string,
100
- options: {
101
- owner?: Group | Account;
102
- maxSize?: 256 | 1024 | 2048;
103
- } = {},
104
- ): Promise<Loaded<typeof ImageDefinition>> {
105
- try {
106
- const { contentType } = base64DataURIToParts(base64ImageDataURI);
107
- const format = contentTypeToFormat(contentType);
108
-
109
- let originalWidth, originalHeight;
110
- try {
111
- ({ width: originalWidth, height: originalHeight } =
112
- await getImageDimensions(base64ImageDataURI));
113
- } catch (error) {
114
- console.error("Error getting image dimensions:", error);
115
- throw new Error("Failed to get image dimensions");
116
- }
117
-
118
- let placeholderImage;
119
- try {
120
- placeholderImage = await ImageResizer.createResizedImage(
121
- base64ImageDataURI,
122
- 8,
123
- 8,
124
- format,
125
- 100,
126
- 0,
127
- );
128
- } catch (error) {
129
- console.error("Error creating placeholder image:", error);
130
- throw new Error("Failed to create placeholder image");
131
- }
132
-
133
- const placeholderDataURL = await convertFileContentsToBase64DataURI(
134
- placeholderImage.uri,
135
- contentType,
136
- );
137
-
138
- if (!placeholderDataURL) {
139
- throw new Error("Failed to create placeholder data URL");
140
- }
141
-
142
- const imageDefinition = ImageDefinition.create(
143
- {
144
- originalSize: [originalWidth, originalHeight],
145
- placeholderDataURL,
146
- },
147
- options.owner,
148
- );
149
-
150
- const addImageStream = async (
151
- width: number,
152
- height: number,
153
- label: string,
154
- ) => {
155
- try {
156
- const resizedImage = await ImageResizer.createResizedImage(
157
- base64ImageDataURI,
158
- width,
159
- height,
160
- format,
161
- 80,
162
- 0,
163
- );
164
-
165
- const binaryStream = await FileStream.createFromBlob(
166
- await fileUriToBlob(resizedImage.uri),
167
- imageDefinition._owner,
168
- );
169
-
170
- imageDefinition[label] = binaryStream;
171
- } catch (error) {
172
- console.error(`Error adding image stream for ${label}:`, error);
173
- throw new Error(`Failed to add image stream for ${label}`);
174
- }
175
- };
176
-
177
- if (originalWidth > 256 || originalHeight > 256) {
178
- const width =
179
- originalWidth > originalHeight
180
- ? 256
181
- : Math.round(256 * (originalWidth / originalHeight));
182
- const height =
183
- originalHeight > originalWidth
184
- ? 256
185
- : Math.round(256 * (originalHeight / originalWidth));
186
- await addImageStream(width, height, `${width}x${height}`);
187
- }
188
-
189
- if (options.maxSize === 256) return imageDefinition;
190
-
191
- if (originalWidth > 1024 || originalHeight > 1024) {
192
- const width =
193
- originalWidth > originalHeight
194
- ? 1024
195
- : Math.round(1024 * (originalWidth / originalHeight));
196
- const height =
197
- originalHeight > originalWidth
198
- ? 1024
199
- : Math.round(1024 * (originalHeight / originalWidth));
200
- await addImageStream(width, height, `${width}x${height}`);
201
- }
202
-
203
- if (options.maxSize === 1024) return imageDefinition;
204
-
205
- if (originalWidth > 2048 || originalHeight > 2048) {
206
- const width =
207
- originalWidth > originalHeight
208
- ? 2048
209
- : Math.round(2048 * (originalWidth / originalHeight));
210
- const height =
211
- originalHeight > originalWidth
212
- ? 2048
213
- : Math.round(2048 * (originalHeight / originalWidth));
214
- await addImageStream(width, height, `${width}x${height}`);
215
- }
216
-
217
- if (options.maxSize === 2048) return imageDefinition;
218
-
219
- if (options.maxSize === undefined || options.maxSize > 2048) {
220
- try {
221
- const originalBinaryStream = await FileStream.createFromBlob(
222
- await base64DataURIToBlob(base64ImageDataURI),
223
- imageDefinition._owner,
224
- );
225
- imageDefinition[`${originalWidth}x${originalHeight}`] =
226
- originalBinaryStream;
227
- } catch (error) {
228
- console.error("Error adding original image stream:", error);
229
- throw new Error("Failed to add original image stream");
230
- }
231
- }
232
-
233
- return imageDefinition;
234
- } catch (error) {
235
- console.error("Error in createImage:", error);
236
- throw error;
237
- }
238
- }
@@ -1,278 +0,0 @@
1
- import { WasmCrypto } from "cojson/crypto/WasmCrypto";
2
- import { describe, expect, test } from "vitest";
3
- import { Account, FileStream, ImageDefinition } from "../exports.js";
4
-
5
- const Crypto = await WasmCrypto.create();
6
-
7
- describe("ImageDefinition", async () => {
8
- const me = await Account.create({
9
- creationProps: { name: "Test User" },
10
- crypto: Crypto,
11
- });
12
-
13
- test("Construction with basic properties", () => {
14
- const imageDef = ImageDefinition.create(
15
- {
16
- originalSize: [1920, 1080],
17
- placeholderDataURL: "data:image/jpeg;base64,...",
18
- },
19
- { owner: me },
20
- );
21
-
22
- expect(imageDef.originalSize).toEqual([1920, 1080]);
23
- expect(imageDef.placeholderDataURL).toBe("data:image/jpeg;base64,...");
24
- });
25
-
26
- test("highestResAvailable with no resolutions", () => {
27
- const imageDef = ImageDefinition.create(
28
- {
29
- originalSize: [1920, 1080],
30
- },
31
- { owner: me },
32
- );
33
-
34
- const result = ImageDefinition.highestResAvailable(imageDef);
35
- expect(result).toBeUndefined();
36
- });
37
-
38
- test("highestResAvailable with single resolution", () => {
39
- const imageDef = ImageDefinition.create(
40
- {
41
- originalSize: [1920, 1080],
42
- },
43
- { owner: me },
44
- );
45
-
46
- const stream = FileStream.create({ owner: me });
47
- stream.start({ mimeType: "image/jpeg" });
48
- stream.push(new Uint8Array([1, 2, 3]));
49
- stream.end();
50
-
51
- imageDef["1920x1080"] = stream;
52
-
53
- const result = ImageDefinition.highestResAvailable(imageDef);
54
- expect(result).toBeDefined();
55
- expect(result?.res).toBe("1920x1080");
56
- expect(result?.stream).toStrictEqual(stream);
57
- });
58
-
59
- test("highestResAvailable with multiple resolutions", () => {
60
- const imageDef = ImageDefinition.create(
61
- {
62
- originalSize: [1920, 1080],
63
- },
64
- { owner: me },
65
- );
66
-
67
- const stream1 = FileStream.create({ owner: me });
68
- stream1.start({ mimeType: "image/jpeg" });
69
- stream1.push(new Uint8Array([1, 2, 3]));
70
- stream1.end();
71
-
72
- const stream2 = FileStream.create({ owner: me });
73
- stream2.start({ mimeType: "image/jpeg" });
74
- stream2.push(new Uint8Array([4, 5, 6]));
75
- stream2.end();
76
-
77
- imageDef["1920x1080"] = stream1;
78
- imageDef["1280x720"] = stream2;
79
-
80
- const result = ImageDefinition.highestResAvailable(imageDef);
81
- expect(result).toBeDefined();
82
- expect(result?.res).toBe("1920x1080");
83
- expect(result?.stream).toStrictEqual(stream1);
84
- });
85
-
86
- test("highestResAvailable with maxWidth option", () => {
87
- const imageDef = ImageDefinition.create(
88
- {
89
- originalSize: [1920, 1080],
90
- },
91
- { owner: me },
92
- );
93
-
94
- const stream1 = FileStream.create({ owner: me });
95
- stream1.start({ mimeType: "image/jpeg" });
96
- stream1.push(new Uint8Array([1, 2, 3]));
97
- stream1.end();
98
-
99
- const stream2 = FileStream.create({ owner: me });
100
- stream2.start({ mimeType: "image/jpeg" });
101
- stream2.push(new Uint8Array([4, 5, 6]));
102
- stream2.end();
103
-
104
- imageDef["1920x1080"] = stream1;
105
- imageDef["1280x720"] = stream2;
106
-
107
- const result = ImageDefinition.highestResAvailable(imageDef, {
108
- maxWidth: 1500,
109
- });
110
- expect(result).toBeDefined();
111
- expect(result?.res).toBe("1280x720");
112
- expect(result?.stream).toStrictEqual(stream2);
113
- });
114
-
115
- test("highestResAvailable with missing chunks", () => {
116
- const imageDef = ImageDefinition.create(
117
- {
118
- originalSize: [1920, 1080],
119
- },
120
- { owner: me },
121
- );
122
-
123
- const stream1 = FileStream.create({ owner: me });
124
- stream1.start({ mimeType: "image/jpeg" });
125
- stream1.push(new Uint8Array([1, 2, 3]));
126
- stream1.end();
127
-
128
- const stream2 = FileStream.create({ owner: me });
129
- stream2.start({ mimeType: "image/jpeg" });
130
- // Don't end stream2, so it has no chunks
131
-
132
- imageDef["1920x1080"] = stream1;
133
- imageDef["1280x720"] = stream2;
134
-
135
- const result = ImageDefinition.highestResAvailable(imageDef);
136
- expect(result).toBeDefined();
137
- expect(result?.res).toBe("1920x1080");
138
- expect(result?.stream).toStrictEqual(stream1);
139
- });
140
-
141
- test("highestResAvailable with missing chunks in middle stream", () => {
142
- const imageDef = ImageDefinition.create(
143
- {
144
- originalSize: [1920, 1080],
145
- },
146
- { owner: me },
147
- );
148
-
149
- const stream1 = FileStream.create({ owner: me });
150
- stream1.start({ mimeType: "image/jpeg" });
151
- stream1.push(new Uint8Array([1, 2, 3]));
152
- stream1.end();
153
-
154
- const stream2 = FileStream.create({ owner: me });
155
- stream2.start({ mimeType: "image/jpeg" });
156
- // Don't end stream2, so it has no chunks
157
-
158
- const stream3 = FileStream.create({ owner: me });
159
- stream3.start({ mimeType: "image/jpeg" });
160
- stream3.push(new Uint8Array([7, 8, 9]));
161
- stream3.end();
162
-
163
- imageDef["1920x1080"] = stream1;
164
- imageDef["1280x720"] = stream2;
165
- imageDef["1024x576"] = stream3;
166
-
167
- const result = ImageDefinition.highestResAvailable(imageDef);
168
- expect(result).toBeDefined();
169
- expect(result?.res).toBe("1920x1080");
170
- expect(result?.stream).toStrictEqual(stream1);
171
- });
172
-
173
- test("highestResAvailable with non-resolution keys", () => {
174
- const imageDef = ImageDefinition.create(
175
- {
176
- originalSize: [1920, 1080],
177
- },
178
- { owner: me },
179
- );
180
-
181
- const stream = FileStream.create({ owner: me });
182
- stream.start({ mimeType: "image/jpeg" });
183
- stream.push(new Uint8Array([1, 2, 3]));
184
- stream.end();
185
-
186
- imageDef["invalid-key"] = stream;
187
-
188
- const result = ImageDefinition.highestResAvailable(imageDef);
189
- expect(result).toBeUndefined();
190
- });
191
-
192
- test("highestResAvailable with targetWidth option", () => {
193
- const imageDef = ImageDefinition.create(
194
- {
195
- originalSize: [1920, 1080],
196
- },
197
- { owner: me },
198
- );
199
-
200
- const stream1 = FileStream.create({ owner: me });
201
- stream1.start({ mimeType: "image/jpeg" });
202
- stream1.push(new Uint8Array([1, 2, 3]));
203
- stream1.end();
204
-
205
- const stream2 = FileStream.create({ owner: me });
206
- stream2.start({ mimeType: "image/jpeg" });
207
- stream2.push(new Uint8Array([4, 5, 6]));
208
- stream2.end();
209
-
210
- const stream3 = FileStream.create({ owner: me });
211
- stream3.start({ mimeType: "image/jpeg" });
212
- stream3.push(new Uint8Array([7, 8, 9]));
213
- stream3.end();
214
-
215
- imageDef["1920x1080"] = stream1;
216
- imageDef["1280x720"] = stream2;
217
- imageDef["800x450"] = stream3;
218
-
219
- // Should return 1280x720 as it's the smallest resolution >= 1000px
220
- const result1 = ImageDefinition.highestResAvailable(imageDef, {
221
- targetWidth: 1000,
222
- });
223
- expect(result1).toBeDefined();
224
- expect(result1?.res).toBe("1280x720");
225
- expect(result1?.stream).toStrictEqual(stream2);
226
-
227
- // Should return 800x450 as it's the smallest resolution >= 700px
228
- const result2 = ImageDefinition.highestResAvailable(imageDef, {
229
- targetWidth: 700,
230
- });
231
- expect(result2).toBeDefined();
232
- expect(result2?.res).toBe("800x450");
233
- expect(result2?.stream).toStrictEqual(stream3);
234
-
235
- // Should return 1920x1080 as it's the smallest resolution >= 1500px
236
- const result3 = ImageDefinition.highestResAvailable(imageDef, {
237
- targetWidth: 1500,
238
- });
239
- expect(result3).toBeDefined();
240
- expect(result3?.res).toBe("1920x1080");
241
- expect(result3?.stream).toStrictEqual(stream1);
242
- });
243
-
244
- test("highestResAvailable with targetWidth and incomplete streams", () => {
245
- const imageDef = ImageDefinition.create(
246
- {
247
- originalSize: [1920, 1080],
248
- },
249
- { owner: me },
250
- );
251
-
252
- const stream1 = FileStream.create({ owner: me });
253
- stream1.start({ mimeType: "image/jpeg" });
254
- stream1.push(new Uint8Array([1, 2, 3]));
255
- stream1.end();
256
-
257
- const stream2 = FileStream.create({ owner: me });
258
- stream2.start({ mimeType: "image/jpeg" });
259
- // Don't end stream2, so it has no chunks
260
-
261
- const stream3 = FileStream.create({ owner: me });
262
- stream3.start({ mimeType: "image/jpeg" });
263
- stream3.push(new Uint8Array([7, 8, 9]));
264
- stream3.end();
265
-
266
- imageDef["1920x1080"] = stream1;
267
- imageDef["1280x720"] = stream2;
268
- imageDef["800x450"] = stream3;
269
-
270
- // Should skip 1280x720 as it's incomplete and return 1920x1080
271
- const result = ImageDefinition.highestResAvailable(imageDef, {
272
- targetWidth: 1000,
273
- });
274
- expect(result).toBeDefined();
275
- expect(result?.res).toBe("800x450");
276
- expect(result?.stream).toStrictEqual(stream1);
277
- });
278
- });