@@ -6,38 +6,31 @@ import Crypto from './Crypto'
66import { Share } from '@capacitor/share'
77import { Filesystem , Directory , Encoding } from '@capacitor/filesystem'
88import { Capacitor } from '@capacitor/core'
9+ import { db } from './IndexedDB'
910
1011export default class Logger {
1112 static log ( ) {
12- const logMsg = [ new Date ( ) . toISOString ( ) , ...arguments ]
13+ const dateTime = Date . now ( )
14+ const logMsg = [ ...arguments ]
15+ const message = util . format . apply ( util , logMsg )
1316
1417 // log to console
1518 DEBUG && console . log ( util . format . apply ( util , logMsg ) )
16- this . messages . push ( util . format . apply ( util , logMsg ) ) // TODO: Use a linked list here to get O(n)
17- }
18-
19- static async persist ( ) {
20- const Storage = ( Capacitor . getPlatform ( ) === 'web' ) ? await import ( './browser/BrowserAccountStorage' ) : await import ( './native/NativeAccountStorage' )
21- await Storage . default . changeEntry (
22- 'logs' ,
23- log => {
24- const messages = this . messages
25- this . messages = [ ]
26- return messages // only save the last sync run
27- } ,
28- [ ]
29- )
19+ db . logs . add ( { dateTime, message} )
20+ . catch ( e => {
21+ console . error ( 'Failed to log to IndexedDB: ' , e )
22+ console . error ( e )
23+ } )
3024 }
3125
3226 static async getLogs ( ) {
33- const Storage = ( Capacitor . getPlatform ( ) === 'web' ) ? await import ( './browser/BrowserAccountStorage' ) : await import ( './native/NativeAccountStorage' )
34- return Storage . default . getEntry ( 'logs' , [ ] )
27+ return db . logs . orderBy ( 'dateTime' ) . toArray ( )
3528 }
3629
3730 static async anonymizeLogs ( logs ) {
3831 const regex = / \[ ( .* ?) \] \( ( .* ?) \) | \[ ( .* ?) \] / g
39- const newLogs = await Parallel . map ( logs , async ( entry ) => {
40- return Logger . replaceAsync ( entry , regex , async ( match , p1 , p2 , p3 ) => {
32+ await Parallel . map ( logs , async ( logMessage ) => {
33+ logMessage . message = await Logger . replaceAsync ( logMessage . message , regex , async ( match , p1 , p2 , p3 ) => {
4134 if ( p1 && p2 ) {
4235 const hash1 = await Crypto . sha256 ( p1 )
4336 const hash2 = await Crypto . sha256 ( p2 )
@@ -50,8 +43,11 @@ export default class Logger {
5043 } , 1 )
5144 const regex2 = / u r l = h t t p s ? % 3 A % 2 F % 2 F .* $ | u r l = h t t p s ? % 3 A % 2 F % 2 F [ ^ ] * /
5245 const regex3 = / h t t p s ? : \/ \/ [ ^ / ] * \/ /
53- return newLogs
54- . map ( line => line . replace ( regex2 , '###url###' ) . replace ( regex3 , '###server###' ) )
46+ logs
47+ . forEach ( logMessage => {
48+ logMessage . message = logMessage . message . replace ( regex2 , '###url###' ) . replace ( regex3 , '###server###' )
49+ } )
50+ return logs
5551 }
5652
5753 static async replaceAsync ( str , regex , asyncFn ) {
@@ -75,18 +71,23 @@ export default class Logger {
7571 if ( anonymous ) {
7672 logs = await Logger . anonymizeLogs ( logs )
7773 }
78- let blob = new Blob ( [ logs . join ( '\n' ) ] , {
74+ logs = logs
75+ . map ( logMessage => {
76+ return new Date ( logMessage . dateTime ) . toISOString ( ) + ' ' + logMessage . message
77+ } )
78+ . join ( '\n' )
79+ let blob = new Blob ( [ logs ] , {
7980 type : 'text/plain' ,
8081 endings : 'native'
8182 } )
8283 this . download (
8384 'floccus-' +
84- packageJson . version +
85- '-' +
86- new Date ( ) . toISOString ( ) . slice ( 0 , 10 ) +
87- '-' +
88- ( anonymous ? 'redacted' : 'full' ) +
89- '.log' ,
85+ packageJson . version +
86+ '-' +
87+ new Date ( ) . toISOString ( ) . slice ( 0 , 10 ) +
88+ '-' +
89+ ( anonymous ? 'redacted' : 'full' ) +
90+ '.log' ,
9091 blob
9192 )
9293 }
@@ -121,4 +122,3 @@ export default class Logger {
121122 }
122123 }
123124}
124- Logger . messages = [ ]
0 commit comments