1
- import { injectable } from 'inversify' ;
1
+ import { injectable , inject } from 'inversify' ;
2
2
import * as createPaths from './create-paths' ;
3
- import { posix , splitSketchPath } from './create-paths' ;
3
+ import { posix } from './create-paths' ;
4
4
import { AuthenticationClientService } from '../auth/authentication-client-service' ;
5
5
import { ArduinoPreferences } from '../arduino-preferences' ;
6
+ import { SketchCache } from '../widgets/cloud-sketchbook/cloud-sketch-cache' ;
6
7
7
8
export interface ResponseResultProvider {
8
9
( response : Response ) : Promise < any > ;
@@ -15,10 +16,11 @@ export namespace ResponseResultProvider {
15
16
16
17
type ResourceType = 'f' | 'd' ;
17
18
18
- export let sketchCache : Create . Sketch [ ] = [ ] ;
19
-
20
19
@injectable ( )
21
20
export class CreateApi {
21
+ @inject ( SketchCache )
22
+ protected readonly sketchCache : SketchCache ;
23
+
22
24
protected authenticationService : AuthenticationClientService ;
23
25
protected arduinoPreferences : ArduinoPreferences ;
24
26
@@ -32,33 +34,19 @@ export class CreateApi {
32
34
return this ;
33
35
}
34
36
35
- public sketchCompareByPath = ( param : string ) => {
36
- return ( sketch : Create . Sketch ) => {
37
- const [ , spath ] = splitSketchPath ( sketch . path ) ;
38
- return param === spath ;
39
- } ;
40
- } ;
41
-
42
- async findSketchInCache (
43
- compareFn : ( sketch : Create . Sketch ) => boolean ,
44
- trustCache = true
45
- ) : Promise < Create . Sketch | undefined > {
46
- const sketch = sketchCache . find ( ( sketch ) => compareFn ( sketch ) ) ;
47
- if ( trustCache ) {
48
- return Promise . resolve ( sketch ) ;
49
- }
50
- return await this . sketch ( { id : sketch ?. id } ) ;
37
+ public wipeCache ( ) : void {
38
+ this . sketchCache . init ( ) ;
51
39
}
52
40
53
41
getSketchSecretStat ( sketch : Create . Sketch ) : Create . Resource {
54
42
return {
55
43
href : `${ sketch . href } ${ posix . sep } ${ Create . arduino_secrets_file } ` ,
56
44
modified_at : sketch . modified_at ,
45
+ created_at : sketch . created_at ,
57
46
name : `${ Create . arduino_secrets_file } ` ,
58
47
path : `${ sketch . path } ${ posix . sep } ${ Create . arduino_secrets_file } ` ,
59
48
mimetype : 'text/x-c++src; charset=utf-8' ,
60
49
type : 'file' ,
61
- sketchId : sketch . id ,
62
50
} ;
63
51
}
64
52
@@ -92,7 +80,7 @@ export class CreateApi {
92
80
method : 'GET' ,
93
81
headers,
94
82
} ) ;
95
- sketchCache = result . sketches ;
83
+ result . sketches . forEach ( ( sketch ) => this . sketchCache . addSketch ( sketch ) ) ;
96
84
return result . sketches ;
97
85
}
98
86
@@ -118,7 +106,7 @@ export class CreateApi {
118
106
119
107
async readDirectory (
120
108
posixPath : string ,
121
- options : { recursive ?: boolean ; match ?: string ; secrets ?: boolean } = { }
109
+ options : { recursive ?: boolean ; match ?: string } = { }
122
110
) : Promise < Create . Resource [ ] > {
123
111
const url = new URL (
124
112
`${ this . domain ( ) } /files/d/$HOME/sketches_v2${ posixPath } `
@@ -131,58 +119,21 @@ export class CreateApi {
131
119
}
132
120
const headers = await this . headers ( ) ;
133
121
134
- const sketchProm = options . secrets
135
- ? this . sketches ( )
136
- : Promise . resolve ( sketchCache ) ;
137
-
138
- return Promise . all ( [
139
- this . run < Create . RawResource [ ] > ( url , {
140
- method : 'GET' ,
141
- headers,
142
- } ) ,
143
- sketchProm ,
144
- ] )
145
- . then ( async ( [ result , sketches ] ) => {
146
- if ( options . secrets ) {
147
- // for every sketch with secrets, create a fake arduino_secrets.h
148
- result . forEach ( async ( res ) => {
149
- if ( res . type !== 'sketch' ) {
150
- return ;
151
- }
152
-
153
- const [ , spath ] = createPaths . splitSketchPath ( res . path ) ;
154
- const sketch = await this . findSketchInCache (
155
- this . sketchCompareByPath ( spath )
156
- ) ;
157
- if ( sketch && sketch . secrets && sketch . secrets . length > 0 ) {
158
- result . push ( this . getSketchSecretStat ( sketch ) ) ;
159
- }
160
- } ) ;
161
-
162
- if ( posixPath !== posix . sep ) {
163
- const sketch = await this . findSketchInCache (
164
- this . sketchCompareByPath ( posixPath )
165
- ) ;
166
- if ( sketch && sketch . secrets && sketch . secrets . length > 0 ) {
167
- result . push ( this . getSketchSecretStat ( sketch ) ) ;
168
- }
122
+ return this . run < Create . RawResource [ ] > ( url , {
123
+ method : 'GET' ,
124
+ headers,
125
+ } )
126
+ . then ( async ( result ) => {
127
+ // add arduino_secrets.h to the results, when reading a sketch main folder
128
+ if ( posixPath . length && posixPath !== posix . sep ) {
129
+ const sketch = this . sketchCache . getSketch ( posixPath ) ;
130
+
131
+ if ( sketch && sketch . secrets && sketch . secrets . length > 0 ) {
132
+ result . push ( this . getSketchSecretStat ( sketch ) ) ;
169
133
}
170
134
}
171
- const sketchesMap : Record < string , Create . Sketch > = sketches . reduce (
172
- ( prev , curr ) => {
173
- return { ...prev , [ curr . path ] : curr } ;
174
- } ,
175
- { }
176
- ) ;
177
-
178
- // add the sketch id and isPublic to the resource
179
- return result . map ( ( resource ) => {
180
- return {
181
- ...resource ,
182
- sketchId : sketchesMap [ resource . path ] ?. id || '' ,
183
- isPublic : sketchesMap [ resource . path ] ?. is_public || false ,
184
- } ;
185
- } ) ;
135
+
136
+ return result ;
186
137
} )
187
138
. catch ( ( reason ) => {
188
139
if ( reason ?. status === 404 ) return [ ] as Create . Resource [ ] ;
@@ -214,18 +165,16 @@ export class CreateApi {
214
165
215
166
let resources ;
216
167
if ( basename === Create . arduino_secrets_file ) {
217
- const sketch = await this . findSketchInCache (
218
- this . sketchCompareByPath ( parentPosixPath )
219
- ) ;
168
+ const sketch = this . sketchCache . getSketch ( parentPosixPath ) ;
220
169
resources = sketch ? [ this . getSketchSecretStat ( sketch ) ] : [ ] ;
221
170
} else {
222
171
resources = await this . readDirectory ( parentPosixPath , {
223
172
match : basename ,
224
173
} ) ;
225
174
}
226
-
227
- resources . sort ( ( left , right ) => left . path . length - right . path . length ) ;
228
- const resource = resources . find ( ( { name } ) => name === basename ) ;
175
+ const resource = resources . find (
176
+ ( { path } ) => createPaths . splitSketchPath ( path ) [ 1 ] === posixPath
177
+ ) ;
229
178
if ( ! resource ) {
230
179
throw new CreateError ( `Not found: ${ posixPath } .` , 404 ) ;
231
180
}
@@ -248,10 +197,7 @@ export class CreateApi {
248
197
return data ;
249
198
}
250
199
251
- const sketch = await this . findSketchInCache ( ( sketch ) => {
252
- const [ , spath ] = splitSketchPath ( sketch . path ) ;
253
- return spath === createPaths . parentPosix ( path ) ;
254
- } , true ) ;
200
+ const sketch = this . sketchCache . getSketch ( createPaths . parentPosix ( path ) ) ;
255
201
256
202
if (
257
203
sketch &&
@@ -273,14 +219,11 @@ export class CreateApi {
273
219
274
220
if ( basename === Create . arduino_secrets_file ) {
275
221
const parentPosixPath = createPaths . parentPosix ( posixPath ) ;
276
- const sketch = await this . findSketchInCache (
277
- this . sketchCompareByPath ( parentPosixPath ) ,
278
- false
279
- ) ;
222
+ const sketch = this . sketchCache . getSketch ( parentPosixPath ) ;
280
223
281
224
let file = '' ;
282
225
if ( sketch && sketch . secrets ) {
283
- for ( const item of sketch ? .secrets ) {
226
+ for ( const item of sketch . secrets ) {
284
227
file += `#define ${ item . name } "${ item . value } "\r\n` ;
285
228
}
286
229
}
@@ -310,9 +253,9 @@ export class CreateApi {
310
253
311
254
if ( basename === Create . arduino_secrets_file ) {
312
255
const parentPosixPath = createPaths . parentPosix ( posixPath ) ;
313
- const sketch = await this . findSketchInCache (
314
- this . sketchCompareByPath ( parentPosixPath )
315
- ) ;
256
+
257
+ const sketch = this . sketchCache . getSketch ( parentPosixPath ) ;
258
+
316
259
if ( sketch ) {
317
260
const url = new URL ( `${ this . domain ( ) } /sketches/${ sketch . id } ` ) ;
318
261
const headers = await this . headers ( ) ;
@@ -357,8 +300,7 @@ export class CreateApi {
357
300
} ;
358
301
359
302
// replace the sketch in the cache, so other calls will not overwrite each other
360
- sketchCache = sketchCache . filter ( ( skt ) => skt . id !== sketch . id ) ;
361
- sketchCache . push ( { ...sketch , secrets } ) ;
303
+ this . sketchCache . addSketch ( sketch ) ;
362
304
363
305
const init = {
364
306
method : 'POST' ,
@@ -543,8 +485,9 @@ export namespace Create {
543
485
*/
544
486
readonly path : string ;
545
487
readonly type : ResourceType ;
546
- readonly sketchId : string ;
488
+ readonly sketchId ? : string ;
547
489
readonly modified_at : string ; // As an ISO-8601 formatted string: `YYYY-MM-DDTHH:mm:ss.sssZ`
490
+ readonly created_at : string ; // As an ISO-8601 formatted string: `YYYY-MM-DDTHH:mm:ss.sssZ`
548
491
readonly children ?: number ; // For 'sketch' and 'folder' types.
549
492
readonly size ?: number ; // For 'sketch' type only.
550
493
readonly isPublic ?: boolean ; // For 'sketch' type only.
0 commit comments