rar-stream 5.3.2 → 5.5.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/README.md CHANGED
@@ -125,6 +125,41 @@ interface FileMedia {
125
125
  | `streamToBuffer(stream)` | Convert Readable to Buffer |
126
126
  | `createFileMedia(source)` | Wrap any `{ createReadStream }` as FileMedia |
127
127
 
128
+ ### Rust API
129
+
130
+ #### In-Memory (no features required)
131
+
132
+ ```rust
133
+ use rar_stream::{MemoryArchive, is_rar_archive, detect_version};
134
+
135
+ // Check format
136
+ let data = std::fs::read("archive.rar")?;
137
+ assert!(is_rar_archive(&data));
138
+
139
+ // Parse and extract
140
+ let archive = MemoryArchive::new(&data)?;
141
+ let info = archive.archive_info();
142
+ println!("Format: {:?}, solid: {}", info.version, info.is_solid);
143
+
144
+ for entry in archive.entries() {
145
+ println!("{}: {} bytes", entry.name, entry.unpacked_size);
146
+ }
147
+ let content = archive.extract(0)?;
148
+ let readme = archive.extract_by_name("README.md")?;
149
+ ```
150
+
151
+ #### Async (requires `async` feature)
152
+
153
+ ```rust
154
+ use rar_stream::{RarFilesPackage, ParseOptions, LocalFileMedia, FileMedia};
155
+ use std::sync::Arc;
156
+
157
+ let file: Arc<dyn FileMedia> = Arc::new(LocalFileMedia::new("archive.rar")?);
158
+ let package = RarFilesPackage::new(vec![file]);
159
+ let files = package.parse(ParseOptions::default()).await?;
160
+ let content = files[0].read_to_end().await?;
161
+ ```
162
+
128
163
  ## Feature Flags
129
164
 
130
165
  ### Rust (Cargo)
package/browser.d.ts CHANGED
@@ -16,7 +16,14 @@ export function isRarArchive(data: Uint8Array): boolean;
16
16
  /** Get RAR version (15 for RAR4, 50 for RAR5, 0 if not RAR) */
17
17
  export function getRarVersion(data: Uint8Array): number;
18
18
 
19
- /** Parse RAR header information (returns first file's header) */
19
+ /** Extract the first file from a RAR archive buffer */
20
+ export function extractFile(archive: Uint8Array): {
21
+ name: string;
22
+ data: Uint8Array;
23
+ length: number;
24
+ };
25
+
26
+ /** Parse RAR4 header information (returns first file's header) */
20
27
  export function parseRarHeader(data: Uint8Array): {
21
28
  name: string;
22
29
  packedSize: number;
@@ -26,7 +33,57 @@ export function parseRarHeader(data: Uint8Array): {
26
33
  dataOffset: number;
27
34
  };
28
35
 
29
- /** RAR decompressor class */
36
+ /** Parse RAR5 header information (returns first file's header) */
37
+ export function parseRar5Header(data: Uint8Array): {
38
+ name: string;
39
+ packedSize: number;
40
+ unpackedSize: number;
41
+ method: number;
42
+ dictSizeLog: number;
43
+ isCompressed: boolean;
44
+ isDirectory: boolean;
45
+ dataOffset: number;
46
+ };
47
+
48
+ /** Parse all RAR4 file headers from a buffer */
49
+ export function parseRarHeaders(data: Uint8Array): Array<{
50
+ name: string;
51
+ packedSize: number;
52
+ unpackedSize: number;
53
+ method: number;
54
+ isCompressed: boolean;
55
+ dataOffset: number;
56
+ }>;
57
+
58
+ /** Parse all RAR5 file headers from a buffer */
59
+ export function parseRar5Headers(data: Uint8Array): Array<{
60
+ name: string;
61
+ packedSize: number;
62
+ unpackedSize: number;
63
+ method: number;
64
+ dictSizeLog: number;
65
+ isCompressed: boolean;
66
+ isDirectory: boolean;
67
+ dataOffset: number;
68
+ }>;
69
+
70
+ /** High-level RAR archive reader */
71
+ export class RarFilesPackage {
72
+ constructor(data: Uint8Array);
73
+ free(): void;
74
+ [Symbol.dispose](): void;
75
+ readonly length: number;
76
+ parse(): Array<{
77
+ name: string;
78
+ length: number;
79
+ packedSize: number;
80
+ isDirectory: boolean;
81
+ }>;
82
+ extract(index: number): { name: string; data: Uint8Array; length: number };
83
+ extractAll(): Array<{ name: string; data: Uint8Array; length: number }>;
84
+ }
85
+
86
+ /** RAR4 decompressor */
30
87
  export class RarDecoder {
31
88
  constructor(unpacked_size: bigint);
32
89
  free(): void;
@@ -37,8 +94,33 @@ export class RarDecoder {
37
94
  reset(): void;
38
95
  }
39
96
 
97
+ /** RAR5 decompressor */
98
+ export class Rar5Decoder {
99
+ constructor(unpacked_size: bigint, dict_size_log: number, method: number, is_solid: boolean);
100
+ free(): void;
101
+ [Symbol.dispose](): void;
102
+ decompress(data: Uint8Array): Uint8Array;
103
+ reset(): void;
104
+ }
105
+
106
+ /** RAR5 AES-256 crypto helper */
107
+ export class Rar5Crypto {
108
+ constructor(password: string, salt: Uint8Array, lg2_count: number);
109
+ free(): void;
110
+ [Symbol.dispose](): void;
111
+ decrypt(iv: Uint8Array, data: Uint8Array): Uint8Array;
112
+ verify_password(check_value: Uint8Array): boolean;
113
+ }
114
+
40
115
  // Snake_case aliases for compatibility
41
116
  export { isRarArchive as is_rar_archive };
42
117
  export { getRarVersion as get_rar_version };
118
+ export { extractFile as extract_file };
43
119
  export { parseRarHeader as parse_rar_header };
120
+ export { parseRar5Header as parse_rar5_header };
121
+ export { parseRarHeaders as parse_rar_headers };
122
+ export { parseRar5Headers as parse_rar5_headers };
44
123
  export { RarDecoder as WasmRarDecoder };
124
+ export { Rar5Decoder as WasmRar5Decoder };
125
+ export { Rar5Crypto as WasmRar5Crypto };
126
+ export { RarFilesPackage as WasmRarArchive };
package/index.d.ts CHANGED
@@ -11,6 +11,7 @@ export interface ReadIntervalJs {
11
11
  /** Parse options for filtering results. */
12
12
  export interface ParseOptionsJs {
13
13
  maxFiles?: number
14
+ headerPrefetchSize?: number
14
15
  }
15
16
  /** Parsed file info from RAR header. */
16
17
  export interface RarFileInfo {
package/lib/index.mjs CHANGED
@@ -247,7 +247,7 @@ class JsInnerFile {
247
247
  if (start !== 0 || end !== this.length - 1) {
248
248
  throw new Error('Range reads not supported for compressed files. Use readToEnd() instead.');
249
249
  }
250
- // TODO: streaming decompression
250
+ // Streaming decompression not supported for custom FileMedia
251
251
  throw new Error('Streaming compressed files not yet supported for custom FileMedia.');
252
252
  }
253
253
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rar-stream",
3
- "version": "5.3.2",
3
+ "version": "5.5.0",
4
4
  "description": "RAR streaming library - Rust implementation with NAPI and WASM bindings",
5
5
  "main": "lib/index.mjs",
6
6
  "browser": "lib/browser.mjs",