From 5cfe3eab63a62204e130b9785f72296259fe5150 Mon Sep 17 00:00:00 2001 From: arily Date: Wed, 26 Jul 2023 10:05:04 +0900 Subject: [PATCH] detect --- package.json | 2 +- src/server/trpc/middleware/session.ts | 78 ++------------------------- src/server/utils/detect-device.ts | 73 +++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 76 deletions(-) create mode 100644 src/server/utils/detect-device.ts diff --git a/package.json b/package.json index 2572e359..c377eb57 100755 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "start:prod": "dotenv -e .env node .output/server/index.mjs", "start:dev:inspect": "dotenv -e .env node -- --inspect .output/server/index.mjs", "analyze": "nuxi analyze", - "postinstall": "nuxi prepare", + "postinstall": "yarn build:gen & nuxi prepare", "typecheck": "nuxi typecheck", "lint": "eslint --ext '.js,.vue,.ts,.jsx,.tsx' --ignore-path .gitignore .", "lint:fix": "yarn lint --fix", diff --git a/src/server/trpc/middleware/session.ts b/src/server/trpc/middleware/session.ts index 68e7a53a..c9a6ea18 100644 --- a/src/server/trpc/middleware/session.ts +++ b/src/server/trpc/middleware/session.ts @@ -1,85 +1,13 @@ import { TRPCError } from '@trpc/server' -import type { H3Event } from 'h3' import { setCookie } from 'h3' -import { UAParser } from 'ua-parser-js' import { publicProcedure } from '../trpc' import { unableToRefreshToken } from '../messages' + import { SessionProvider } from '$active/server' -import type { Session } from '$base/server/session' -import { Client, OS } from '~/def/device' const sessionProvider = new SessionProvider() -// TODO finish me -function createSession(e: H3Event) { - const ua = getRequestHeader(e, 'User-Agent') - const r: Omit, 'lastSeen'> = { - OS: OS.Unknown, - client: Client.Unknown, - } - if (!ua) { - return r - } - const res = UAParser(ua) - - switch (res.os.name) { - case 'Windows': { - r.OS = OS.Windows - break - } - case 'Mac OS': { - if (res.device.type === 'tablet') { - r.OS = OS.iPadOS - } - else { - r.OS = OS.macOS - } - break - } - case 'iOS': { - r.OS = OS.iOS - break - } - // case 'iPadOS': { - // r.OS = OS.iPadOS - // break - // } - case 'Android': { - r.OS = OS.Android - break - } - case 'Chromium OS': { - r.OS = OS.ChromeOS - break - } - case 'Linux': - case 'GNU': - case 'Debian': - case 'Arch': - case 'CentOS': - case 'Fedora': - case 'Gentoo': - case 'Mint': - case 'Nintendo': - case 'PCLinuxOS': - case 'RedHat': - case 'SUSE': - case 'Tizen': - case 'Ubuntu': - case 'VectorLinux': - { - r.OS = OS.Linux - } - } - - if (res.browser.name) { - r.client = Client.Browser - } - - return r -} - const config = { httpOnly: true, } @@ -87,7 +15,7 @@ const config = { export const sessionProcedure = publicProcedure .use(async ({ ctx, next }) => { if (!ctx.session.id) { - const sessionId = await sessionProvider.create(createSession(ctx.h3Event)) + const sessionId = await sessionProvider.create(detectDevice(ctx.h3Event)) setCookie(ctx.h3Event, 'session', sessionId, config) return await next({ ctx: Object.assign(ctx, { @@ -99,7 +27,7 @@ export const sessionProcedure = publicProcedure } const session = await sessionProvider.get(ctx.session.id) if (session == null) { - const sessionId = await sessionProvider.create(createSession(ctx.h3Event)) + const sessionId = await sessionProvider.create(detectDevice(ctx.h3Event)) setCookie(ctx.h3Event, 'session', sessionId, config) return await next({ ctx: Object.assign(ctx, { diff --git a/src/server/utils/detect-device.ts b/src/server/utils/detect-device.ts new file mode 100644 index 00000000..890aec96 --- /dev/null +++ b/src/server/utils/detect-device.ts @@ -0,0 +1,73 @@ +import type { H3Event } from 'h3' +import { UAParser } from 'ua-parser-js' +import type { Session } from '$base/server/session' +import { Client, OS } from '~/def/device' + +// TODO finish me +export function detectDevice(e: H3Event) { + const ua = getRequestHeader(e, 'User-Agent') + const r: Omit, 'lastSeen'> = { + OS: OS.Unknown, + client: Client.Unknown, + } + if (!ua) { + return r + } + const res = UAParser(ua) + + switch (res.os.name) { + case 'Windows': { + r.OS = OS.Windows + break + } + case 'Mac OS': { + if (res.device.type === 'tablet') { + r.OS = OS.iPadOS + } + else { + r.OS = OS.macOS + } + break + } + case 'iOS': { + r.OS = OS.iOS + break + } + // case 'iPadOS': { + // r.OS = OS.iPadOS + // break + // } + case 'Android': { + r.OS = OS.Android + break + } + case 'Chromium OS': { + r.OS = OS.ChromeOS + break + } + case 'Linux': + case 'GNU': + case 'Debian': + case 'Arch': + case 'CentOS': + case 'Fedora': + case 'Gentoo': + case 'Mint': + case 'Nintendo': + case 'PCLinuxOS': + case 'RedHat': + case 'SUSE': + case 'Tizen': + case 'Ubuntu': + case 'VectorLinux': + { + r.OS = OS.Linux + } + } + + if (res.browser.name) { + r.client = Client.Browser + } + + return r +}