71 lines
1.9 KiB
TypeScript
71 lines
1.9 KiB
TypeScript
import { join } from 'path'
|
|
|
|
// Middleware to intercept requests and proxy if certain conditions are met
|
|
const config = {
|
|
endpoint: process.env.AWS_ENDPOINT,
|
|
region: process.env.AWS_REGION,
|
|
credentials: {
|
|
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
|
|
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
|
|
},
|
|
}
|
|
|
|
const S3_BUCKET_NAME = process.env.S3_BUCKET_NAME
|
|
|
|
const fs = require('@cyclic.sh/s3fs')(S3_BUCKET_NAME, config)
|
|
const PROXY_PREFIX = '/v1/fs'
|
|
const PROXY_ROUTES = ['/threads', '/messages']
|
|
|
|
export const s3 = (req: any, reply: any, done: any) => {
|
|
// Proxy FS requests to S3 using S3FS
|
|
if (req.url.startsWith(PROXY_PREFIX)) {
|
|
const route = req.url.split('/').pop()
|
|
const args = parseRequestArgs(req)
|
|
|
|
// Proxy matched requests to the s3fs module
|
|
if (args.length && PROXY_ROUTES.some((route) => args[0].includes(route))) {
|
|
try {
|
|
// Handle customized route
|
|
// S3FS does not handle appendFileSync
|
|
if (route === 'appendFileSync') {
|
|
let result = handAppendFileSync(args)
|
|
|
|
reply.status(200).send(result)
|
|
return
|
|
}
|
|
// Reroute the other requests to the s3fs module
|
|
const result = fs[route](...args)
|
|
reply.status(200).send(result)
|
|
return
|
|
} catch (ex) {
|
|
console.log(ex)
|
|
}
|
|
}
|
|
}
|
|
// Let other requests go through
|
|
done()
|
|
}
|
|
|
|
const parseRequestArgs = (req: Request) => {
|
|
const {
|
|
getJanDataFolderPath,
|
|
normalizeFilePath,
|
|
} = require('@janhq/core/node')
|
|
|
|
return JSON.parse(req.body as any).map((arg: any) =>
|
|
typeof arg === 'string' &&
|
|
(arg.startsWith(`file:/`) || arg.startsWith(`file:\\`))
|
|
? join(getJanDataFolderPath(), normalizeFilePath(arg))
|
|
: arg
|
|
)
|
|
}
|
|
|
|
const handAppendFileSync = (args: any[]) => {
|
|
if (fs.existsSync(args[0])) {
|
|
const data = fs.readFileSync(args[0], 'utf-8')
|
|
return fs.writeFileSync(args[0], data + args[1])
|
|
} else {
|
|
return fs.writeFileSync(args[0], args[1])
|
|
}
|
|
}
|