@@ -57,6 +57,30 @@ export class CreateApi {
57
57
return result ;
58
58
}
59
59
60
+ /**
61
+ * `sketchPath` is not the POSIX path but the path with the user UUID, username, etc.
62
+ * See [Create.Resource#path](./typings.ts). If `cache` is `true` and a sketch exists with the path,
63
+ * the cache will be updated with the new state of the sketch.
64
+ */
65
+ // TODO: no nulls in API
66
+ async sketchByPath (
67
+ sketchPath : string ,
68
+ cache = false
69
+ ) : Promise < Create . Sketch | null > {
70
+ const url = new URL ( `${ this . domain ( ) } /sketches/byPath/${ sketchPath } ` ) ;
71
+ const headers = await this . headers ( ) ;
72
+ const sketch = await this . run < Create . Sketch > ( url , {
73
+ method : 'GET' ,
74
+ headers,
75
+ } ) ;
76
+ if ( sketch && cache ) {
77
+ this . sketchCache . addSketch ( sketch ) ;
78
+ const posixPath = createPaths . toPosixPath ( sketch . path ) ;
79
+ this . sketchCache . purgeByPath ( posixPath ) ;
80
+ }
81
+ return sketch ;
82
+ }
83
+
60
84
async sketches ( limit = 50 ) : Promise < Create . Sketch [ ] > {
61
85
const url = new URL ( `${ this . domain ( ) } /sketches` ) ;
62
86
url . searchParams . set ( 'user_id' , 'me' ) ;
@@ -212,7 +236,17 @@ export class CreateApi {
212
236
return data ;
213
237
}
214
238
215
- const sketch = this . sketchCache . getSketch ( createPaths . parentPosix ( path ) ) ;
239
+ const posixPath = createPaths . parentPosix ( path ) ;
240
+ let sketch = this . sketchCache . getSketch ( posixPath ) ;
241
+ // Workaround for https://github.com/arduino/arduino-ide/issues/1999.
242
+ if ( ! sketch ) {
243
+ // Convert the ordinary sketch POSIX path to the Create path.
244
+ // For example, `/sketch_apr6a` will be transformed to `8a694e4b83878cc53472bd75ee928053:kittaakos/sketches_v2/sketch_apr6a`.
245
+ const createPathPrefix = this . sketchCache . createPathPrefix ;
246
+ if ( createPathPrefix ) {
247
+ sketch = await this . sketchByPath ( createPathPrefix + posixPath , true ) ;
248
+ }
249
+ }
216
250
217
251
if (
218
252
sketch &&
@@ -448,13 +482,18 @@ export class CreateApi {
448
482
await this . run ( url , init , ResponseResultProvider . NOOP ) ;
449
483
}
450
484
485
+ private fetchCounter = 0 ;
451
486
private async run < T > (
452
487
requestInfo : URL ,
453
488
init : RequestInit | undefined ,
454
489
resultProvider : ResponseResultProvider = ResponseResultProvider . JSON
455
490
) : Promise < T > {
456
- console . debug ( `HTTP ${ init ?. method } : ${ requestInfo . toString ( ) } ` ) ;
491
+ const fetchCount = `[${ ++ this . fetchCounter } ]` ;
492
+ const fetchStart = performance . now ( ) ;
493
+ const method = init ?. method ? `${ init . method } : ` : '' ;
494
+ const url = requestInfo . toString ( ) ;
457
495
const response = await fetch ( requestInfo . toString ( ) , init ) ;
496
+ const fetchEnd = performance . now ( ) ;
458
497
if ( ! response . ok ) {
459
498
let details : string | undefined = undefined ;
460
499
try {
@@ -465,7 +504,18 @@ export class CreateApi {
465
504
const { statusText, status } = response ;
466
505
throw new CreateError ( statusText , status , details ) ;
467
506
}
507
+ const parseStart = performance . now ( ) ;
468
508
const result = await resultProvider ( response ) ;
509
+ const parseEnd = performance . now ( ) ;
510
+ console . debug (
511
+ `HTTP ${ fetchCount } ${ method } ${ url } [fetch: ${ (
512
+ fetchEnd - fetchStart
513
+ ) . toFixed ( 2 ) } ms, parse: ${ ( parseEnd - parseStart ) . toFixed (
514
+ 2
515
+ ) } ms] body: ${
516
+ typeof result === 'string' ? result : JSON . stringify ( result )
517
+ } `
518
+ ) ;
469
519
return result ;
470
520
}
471
521
0 commit comments