chore: LoggerService refactor

This commit is contained in:
Ben Allfree 2023-10-11 12:16:41 -07:00
parent 3ada3f86e3
commit bfc8bba81d
26 changed files with 67 additions and 70 deletions

View File

@ -1,6 +1,6 @@
import { reduce, values } from '@s-libs/micro-dash'
import { nanoid } from 'nanoid'
import { logger } from './Logger'
import { LoggerService } from './Logger'
export type CleanupFunc = () => Promise<void> | void
type CleanupRec = {
@ -14,7 +14,7 @@ export const CLEANUP_PRIORITY_LAST = 1000
export const createCleanupManager = (slug?: string) => {
const _slug = slug || nanoid()
const { error, warn, dbg } = logger().create(`cleanupManager:${_slug}`)
const { error, warn, dbg } = LoggerService().create(`cleanupManager:${_slug}`)
let i = 0
const cleanups: { [_: number]: CleanupRec } = {}
const add = (cb: CleanupFunc, priority = CLEANUP_DEFAULT_PRIORITY) => {

View File

@ -133,4 +133,6 @@ export const createLogger = (config: Partial<Config>) => {
return api
}
export const logger = mkSingleton((config: Config) => createLogger(config))
export const LoggerService = mkSingleton((config: Config) =>
createLogger(config),
)

View File

@ -1,5 +1,5 @@
import { forEach, values } from '@s-libs/micro-dash'
import { logger } from './Logger'
import { LoggerService } from './Logger'
export type UnixTimestampMs = number
export type TimerCanceler = () => void
@ -11,7 +11,7 @@ export type TimeManagerConfig = {}
export type TimeManager = ReturnType<typeof createTimerManager>
export const createTimerManager = (config: TimeManagerConfig) => {
const { dbg, error } = logger().create(`timerManager`)
const { dbg, error } = LoggerService().create(`timerManager`)
let i = 0
const cleanups: any = {}
let isShutDown = false

View File

@ -1,4 +1,4 @@
import { logger } from '@pockethost/common'
import { LoggerService } from '@pockethost/common'
import { uniqueId } from '@s-libs/micro-dash'
import Bottleneck from 'bottleneck'
import { SetReturnType } from 'type-fest'
@ -13,7 +13,7 @@ export const serialAsyncExecutionGuard = <
const uuid = uniqueId()
const _lane = lane || (() => uuid)
const wrapper = (...args: Parameters<T>) => {
const { dbg } = logger().create('serialAsyncExecutionGuard')
const { dbg } = LoggerService().create('serialAsyncExecutionGuard')
const key = _lane(...args)
if (!limiters[key]) {
dbg(`New serial limiter with key ${key}`)
@ -35,7 +35,7 @@ export const singletonAsyncExecutionGuard = <
const uuid = uniqueId()
const keyFactory = key || (() => uuid)
const wrapper = (...args: Parameters<T>) => {
const { dbg } = logger().create(`singletonAsyncExecutionGuard`)
const { dbg } = LoggerService().create(`singletonAsyncExecutionGuard`)
const key = keyFactory(...args)
if (singletons[key]) {
return singletons[key] as unknown as ReturnType<T>

View File

@ -2,7 +2,7 @@ import Ajv, { JSONSchemaType } from 'ajv'
import type pocketbaseEs from 'pocketbase'
import { ClientResponseError, RecordSubscription } from 'pocketbase'
import type { JsonObject } from 'type-fest'
import { logger } from '../Logger'
import { LoggerService } from '../Logger'
import { newId } from '../newId'
import { safeCatch } from '../safeCatch'
import {
@ -22,7 +22,7 @@ export type RpcHelperConfig = {
export type RpcHelper = ReturnType<typeof createRpcHelper>
export const createRpcHelper = (config: RpcHelperConfig) => {
const _logger = logger().create(`RpcHelper`)
const _logger = LoggerService().create(`RpcHelper`)
const {
client,
watchHelper: { watchById },
@ -36,7 +36,7 @@ export const createRpcHelper = (config: RpcHelperConfig) => {
const validator = new Ajv().compile(schema)
return safeCatch(
cmd,
logger(),
LoggerService(),
async (
payload: TPayload,
cb?: (data: RecordSubscription<ConcreteRpcRecord>) => void,

View File

@ -1,6 +1,6 @@
import type pocketbaseEs from 'pocketbase'
import type { RecordSubscription, UnsubscribeFunc } from 'pocketbase'
import { logger } from '../Logger'
import { LoggerService } from '../Logger'
import { UnixTimestampMs, createTimerManager } from '../TimerManager'
import { safeCatch } from '../safeCatch'
import { BaseFields, RecordId } from '../schema'
@ -25,7 +25,7 @@ export const createWatchHelper = (config: WatchHelperConfig) => {
cb: (data: RecordSubscription<TRec>, unsub: UnsubscribeFunc) => void,
options?: Partial<WatchConfig>,
): Promise<UnsubscribeFunc> => {
const { dbg } = logger().create(`watchById:${collectionName}:${id}`)
const { dbg } = LoggerService().create(`watchById:${collectionName}:${id}`)
const config: WatchConfig = {
initialFetch: true,
pollIntervalMs: 0,
@ -83,7 +83,7 @@ export const createWatchHelper = (config: WatchHelperConfig) => {
const watchAllById = safeCatch(
`watchAllById`,
logger(),
LoggerService(),
async <TRec extends BaseFields>(
collectionName: string,
idName: keyof TRec,

View File

@ -17,7 +17,7 @@ import {
rpcService,
sqliteService,
} from '$services'
import { logger as loggerService } from '@pockethost/common'
import { LoggerService } from '@pockethost/common'
import { exec } from 'child_process'
import { centralDbService } from './services/CentralDbService'
import { instanceLoggerService } from './services/InstanceLoggerService'
@ -32,13 +32,13 @@ if ((major || 0) < 18) {
throw new Error(`Node 18 or higher required.`)
}
loggerService({ debug: DEBUG, trace: TRACE, errorTrace: !DEBUG })
LoggerService({ debug: DEBUG, trace: TRACE, errorTrace: !DEBUG })
// npm install eventsource --save
// @ts-ignore
global.EventSource = require('eventsource')
;(async () => {
const logger = loggerService().create(`server.ts`)
const logger = LoggerService().create(`server.ts`)
const { dbg, error, info, warn } = logger
info(`Starting`)

View File

@ -1,8 +1,8 @@
import { DAEMON_IPCIDR_LIST } from '$constants'
import { assert } from '$util'
import {
LoggerService,
SingletonBaseConfig,
logger as mkLogger,
mkSingleton,
} from '@pockethost/common'
import IPCIDR from 'ip-cidr'
@ -14,13 +14,8 @@ export type IpWhitelistServiceConfig = SingletonBaseConfig & {
const IP_WHITELIST_SERVICE_NAME = 'IpWhitelistService'
export const ipWhitelistService = mkSingleton(
async (_config: Partial<IpWhitelistServiceConfig>) => {
const config: IpWhitelistServiceConfig = {
ipRanges: DAEMON_IPCIDR_LIST,
logger: _config.logger || mkLogger(),
..._config,
}
const { logger, ipRanges } = config
async (config: Partial<IpWhitelistServiceConfig> = {}) => {
const { ipRanges = DAEMON_IPCIDR_LIST, logger = LoggerService() } = config
const _serviceLogger = logger.create(IP_WHITELIST_SERVICE_NAME)
const { dbg, error, warn, abort } = _serviceLogger

View File

@ -1,6 +1,6 @@
import { DAEMON_PB_PORT_BASE } from '$constants'
import {
logger,
LoggerService,
mkSingleton,
serialAsyncExecutionGuard,
} from '@pockethost/common'
@ -15,7 +15,7 @@ export type PortManagerConfig = {
export const portManager = mkSingleton(async (cfg: PortManagerConfig) => {
const { maxPorts } = cfg
const _logger = logger().create(`PortManager`)
const _logger = LoggerService().create(`PortManager`)
const { dbg, error, info } = _logger
info(`Starting`)

View File

@ -4,9 +4,9 @@ import {
INVOCATION_COLLECTION,
InstanceFields,
InvocationFields,
LoggerService,
RPC_COLLECTION,
RpcFields,
logger,
singletonAsyncExecutionGuard,
} from '@pockethost/common'
import Bottleneck from 'bottleneck'
@ -23,7 +23,7 @@ export const deleteInvocation = singletonAsyncExecutionGuard(
export const deleteInvocationsForInstance = singletonAsyncExecutionGuard(
async (instance: InstanceFields) => {
const { client } = await clientService()
const { dbg, error } = logger()
const { dbg, error } = LoggerService()
.create(`deleteInvocationsForInstance`)
.breadcrumb(instance.id)
const { id } = instance

View File

@ -1,5 +1,5 @@
import { DEBUG, TRACE } from '$constants'
import { logger as loggerService } from '@pockethost/common'
import { LoggerService } from '@pockethost/common'
import { Command } from 'commander'
import { createCleanup } from './commands/cleanup'
@ -7,8 +7,8 @@ import { createSeed } from './commands/seed'
import { createStress } from './commands/stress'
const program = new Command()
loggerService({ debug: DEBUG, trace: TRACE, errorTrace: !DEBUG })
const logger = loggerService().create(`stresser`)
LoggerService({ debug: DEBUG, trace: TRACE, errorTrace: !DEBUG })
const logger = LoggerService().create(`stresser`)
const { dbg, error, info, warn } = logger
// npm install eventsource --save

View File

@ -1,8 +1,8 @@
import { logger } from '@pockethost/common'
import { LoggerService } from '@pockethost/common'
import { mkdirSync } from 'fs'
export const ensureDirExists = (path: string) => {
const { dbg } = logger().create(`ensureDirExists`)
const { dbg } = LoggerService().create(`ensureDirExists`)
try {
mkdirSync(path)

View File

@ -1,4 +1,4 @@
import { logger } from '@pockethost/common'
import { LoggerService } from '@pockethost/common'
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'
import fetch from 'node-fetch'
import { dirname } from 'path'
@ -7,7 +7,7 @@ export const smartFetch = async <TRet>(
url: string,
path: string,
): Promise<TRet> => {
const { dbg } = logger().create(`smartFetch`)
const { dbg } = LoggerService().create(`smartFetch`)
const data = await (async () => {
try {

View File

@ -1,4 +1,4 @@
import { logger as defaultLogger } from '@pockethost/common'
import { LoggerService } from '@pockethost/common'
import fetch from 'node-fetch'
import { AsyncContext } from './AsyncContext'
@ -11,7 +11,7 @@ export type Config = Required<AsyncContext> & {
export const tryFetch = async (url: string, config?: Partial<Config>) => {
const { logger, preflight, retryMs }: Config = {
logger: defaultLogger(),
logger: LoggerService().create(`tryFetch`),
preflight: async () => true,
retryMs: TRYFETCH_RETRY_MS,
...config,

View File

@ -1,10 +1,10 @@
<script lang="ts">
import CopyButton from '$components/CopyButton.svelte'
import { logger } from '@pockethost/common'
import { LoggerService } from '@pockethost/common'
import { Highlight } from 'svelte-highlight'
import { typescript, type LanguageType } from 'svelte-highlight/languages'
const { dbg } = logger()
const { dbg } = LoggerService()
export let code: string
export let language: LanguageType<'typescript' | 'bash'> = typescript

View File

@ -1,12 +1,12 @@
<script lang="ts">
import TinyButton from '$components/helpers/TinyButton.svelte'
import { logger } from '@pockethost/common'
import { LoggerService } from '@pockethost/common'
export let value: string = ''
export let disabled: boolean = false
export let save: (newValue: string) => Promise<string> = async () => 'saved'
const { dbg, error } = logger().create('MiniEdit.svelte')
const { dbg, error } = LoggerService().create('MiniEdit.svelte')
let msg = ''
let err = ''

View File

@ -2,7 +2,7 @@
import { PUBLIC_ROUTES } from '$src/env'
import { client } from '$src/pocketbase'
import { getRouter } from '$util/utilities'
import { logger } from '@pockethost/common'
import { LoggerService } from '@pockethost/common'
import { onMount } from 'svelte'
onMount(() => {
@ -12,7 +12,7 @@
const { pathname } = router
if (!PUBLIC_ROUTES.find((matcher) => matcher.match(pathname))) {
const { warn } = logger()
const { warn } = LoggerService()
// Send user to the homepage
warn(`${pathname} is a private route`)
window.location.href = '/'

View File

@ -1,7 +1,7 @@
import { dev } from '$app/environment'
import { env as _env } from '$env/dynamic/public'
import publicRoutes from '$util/public-routes.json'
import { logger } from '@pockethost/common'
import { LoggerService } from '@pockethost/common'
import { boolean } from 'boolean'
import UrlPattern from 'url-pattern'
import base from '../../../package.json'
@ -38,7 +38,7 @@ export const PUBLIC_ROUTES = publicRoutes.map(
)
try {
logger()
LoggerService()
} catch {
logger({ debug: PUBLIC_DEBUG, trace: false, errorTrace: false })
LoggerService({ debug: PUBLIC_DEBUG, trace: false, errorTrace: false })
}

View File

@ -2,6 +2,7 @@ import { createGenericSyncEvent } from '$util/events'
import { fetchEventSource } from '@microsoft/fetch-event-source'
import {
CreateInstancePayloadSchema,
LoggerService,
RenameInstancePayloadSchema,
RpcCommands,
SaveSecretsPayloadSchema,
@ -10,7 +11,6 @@ import {
assertExists,
createRpcHelper,
createWatchHelper,
logger,
safeCatch,
type CreateInstancePayload,
type CreateInstanceResult,
@ -51,7 +51,7 @@ export type PocketbaseClient = ReturnType<typeof createPocketbaseClient>
export const createPocketbaseClient = (config: PocketbaseClientConfig) => {
const { url } = config
const _logger = logger()
const _logger = LoggerService()
const { dbg, error } = _logger
const client = new PocketBase(url)

View File

@ -1,6 +1,6 @@
import { browser } from '$app/environment'
import { HTTP_PROTOCOL, MOTHERSHIP_DOMAIN } from '$src/env'
import { logger } from '@pockethost/common'
import { LoggerService } from '@pockethost/common'
import {
createPocketbaseClient,
type PocketbaseClient,
@ -11,7 +11,7 @@ export const client = (() => {
return () => {
if (!browser) throw new Error(`PocketBase client not supported in SSR`)
if (clientInstance) return clientInstance
const { info } = logger()
const { info } = LoggerService()
info(`Initializing pocketbase client`)
const url = `${HTTP_PROTOCOL}://${MOTHERSHIP_DOMAIN}`
clientInstance = createPocketbaseClient({ url })

View File

@ -1,8 +1,10 @@
<script lang="ts">
import Card from '$components/cards/Card.svelte'
import CardHeader from '$components/cards/CardHeader.svelte'
import { client } from '$src/pocketbase'
import {
LoggerService,
createCleanupManager,
logger,
type InstanceLogFields,
type RecordId,
} from '@pockethost/common'
@ -10,10 +12,8 @@
import { onDestroy, onMount } from 'svelte'
import { writable } from 'svelte/store'
import { instance } from './store'
import Card from '$components/cards/Card.svelte'
import CardHeader from '$components/cards/CardHeader.svelte'
const { dbg, trace } = logger().create(`Logging.svelte`)
const { dbg, trace } = LoggerService().create(`Logging.svelte`)
$: ({ id } = $instance)

View File

@ -1,9 +1,11 @@
<script lang="ts">
import Card from '$components/cards/Card.svelte'
import CardHeader from '$components/cards/CardHeader.svelte'
import CodeSample from '$components/CodeSample.svelte'
import { client } from '$src/pocketbase'
import {
createCleanupManager,
logger,
LoggerService,
type SaveSecretsPayload,
} from '@pockethost/common'
import { forEach, reduce } from '@s-libs/micro-dash'
@ -12,8 +14,6 @@
import Form from './Form.svelte'
import List from './List.svelte'
import { items } from './stores'
import Card from '$components/cards/Card.svelte'
import CardHeader from '$components/cards/CardHeader.svelte'
// TODO: Hot Reload is causing an infinite loop in the network tab for some reason. Wasn't able to figure out why
@ -27,7 +27,7 @@
activeTab = id
}
const { dbg } = logger().create(`Secrets.svelte`)
const { dbg } = LoggerService().create(`Secrets.svelte`)
const cm = createCleanupManager()

View File

@ -1,4 +1,4 @@
import { logger } from '@pockethost/common'
import { LoggerService } from '@pockethost/common'
import { scaleOrdinal } from 'd3-scale'
import { schemeTableau10 } from 'd3-scale-chromatic'
import { writable } from 'svelte/store'
@ -36,7 +36,7 @@ const sanitize = (item: SecretItem) => {
// create a custom store fulfilling the CRUD operations
function createItems(initialItems: SecretsArray) {
const { dbg } = logger().create(`Secrets/store.ts`)
const { dbg } = LoggerService().create(`Secrets/store.ts`)
const { subscribe, set, update } = writable(initialItems)

View File

@ -1,12 +1,12 @@
import { goto } from '$app/navigation'
import { client } from '$src/pocketbase'
import { logger } from '@pockethost/common'
import { LoggerService } from '@pockethost/common'
export type FormErrorHandler = (value: string) => void
export const handleFormError = (e: Error, setError?: FormErrorHandler) => {
const { parseError } = client()
const { dbg, error, warn } = logger()
const { dbg, error, warn } = LoggerService()
error(`Form error: ${e}`, { error: e })
if (setError) {
@ -174,7 +174,7 @@ export const handleInstanceGeneratorWidget = async (
instanceName: string,
setError = (value: string) => {},
) => {
const { dbg, error, warn } = logger()
const { dbg, error, warn } = LoggerService()
const { user, parseError } = client()
try {

View File

@ -3,14 +3,14 @@ import { client } from '$src/pocketbase'
import { instance } from '$src/routes/app/instances/[instanceId]/store'
import { globalInstancesStore } from '$util/stores'
import {
LoggerService,
assertExists,
createCleanupManager,
logger,
type InstanceFields,
} from '@pockethost/common'
import { onDestroy, onMount } from 'svelte'
const { error } = logger()
const { error } = LoggerService()
const cm = createCleanupManager()
export const getInstances = async () => {
@ -46,7 +46,7 @@ export const getInstances = async () => {
export const getSingleInstance = async (instanceId: string) => {
// Only run this on the browser
if (browser) {
const { dbg, error } = logger().create(`layout.svelte`)
const { dbg, error } = LoggerService().create(`layout.svelte`)
const { watchInstanceById } = client()

View File

@ -2,7 +2,7 @@ import { browser } from '$app/environment'
import { client } from '$src/pocketbase'
import type { AuthStoreProps } from '$src/pocketbase/PocketbaseClient'
import {
logger,
LoggerService,
type InstanceFields,
type InstanceId,
} from '@pockethost/common'
@ -25,7 +25,7 @@ if (browser) {
* Listen for auth change events. When we get at least one, the auth state is initialized.
*/
onAuthChange((authStoreProps) => {
const { dbg } = logger()
const { dbg } = LoggerService()
dbg(`onAuthChange in store`, { ...authStoreProps })
authStoreState.set(authStoreProps)
isAuthStateInitialized.set(true)
@ -33,7 +33,7 @@ if (browser) {
// Update derived stores when authStore changes
authStoreState.subscribe((authStoreProps) => {
const { dbg } = logger()
const { dbg } = LoggerService()
dbg(`subscriber change`, authStoreProps)
isUserLoggedIn.set(authStoreProps.isValid)
isUserVerified.set(!!authStoreProps.model?.verified)