9
9
10
10
import {
11
11
Ack ,
12
+ AddUserActivityRequest ,
12
13
CreateNodeArgs ,
13
14
Eid ,
14
15
GetNodeSliceArgs ,
@@ -25,6 +26,7 @@ import {
25
26
TNode ,
26
27
TNodeJson ,
27
28
TNodeSliceIterator ,
29
+ TotalUserActivity ,
28
30
} from 'smuggler-api'
29
31
import { NodeType } from 'smuggler-api'
30
32
import { v4 as uuidv4 } from 'uuid'
@@ -62,8 +64,11 @@ type OriginToNidLav = GenericLav<'origin->nid', Nid[]>
62
64
type NidToEdgeYek = GenericYek < 'nid->edge' , Nid >
63
65
type NidToEdgeLav = GenericLav < 'nid->edge' , TEdgeJson [ ] >
64
66
65
- type Yek = NidYek | OriginToNidYek | NidToEdgeYek
66
- type Lav = NidLav | OriginToNidLav | NidToEdgeLav
67
+ type OriginToActivityYek = GenericYek < 'origin->activity' , OriginId >
68
+ type OriginToActivityLav = GenericLav < 'origin->activity' , TotalUserActivity >
69
+
70
+ type Yek = NidYek | OriginToNidYek | NidToEdgeYek | OriginToActivityYek
71
+ type Lav = NidLav | OriginToNidLav | NidToEdgeLav | OriginToActivityLav
67
72
68
73
// TODO[snikitin@outlook .com] Describe that the purpose of this wrapper is to
69
74
// add a bit of ORM-like typesafety to browser.Storage.StorageArea.
@@ -99,6 +104,7 @@ class YekLavStore {
99
104
get ( yek : OriginToNidYek ) : Promise < OriginToNidLav | undefined >
100
105
get ( yek : NidToEdgeYek ) : Promise < NidToEdgeLav | undefined >
101
106
get ( yek : NidYek [ ] ) : Promise < NidLav [ ] >
107
+ get ( yek : OriginToActivityYek ) : Promise < OriginToActivityLav | undefined >
102
108
get ( yek : Yek | Yek [ ] ) : Promise < Lav | Lav [ ] | undefined > {
103
109
if ( Array . isArray ( yek ) ) {
104
110
const keys : string [ ] = yek . map ( ( value : Yek ) => this . stringify ( value ) )
@@ -132,6 +138,8 @@ class YekLavStore {
132
138
return 'origin->nid:' + yek . yek . key
133
139
case 'nid->edge' :
134
140
return 'nid->edge:' + yek . yek . key
141
+ case 'origin->activity' :
142
+ return 'origin->activity:' + yek . yek . key
135
143
}
136
144
}
137
145
}
@@ -286,6 +294,58 @@ async function updateNode(
286
294
return { ack : true }
287
295
}
288
296
297
+ async function addExternalUserActivity (
298
+ store : YekLavStore ,
299
+ origin : OriginId ,
300
+ activity : AddUserActivityRequest
301
+ ) : Promise < TotalUserActivity > {
302
+ const total : TotalUserActivity = await getExternalUserActivity ( store , origin )
303
+ if ( 'visit' in activity ) {
304
+ if ( activity . visit == null ) {
305
+ return total
306
+ }
307
+ total . visits = total . visits . concat ( activity . visit . visits )
308
+ if ( activity . visit . reported_by != null ) {
309
+ throw new Error (
310
+ `activity.external.add does not implement support for visit.reported_by yet`
311
+ )
312
+ }
313
+ } else if ( 'attention' in activity ) {
314
+ if ( activity . attention == null ) {
315
+ return total
316
+ }
317
+ // TODO[snikitin@outlook .com] What to do with activity.attention.timestamp here?
318
+ total . seconds_of_attention += activity . attention . seconds
319
+ }
320
+
321
+ const yek : OriginToActivityYek = {
322
+ yek : { kind : 'origin->activity' , key : origin } ,
323
+ }
324
+ const lav : OriginToActivityLav = {
325
+ lav : { kind : 'origin->activity' , value : total } ,
326
+ }
327
+ await store . set ( [ { yek, lav } ] )
328
+ return total
329
+ }
330
+
331
+ async function getExternalUserActivity (
332
+ store : YekLavStore ,
333
+ origin : OriginId
334
+ ) : Promise < TotalUserActivity > {
335
+ const yek : OriginToActivityYek = {
336
+ yek : { kind : 'origin->activity' , key : origin } ,
337
+ }
338
+ const lav : OriginToActivityLav | undefined = await store . get ( yek )
339
+ if ( lav == null ) {
340
+ return {
341
+ visits : [ ] ,
342
+ seconds_of_attention : 0 ,
343
+ }
344
+ }
345
+ const value : TotalUserActivity = lav . lav . value
346
+ return value
347
+ }
348
+
289
349
export function makeLocalStorageApi (
290
350
browserStore : browser . Storage . StorageArea
291
351
) : StorageApi {
@@ -346,8 +406,9 @@ export function makeLocalStorageApi(
346
406
} ,
347
407
activity : {
348
408
external : {
349
- // add: addExternalUserActivity,
350
- // get: getExternalUserActivity,
409
+ add : ( ) => addExternalUserActivity ,
410
+ get : ( origin : OriginId , _signal ?: AbortSignal ) =>
411
+ getExternalUserActivity ( store , origin ) ,
351
412
} ,
352
413
association : {
353
414
// record: recordExternalAssociation,
0 commit comments