1
+ const fs = await navigator . storage . getDirectory ( ) ;
2
+
1
3
class Logger {
2
4
#output;
5
+ #file;
6
+ #stream;
3
7
4
- constructor ( outputId ) {
8
+ constructor ( outputId , file ) {
5
9
this . #output = document . getElementById ( outputId ) ;
10
+ this . #file = file ;
11
+ return file . createWritable ( ) . then ( ( stream ) => {
12
+ this . #stream = stream ;
13
+ return this ;
14
+ } ) ;
6
15
}
7
16
8
17
log ( ...args ) {
9
18
const lines = args . map ( Logger . #serialize) ;
10
- this . #output. textContent += lines . join ( ' ' ) + '\n' ;
19
+ const data = lines . join ( ' ' ) + '\n' ;
20
+ this . #output. textContent += data ;
11
21
this . #output. scrollTop = this . #output. scrollHeight ;
22
+ const { size } = this . #file;
23
+ this . #stream. write ( { type : 'write' , position : size , data } ) ;
12
24
}
13
25
14
26
static #serialize( x ) {
15
27
return typeof x === 'object' ? JSON . stringify ( x , null , 2 ) : x ;
16
28
}
17
29
}
18
30
19
- const logger = new Logger ( 'output' ) ;
20
-
21
- const fs = await navigator . storage . getDirectory ( ) ;
31
+ const logDir = await fs . getDirectoryHandle ( 'logs' , { create : true } ) ;
32
+ const logFile = await logDir . getFileHandle ( 'app.log' , { create : true } ) ;
33
+ const logger = await new Logger ( 'output' , logFile ) ;
22
34
23
35
const data = [
24
36
{ name : 'Marcus' , age : 20 } ,
@@ -27,42 +39,64 @@ const data = [
27
39
] ;
28
40
29
41
document . getElementById ( 'create' ) . onclick = async ( ) => {
30
- const fileHandle = await fs . getFileHandle ( 'data.json' , { create : true } ) ;
31
- const writable = await fileHandle . createWritable ( ) ;
32
- await writable . write ( JSON . stringify ( data ) ) ;
33
- await writable . close ( ) ;
34
42
logger . log ( 'File saved: data.json' ) ;
43
+ try {
44
+ const fileHandle = await fs . getFileHandle ( 'data.json' , { create : true } ) ;
45
+ const writable = await fileHandle . createWritable ( ) ;
46
+ await writable . write ( JSON . stringify ( data ) ) ;
47
+ await writable . close ( ) ;
48
+ } catch ( error ) {
49
+ logger . log ( error . message ) ;
50
+ }
35
51
} ;
36
52
37
53
document . getElementById ( 'read' ) . onclick = async ( ) => {
38
- const fileHandle = await fs . getFileHandle ( 'data.json' ) ;
39
- const file = await fileHandle . getFile ( ) ;
40
- const content = await file . text ( ) ;
41
- logger . log ( content ) ;
42
- const data = JSON . parse ( content ) ;
43
54
logger . log ( 'Read file: data.json' ) ;
44
- logger . log ( data ) ;
55
+ try {
56
+ const fileHandle = await fs . getFileHandle ( 'data.json' ) ;
57
+ const file = await fileHandle . getFile ( ) ;
58
+ const content = await file . text ( ) ;
59
+ logger . log ( content ) ;
60
+ const data = JSON . parse ( content ) ;
61
+ logger . log ( data ) ;
62
+ } catch ( error ) {
63
+ logger . log ( error . message ) ;
64
+ }
45
65
} ;
46
66
47
67
document . getElementById ( 'append' ) . onclick = async ( ) => {
48
- const fileHandle = await fs . getFileHandle ( 'data.json' , { create : true } ) ;
49
- const writable = await fileHandle . createWritable ( { keepExistingData : true } ) ;
50
- const file = await fileHandle . getFile ( ) ;
51
- const marcus = { name : 'Marcus' , age : 20 } ;
52
- const buffer = ',' + JSON . stringify ( marcus ) + ']' ;
53
- logger . log ( buffer ) ;
54
- await writable . write ( { type : 'write' , position : file . size - 1 , buffer } ) ;
55
- await writable . close ( ) ;
56
68
logger . log ( 'Append to: data.json' ) ;
69
+ try {
70
+ const fileHandle = await fs . getFileHandle ( 'data.json' , { create : true } ) ;
71
+ const writable = await fileHandle . createWritable ( {
72
+ keepExistingData : true ,
73
+ } ) ;
74
+ const file = await fileHandle . getFile ( ) ;
75
+ const marcus = { name : 'Marcus' , age : 20 } ;
76
+ const data = `,${ JSON . stringify ( marcus ) } ]` ;
77
+ await writable . write ( { type : 'write' , position : file . size - 1 , data } ) ;
78
+ await writable . close ( ) ;
79
+ } catch ( error ) {
80
+ logger . log ( error . message ) ;
81
+ }
57
82
} ;
58
83
59
84
document . getElementById ( 'list' ) . onclick = async ( ) => {
60
- for await ( const [ name , handle ] of fs . entries ( ) ) {
61
- logger . log ( `${ name } ${ handle . kind } ` ) ;
85
+ logger . log ( 'List files:' ) ;
86
+ try {
87
+ for await ( const [ name , handle ] of fs . entries ( ) ) {
88
+ logger . log ( `${ name } ${ handle . kind } ` ) ;
89
+ }
90
+ } catch ( error ) {
91
+ logger . log ( error . message ) ;
62
92
}
63
93
} ;
64
94
65
95
document . getElementById ( 'delete' ) . onclick = async ( ) => {
66
- await fs . removeEntry ( 'data.json' ) ;
67
96
logger . log ( 'Deleted: data.json' ) ;
97
+ try {
98
+ await fs . removeEntry ( 'data.json' ) ;
99
+ } catch ( error ) {
100
+ logger . log ( error . message ) ;
101
+ }
68
102
} ;
0 commit comments