@pixzle/node 0.0.18 → 0.0.20

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 (93) hide show
  1. package/dist/block.cjs +158 -0
  2. package/dist/block.d.cts +71 -0
  3. package/dist/block.d.ts.map +1 -0
  4. package/dist/block.js +26 -17
  5. package/dist/block.js.map +1 -1
  6. package/dist/cjs/block.d.ts +71 -0
  7. package/dist/cjs/block.d.ts.map +1 -0
  8. package/dist/cjs/block.js +158 -0
  9. package/dist/cjs/block.js.map +1 -0
  10. package/dist/cjs/constants.d.ts +2 -0
  11. package/dist/cjs/constants.d.ts.map +1 -0
  12. package/dist/cjs/constants.js +6 -0
  13. package/dist/cjs/constants.js.map +1 -0
  14. package/dist/cjs/file.d.ts +33 -0
  15. package/dist/cjs/file.d.ts.map +1 -0
  16. package/dist/cjs/file.js +57 -0
  17. package/dist/cjs/file.js.map +1 -0
  18. package/dist/cjs/fragmenter.d.ts +14 -0
  19. package/dist/cjs/fragmenter.d.ts.map +1 -0
  20. package/dist/cjs/fragmenter.js +95 -0
  21. package/dist/cjs/fragmenter.js.map +1 -0
  22. package/dist/cjs/index.d.ts +12 -0
  23. package/dist/cjs/index.d.ts.map +1 -0
  24. package/dist/cjs/index.js +59 -0
  25. package/dist/cjs/index.js.map +1 -0
  26. package/dist/cjs/package.json +1 -0
  27. package/dist/cjs/restorer.d.ts +10 -0
  28. package/dist/cjs/restorer.d.ts.map +1 -0
  29. package/dist/cjs/restorer.js +54 -0
  30. package/dist/cjs/restorer.js.map +1 -0
  31. package/dist/cjs/utils.d.ts +6 -0
  32. package/dist/cjs/utils.d.ts.map +1 -0
  33. package/dist/cjs/utils.js +15 -0
  34. package/dist/cjs/utils.js.map +1 -0
  35. package/dist/constants.cjs +6 -0
  36. package/dist/constants.d.cts +2 -0
  37. package/dist/constants.d.ts.map +1 -0
  38. package/dist/constants.js +5 -2
  39. package/dist/constants.js.map +1 -1
  40. package/dist/esm/block.d.ts +71 -0
  41. package/dist/esm/block.d.ts.map +1 -0
  42. package/dist/esm/block.js +149 -0
  43. package/dist/esm/block.js.map +1 -0
  44. package/dist/esm/constants.d.ts +2 -0
  45. package/dist/esm/constants.d.ts.map +1 -0
  46. package/dist/esm/constants.js +3 -0
  47. package/dist/esm/constants.js.map +1 -0
  48. package/dist/esm/file.d.ts +33 -0
  49. package/dist/esm/file.d.ts.map +1 -0
  50. package/dist/esm/file.js +47 -0
  51. package/dist/esm/file.js.map +1 -0
  52. package/dist/esm/fragmenter.d.ts +14 -0
  53. package/dist/esm/fragmenter.d.ts.map +1 -0
  54. package/dist/esm/fragmenter.js +91 -0
  55. package/dist/esm/fragmenter.js.map +1 -0
  56. package/dist/esm/index.d.ts +12 -0
  57. package/dist/esm/index.d.ts.map +1 -0
  58. package/dist/esm/index.js +55 -0
  59. package/dist/esm/index.js.map +1 -0
  60. package/dist/esm/restorer.d.ts +10 -0
  61. package/dist/esm/restorer.d.ts.map +1 -0
  62. package/dist/esm/restorer.js +50 -0
  63. package/dist/esm/restorer.js.map +1 -0
  64. package/dist/esm/utils.d.ts +6 -0
  65. package/dist/esm/utils.d.ts.map +1 -0
  66. package/dist/esm/utils.js +9 -0
  67. package/dist/esm/utils.js.map +1 -0
  68. package/dist/file.cjs +57 -0
  69. package/dist/file.d.cts +33 -0
  70. package/dist/file.d.ts.map +1 -0
  71. package/dist/file.js +23 -13
  72. package/dist/file.js.map +1 -1
  73. package/dist/fragmenter.cjs +95 -0
  74. package/dist/fragmenter.d.cts +14 -0
  75. package/dist/fragmenter.d.ts.map +1 -0
  76. package/dist/fragmenter.js +28 -24
  77. package/dist/fragmenter.js.map +1 -1
  78. package/dist/index.cjs +59 -0
  79. package/dist/index.d.cts +12 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +22 -18
  82. package/dist/index.js.map +1 -1
  83. package/dist/restorer.cjs +54 -0
  84. package/dist/restorer.d.cts +10 -0
  85. package/dist/restorer.d.ts.map +1 -0
  86. package/dist/restorer.js +19 -15
  87. package/dist/restorer.js.map +1 -1
  88. package/dist/utils.cjs +15 -0
  89. package/dist/utils.d.cts +6 -0
  90. package/dist/utils.d.ts.map +1 -0
  91. package/dist/utils.js +9 -3
  92. package/dist/utils.js.map +1 -1
  93. package/package.json +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block.js","sourceRoot":"","sources":["../../src/block.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const VERSION: string;
