goscript 0.0.82 → 0.0.84
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/dist/gs/builtin/builtin.js +4 -7
- package/dist/gs/builtin/builtin.js.map +1 -1
- package/dist/gs/builtin/hostio.d.ts +72 -0
- package/dist/gs/builtin/hostio.js +181 -0
- package/dist/gs/builtin/hostio.js.map +1 -0
- package/dist/gs/builtin/print.d.ts +8 -0
- package/dist/gs/builtin/print.js +111 -0
- package/dist/gs/builtin/print.js.map +1 -0
- package/dist/gs/fmt/fmt.js +2 -22
- package/dist/gs/fmt/fmt.js.map +1 -1
- package/dist/gs/os/dir.gs.js +41 -27
- package/dist/gs/os/dir.gs.js.map +1 -1
- package/dist/gs/os/exec.gs.js +1 -2
- package/dist/gs/os/exec.gs.js.map +1 -1
- package/dist/gs/os/exec_posix.gs.js +1 -1
- package/dist/gs/os/exec_posix.gs.js.map +1 -1
- package/dist/gs/os/file_constants_js.gs.js +71 -7
- package/dist/gs/os/file_constants_js.gs.js.map +1 -1
- package/dist/gs/os/file_js.gs.js +168 -24
- package/dist/gs/os/file_js.gs.js.map +1 -1
- package/dist/gs/os/file_posix_js.gs.js +75 -11
- package/dist/gs/os/file_posix_js.gs.js.map +1 -1
- package/dist/gs/os/file_unix_js.gs.d.ts +3 -3
- package/dist/gs/os/file_unix_js.gs.js +218 -21
- package/dist/gs/os/file_unix_js.gs.js.map +1 -1
- package/dist/gs/os/getwd_js.gs.js +19 -6
- package/dist/gs/os/getwd_js.gs.js.map +1 -1
- package/dist/gs/os/path.gs.js +3 -3
- package/dist/gs/os/path.gs.js.map +1 -1
- package/dist/gs/os/pidfd_js.gs.js +0 -3
- package/dist/gs/os/pidfd_js.gs.js.map +1 -1
- package/dist/gs/os/proc.gs.js +6 -3
- package/dist/gs/os/proc.gs.js.map +1 -1
- package/dist/gs/os/proc_js.gs.js +10 -5
- package/dist/gs/os/proc_js.gs.js.map +1 -1
- package/dist/gs/os/rawconn_js.gs.d.ts +6 -3
- package/dist/gs/os/rawconn_js.gs.js +16 -10
- package/dist/gs/os/rawconn_js.gs.js.map +1 -1
- package/dist/gs/os/removeall_js.gs.js +2 -4
- package/dist/gs/os/removeall_js.gs.js.map +1 -1
- package/dist/gs/os/root_js.gs.d.ts +4 -1
- package/dist/gs/os/root_js.gs.js +90 -40
- package/dist/gs/os/root_js.gs.js.map +1 -1
- package/dist/gs/os/root_noopenat.gs.js +13 -16
- package/dist/gs/os/root_noopenat.gs.js.map +1 -1
- package/dist/gs/os/stat_js.gs.js +40 -4
- package/dist/gs/os/stat_js.gs.js.map +1 -1
- package/dist/gs/os/stat_unix_js.gs.d.ts +1 -1
- package/dist/gs/os/stat_unix_js.gs.js +5 -10
- package/dist/gs/os/stat_unix_js.gs.js.map +1 -1
- package/dist/gs/os/tempfile.gs.d.ts +1 -1
- package/dist/gs/os/tempfile.gs.js +24 -7
- package/dist/gs/os/tempfile.gs.js.map +1 -1
- package/dist/gs/os/types_js.gs.d.ts +30 -2
- package/dist/gs/os/types_js.gs.js +426 -23
- package/dist/gs/os/types_js.gs.js.map +1 -1
- package/gs/builtin/builtin.ts +4 -6
- package/gs/builtin/hostio.test.ts +69 -0
- package/gs/builtin/hostio.ts +298 -0
- package/gs/builtin/print.test.ts +48 -0
- package/gs/builtin/print.ts +154 -0
- package/gs/fmt/fmt.test.ts +41 -30
- package/gs/fmt/fmt.ts +2 -22
- package/gs/os/dir.gs.ts +40 -28
- package/gs/os/exec.gs.ts +2 -4
- package/gs/os/exec_posix.gs.ts +1 -2
- package/gs/os/file_constants_js.gs.ts +70 -8
- package/gs/os/file_js.gs.ts +156 -26
- package/gs/os/file_posix_js.gs.ts +69 -13
- package/gs/os/file_unix_js.gs.ts +212 -24
- package/gs/os/file_unix_js.test.ts +184 -0
- package/gs/os/getwd_js.gs.ts +18 -8
- package/gs/os/path.gs.ts +3 -4
- package/gs/os/pidfd_js.gs.ts +3 -8
- package/gs/os/proc.gs.ts +6 -4
- package/gs/os/proc_js.gs.ts +11 -8
- package/gs/os/rawconn_js.gs.ts +22 -14
- package/gs/os/removeall_js.gs.ts +3 -6
- package/gs/os/root_js.gs.ts +94 -42
- package/gs/os/root_noopenat.gs.ts +13 -20
- package/gs/os/stat_js.gs.ts +37 -6
- package/gs/os/stat_unix_js.gs.ts +6 -13
- package/gs/os/tempfile.gs.ts +27 -9
- package/gs/os/types_js.gs.ts +449 -26
- package/package.json +1 -1
package/gs/os/types_js.gs.ts
CHANGED
|
@@ -1,10 +1,203 @@
|
|
|
1
1
|
import * as $ from "@goscript/builtin/index.js";
|
|
2
|
-
import { ErrUnimplemented } from "./error.gs.js";
|
|
2
|
+
import { ErrClosed, ErrInvalid, ErrUnimplemented } from "./error.gs.js";
|
|
3
3
|
|
|
4
4
|
import * as fs from "@goscript/io/fs/index.js"
|
|
5
5
|
import * as io from "@goscript/io/index.js"
|
|
6
6
|
import * as time from "@goscript/time/index.js"
|
|
7
7
|
import * as syscall from "@goscript/syscall/index.js"
|
|
8
|
+
import {
|
|
9
|
+
DenoFileLike,
|
|
10
|
+
DenoStream,
|
|
11
|
+
HostUnsupportedError,
|
|
12
|
+
hostRuntime,
|
|
13
|
+
NodeFSModule,
|
|
14
|
+
resetHostRuntimeForTests,
|
|
15
|
+
} from "@goscript/builtin/hostio.js"
|
|
16
|
+
import { newRawConn } from "./rawconn_js.gs.js"
|
|
17
|
+
|
|
18
|
+
export type HostStatLike = {
|
|
19
|
+
isDirectory(): boolean
|
|
20
|
+
isSymbolicLink?(): boolean
|
|
21
|
+
mode?: number
|
|
22
|
+
mtime?: Date | null
|
|
23
|
+
mtimeMs?: number
|
|
24
|
+
size?: number
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function newHostError(err: unknown): $.GoError {
|
|
28
|
+
const message =
|
|
29
|
+
err instanceof Error ? err.message
|
|
30
|
+
: typeof err === "string" ? err
|
|
31
|
+
: String(err)
|
|
32
|
+
return { Error: () => message }
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function getNodeFS(): NodeFSModule | null {
|
|
36
|
+
return hostRuntime.nodeFS
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function getDeno(): any | null {
|
|
40
|
+
return hostRuntime.deno
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function getPlatform(): string {
|
|
44
|
+
return hostRuntime.platform
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function getEnv(name: string): string {
|
|
48
|
+
return hostRuntime.getEnv(name)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function getDenoStream(fd: number): DenoStream | null {
|
|
52
|
+
return hostRuntime.getStdioHandle(fd)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function readFD(fd: number, b: Uint8Array): [number, $.GoError] {
|
|
56
|
+
if (b.length === 0) {
|
|
57
|
+
return [0, null]
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
try {
|
|
61
|
+
const n = hostRuntime.readFD(fd, b)
|
|
62
|
+
if (n === null || n === 0) {
|
|
63
|
+
return [0, io.EOF]
|
|
64
|
+
}
|
|
65
|
+
return [n, null]
|
|
66
|
+
} catch (err) {
|
|
67
|
+
if (err instanceof HostUnsupportedError) {
|
|
68
|
+
return [0, ErrUnimplemented]
|
|
69
|
+
}
|
|
70
|
+
return [0, newHostError(err)]
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function writeFD(fd: number, b: Uint8Array): [number, $.GoError] {
|
|
75
|
+
if (b.length === 0) {
|
|
76
|
+
return [0, null]
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
try {
|
|
80
|
+
return [hostRuntime.writeFD(fd, b), null]
|
|
81
|
+
} catch (err) {
|
|
82
|
+
if (err instanceof HostUnsupportedError) {
|
|
83
|
+
return [0, ErrUnimplemented]
|
|
84
|
+
}
|
|
85
|
+
return [0, newHostError(err)]
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function readHandle(handle: DenoFileLike, b: Uint8Array): [number, $.GoError] {
|
|
90
|
+
if (typeof handle.readSync !== "function") {
|
|
91
|
+
return [0, ErrUnimplemented]
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
const n = handle.readSync(b)
|
|
95
|
+
if (n === null || n === 0) {
|
|
96
|
+
return [0, io.EOF]
|
|
97
|
+
}
|
|
98
|
+
return [n, null]
|
|
99
|
+
} catch (err) {
|
|
100
|
+
return [0, newHostError(err)]
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function writeHandle(handle: DenoFileLike, b: Uint8Array): [number, $.GoError] {
|
|
105
|
+
if (typeof handle.writeSync !== "function") {
|
|
106
|
+
return [0, ErrUnimplemented]
|
|
107
|
+
}
|
|
108
|
+
try {
|
|
109
|
+
let offset = 0
|
|
110
|
+
while (offset < b.length) {
|
|
111
|
+
const n = handle.writeSync(b.subarray(offset))
|
|
112
|
+
if (!Number.isFinite(n) || n < 0) {
|
|
113
|
+
throw new Error(`invalid write result: ${n}`)
|
|
114
|
+
}
|
|
115
|
+
if (n === 0) {
|
|
116
|
+
throw new Error("short write")
|
|
117
|
+
}
|
|
118
|
+
offset += n
|
|
119
|
+
}
|
|
120
|
+
return [b.length, null]
|
|
121
|
+
} catch (err) {
|
|
122
|
+
return [0, newHostError(err)]
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
class hostFileInfo {
|
|
127
|
+
public name: string
|
|
128
|
+
public modTime: time.Time
|
|
129
|
+
public mode: fs.FileMode
|
|
130
|
+
public size: number
|
|
131
|
+
public sys: HostStatLike | null
|
|
132
|
+
|
|
133
|
+
constructor(init?: Partial<{modTime?: time.Time, mode?: fs.FileMode, name?: string, size?: number, sys?: HostStatLike | null}>) {
|
|
134
|
+
this.name = init?.name ?? ""
|
|
135
|
+
this.modTime = init?.modTime ?? time.Unix(0, 0)
|
|
136
|
+
this.mode = init?.mode ?? 0
|
|
137
|
+
this.size = init?.size ?? 0
|
|
138
|
+
this.sys = init?.sys ?? null
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
public IsDir(): boolean {
|
|
142
|
+
return fs.FileMode_IsDir(this.mode)
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
public ModTime(): time.Time {
|
|
146
|
+
return this.modTime
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
public Mode(): fs.FileMode {
|
|
150
|
+
return this.mode
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
public Name(): string {
|
|
154
|
+
return this.name
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
public Size(): number {
|
|
158
|
+
return this.size
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
public Sys(): HostStatLike | null {
|
|
162
|
+
return this.sys
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export function createFileInfo(name: string, stat: HostStatLike): fs.FileInfo {
|
|
167
|
+
const normalizedName = name.replace(/\\/g, "/").split("/").filter((part) => part !== "").slice(-1)[0] ?? name
|
|
168
|
+
let mode = (stat.mode ?? 0) & fs.ModePerm
|
|
169
|
+
if (stat.isDirectory()) {
|
|
170
|
+
mode |= fs.ModeDir
|
|
171
|
+
}
|
|
172
|
+
if (stat.isSymbolicLink?.()) {
|
|
173
|
+
mode |= fs.ModeSymlink
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
let mtimeMs = 0
|
|
177
|
+
if (typeof stat.mtimeMs === "number") {
|
|
178
|
+
mtimeMs = stat.mtimeMs
|
|
179
|
+
} else if (stat.mtime instanceof Date) {
|
|
180
|
+
mtimeMs = stat.mtime.getTime()
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return new hostFileInfo({
|
|
184
|
+
modTime: time.UnixMilli(mtimeMs),
|
|
185
|
+
mode,
|
|
186
|
+
name: normalizedName,
|
|
187
|
+
size: stat.size ?? 0,
|
|
188
|
+
sys: stat,
|
|
189
|
+
})
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
export function createHostFile(name: string, fd: number = -1, handle: DenoFileLike | null = null): File {
|
|
193
|
+
return new File({
|
|
194
|
+
fd,
|
|
195
|
+
file: new file({ handle: handle ?? hostRuntime.getStdioHandle(fd), path: name }),
|
|
196
|
+
name,
|
|
197
|
+
})
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export { resetHostRuntimeForTests }
|
|
8
201
|
|
|
9
202
|
// Re-export essential types
|
|
10
203
|
export type Time = time.Time;
|
|
@@ -25,30 +218,41 @@ export function Getpagesize(): number {
|
|
|
25
218
|
return 4096
|
|
26
219
|
}
|
|
27
220
|
|
|
28
|
-
//
|
|
221
|
+
// File adapts host file descriptors and file handles to Go's os.File surface.
|
|
29
222
|
export class File {
|
|
30
223
|
public get file(): file | null {
|
|
31
|
-
return
|
|
224
|
+
return this._fields.file.value
|
|
32
225
|
}
|
|
33
226
|
public set file(value: file | null) {
|
|
34
|
-
|
|
227
|
+
this._fields.file.value = value
|
|
35
228
|
}
|
|
36
229
|
|
|
230
|
+
public name: string
|
|
231
|
+
public closed: boolean
|
|
232
|
+
public fd: number
|
|
233
|
+
|
|
37
234
|
public _fields: {
|
|
38
235
|
file: $.VarRef<file | null>;
|
|
39
236
|
}
|
|
40
237
|
|
|
41
|
-
constructor(init?: Partial<{file?: file | null}>) {
|
|
238
|
+
constructor(init?: Partial<{closed?: boolean, fd?: number, file?: file | null, name?: string}>) {
|
|
239
|
+
this.name = init?.name ?? ""
|
|
240
|
+
this.closed = init?.closed ?? false
|
|
241
|
+
this.fd = init?.fd ?? -1
|
|
42
242
|
this._fields = {
|
|
43
|
-
file: $.varRef(null)
|
|
243
|
+
file: $.varRef(init?.file ?? null)
|
|
44
244
|
}
|
|
45
245
|
}
|
|
46
246
|
|
|
47
247
|
public clone(): File {
|
|
48
|
-
return new File(
|
|
248
|
+
return new File({
|
|
249
|
+
closed: this.closed,
|
|
250
|
+
fd: this.fd,
|
|
251
|
+
file: this.file,
|
|
252
|
+
name: this.name,
|
|
253
|
+
})
|
|
49
254
|
}
|
|
50
255
|
|
|
51
|
-
// All File methods return ErrUnimplemented in JavaScript environment
|
|
52
256
|
public Readdir(n: number): [$.Slice<fs.FileInfo>, $.GoError] {
|
|
53
257
|
return [null, ErrUnimplemented]
|
|
54
258
|
}
|
|
@@ -66,42 +270,129 @@ export class File {
|
|
|
66
270
|
}
|
|
67
271
|
|
|
68
272
|
public Name(): string {
|
|
69
|
-
return
|
|
273
|
+
return this.name
|
|
70
274
|
}
|
|
71
275
|
|
|
72
276
|
public Read(b: $.Bytes): [number, $.GoError] {
|
|
73
|
-
|
|
277
|
+
if (this.closed) {
|
|
278
|
+
return [0, ErrClosed]
|
|
279
|
+
}
|
|
280
|
+
if (this.fd < 0) {
|
|
281
|
+
return [0, ErrInvalid]
|
|
282
|
+
}
|
|
283
|
+
if (b === null) {
|
|
284
|
+
return [0, null]
|
|
285
|
+
}
|
|
286
|
+
const buf = $.bytesToUint8Array(b)
|
|
287
|
+
const handle = this.file?.handle
|
|
288
|
+
const [n, err] =
|
|
289
|
+
handle && typeof handle.readSync === "function"
|
|
290
|
+
? readHandle(handle, buf)
|
|
291
|
+
: readFD(this.fd, buf)
|
|
292
|
+
if (!(b instanceof Uint8Array) && n > 0) {
|
|
293
|
+
$.copy(b, buf.subarray(0, n))
|
|
294
|
+
}
|
|
295
|
+
return [n, err]
|
|
74
296
|
}
|
|
75
297
|
|
|
76
298
|
public ReadAt(b: $.Bytes, off: number): [number, $.GoError] {
|
|
77
|
-
|
|
299
|
+
const handle = this.file?.handle
|
|
300
|
+
if (!handle || typeof handle.seekSync !== "function" || b === null) {
|
|
301
|
+
return [0, ErrUnimplemented]
|
|
302
|
+
}
|
|
303
|
+
try {
|
|
304
|
+
handle.seekSync(off, io.SeekStart)
|
|
305
|
+
return this.Read(b)
|
|
306
|
+
} catch (err) {
|
|
307
|
+
return [0, newHostError(err)]
|
|
308
|
+
}
|
|
78
309
|
}
|
|
79
310
|
|
|
80
311
|
public ReadFrom(r: io.Reader): [number, $.GoError] {
|
|
81
|
-
|
|
312
|
+
if (this.closed) {
|
|
313
|
+
return [0, ErrClosed]
|
|
314
|
+
}
|
|
315
|
+
return io.Copy(this, r)
|
|
82
316
|
}
|
|
83
317
|
|
|
84
318
|
public Write(b: $.Bytes): [number, $.GoError] {
|
|
85
|
-
|
|
319
|
+
if (this.closed) {
|
|
320
|
+
return [0, ErrClosed]
|
|
321
|
+
}
|
|
322
|
+
if (this.fd < 0) {
|
|
323
|
+
return [0, ErrInvalid]
|
|
324
|
+
}
|
|
325
|
+
if (b === null) {
|
|
326
|
+
return [0, null]
|
|
327
|
+
}
|
|
328
|
+
const buf = $.bytesToUint8Array(b)
|
|
329
|
+
const handle = this.file?.handle
|
|
330
|
+
return handle && typeof handle.writeSync === "function"
|
|
331
|
+
? writeHandle(handle, buf)
|
|
332
|
+
: writeFD(this.fd, buf)
|
|
86
333
|
}
|
|
87
334
|
|
|
88
335
|
public WriteAt(b: $.Bytes, off: number): [number, $.GoError] {
|
|
89
|
-
|
|
336
|
+
const handle = this.file?.handle
|
|
337
|
+
if (!handle || typeof handle.seekSync !== "function" || b === null) {
|
|
338
|
+
return [0, ErrUnimplemented]
|
|
339
|
+
}
|
|
340
|
+
try {
|
|
341
|
+
handle.seekSync(off, io.SeekStart)
|
|
342
|
+
return this.Write(b)
|
|
343
|
+
} catch (err) {
|
|
344
|
+
return [0, newHostError(err)]
|
|
345
|
+
}
|
|
90
346
|
}
|
|
91
347
|
|
|
92
348
|
public WriteTo(w: io.Writer): [number, $.GoError] {
|
|
93
|
-
|
|
349
|
+
if (this.closed) {
|
|
350
|
+
return [0, ErrClosed]
|
|
351
|
+
}
|
|
352
|
+
return io.Copy(w, this)
|
|
94
353
|
}
|
|
95
354
|
|
|
96
355
|
public Seek(offset: number, whence: number): [number, $.GoError] {
|
|
97
|
-
|
|
356
|
+
const handle = this.file?.handle
|
|
357
|
+
if (!handle || typeof handle.seekSync !== "function") {
|
|
358
|
+
return [0, ErrUnimplemented]
|
|
359
|
+
}
|
|
360
|
+
try {
|
|
361
|
+
return [handle.seekSync(offset, whence), null]
|
|
362
|
+
} catch (err) {
|
|
363
|
+
return [0, newHostError(err)]
|
|
364
|
+
}
|
|
98
365
|
}
|
|
99
366
|
|
|
100
367
|
public WriteString(s: string): [number, $.GoError] {
|
|
101
|
-
return
|
|
368
|
+
return this.Write($.stringToBytes(s))
|
|
102
369
|
}
|
|
103
370
|
|
|
104
371
|
public Chmod(mode: number): $.GoError {
|
|
372
|
+
if (this.closed) {
|
|
373
|
+
return ErrClosed
|
|
374
|
+
}
|
|
375
|
+
if (this.name === "") {
|
|
376
|
+
return ErrUnimplemented
|
|
377
|
+
}
|
|
378
|
+
const denoObj = getDeno()
|
|
379
|
+
if (denoObj?.chmodSync) {
|
|
380
|
+
try {
|
|
381
|
+
denoObj.chmodSync(this.name, mode)
|
|
382
|
+
return null
|
|
383
|
+
} catch (err) {
|
|
384
|
+
return newHostError(err)
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
const nodeFS = getNodeFS()
|
|
388
|
+
if (nodeFS?.chmodSync) {
|
|
389
|
+
try {
|
|
390
|
+
nodeFS.chmodSync(this.name, mode)
|
|
391
|
+
return null
|
|
392
|
+
} catch (err) {
|
|
393
|
+
return newHostError(err)
|
|
394
|
+
}
|
|
395
|
+
}
|
|
105
396
|
return ErrUnimplemented
|
|
106
397
|
}
|
|
107
398
|
|
|
@@ -118,40 +409,167 @@ export class File {
|
|
|
118
409
|
}
|
|
119
410
|
|
|
120
411
|
public SyscallConn(): [any, $.GoError] {
|
|
121
|
-
|
|
412
|
+
if (this.closed) {
|
|
413
|
+
return [null, ErrClosed]
|
|
414
|
+
}
|
|
415
|
+
if (this.fd < 0) {
|
|
416
|
+
return [null, ErrInvalid]
|
|
417
|
+
}
|
|
418
|
+
return [newRawConn(this), null]
|
|
122
419
|
}
|
|
123
420
|
|
|
124
421
|
public Close(): $.GoError {
|
|
125
|
-
|
|
422
|
+
if (this.closed) {
|
|
423
|
+
return ErrClosed
|
|
424
|
+
}
|
|
425
|
+
const handle = this.file?.handle
|
|
426
|
+
if (handle && typeof handle.close === "function") {
|
|
427
|
+
try {
|
|
428
|
+
handle.close()
|
|
429
|
+
} catch (err) {
|
|
430
|
+
return newHostError(err)
|
|
431
|
+
}
|
|
432
|
+
} else if (this.fd > 2) {
|
|
433
|
+
const nodeFS = getNodeFS()
|
|
434
|
+
if (nodeFS?.closeSync) {
|
|
435
|
+
try {
|
|
436
|
+
nodeFS.closeSync(this.fd)
|
|
437
|
+
} catch (err) {
|
|
438
|
+
return newHostError(err)
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
this.closed = true
|
|
443
|
+
return null
|
|
126
444
|
}
|
|
127
445
|
|
|
128
446
|
public Chown(uid: number, gid: number): $.GoError {
|
|
447
|
+
if (this.closed) {
|
|
448
|
+
return ErrClosed
|
|
449
|
+
}
|
|
450
|
+
if (this.name === "") {
|
|
451
|
+
return ErrUnimplemented
|
|
452
|
+
}
|
|
453
|
+
const denoObj = getDeno()
|
|
454
|
+
if (denoObj?.chownSync) {
|
|
455
|
+
try {
|
|
456
|
+
denoObj.chownSync(this.name, uid, gid)
|
|
457
|
+
return null
|
|
458
|
+
} catch (err) {
|
|
459
|
+
return newHostError(err)
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
const nodeFS = getNodeFS()
|
|
463
|
+
if (nodeFS?.chownSync) {
|
|
464
|
+
try {
|
|
465
|
+
nodeFS.chownSync(this.name, uid, gid)
|
|
466
|
+
return null
|
|
467
|
+
} catch (err) {
|
|
468
|
+
return newHostError(err)
|
|
469
|
+
}
|
|
470
|
+
}
|
|
129
471
|
return ErrUnimplemented
|
|
130
472
|
}
|
|
131
473
|
|
|
132
474
|
public Truncate(size: number): $.GoError {
|
|
475
|
+
const handle = this.file?.handle
|
|
476
|
+
if (handle && typeof handle.truncateSync === "function") {
|
|
477
|
+
try {
|
|
478
|
+
handle.truncateSync(size)
|
|
479
|
+
return null
|
|
480
|
+
} catch (err) {
|
|
481
|
+
return newHostError(err)
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
const nodeFS = getNodeFS()
|
|
485
|
+
if (nodeFS?.ftruncateSync && this.fd >= 0) {
|
|
486
|
+
try {
|
|
487
|
+
nodeFS.ftruncateSync(this.fd, size)
|
|
488
|
+
return null
|
|
489
|
+
} catch (err) {
|
|
490
|
+
return newHostError(err)
|
|
491
|
+
}
|
|
492
|
+
}
|
|
133
493
|
return ErrUnimplemented
|
|
134
494
|
}
|
|
135
495
|
|
|
136
496
|
public Sync(): $.GoError {
|
|
497
|
+
const handle = this.file?.handle
|
|
498
|
+
if (handle && typeof handle.syncSync === "function") {
|
|
499
|
+
try {
|
|
500
|
+
handle.syncSync()
|
|
501
|
+
return null
|
|
502
|
+
} catch (err) {
|
|
503
|
+
return newHostError(err)
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
const nodeFS = getNodeFS()
|
|
507
|
+
if (nodeFS?.fsyncSync && this.fd >= 0) {
|
|
508
|
+
try {
|
|
509
|
+
nodeFS.fsyncSync(this.fd)
|
|
510
|
+
return null
|
|
511
|
+
} catch (err) {
|
|
512
|
+
return newHostError(err)
|
|
513
|
+
}
|
|
514
|
+
}
|
|
137
515
|
return ErrUnimplemented
|
|
138
516
|
}
|
|
139
517
|
|
|
140
518
|
public Chdir(): $.GoError {
|
|
519
|
+
const processObj = (globalThis as any).process
|
|
520
|
+
if (processObj?.chdir && this.name !== "") {
|
|
521
|
+
try {
|
|
522
|
+
processObj.chdir(this.name)
|
|
523
|
+
return null
|
|
524
|
+
} catch (err) {
|
|
525
|
+
return newHostError(err)
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
const denoObj = getDeno()
|
|
529
|
+
if (denoObj?.chdir && this.name !== "") {
|
|
530
|
+
try {
|
|
531
|
+
denoObj.chdir(this.name)
|
|
532
|
+
return null
|
|
533
|
+
} catch (err) {
|
|
534
|
+
return newHostError(err)
|
|
535
|
+
}
|
|
536
|
+
}
|
|
141
537
|
return ErrUnimplemented
|
|
142
538
|
}
|
|
143
539
|
|
|
144
540
|
public Fd(): syscall.uintptr {
|
|
145
|
-
return
|
|
541
|
+
return this.fd
|
|
146
542
|
}
|
|
147
543
|
|
|
148
544
|
public Stat(): [fs.FileInfo, $.GoError] {
|
|
545
|
+
const handle = this.file?.handle
|
|
546
|
+
if (handle && typeof handle.statSync === "function") {
|
|
547
|
+
try {
|
|
548
|
+
return [createFileInfo(this.name, handle.statSync()), null]
|
|
549
|
+
} catch (err) {
|
|
550
|
+
return [null, newHostError(err)]
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
const nodeFS = getNodeFS()
|
|
554
|
+
if (nodeFS?.fstatSync && this.fd >= 0) {
|
|
555
|
+
try {
|
|
556
|
+
return [createFileInfo(this.name, nodeFS.fstatSync(this.fd)), null]
|
|
557
|
+
} catch (err) {
|
|
558
|
+
return [null, newHostError(err)]
|
|
559
|
+
}
|
|
560
|
+
}
|
|
149
561
|
return [null, ErrUnimplemented]
|
|
150
562
|
}
|
|
151
563
|
|
|
152
564
|
// Internal methods
|
|
153
565
|
public checkValid(op: string): $.GoError {
|
|
154
|
-
|
|
566
|
+
if (this.closed) {
|
|
567
|
+
return ErrClosed
|
|
568
|
+
}
|
|
569
|
+
if (this.fd < 0) {
|
|
570
|
+
return ErrInvalid
|
|
571
|
+
}
|
|
572
|
+
return null
|
|
155
573
|
}
|
|
156
574
|
|
|
157
575
|
public wrapErr(op: string, err: $.GoError): $.GoError {
|
|
@@ -168,16 +586,21 @@ export class File {
|
|
|
168
586
|
{ name: "Close", args: [], returns: [{ type: { kind: $.TypeKind.Interface, name: 'GoError', methods: [{ name: 'Error', args: [], returns: [{ type: { kind: $.TypeKind.Basic, name: 'string' } }] }] } }] }
|
|
169
587
|
],
|
|
170
588
|
File,
|
|
171
|
-
{ "file": { kind: $.TypeKind.Pointer, elemType: "file" } }
|
|
589
|
+
{ "file": { kind: $.TypeKind.Pointer, elemType: "file" }, "name": { kind: $.TypeKind.Basic, name: "string" }, "closed": { kind: $.TypeKind.Basic, name: "boolean" }, "fd": { kind: $.TypeKind.Basic, name: "number" } }
|
|
172
590
|
);
|
|
173
591
|
}
|
|
174
592
|
|
|
175
|
-
// Stub file type for internal use
|
|
176
593
|
class file {
|
|
177
|
-
|
|
594
|
+
public handle: DenoFileLike | null
|
|
595
|
+
public path: string
|
|
596
|
+
|
|
597
|
+
constructor(init?: Partial<{handle?: DenoFileLike | null, path?: string}>) {
|
|
598
|
+
this.handle = init?.handle ?? null
|
|
599
|
+
this.path = init?.path ?? ""
|
|
600
|
+
}
|
|
178
601
|
}
|
|
179
602
|
|
|
180
|
-
//
|
|
603
|
+
// readdirMode mirrors the Go runtime helper enum.
|
|
181
604
|
type readdirMode = number
|
|
182
605
|
|
|
183
606
|
// File mode constants
|
|
@@ -223,4 +646,4 @@ export function FileMode_String(receiver: fs.FileMode): string {
|
|
|
223
646
|
|
|
224
647
|
export function FileMode_Type(receiver: fs.FileMode): fs.FileMode {
|
|
225
648
|
return fs.FileMode_Type(receiver)
|
|
226
|
-
}
|
|
649
|
+
}
|