Dockerfile was incorrect, trying to fix this and expose a testing method on server as I am having issues with M1 processor with puppeteer as well
This commit is contained in:
parent
c0a8e61187
commit
a8927c655a
7 changed files with 83 additions and 13 deletions
|
|
@ -17,7 +17,8 @@ COPY --chown=node:node src src
|
|||
COPY --chown=node:node tsconfig.json tsconfig.json
|
||||
RUN npm run build
|
||||
|
||||
FROM node:18 as dependencies
|
||||
FROM node:18 as app
|
||||
LABEL org.opencontainers.image.source https://github.com/cgduncan7/autobaan
|
||||
|
||||
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD true
|
||||
ENV PUPPETEER_EXECUTABLE_PATH /usr/bin/chromium
|
||||
|
|
@ -28,6 +29,7 @@ RUN npm i -g node-gyp
|
|||
WORKDIR /app
|
||||
RUN chown -R node:node .
|
||||
|
||||
COPY --from=builder /app/dist ./dist
|
||||
COPY --chown=node:node package.json package.json
|
||||
COPY --chown=node:node package-lock.json package-lock.json
|
||||
|
||||
|
|
@ -35,10 +37,5 @@ USER node
|
|||
|
||||
RUN CXX=g++-12 npm install --omit=dev
|
||||
|
||||
FROM dependencies as app
|
||||
LABEL org.opencontainers.image.source https://github.com/cgduncan7/autobaan
|
||||
|
||||
COPY --from=builder /app/dist ./dist
|
||||
|
||||
EXPOSE 3000
|
||||
ENTRYPOINT node dist/server/index.js
|
||||
|
|
@ -8,7 +8,9 @@ const getDatabase = () => new sqlite.Database(resolve('./db/autobaan_db'))
|
|||
export const run = async (sql: string, params?: unknown) => {
|
||||
const db = getDatabase()
|
||||
await new Promise<void>((res, rej) => {
|
||||
asyncLocalStorage.getStore()?.debug(`<database> run ~> ${sql.replace(/\s*\n\s*/g, ' ')} (${params})`)
|
||||
asyncLocalStorage
|
||||
.getStore()
|
||||
?.debug(`<database> run ~> ${sql.replace(/\s*\n\s*/g, ' ')} (${params})`)
|
||||
db.run(sql, params, (err) => {
|
||||
if (err) rej(err)
|
||||
res()
|
||||
|
|
@ -20,13 +22,14 @@ export const run = async (sql: string, params?: unknown) => {
|
|||
export const all = async <T>(sql: string, params?: unknown) => {
|
||||
const db = getDatabase()
|
||||
const rows = await new Promise<T[]>((res, rej) => {
|
||||
asyncLocalStorage.getStore()?.debug(`<database> all ~> ${sql.replace(/\s*\n\s*/g, ' ')} (${params})`)
|
||||
asyncLocalStorage
|
||||
.getStore()
|
||||
?.debug(`<database> all ~> ${sql.replace(/\s*\n\s*/g, ' ')} (${params})`)
|
||||
db.all(sql, params, (err, rows) => {
|
||||
if (err) rej(err)
|
||||
res(rows)
|
||||
})
|
||||
}
|
||||
)
|
||||
})
|
||||
db.close()
|
||||
return rows
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,7 +8,6 @@ const getRunner = () => {
|
|||
if (!runner) {
|
||||
runner = new Runner({
|
||||
headless: true,
|
||||
args: ['--no-sandbox', '--disable-setuid-sandbox'],
|
||||
})
|
||||
}
|
||||
return runner
|
||||
|
|
|
|||
|
|
@ -35,7 +35,32 @@ export class Runner {
|
|||
BrowserLaunchArgumentOptions &
|
||||
BrowserConnectOptions
|
||||
) {
|
||||
this.options = options
|
||||
const defaultArgs = [
|
||||
'--disable-gpu',
|
||||
'--disable-dev-shm-usage',
|
||||
'--disable-setuid-sandbox',
|
||||
'--no-sandbox',
|
||||
]
|
||||
this.options = { args: defaultArgs, ...options }
|
||||
}
|
||||
|
||||
public async test() {
|
||||
l.getStore()?.debug('Runner test')
|
||||
try {
|
||||
if (!this.browser) {
|
||||
this.browser = await puppeteer.launch(this.options)
|
||||
}
|
||||
} catch (error: unknown) {
|
||||
l.getStore()?.error('Browser error', { error: (error as Error).message })
|
||||
throw new PuppeteerBrowserLaunchError(error as Error)
|
||||
}
|
||||
|
||||
try {
|
||||
this.page = await this.browser?.newPage()
|
||||
} catch (error) {
|
||||
l.getStore()?.error('Page error', { error: (error as Error).message })
|
||||
throw new PuppeteerNewPageError(error as Error)
|
||||
}
|
||||
}
|
||||
|
||||
public async run(reservation: Reservation) {
|
||||
|
|
|
|||
|
|
@ -3,9 +3,11 @@ import { v4 } from 'uuid'
|
|||
import { asyncLocalStorage, Logger, LogLevel } from '../../common/logger'
|
||||
import { CronRouter } from './routes/cron'
|
||||
import { ReservationsRouter } from './routes/reservations'
|
||||
import { RunnerRouter } from './routes/runner'
|
||||
|
||||
const cronRouter = new CronRouter()
|
||||
const reservationsRouter = new ReservationsRouter()
|
||||
const runnerRouter = new RunnerRouter()
|
||||
|
||||
// Handles POST requests to /reservations
|
||||
const server = http.createServer(async (req, res) => {
|
||||
|
|
@ -32,6 +34,10 @@ const server = http.createServer(async (req, res) => {
|
|||
await reservationsRouter.handleRequest(req, res)
|
||||
break
|
||||
}
|
||||
case /^\/runner/.test(url): {
|
||||
await runnerRouter.handleRequest(req, res)
|
||||
break
|
||||
}
|
||||
default: {
|
||||
logger?.info('Not found', { url, method, location: 'root' })
|
||||
res.writeHead(404, 'Not found')
|
||||
|
|
|
|||
|
|
@ -63,7 +63,11 @@ export class ReservationsRouter extends Router {
|
|||
date = dayjs(rawDate)
|
||||
}
|
||||
|
||||
l.getStore()?.debug('Fetching reservations', { pageNumber, pageSize, date: date?.format() })
|
||||
l.getStore()?.debug('Fetching reservations', {
|
||||
pageNumber,
|
||||
pageSize,
|
||||
date: date?.format(),
|
||||
})
|
||||
|
||||
try {
|
||||
let reservations: Reservation[]
|
||||
|
|
|
|||
36
src/server/http/routes/runner.ts
Normal file
36
src/server/http/routes/runner.ts
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
import { IncomingMessage, ServerResponse } from 'http'
|
||||
import { asyncLocalStorage as l } from '../../../common/logger'
|
||||
import { Router } from './index'
|
||||
import { getStatus, startTasks, stopTasks } from '../../cron'
|
||||
import { Runner } from '../../../common/runner'
|
||||
|
||||
export class RunnerRouter extends Router {
|
||||
public async handleRequest(
|
||||
req: IncomingMessage,
|
||||
res: ServerResponse<IncomingMessage>
|
||||
) {
|
||||
const { url = '', method } = req
|
||||
const [route] = url.split('?')
|
||||
switch (true) {
|
||||
case /^\/runner\/test$/.test(route) && method === 'GET': {
|
||||
await this.GET_runner_test(req, res)
|
||||
break
|
||||
}
|
||||
default: {
|
||||
this.handle404(req, res)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private async GET_runner_test(
|
||||
_req: IncomingMessage,
|
||||
res: ServerResponse<IncomingMessage>
|
||||
) {
|
||||
try {
|
||||
await new Runner({ headless: false }).test()
|
||||
res.writeHead(200, 'OK')
|
||||
} catch (e) {
|
||||
res.writeHead(500, 'Internal server error')
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue