Skip to content
This repository was archived by the owner on Dec 10, 2024. It is now read-only.

Commit a2d68e5

Browse files
committed
Refactored Directory to extend Map
1 parent 753dec8 commit a2d68e5

File tree

3 files changed

+26
-64
lines changed

3 files changed

+26
-64
lines changed

jest.config.json

-19
This file was deleted.

src/Directory.ts

+21-40
Original file line numberDiff line numberDiff line change
@@ -2,40 +2,40 @@ import { DirectoryRecord, ISODirectoryRecord, JolietDirectoryRecord } from './Di
22
import { FileFlags } from './constants.js';
33
import { CLEntry, REEntry } from './entries.js';
44

5-
export abstract class Directory<T extends DirectoryRecord> {
6-
protected _record: T;
7-
private _fileList: string[] = [];
8-
private _fileMap: { [name: string]: T } = {};
5+
export abstract class Directory<T extends DirectoryRecord> extends Map<string, T> {
6+
//public readonly files: string[] = [];
7+
//private fileMap = new Map<string, T>();
98

10-
public constructor(record: T, isoData: Uint8Array) {
11-
this._record = record;
9+
public constructor(
10+
protected record: T,
11+
isoData: Uint8Array
12+
) {
13+
super();
1214
let i = record.lba;
1315
let limit = i + record.dataLength;
1416
if (!(record.fileFlags & FileFlags.Directory)) {
1517
// Must have a CL entry.
16-
const cl = record.getSUEntries(isoData).filter(e => e instanceof CLEntry)[0] as CLEntry;
18+
const cl = record.getSUEntries(isoData).find(e => e instanceof CLEntry);
19+
if (!cl) {
20+
throw new ReferenceError('No CL entry');
21+
}
1722
i = cl.childDirectoryLba * 2048;
1823
limit = Infinity;
1924
}
2025

2126
while (i < limit) {
22-
const len = isoData[i];
27+
const length = isoData[i];
2328
// Zero-padding between sectors.
24-
// TODO: Could optimize this to seek to nearest-sector upon
25-
// seeing a 0.
26-
if (len === 0) {
29+
// Could optimize this to seek to nearest-sector upon seeing a 0.
30+
if (!length) {
2731
i++;
2832
continue;
2933
}
3034
const r = this._constructDirectoryRecord(isoData.slice(i));
3135
const fname = r.fileName(isoData);
3236
// Skip '.' and '..' entries.
33-
if (fname !== '\u0000' && fname !== '\u0001') {
34-
// Skip relocated entries.
35-
if (!r.hasRockRidge || r.getSUEntries(isoData).filter(e => e instanceof REEntry).length === 0) {
36-
this._fileMap[fname] = r;
37-
this._fileList.push(fname);
38-
}
37+
if (fname !== '\u0000' && fname !== '\u0001' && (!r.hasRockRidge || !r.getSUEntries(isoData).filter(e => e instanceof REEntry).length)) {
38+
this.set(fname, r);
3939
} else if (limit === Infinity) {
4040
// First entry contains needed data.
4141
limit = i + r.dataLength;
@@ -44,40 +44,21 @@ export abstract class Directory<T extends DirectoryRecord> {
4444
}
4545
}
4646

47-
/**
48-
* Get the record with the given name.
49-
* Returns undefined if not present.
50-
*/
51-
public getRecord(name: string): DirectoryRecord {
52-
return this._fileMap[name];
53-
}
54-
55-
public get fileList(): string[] {
56-
return this._fileList;
57-
}
58-
5947
public getDotEntry(isoData: Uint8Array): T {
60-
return this._constructDirectoryRecord(isoData.slice(this._record.lba));
48+
return this._constructDirectoryRecord(isoData.slice(this.record.lba));
6149
}
6250

6351
protected abstract _constructDirectoryRecord(data: Uint8Array): T;
6452
}
65-
export class ISODirectory extends Directory<ISODirectoryRecord> {
66-
public constructor(record: ISODirectoryRecord, isoData: Uint8Array) {
67-
super(record, isoData);
68-
}
6953

54+
export class ISODirectory extends Directory<ISODirectoryRecord> {
7055
protected _constructDirectoryRecord(data: Uint8Array): ISODirectoryRecord {
71-
return new ISODirectoryRecord(data, this._record.rockRidgeOffset);
56+
return new ISODirectoryRecord(data, this.record.rockRidgeOffset);
7257
}
7358
}
7459

7560
export class JolietDirectory extends Directory<JolietDirectoryRecord> {
76-
public constructor(record: JolietDirectoryRecord, isoData: Uint8Array) {
77-
super(record, isoData);
78-
}
79-
8061
protected _constructDirectoryRecord(data: Uint8Array): JolietDirectoryRecord {
81-
return new JolietDirectoryRecord(data, this._record.rockRidgeOffset);
62+
return new JolietDirectoryRecord(data, this.record.rockRidgeOffset);
8263
}
8364
}

src/IsoFS.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ export class IsoFS extends Readonly(Sync(FileSystem)) {
135135
}
136136

137137
if (record.isDirectory(this.data)) {
138-
return record.getDirectory(this.data).fileList.slice(0);
138+
return Array.from(record.getDirectory(this.data).keys());
139139
}
140140

141141
throw ErrnoError.With('ENOTDIR', path, 'readdir');
@@ -146,13 +146,13 @@ export class IsoFS extends Readonly(Sync(FileSystem)) {
146146
if (path === '/') {
147147
return this._root;
148148
}
149-
const components = path.split('/').slice(1);
150-
let dir = this._root;
151-
for (const component of components) {
149+
const parts = path.split('/').slice(1);
150+
let dir: DirectoryRecord | undefined = this._root;
151+
for (const part of parts) {
152152
if (!dir.isDirectory(this.data)) {
153153
return;
154154
}
155-
dir = dir.getDirectory(this.data).getRecord(component);
155+
dir = dir.getDirectory(this.data).get(part);
156156
if (!dir) {
157157
return;
158158
}

0 commit comments

Comments
 (0)