2
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,OAAO,QAAU,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { version } from "./../package.json";
2
+ export const VERSION = version;
3
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Create a directory
3
+ * @param dir Directory path
4
+ * @param recursive Create parent directories if they don't exist
5
+ */
6
+ export declare function createDir(dir: string, recursive?: boolean): Promise<void>;
7
+ /**
8
+ * Write a file
9
+ * @param dir Directory path
10
+ * @param filename Filename
11
+ * @param data Data to write
12
+ * @returns Path to the file
13
+ */
14
+ export declare function writeFile(dir: string, filename: string, data: string | Buffer): Promise<string>;
15
+ /**
16
+ * Read a JSON file and return its content
17
+ * @param filePath Path to the JSON file
18
+ * @returns Content of the JSON file
19
+ */
20
+ export declare function readJsonFile<T>(filePath: string): Promise<T>;
21
+ /**
22
+ * Read a file and return its content
23
+ * @param filePath Path to the file
24
+ * @returns Content of the file
25
+ */
26
+ export declare function readFileBuffer(filePath: string): Promise<Buffer>;
27
+ /**
28
+ * Get the filename without the extension
29
+ * @param filePath Path to the file
30
+ * @returns Filename without the extension
31
+ */
32
+ export declare function fileNameWithoutExtension(filePath: string): string;
33
+ //# sourceMappingURL=file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/file.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,UAAQ,iBAE7D;AAED;;;;;;GAMG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GAAG,MAAM,mBAKtB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAElE;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEtE;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEjE"}
@@ -0,0 +1,47 @@
1
+ import { promises as fs } from "node:fs";
2
+ import path from "node:path";
3
+ /**
4
+ * Create a directory
5
+ * @param dir Directory path
6
+ * @param recursive Create parent directories if they don't exist
7
+ */
8
+ export async function createDir(dir, recursive = false) {
9
+ await fs.mkdir(dir, { recursive });
10
+ }
11
+ /**
12
+ * Write a file
13
+ * @param dir Directory path
14
+ * @param filename Filename
15
+ * @param data Data to write
16
+ * @returns Path to the file
17
+ */
18
+ export async function writeFile(dir, filename, data) {
19
+ const filePath = path.join(dir, filename);
20
+ await fs.writeFile(filePath, data);
21
+ return filePath;
22
+ }
23
+ /**
24
+ * Read a JSON file and return its content
25
+ * @param filePath Path to the JSON file
26
+ * @returns Content of the JSON file
27
+ */
28
+ export async function readJsonFile(filePath) {
29
+ return JSON.parse(await fs.readFile(filePath, "utf8"));
30
+ }
31
+ /**
32
+ * Read a file and return its content
33
+ * @param filePath Path to the file
34
+ * @returns Content of the file
35
+ */
36
+ export async function readFileBuffer(filePath) {
37
+ return await fs.readFile(filePath);
38
+ }
39
+ /**
40
+ * Get the filename without the extension
41
+ * @param filePath Path to the file
42
+ * @returns Filename without the extension
43
+ */
44
+ export function fileNameWithoutExtension(filePath) {
45
+ return path.basename(filePath, path.extname(filePath));
46
+ }
47
+ //# sourceMappingURL=file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW,EAAE,SAAS,GAAG,KAAK;IAC5D,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,GAAW,EACX,QAAgB,EAChB,IAAqB;IAErB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC1C,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACnC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAI,QAAgB;IACpD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,QAAgB;IACvD,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AACzD,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { type FragmentationConfig, type FragmentationResult } from "@pixzle/core";
2
+ export declare class ImageFragmenter {
3
+ private config;
4
+ constructor(config: FragmentationConfig);
5
+ private _initializeConfig;
6
+ fragmentImages(paths: string[]): Promise<FragmentationResult>;
7
+ private _createImages;
8
+ private _createManifest;
9
+ private _prepareData;
10
+ private _processImages;
11
+ private _processImage;
12
+ private _createImage;
13
+ }
14
+ //# sourceMappingURL=fragmenter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fragmenter.d.ts","sourceRoot":"","sources":["../../src/fragmenter.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EAQzB,MAAM,cAAc,CAAC;AAOtB,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAgC;gBAElC,MAAM,EAAE,mBAAmB;IAIvC,OAAO,CAAC,iBAAiB;IAenB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC;YA6BrD,aAAa;IAc3B,OAAO,CAAC,eAAe;YAaT,YAAY;YAyBZ,cAAc;YAcd,aAAa;YAuBb,YAAY;CAW3B"}
@@ -0,0 +1,91 @@
1
+ import { DEFAULT_FRAGMENTATION_CONFIG, calculateBlockCountsForCrossImages, calculateBlockCountsPerImage, calculateBlockRange, encodeFileName, validateFileNames, } from "@pixzle/core";
2
+ import { SeededRandom, shuffle } from "@tuki0918/seeded-shuffle";
3
+ import { blocksPerImage, blocksToPngImage, imageFileToBlocks } from "./block";
4
+ import { VERSION } from "./constants";
5
+ import { fileNameWithoutExtension, readFileBuffer } from "./file";
6
+ import { generateManifestId } from "./utils";
7
+ export class ImageFragmenter {
8
+ config;
9
+ constructor(config) {
10
+ this.config = this._initializeConfig(config);
11
+ }
12
+ _initializeConfig(config) {
13
+ return {
14
+ blockSize: config.blockSize ?? DEFAULT_FRAGMENTATION_CONFIG.BLOCK_SIZE,
15
+ prefix: config.prefix ?? DEFAULT_FRAGMENTATION_CONFIG.PREFIX,
16
+ seed: config.seed || SeededRandom.generateSeed(),
17
+ preserveName: config.preserveName ?? DEFAULT_FRAGMENTATION_CONFIG.PRESERVE_NAME,
18
+ crossImageShuffle: config.crossImageShuffle ??
19
+ DEFAULT_FRAGMENTATION_CONFIG.CROSS_IMAGE_SHUFFLE,
20
+ };
21
+ }
22
+ async fragmentImages(paths) {
23
+ const { manifest, blocks, blockCountsForCrossImages, blockCountsPerImage } = await this._prepareData(paths);
24
+ const shuffled = this.config.crossImageShuffle
25
+ ? shuffle(blocks, manifest.config.seed)
26
+ : blocksPerImage(blocks, blockCountsPerImage, manifest.config.seed, shuffle);
27
+ const blockCounts = this.config.crossImageShuffle
28
+ ? blockCountsForCrossImages
29
+ : blockCountsPerImage;
30
+ const fragmentedImages = await this._createImages(shuffled, blockCounts, manifest);
31
+ return {
32
+ manifest,
33
+ fragmentedImages,
34
+ };
35
+ }
36
+ async _createImages(blocks, blockCounts, manifest) {
37
+ return await Promise.all(manifest.images.map(async (_, index) => {
38
+ const { start, end } = calculateBlockRange(blockCounts, index);
39
+ const imageBlocks = blocks.slice(start, end);
40
+ return await this._createImage(imageBlocks, manifest.config.blockSize);
41
+ }));
42
+ }
43
+ _createManifest(manifestId, imageInfos) {
44
+ return {
45
+ id: manifestId,
46
+ version: VERSION,
47
+ timestamp: new Date().toISOString(),
48
+ config: this.config,
49
+ images: imageInfos,
50
+ };
51
+ }
52
+ async _prepareData(paths) {
53
+ const manifestId = generateManifestId();
54
+ const { imageInfos, blocks } = await this._processImages(paths);
55
+ validateFileNames(imageInfos, this.config.preserveName);
56
+ const manifest = this._createManifest(manifestId, imageInfos);
57
+ const blockCountsForCrossImages = calculateBlockCountsForCrossImages(blocks.length, paths.length);
58
+ // Calculate actual block counts per image for per-image shuffle
59
+ const blockCountsPerImage = calculateBlockCountsPerImage(imageInfos);
60
+ return { manifest, blocks, blockCountsForCrossImages, blockCountsPerImage };
61
+ }
62
+ async _processImages(paths) {
63
+ const results = await Promise.all(paths.map((path) => this._processImage(path)));
64
+ const imageInfos = results.map((r) => r.imageInfo);
65
+ const blocks = results.flatMap((r) => r.blocks);
66
+ return { imageInfos, blocks };
67
+ }
68
+ async _processImage(path) {
69
+ const buffer = await readFileBuffer(path);
70
+ const { blocks, width, height, blockCountX, blockCountY } = await imageFileToBlocks(buffer, this.config.blockSize);
71
+ const imageInfo = {
72
+ w: width,
73
+ h: height,
74
+ c: 4, // Always use 4 channels (RGBA) for generated PNG
75
+ x: blockCountX,
76
+ y: blockCountY,
77
+ name: this.config.preserveName
78
+ ? encodeFileName(fileNameWithoutExtension(path))
79
+ : undefined,
80
+ };
81
+ return { imageInfo, blocks };
82
+ }
83
+ async _createImage(blocks, blockSize) {
84
+ const blockCount = blocks.length;
85
+ const blocksPerRow = Math.ceil(Math.sqrt(blockCount));
86
+ const imageWidth = blocksPerRow * blockSize;
87
+ const imageHeight = Math.ceil(blockCount / blocksPerRow) * blockSize;
88
+ return await blocksToPngImage(blocks, imageWidth, imageHeight, blockSize);
89
+ }
90
+ }
91
+ //# sourceMappingURL=fragmenter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fragmenter.js","sourceRoot":"","sources":["../../src/fragmenter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type FragmentationConfig, type ManifestData, type RestoreOptions, type ShuffleOptions } from "@pixzle/core";
2
+ import { ImageFragmenter } from "./fragmenter";
3
+ import { ImageRestorer } from "./restorer";
4
+ export { ImageFragmenter, ImageRestorer, type FragmentationConfig, type ManifestData, };
5
+ declare function shuffle(options: ShuffleOptions): Promise<void>;
6
+ declare function restore(options: RestoreOptions): Promise<void>;
7
+ declare const pixzle: {
8
+ shuffle: typeof shuffle;
9
+ restore: typeof restore;
10
+ };
11
+ export default pixzle;
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,mBAAmB,EAExB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,cAAc,EAKpB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EACL,eAAe,EACf,aAAa,EACb,KAAK,mBAAmB,EACxB,KAAK,YAAY,GAClB,CAAC;AAEF,iBAAe,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB7D;AAED,iBAAe,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB7D;AAED,QAAA,MAAM,MAAM;;;CAGX,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { MANIFEST_FILE_NAME, generateFragmentFileName, generateRestoredFileName, generateRestoredOriginalFileName, validateFragmentImageCount, } from "@pixzle/core";
2
+ import { createDir, readJsonFile, writeFile } from "./file";
3
+ import { ImageFragmenter } from "./fragmenter";
4
+ import { ImageRestorer } from "./restorer";
5
+ export { ImageFragmenter, ImageRestorer, };
6
+ async function shuffle(options) {
7
+ const { imagePaths, config, outputDir } = validateShuffleOptions(options);
8
+ const fragmenter = new ImageFragmenter(config ?? {});
9
+ const { manifest, fragmentedImages } = await fragmenter.fragmentImages(imagePaths);
10
+ await createDir(outputDir, true);
11
+ await writeFile(outputDir, MANIFEST_FILE_NAME, JSON.stringify(manifest, null, 2));
12
+ await Promise.all(fragmentedImages.map((img, i) => {
13
+ const filename = generateFragmentFileName(manifest, i);
14
+ return writeFile(outputDir, filename, img);
15
+ }));
16
+ }
17
+ async function restore(options) {
18
+ const { imagePaths, manifestPath, outputDir } = validateRestoreOptions(options);
19
+ const manifest = await readJsonFile(manifestPath);
20
+ validateFragmentImageCount(imagePaths, manifest);
21
+ const restorer = new ImageRestorer();
22
+ const restoredImages = await restorer.restoreImages(imagePaths, manifest);
23
+ await createDir(outputDir, true);
24
+ const imageInfos = manifest.images;
25
+ await Promise.all(restoredImages.map((img, i) => {
26
+ const filename = generateRestoredOriginalFileName(imageInfos[i]) ??
27
+ generateRestoredFileName(manifest, i);
28
+ return writeFile(outputDir, filename, img);
29
+ }));
30
+ }
31
+ const pixzle = {
32
+ shuffle,
33
+ restore,
34
+ };
35
+ export default pixzle;
36
+ function validateCommonOptions(options, context) {
37
+ if (!options)
38
+ throw new Error(`[${context}] Options object is required.`);
39
+ const { imagePaths, outputDir } = options;
40
+ if (!imagePaths || !Array.isArray(imagePaths) || imagePaths.length === 0)
41
+ throw new Error(`[${context}] imagePaths must be a non-empty array.`);
42
+ if (!outputDir || typeof outputDir !== "string")
43
+ throw new Error(`[${context}] outputDir is required and must be a string.`);
44
+ return options;
45
+ }
46
+ function validateShuffleOptions(options) {
47
+ return validateCommonOptions(options, "shuffle");
48
+ }
49
+ function validateRestoreOptions(options) {
50
+ const { manifestPath } = options;
51
+ if (!manifestPath || typeof manifestPath !== "string")
52
+ throw new Error("[restore] manifestPath is required and must be a string.");
53
+ return validateCommonOptions(options, "restore");
54
+ }
55
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type ManifestData } from "@pixzle/core";
2
+ export declare class ImageRestorer {
3
+ restoreImages(fragments: (string | Buffer)[], manifest: ManifestData): Promise<Buffer[]>;
4
+ private _reconstructImages;
5
+ private _prepareData;
6
+ private _readBlocksFromFragment;
7
+ private _readBlocks;
8
+ private _createImage;
9
+ }
10
+ //# sourceMappingURL=restorer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restorer.d.ts","sourceRoot":"","sources":["../../src/restorer.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EAKlB,MAAM,cAAc,CAAC;AAKtB,qBAAa,aAAa;IAClB,aAAa,CACjB,SAAS,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,EAC9B,QAAQ,EAAE,YAAY,GACrB,OAAO,CAAC,MAAM,EAAE,CAAC;YAkBN,kBAAkB;YAkBlB,YAAY;YA2BZ,uBAAuB;YAgBvB,WAAW;YAaX,YAAY;CAQ3B"}
@@ -0,0 +1,50 @@
1
+ import { calculateBlockCountsForCrossImages, calculateBlockCountsPerImage, calculateBlockRange, calculateTotalBlocks, } from "@pixzle/core";
2
+ import { unshuffle } from "@tuki0918/seeded-shuffle";
3
+ import { blocksPerImage, blocksToPngImage, imageFileToBlocks } from "./block";
4
+ import { readFileBuffer } from "./file";
5
+ export class ImageRestorer {
6
+ async restoreImages(fragments, manifest) {
7
+ const { blocks, blockCountsPerImage } = await this._prepareData(fragments, manifest);
8
+ const restored = manifest.config.crossImageShuffle
9
+ ? unshuffle(blocks, manifest.config.seed)
10
+ : blocksPerImage(blocks, blockCountsPerImage, manifest.config.seed, unshuffle);
11
+ return await this._reconstructImages(restored, manifest);
12
+ }
13
+ async _reconstructImages(blocks, manifest) {
14
+ const blockCountsPerImage = calculateBlockCountsPerImage(manifest.images);
15
+ return await Promise.all(manifest.images.map(async (imageInfo, index) => {
16
+ const { start, end } = calculateBlockRange(blockCountsPerImage, index);
17
+ const imageBlocks = blocks.slice(start, end);
18
+ return await this._createImage(imageBlocks, manifest.config.blockSize, imageInfo);
19
+ }));
20
+ }
21
+ async _prepareData(fragments, manifest) {
22
+ const totalBlocks = calculateTotalBlocks(manifest.images);
23
+ const blockCountsForCrossImages = calculateBlockCountsForCrossImages(totalBlocks, fragments.length);
24
+ // Calculate actual block counts per image for per-image unshuffle
25
+ const blockCountsPerImage = calculateBlockCountsPerImage(manifest.images);
26
+ // Use blockCountsPerImage when crossImageShuffle is false
27
+ const blockCounts = manifest.config.crossImageShuffle
28
+ ? blockCountsForCrossImages
29
+ : blockCountsPerImage;
30
+ const blocks = await this._readBlocks(fragments, manifest, blockCounts);
31
+ return { blocks, blockCountsPerImage };
32
+ }
33
+ // Extract an array of blocks (Buffer) from a fragment image
34
+ async _readBlocksFromFragment(fragment, manifest, expectedCount) {
35
+ const buffer = Buffer.isBuffer(fragment)
36
+ ? fragment
37
+ : await readFileBuffer(fragment);
38
+ const { blocks } = await imageFileToBlocks(buffer, manifest.config.blockSize);
39
+ return blocks.slice(0, expectedCount);
40
+ }
41
+ async _readBlocks(fragments, manifest, blockCounts) {
42
+ const blockGroups = await Promise.all(fragments.map((fragment, i) => this._readBlocksFromFragment(fragment, manifest, blockCounts[i])));
43
+ return blockGroups.flat();
44
+ }
45
+ async _createImage(blocks, blockSize, imageInfo) {
46
+ const { w, h } = imageInfo;
47
+ return await blocksToPngImage(blocks, w, h, blockSize);
48
+ }
49
+ }
50
+ //# sourceMappingURL=restorer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restorer.js","sourceRoot":"","sources":["../../src/restorer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Generate a unique manifest ID
3
+ * @returns A UUID string
4
+ */
5
+ export declare function generateManifestId(): string;
6
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
@@ -0,0 +1,9 @@
1
+ import crypto from "node:crypto";
2
+ /**
3
+ * Generate a unique manifest ID
4
+ * @returns A UUID string
5
+ */
6
+ export function generateManifestId() {
7
+ return crypto.randomUUID();
8
+ }
9
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC;AAC7B,CAAC"}
package/dist/file.cjs ADDED
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createDir = createDir;
7
+ exports.writeFile = writeFile;
8
+ exports.readJsonFile = readJsonFile;
9
+ exports.readFileBuffer = readFileBuffer;
10
+ exports.fileNameWithoutExtension = fileNameWithoutExtension;
11
+ const node_fs_1 = require("node:fs");
12
+ const node_path_1 = __importDefault(require("node:path"));
13
+ /**
14
+ * Create a directory
15
+ * @param dir Directory path
16
+ * @param recursive Create parent directories if they don't exist
17
+ */
18
+ async function createDir(dir, recursive = false) {
19
+ await node_fs_1.promises.mkdir(dir, { recursive });
20
+ }
21
+ /**
22
+ * Write a file
23
+ * @param dir Directory path
24
+ * @param filename Filename
25
+ * @param data Data to write
26
+ * @returns Path to the file
27
+ */
28
+ async function writeFile(dir, filename, data) {
29
+ const filePath = node_path_1.default.join(dir, filename);
30
+ await node_fs_1.promises.writeFile(filePath, data);
31
+ return filePath;
32
+ }
33
+ /**
34
+ * Read a JSON file and return its content
35
+ * @param filePath Path to the JSON file
36
+ * @returns Content of the JSON file
37
+ */
38
+ async function readJsonFile(filePath) {
39
+ return JSON.parse(await node_fs_1.promises.readFile(filePath, "utf8"));
40
+ }
41
+ /**
42
+ * Read a file and return its content
43
+ * @param filePath Path to the file
44
+ * @returns Content of the file
45
+ */
46
+ async function readFileBuffer(filePath) {
47
+ return await node_fs_1.promises.readFile(filePath);
48
+ }
49
+ /**
50
+ * Get the filename without the extension
51
+ * @param filePath Path to the file
52
+ * @returns Filename without the extension
53
+ */
54
+ function fileNameWithoutExtension(filePath) {
55
+ return node_path_1.default.basename(filePath, node_path_1.default.extname(filePath));
56
+ }
57
+ //# sourceMappingURL=file.js.map
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Create a directory
3
+ * @param dir Directory path
4
+ * @param recursive Create parent directories if they don't exist
5
+ */
6
+ export declare function createDir(dir: string, recursive?: boolean): Promise<void>;
7
+ /**
8
+ * Write a file
9
+ * @param dir Directory path
10
+ * @param filename Filename
11
+ * @param data Data to write
12
+ * @returns Path to the file
13
+ */
14
+ export declare function writeFile(dir: string, filename: string, data: string | Buffer): Promise<string>;
15
+ /**
16
+ * Read a JSON file and return its content
17
+ * @param filePath Path to the JSON file
18
+ * @returns Content of the JSON file
19
+ */
20
+ export declare function readJsonFile<T>(filePath: string): Promise<T>;
21
+ /**
22
+ * Read a file and return its content
23
+ * @param filePath Path to the file
24
+ * @returns Content of the file
25
+ */
26
+ export declare function readFileBuffer(filePath: string): Promise<Buffer>;
27
+ /**
28
+ * Get the filename without the extension
29
+ * @param filePath Path to the file
30
+ * @returns Filename without the extension
31
+ */
32
+ export declare function fileNameWithoutExtension(filePath: string): string;
33
+ //# sourceMappingURL=file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../src/file.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,UAAQ,iBAE7D;AAED;;;;;;GAMG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GAAG,MAAM,mBAKtB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAElE;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEtE;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEjE"}
package/dist/file.js CHANGED
@@ -1,12 +1,22 @@
1
- import { promises as fs } from "node:fs";
2
- import path from "node:path";
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createDir = createDir;
7
+ exports.writeFile = writeFile;
8
+ exports.readJsonFile = readJsonFile;
9
+ exports.readFileBuffer = readFileBuffer;
10
+ exports.fileNameWithoutExtension = fileNameWithoutExtension;
11
+ const node_fs_1 = require("node:fs");
12
+ const node_path_1 = __importDefault(require("node:path"));
3
13
  /**
4
14
  * Create a directory
5
15
  * @param dir Directory path
6
16
  * @param recursive Create parent directories if they don't exist
7
17
  */
