diff --git a/server/utils/access-log.ts b/server/utils/access-log.ts index c79de32..2db2a55 100644 --- a/server/utils/access-log.ts +++ b/server/utils/access-log.ts @@ -36,27 +36,59 @@ export const blobsMap = { blob15: 'deviceType', } as const +export const doublesMap = { + double1: 'latitude', + double2: 'longitude', +} as const + export type BlobsMap = typeof blobsMap export type BlobsKey = keyof BlobsMap -export type LogsKey = BlobsMap[BlobsKey] -export type LogsMap = { [key in LogsKey]: string | undefined } -export const logsMap: LogsMap = Object.entries(blobsMap).reduce((acc, [k, v]) => ({ ...acc, [v]: k }), {}) as LogsMap +export type DoublesMap = typeof doublesMap +export type DoublesKey = keyof DoublesMap + +export type LogsKey = BlobsMap[BlobsKey] | DoublesMap[DoublesKey] +export type LogsMap = { + [key in BlobsMap[BlobsKey]]: string | undefined +} & { + [key in DoublesMap[DoublesKey]]?: number | undefined +} + +export const logsMap = { + ...Object.entries(blobsMap).reduce((acc, [k, v]) => ({ ...acc, [v]: k }), {}), + ...Object.entries(doublesMap).reduce((acc, [k, v]) => ({ ...acc, [v]: k }), {}), +} as LogsMap function logs2blobs(logs: LogsMap) { - // @ts-expect-error todo - return Object.keys(blobsMap).sort((a, b) => toBlobNumber(a) - toBlobNumber(b)).map(key => logs[blobsMap[key]] || '') + return (Object.keys(blobsMap) as BlobsKey[]) + .sort((a, b) => toBlobNumber(a) - toBlobNumber(b)) + .map(key => String(logs[blobsMap[key] as LogsKey] || '')) } function blobs2logs(blobs: string[]) { const logsList = Object.keys(blobsMap) - // @ts-expect-error todo - return blobs.reduce((logs: LogsMap, blob, i) => { - // @ts-expect-error todo - logs[blobsMap[logsList[i]]] = blob + return blobs.reduce((logs, blob, i) => { + const key = blobsMap[logsList[i] as BlobsKey] + logs[key] = blob return logs - }, {}) + }, {} as Partial) +} + +function logs2doubles(logs: LogsMap) { + return (Object.keys(doublesMap) as DoublesKey[]) + .sort((a, b) => toBlobNumber(a) - toBlobNumber(b)) + .map(key => Number(logs[doublesMap[key] as LogsKey] || 0)) +} + +function doubles2logs(doubles: number[]) { + const logsList = Object.keys(doublesMap) + + return doubles.reduce((logs, double, i) => { + const key = doublesMap[logsList[i] as DoublesKey] + logs[key] = double + return logs + }, {} as Partial) } export function useAccessLog(event: H3Event) { @@ -108,16 +140,21 @@ export function useAccessLog(event: H3Event) { browserType: uaInfo?.browser?.type, device: uaInfo?.device?.model, deviceType: uaInfo?.device?.type, + + // For RealTime Globe + latitude: Number(cf?.latitude || getHeader(event, 'cf-iplatitude') || 0), + longitude: Number(cf?.longitude || getHeader(event, 'cf-iplongitude') || 0), } if (process.env.NODE_ENV === 'production') { return hubAnalytics().put({ indexes: [link.id], // only one index blobs: logs2blobs(accessLogs), + doubles: logs2doubles(accessLogs), }) } else { - console.log('access logs:', logs2blobs(accessLogs), blobs2logs(logs2blobs(accessLogs))) + console.log('access logs:', accessLogs, logs2blobs(accessLogs), logs2doubles(accessLogs), { ...blobs2logs(logs2blobs(accessLogs)), ...doubles2logs(logs2doubles(accessLogs)) }) return Promise.resolve() } }