@chr33s/pdf-common 5.0.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 (77) hide show
  1. package/dist/base64.d.ts +7 -0
  2. package/dist/base64.js +24 -0
  3. package/dist/base64.js.map +1 -0
  4. package/dist/brotli.d.ts +9 -0
  5. package/dist/brotli.js +2015 -0
  6. package/dist/brotli.js.map +1 -0
  7. package/dist/compression.d.ts +3 -0
  8. package/dist/compression.js +31 -0
  9. package/dist/compression.js.map +1 -0
  10. package/dist/crypto/aes.d.ts +17 -0
  11. package/dist/crypto/aes.js +60 -0
  12. package/dist/crypto/aes.js.map +1 -0
  13. package/dist/crypto/index.d.ts +7 -0
  14. package/dist/crypto/index.js +8 -0
  15. package/dist/crypto/index.js.map +1 -0
  16. package/dist/crypto/md5.d.ts +3 -0
  17. package/dist/crypto/md5.js +9 -0
  18. package/dist/crypto/md5.js.map +1 -0
  19. package/dist/crypto/mode.d.ts +5 -0
  20. package/dist/crypto/mode.js +7 -0
  21. package/dist/crypto/mode.js.map +1 -0
  22. package/dist/crypto/padding.d.ts +7 -0
  23. package/dist/crypto/padding.js +27 -0
  24. package/dist/crypto/padding.js.map +1 -0
  25. package/dist/crypto/rc4.d.ts +10 -0
  26. package/dist/crypto/rc4.js +48 -0
  27. package/dist/crypto/rc4.js.map +1 -0
  28. package/dist/crypto/sha256.d.ts +3 -0
  29. package/dist/crypto/sha256.js +9 -0
  30. package/dist/crypto/sha256.js.map +1 -0
  31. package/dist/crypto/word-array.d.ts +28 -0
  32. package/dist/crypto/word-array.js +116 -0
  33. package/dist/crypto/word-array.js.map +1 -0
  34. package/dist/index.d.ts +4 -0
  35. package/dist/index.js +5 -0
  36. package/dist/index.js.map +1 -0
  37. package/package.json +34 -0
  38. package/src/base64.ts +34 -0
  39. package/src/brotli.ts +2158 -0
  40. package/src/compression.ts +35 -0
  41. package/src/crypto/aes.ts +93 -0
  42. package/src/crypto/index.ts +7 -0
  43. package/src/crypto/md5.ts +10 -0
  44. package/src/crypto/mode.ts +11 -0
  45. package/src/crypto/padding.ts +36 -0
  46. package/src/crypto/rc4.ts +65 -0
  47. package/src/crypto/sha256.ts +10 -0
  48. package/src/crypto/word-array.ts +147 -0
  49. package/src/index.ts +4 -0
  50. package/test/base64.test.ts +173 -0
  51. package/test/brotli.test.data/0000000000000000.empty.br +1 -0
  52. package/test/brotli.test.data/126d9a84a3d1b3ad.xyzzy.br +2 -0
  53. package/test/brotli.test.data/1f39ef98802627d5.bref65536.br +0 -0
  54. package/test/brotli.test.data/24b2c7600b8207e2.random.br +0 -0
  55. package/test/brotli.test.data/5b5eb8c2e54aa1c4.fox.br +1 -0
  56. package/test/brotli.test.data/5ea84b0ab2a9d2f3.ascii.br +0 -0
  57. package/test/brotli.test.data/62652dac985a31f1.monkey.br +0 -0
  58. package/test/brotli.test.data/68333cc8433f3ab8.16k_minus_one.br +0 -0
  59. package/test/brotli.test.data/7da01857468c3de8.buffer_sized_chunks.br +0 -0
  60. package/test/brotli.test.data/89988757bded53ae.x10y10.br +0 -0
  61. package/test/brotli.test.data/940493692ce62466.E.coli.br +0 -0
  62. package/test/brotli.test.data/c3f720395238182c.world192.br +0 -0
  63. package/test/brotli.test.data/c5a4246584d690a7.16k_plus_one.br +0 -0
  64. package/test/brotli.test.data/c895e0c1b11448fa.ukkonooa.br +0 -0
  65. package/test/brotli.test.data/d238c71341928567.allbytevalues_twice.br +0 -0
  66. package/test/brotli.test.data/d38da8261aedc293.bible.br +0 -0
  67. package/test/brotli.test.data/d6a9c5da7ba30f21.allbytevalues_16k.br +0 -0
  68. package/test/brotli.test.data/f121ac88218962d7.x.br +0 -0
  69. package/test/brotli.test.data/f6083a8a3754518c.x64.br +0 -0
  70. package/test/brotli.test.file +201 -0
  71. package/test/brotli.test.file.br +0 -0
  72. package/test/brotli.test.ts +2197 -0
  73. package/test/compression.test.ts +93 -0
  74. package/test/crypto.test.ts +157 -0
  75. package/tsconfig.json +10 -0
  76. package/tsconfig.typecheck.json +14 -0
  77. package/vitest.config.ts +8 -0
