{
const createdAt = Math.round(new Date().valueOf() / 1000)
const event = {kind, content, tags, pubkey, created_at: createdAt}
- console.log("Publishing", event, relays)
+ log("Publishing", event, relays)
return network.publish(relays, event)
}
diff --git a/src/agent/database.ts b/src/agent/database.ts
index 38bfa552..c1025e5f 100644
--- a/src/agent/database.ts
+++ b/src/agent/database.ts
@@ -2,6 +2,7 @@ import {debounce} from 'throttle-debounce'
import {filter, always, is, prop, find, without, pluck, all, identity} from 'ramda'
import {writable, derived} from 'svelte/store'
import {switcherFn, createMap, ensurePlural} from 'hurdak/lib/hurdak'
+import {log, error} from 'src/util/logger'
import {defer, where, now, timedelta, asyncIterableToArray} from 'src/util/misc'
// Types
@@ -30,7 +31,7 @@ const worker = new Worker(
{type: 'module'}
)
-worker.addEventListener('error', e => console.error(e))
+worker.addEventListener('error', error)
class Channel {
id: string
@@ -214,6 +215,7 @@ const defineTable = (name: string, pk: string, opts: TableOpts = {}): Table => {
// Sync from storage initially
;(async () => {
+ const t = Date.now()
const initialData = {}
for await (const {k, v} of iterate(name)) {
if (isValid(v)) {
@@ -228,6 +230,8 @@ const defineTable = (name: string, pk: string, opts: TableOpts = {}): Table => {
setAndNotify(initialData)
}
+ log(`Table ${name} ready in ${Date.now() - t}ms`)
+
ready.set(true)
})()
diff --git a/src/agent/keys.ts b/src/agent/keys.ts
index 0b6f5ed5..0ac97949 100644
--- a/src/agent/keys.ts
+++ b/src/agent/keys.ts
@@ -1,6 +1,7 @@
import {nip04} from 'nostr-tools'
import {getPublicKey, getEventHash, signEvent} from 'nostr-tools'
import {get} from 'svelte/store'
+import {error} from 'src/util/logger'
import {synced} from 'src/util/misc'
let signingFunction
@@ -64,7 +65,8 @@ const getCrypt = () => {
? nip04.decrypt($privkey, pubkey, message)
: await nostr.nip04.decrypt(pubkey, message)
} catch (e) {
- console.error(e)
+ error(e)
+
return `
`
}
},
diff --git a/src/agent/pool.ts b/src/agent/pool.ts
index fadb6943..20b97dc7 100644
--- a/src/agent/pool.ts
+++ b/src/agent/pool.ts
@@ -3,6 +3,7 @@ import type {MyEvent} from 'src/util/types'
import {relayInit} from 'nostr-tools'
import {uniqBy, prop, find, is} from 'ramda'
import {ensurePlural} from 'hurdak/lib/hurdak'
+import {warn} from 'src/util/logger'
import {isRelay} from 'src/util/nostr'
import {sleep} from 'src/util/misc'
import database from 'src/agent/database'
@@ -166,7 +167,7 @@ const subscribe = async (relays, filters, {onEvent, onEose}: Record 10) {
- console.warn(`Relay ${conn.nostr.url} has >10 active subscriptions`)
+ warn(`Relay ${conn.nostr.url} has >10 active subscriptions`)
}
return Object.assign(sub, {conn})
diff --git a/src/agent/sync.ts b/src/agent/sync.ts
index 6529f169..0978d293 100644
--- a/src/agent/sync.ts
+++ b/src/agent/sync.ts
@@ -1,6 +1,7 @@
import {pick, identity, isEmpty} from 'ramda'
import {nip05} from 'nostr-tools'
import {noop, createMap, ensurePlural, switcherFn} from 'hurdak/lib/hurdak'
+import {log, warn} from 'src/util/logger'
import {now, timedelta, shuffle, hash} from 'src/util/misc'
import {personKinds, Tags, roomAttrs, isRelay} from 'src/util/nostr'
import database from 'src/agent/database'
@@ -84,7 +85,7 @@ const processProfileEvents = async events => {
}
},
default: () => {
- console.log(`Received unsupported event type ${e.kind}`)
+ log(`Received unsupported event type ${e.kind}`)
},
}),
updated_at: now(),
@@ -256,7 +257,7 @@ const tryJson = f => {
return f()
} catch (e) {
if (!e.toString().includes('JSON')) {
- console.warn(e)
+ warn(e)
}
}
}
diff --git a/src/agent/workers/database.js b/src/agent/workers/database.js
index f2968dfc..72f95a12 100644
--- a/src/agent/workers/database.js
+++ b/src/agent/workers/database.js
@@ -1,6 +1,7 @@
import lf from 'localforage'
import memoryStorageDriver from 'localforage-memoryStorageDriver'
import {switcherFn} from 'hurdak/lib/hurdak'
+import {error} from 'src/util/logger'
import {where} from 'src/util/misc'
// Firefox private mode doesn't have access to any storage options
@@ -47,10 +48,5 @@ addEventListener('message', async ({data: {topic, payload, channel}}) => {
})
})
-addEventListener('error', event => {
- console.error(event.error)
-})
-
-addEventListener('unhandledrejection', event => {
- console.error(event)
-})
+addEventListener('error', error)
+addEventListener('unhandledrejection', error)
diff --git a/src/app/ui.ts b/src/app/ui.ts
index f92f8eff..5a78a700 100644
--- a/src/app/ui.ts
+++ b/src/app/ui.ts
@@ -7,6 +7,7 @@ import {nip19} from 'nostr-tools'
import {writable, get} from "svelte/store"
import {globalHistory} from "svelte-routing/src/history"
import {synced, sleep} from "src/util/misc"
+import {warn} from 'src/util/logger'
// Routing
@@ -104,7 +105,7 @@ export const logUsage = async name => {
await fetch(`${dufflepudUrl}/usage/${session}/${name}`, {method: 'post' })
} catch (e) {
if (!e.toString().includes('Failed to fetch')) {
- console.warn(e)
+ warn(e)
}
}
}
diff --git a/src/routes/Debug.svelte b/src/routes/Debug.svelte
new file mode 100644
index 00000000..3d03e944
--- /dev/null
+++ b/src/routes/Debug.svelte
@@ -0,0 +1,17 @@
+
+
+
+ {#each reverse(flatten($logs)) as {created_at, message}}
+
+
{formatTimestamp(created_at/1000)}
+
{message.map(m => JSON.stringify(m, null, 2)).join(' ')}
+
+ {/each}
+
+
diff --git a/src/routes/Person.svelte b/src/routes/Person.svelte
index eaeec9c8..0062473d 100644
--- a/src/routes/Person.svelte
+++ b/src/routes/Person.svelte
@@ -5,6 +5,7 @@
import {nip19} from 'nostr-tools'
import {fly} from 'svelte/transition'
import {navigate} from 'svelte-routing'
+ import {log} from 'src/util/logger'
import {renderContent} from 'src/util/html'
import {displayPerson, Tags} from 'src/util/nostr'
import Tabs from "src/partials/Tabs.svelte"
@@ -38,7 +39,7 @@
$: following = find(t => t[1] === pubkey, $user?.petnames || [])
onMount(async () => {
- console.log('Person', npub, person)
+ log('Person', npub, person)
// Add all the relays we know the person uses
relays = relays.concat(getPubkeyRelays(pubkey))
diff --git a/src/routes/Profile.svelte b/src/routes/Profile.svelte
index fd77eb35..e55e6267 100644
--- a/src/routes/Profile.svelte
+++ b/src/routes/Profile.svelte
@@ -3,6 +3,7 @@
import {fly} from 'svelte/transition'
import {navigate} from "svelte-routing"
import pick from "ramda/src/pick"
+ import {error} from "src/util/logger"
import {stripExifData} from "src/util/html"
import Input from "src/partials/Input.svelte"
import Textarea from "src/partials/Textarea.svelte"
@@ -33,8 +34,8 @@
if (file) {
const reader = new FileReader()
+ reader.onerror = error
reader.onload = () => values.picture = reader.result
- reader.onerror = e => console.error(e)
reader.readAsDataURL(await stripExifData(file))
} else {
values.picture = null
diff --git a/src/util/logger.js b/src/util/logger.js
new file mode 100644
index 00000000..853a3613
--- /dev/null
+++ b/src/util/logger.js
@@ -0,0 +1,12 @@
+import {writable} from 'svelte/store'
+
+export const logs = writable([])
+
+const logAndAppend = (level, ...message) => {
+ logs.update($logs => $logs.concat({created_at: Date.now(), message}))
+ console[level](...message)
+}
+
+export const log = (...message) => logAndAppend('log', ...message)
+export const warn = (...message) => logAndAppend('warn', ...message)
+export const error = (...message) => logAndAppend('error', ...message)
diff --git a/src/util/misc.ts b/src/util/misc.ts
index 843e4ea6..21b3a8eb 100644
--- a/src/util/misc.ts
+++ b/src/util/misc.ts
@@ -3,6 +3,7 @@ import {allPass, prop, pipe, isNil, complement, equals, is, pluck, sum, identity
import Fuse from "fuse.js/dist/fuse.min.js"
import {writable} from 'svelte/store'
import {isObject} from 'hurdak/lib/hurdak'
+import {warn} from 'src/util/logger'
export const fuzzy = (data, opts = {}) => {
const fuse = new Fuse(data, opts)
@@ -18,7 +19,7 @@ export const getLocalJson = (k) => {
try {
return JSON.parse(localStorage.getItem(k))
} catch (e) {
- console.warn(`Unable to parse ${k}: ${e}`)
+ warn(`Unable to parse ${k}: ${e}`)
return null
}
@@ -28,7 +29,7 @@ export const setLocalJson = (k, v) => {
try {
localStorage.setItem(k, JSON.stringify(v))
} catch (e) {
- console.warn(`Unable to set ${k}: ${e}`)
+ warn(`Unable to set ${k}: ${e}`)
}
}
diff --git a/src/views/ChatEdit.svelte b/src/views/ChatEdit.svelte
index dcef5257..91dea5da 100644
--- a/src/views/ChatEdit.svelte
+++ b/src/views/ChatEdit.svelte
@@ -1,6 +1,7 @@