Skip to content

Commit f523a5e

Browse files
Implemented seek and seekSync
1 parent f8c9725 commit f523a5e

File tree

9 files changed

+87
-15
lines changed

9 files changed

+87
-15
lines changed

packages/shim-deno/src/deno/stable/classes/FsFile.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import { read } from "../functions/read.js";
1212
import { readSync } from "../functions/readSync.js";
1313
import { write } from "../functions/write.js";
1414
import { writeSync } from "../functions/writeSync.js";
15+
import { seek } from "../functions/seek.js";
16+
import { seekSync } from "../functions/seekSync.js";
1517

1618
(Symbol as any).dispose ??= Symbol("Symbol.dispose");
1719
(Symbol as any).asyncDispose ??= Symbol("Symbol.asyncDispose");
@@ -51,12 +53,12 @@ export class FsFile implements Deno.FsFile {
5153
return readSync(this.rid, p);
5254
}
5355

54-
seek(_offset: number, _whence: Deno.SeekMode): Promise<number> {
55-
throw new Error("Method not implemented.");
56+
async seek(offset: number, whence: Deno.SeekMode): Promise<number> {
57+
return await seek(this.rid, offset, whence);
5658
}
5759

58-
seekSync(_offset: number, _whence: Deno.SeekMode): number {
59-
throw new Error("Method not implemented.");
60+
seekSync(offset: number, whence: Deno.SeekMode): number {
61+
return seekSync(this.rid, offset, whence);
6062
}
6163

6264
async stat(): Promise<Deno.FileInfo> {

packages/shim-deno/src/deno/stable/functions/close.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,9 @@
22

33
import * as fs from "fs";
44

5-
export const close: typeof Deno.close = fs.closeSync;
5+
import { positions } from "./seekSync.ts";
6+
7+
export const close: typeof Deno.close = function close(fd) {
8+
fs.closeSync(fd);
9+
positions.delete(fd);
10+
};

packages/shim-deno/src/deno/stable/functions/open.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { open as _open } from "fs";
44
import { promisify } from "util";
55

66
import { File } from "../classes/FsFile.js";
7+
import { positions } from "../functions/seekSync.js";
78
import { getFsFlag } from "../../internal/fs_flags.js";
89
import mapError from "../../internal/errorMap.js";
910

@@ -25,6 +26,7 @@ export const open: typeof Deno.open = async function open(
2526
});
2627
try {
2728
const fd = await nodeOpen(path, flagMode, mode);
29+
positions.set(fd, 0);
2830
return new File(fd);
2931
} catch (err) {
3032
throw mapError(err);

packages/shim-deno/src/deno/stable/functions/openSync.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import { openSync as nodeOpenSync } from "fs";
44

55
import { File } from "../classes/FsFile.js";
6+
import { positions } from "../functions/seekSync.js";
67
import { getFsFlag } from "../../internal/fs_flags.js";
78
import mapError from "../../internal/errorMap.js";
89

@@ -22,6 +23,7 @@ export const openSync: typeof Deno.openSync = function openSync(
2223
});
2324
try {
2425
const fd = nodeOpenSync(path, flagMode, mode);
26+
positions.set(fd, 0);
2527
return new File(fd);
2628
} catch (err) {
2729
throw mapError(err);

packages/shim-deno/src/deno/stable/functions/read.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import { promisify } from "util";
44
import { read as nodeRead } from "fs";
55

6+
import { positions } from "./seekSync.js";
7+
68
const _read = promisify(nodeRead);
79

810
export const read: typeof Deno.read = async function read(rid, buffer) {
@@ -13,7 +15,11 @@ export const read: typeof Deno.read = async function read(rid, buffer) {
1315
return 0;
1416
}
1517

16-
const { bytesRead } = await _read(rid, buffer, 0, buffer.length, null);
18+
const position = positions.get(rid) ?? null;
19+
const { bytesRead } = await _read(rid, buffer, 0, buffer.length, position);
20+
if (position !== null) {
21+
positions.set(rid, position + bytesRead);
22+
}
1723
// node returns 0 on EOF, Deno expects null
1824
return bytesRead === 0 ? null : bytesRead;
1925
};

packages/shim-deno/src/deno/stable/functions/readSync.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,14 @@
22

33
import * as fs from "fs";
44

5+
import { positions } from "./seekSync.js";
6+
57
export const readSync: typeof Deno.readSync = (fd, buffer) => {
6-
const bytesRead = fs.readSync(fd, buffer);
8+
const position = positions.get(fd) ?? null;
9+
const bytesRead = fs.readSync(fd, buffer, { position });
10+
if (position !== null) {
11+
positions.set(fd, position + bytesRead);
12+
}
713
// node returns 0 on EOF, Deno expects null
814
return bytesRead === 0 ? null : bytesRead;
915
};
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
///<reference path="../lib.deno.d.ts" />
2+
3+
import { fstat } from "fs";
4+
import { promisify } from "util";
5+
6+
import { positions } from "./seekSync.js";
7+
8+
const nodeFstat = promisify(fstat);
9+
10+
export const seek: typeof Deno.seek = async function (fd, offset, whence) {
11+
let p = positions.get(fd);
12+
if (p == null) {
13+
throw new Error("Bad file descriptor");
14+
}
15+
switch (whence) {
16+
case Deno.SeekMode.Start:
17+
p = Number(offset);
18+
break;
19+
case Deno.SeekMode.Current:
20+
p += Number(offset);
21+
break;
22+
case Deno.SeekMode.End:
23+
p = (await nodeFstat(fd)).size + Number(offset);
24+
break;
25+
default:
26+
throw new TypeError(`Invalid seek mode: ${whence}`);
27+
}
28+
positions.set(fd, p!);
29+
return p!;
30+
};
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
///<reference path="../lib.deno.d.ts" />
2+
3+
import { fstatSync } from "fs";
4+
5+
export const positions = new Map<number, number>();
6+
7+
export const seekSync: typeof Deno.seekSync = function (fd, offset, whence) {
8+
let p = positions.get(fd);
9+
if (p == null) {
10+
throw new Error("Bad file descriptor");
11+
}
12+
switch (whence) {
13+
case Deno.SeekMode.Start:
14+
p = Number(offset);
15+
break;
16+
case Deno.SeekMode.Current:
17+
p += Number(offset);
18+
break;
19+
case Deno.SeekMode.End:
20+
p = fstatSync(fd).size + Number(offset);
21+
break;
22+
default:
23+
throw new TypeError(`Invalid seek mode: ${whence}`);
24+
}
25+
positions.set(fd, p!);
26+
return p!;
27+
};

packages/shim-deno/tools/run_tests.mjs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,6 @@ const testsToSkip = new Set([
5151
"openNotFound", // includes full path in node.js
5252
"openModeWriteRead", // not implemented
5353
"readFileIsDirectoryErrorCode", // todo(https://github.com/denoland/deno/issues/18629): re-enable
54-
"seekStart", // not implemented
55-
"seekSyncStart", // not implemented
56-
"seekCurrent", // not implemented
57-
"seekStartBigInt", // not implemented
58-
"seekSyncCurrent", // not implemented
59-
"seekEnd", // not implemented
60-
"seekSyncEnd", // not implemented
61-
"seekMode", // not implemented
6254

6355
// mkdir_test
6456
"mkdirMode", // depends on Deno.umask

0 commit comments

Comments
 (0)