8
- export async function createDir(dir, recursive = false) {
9
- await fs.mkdir(dir, { recursive });
18
+ async function createDir(dir, recursive = false) {
19
+ await node_fs_1.promises.mkdir(dir, { recursive });
10
20
  }
11
21
  /**
12
22
  * Write a file
@@ -15,9 +25,9 @@ export async function createDir(dir, recursive = false) {
15
25
  * @param data Data to write
16
26
  * @returns Path to the file
17
27
  */
18
- export async function writeFile(dir, filename, data) {
19
- const filePath = path.join(dir, filename);
20
- await fs.writeFile(filePath, data);
28
+ async function writeFile(dir, filename, data) {
29
+ const filePath = node_path_1.default.join(dir, filename);
30
+ await node_fs_1.promises.writeFile(filePath, data);
21
31
  return filePath;
22
32
  }
23
33
  /**
@@ -25,23 +35,23 @@ export async function writeFile(dir, filename, data) {
25
35
  * @param filePath Path to the JSON file
26
36
  * @returns Content of the JSON file
27
37
  */
28
- export async function readJsonFile(filePath) {
29
- return JSON.parse(await fs.readFile(filePath, "utf8"));
38
+ async function readJsonFile(filePath) {
39
+ return JSON.parse(await node_fs_1.promises.readFile(filePath, "utf8"));
30
40
  }
31
41
  /**
32
42
  * Read a file and return its content
33
43
  * @param filePath Path to the file
34
44
  * @returns Content of the file
35
45
  */
36
- export async function readFileBuffer(filePath) {
37
- return await fs.readFile(filePath);
46
+ async function readFileBuffer(filePath) {
47
+ return await node_fs_1.promises.readFile(filePath);
38
48
  }
39
49
  /**
40
50
  * Get the filename without the extension
41
51
  * @param filePath Path to the file
42
52
  * @returns Filename without the extension
43
53
  */
44
- export function fileNameWithoutExtension(filePath) {
45
- return path.basename(filePath, path.extname(filePath));
54
+ function fileNameWithoutExtension(filePath) {
55
+ return node_path_1.default.basename(filePath, node_path_1.default.extname(filePath));
46
56
  }
47
57
  //# sourceMappingURL=file.js.map
package/dist/file.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"file.js","sourceRoot":"","sources":["../src/file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW,EAAE,SAAS,GAAG,KAAK;IAC5D,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,GAAW,EACX,QAAgB,EAChB,IAAqB;IAErB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC1C,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACnC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAI,QAAgB;IACpD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,QAAgB;IACvD,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AACzD,CAAC"}
1
+ {"version":3,"file":"file.js","sourceRoot":"","sources":["../src/file.ts"],"names":[],"mappings":";;;;;AAQA,8BAEC;AASD,8BAQC;AAOD,oCAEC;AAOD,wCAEC;AAOD,4DAEC;AAtDD,qCAAyC;AACzC,0DAA6B;AAE7B;;;;GAIG;AACI,KAAK,UAAU,SAAS,CAAC,GAAW,EAAE,SAAS,GAAG,KAAK;IAC5D,MAAM,kBAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,SAAS,CAC7B,GAAW,EACX,QAAgB,EAChB,IAAqB;IAErB,MAAM,QAAQ,GAAG,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC1C,MAAM,kBAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACnC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,YAAY,CAAI,QAAgB;IACpD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,kBAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,OAAO,MAAM,kBAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,SAAgB,wBAAwB,CAAC,QAAgB;IACvD,OAAO,mBAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,mBAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AACzD,CAAC"}