Skip to content

Commit

Permalink
detect
Browse files Browse the repository at this point in the history
  • Loading branch information
arily committed Jul 26, 2023
1 parent 16dbac8 commit 5cfe3ea
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 76 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
78 changes: 3 additions & 75 deletions src/server/trpc/middleware/session.ts
Original file line number Diff line number Diff line change
@@ -1,93 +1,21 @@
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<Session<string>, '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,
}

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, {
Expand All @@ -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, {
Expand Down
73 changes: 73 additions & 0 deletions src/server/utils/detect-device.ts
Original file line number Diff line number Diff line change
@@ -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<Session<string>, '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
}

0 comments on commit 5cfe3ea

Please sign in to comment.