@@ -0,0 +1,116 @@
1
+ import { randomBytes } from "node:crypto";
2
+ export class WordArray {
3
+ words;
4
+ sigBytes;
5
+ constructor(words, sigBytes) {
6
+ this.words = words || [];
7
+ this.sigBytes = sigBytes !== undefined ? sigBytes : this.words.length * 4;
8
+ }
9
+ static create(words, sigBytes) {
10
+ return new WordArray(words, sigBytes);
11
+ }
12
+ /**
13
+ * Creates a word array filled with random bytes.
14
+ */
15
+ static random(nBytes) {
16
+ const bytes = randomBytes(nBytes);
17
+ return WordArray.fromUint8Array(bytes);
18
+ }
19
+ /**
20
+ * Create WordArray from Uint8Array
21
+ */
22
+ static fromUint8Array(bytes) {
23
+ const words = [];
24
+ for (let i = 0; i < bytes.length; i += 4) {
25
+ words.push(((bytes[i] || 0) << 24) |
26
+ ((bytes[i + 1] || 0) << 16) |
27
+ ((bytes[i + 2] || 0) << 8) |
28
+ (bytes[i + 3] || 0));
29
+ }
30
+ return new WordArray(words, bytes.length);
31
+ }
32
+ /**
33
+ * Convert WordArray to Uint8Array
34
+ */
35
+ toUint8Array() {
36
+ const bytes = new Uint8Array(this.sigBytes);
37
+ for (let i = 0; i < this.sigBytes; i++) {
38
+ bytes[i] = (this.words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
39
+ }
40
+ return bytes;
41
+ }
42
+ toString(encoder) {
43
+ return (encoder || Hex).stringify(this);
44
+ }
45
+ concat(wordArray) {
46
+ const thisWords = this.words;
47
+ const thatWords = wordArray.words;
48
+ const thisSigBytes = this.sigBytes;
49
+ const thatSigBytes = wordArray.sigBytes;
50
+ this.clamp();
51
+ if (thisSigBytes % 4) {
52
+ for (let i = 0; i < thatSigBytes; i++) {
53
+ const thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
54
+ thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);
55
+ }
56
+ }
57
+ else {
58
+ for (let j = 0; j < thatSigBytes; j += 4) {
59
+ thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2];
60
+ }
61
+ }
62
+ this.sigBytes += thatSigBytes;
63
+ return this;
64
+ }
65
+ clamp() {
66
+ const words = this.words;
67
+ const sigBytes = this.sigBytes;
68
+ words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);
69
+ words.length = Math.ceil(sigBytes / 4);
70
+ }
71
+ clone() {
72
+ return new WordArray(this.words.slice(0), this.sigBytes);
73
+ }
74
+ }
75
+ export const Hex = {
76
+ stringify(wordArray) {
77
+ const words = wordArray.words;
78
+ const sigBytes = wordArray.sigBytes;
79
+ const hexChars = [];
80
+ for (let i = 0; i < sigBytes; i++) {
81
+ const bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
82
+ hexChars.push((bite >>> 4).toString(16));
83
+ hexChars.push((bite & 0x0f).toString(16));
84
+ }
85
+ return hexChars.join("");
86
+ },
87
+ parse(hexStr) {
88
+ const hexStrLength = hexStr.length;
89
+ const words = [];
90
+ for (let i = 0; i < hexStrLength; i += 2) {
91
+ words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);
92
+ }
93
+ return new WordArray(words, hexStrLength / 2);
94
+ },
95
+ };
96
+ export const Latin1 = {
97
+ stringify(wordArray) {
98
+ const words = wordArray.words;
99
+ const sigBytes = wordArray.sigBytes;
100
+ const chars = [];
101
+ for (let i = 0; i < sigBytes; i++) {
102
+ const bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
103
+ chars.push(String.fromCharCode(bite));
104
+ }
105
+ return chars.join("");
106
+ },
107
+ parse(latin1Str) {
108
+ const length = latin1Str.length;
109
+ const words = [];
110
+ for (let i = 0; i < length; i++) {
111
+ words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);
112
+ }
113
+ return new WordArray(words, length);
114
+ },
115
+ };
116
+ //# sourceMappingURL=word-array.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"word-array.js","sourceRoot":"","sources":["../../src/crypto/word-array.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from "./base64.js";
2
+ export * as brotli from "./brotli.js";
3
+ export * from "./compression.js";
4
+ export * from "./crypto/index.js";
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export * from "./base64.js";
2
+ export * as brotli from "./brotli.js";
3
+ export * from "./compression.js";
4
+ export * from "./crypto/index.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@chr33s/pdf-common",
3
+ "version": "5.0.0",
4
+ "description": "Common pdf utilities and types",
5
+ "type": "module",
6
+ "sideEffects": false,
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "default": "./dist/index.js"
11
+ }
12
+ },
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "clean": "rm -rf dist",
16
+ "typecheck": "tsc --project tsconfig.typecheck.json",
17
+ "test": "vitest run"
18
+ },
19
+ "author": "chr33s",
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "https://github.com/chr33s/pdf.git"
23
+ },
24
+ "bugs": {
25
+ "url": "https://github.com/chr33s/pdf/issues"
26
+ },
27
+ "license": "MIT",
28
+ "homepage": "https://github.com/chr33s/pdf",
29
+ "devDependencies": {
30
+ "@types/node": "24.10.1",
31
+ "typescript": "5.9.3",
32
+ "vitest": "4.0.15"
33
+ }
34
+ }
package/src/base64.ts ADDED
@@ -0,0 +1,34 @@
1
+ import { Buffer } from "node:buffer";
2
+
3
+ export const encodeToBase64 = (bytes: Uint8Array): string => Buffer.from(bytes).toString("base64");
4
+
5
+ export const decodeFromBase64 = (base64: string): Uint8Array =>
6
+ new Uint8Array(Buffer.from(base64, "base64"));
7
+
8
+ // This regex is designed to be as flexible as possible. It will parse certain invalid data URIs.
9
+ const DATA_URI_PREFIX_REGEX = /^(data)?:?([\w/+]+)?;?(charset=[\w-]+|base64)?.*,/i;
10
+
11
+ export const decodeFromBase64DataUri = (dataUri: string): Uint8Array => {
12
+ const trimmedUri = dataUri.trim();
13
+
14
+ const prefix = trimmedUri.substring(0, 100);
15
+ const res = prefix.match(DATA_URI_PREFIX_REGEX);
16
+
17
+ // Assume it's not a data URI - just a plain base64 string
18
+ if (!res) return decodeFromBase64(trimmedUri);
19
+
20
+ // Remove the data URI prefix and parse the remainder as a base64 string
21
+ const [fullMatch] = res;
22
+ const data = trimmedUri.substring(fullMatch.length);
23
+
24
+ return decodeFromBase64(data);
25
+ };
26
+
27
+ const encode = (arrayBuffer: ArrayBuffer): string => encodeToBase64(new Uint8Array(arrayBuffer));
28
+
29
+ const decode = (base64: string): ArrayBuffer => {
30
+ const bytes = decodeFromBase64(base64);
31
+ return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer;
32
+ };
33
+
34
+ export const base64 = { encode, decode };