feat: add main portfolio server
This commit is contained in:
parent
ffbdc9c4e6
commit
16c686a0bf
14
deno.json
Normal file
14
deno.json
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
{
|
||||||
|
"tasks": {
|
||||||
|
"serve": "deno run --allow-net=\"https://git.cohabit.fr,localhost:$PORT,127.0.0.1:$PORT,0.0.0.0:$PORT\" ./server.ts"
|
||||||
|
},
|
||||||
|
"fmt": {
|
||||||
|
"singleQuote": true,
|
||||||
|
"semiColons": false,
|
||||||
|
"useTabs": true
|
||||||
|
},
|
||||||
|
"imports": {
|
||||||
|
"@std/media-types": "jsr:@std/media-types@^0.224.1",
|
||||||
|
"@std/path": "jsr:@std/path@^0.225.2"
|
||||||
|
}
|
||||||
|
}
|
27
deno.lock
Normal file
27
deno.lock
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
{
|
||||||
|
"version": "3",
|
||||||
|
"packages": {
|
||||||
|
"specifiers": {
|
||||||
|
"jsr:@std/assert@^0.226.0": "jsr:@std/assert@0.226.0",
|
||||||
|
"jsr:@std/path@^0.225.2": "jsr:@std/path@0.225.2"
|
||||||
|
},
|
||||||
|
"jsr": {
|
||||||
|
"@std/assert@0.226.0": {
|
||||||
|
"integrity": "0dfb5f7c7723c18cec118e080fec76ce15b4c31154b15ad2bd74822603ef75b3"
|
||||||
|
},
|
||||||
|
"@std/path@0.225.2": {
|
||||||
|
"integrity": "0f2db41d36b50ef048dcb0399aac720a5348638dd3cb5bf80685bf2a745aa506",
|
||||||
|
"dependencies": [
|
||||||
|
"jsr:@std/assert@^0.226.0"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"remote": {},
|
||||||
|
"workspace": {
|
||||||
|
"dependencies": [
|
||||||
|
"jsr:@std/media-types@^0.224.1",
|
||||||
|
"jsr:@std/path@^0.225.2"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
39
server.ts
Normal file
39
server.ts
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
import { contentType } from '@std/media-types'
|
||||||
|
import { extname } from '@std/path'
|
||||||
|
import { getBaseUrl, getSourceUrl } from './src/url_utils.ts'
|
||||||
|
import { toUser, toUserDomain } from './src/user_utils.ts'
|
||||||
|
|
||||||
|
Deno.serve({ port: Number(Deno.env.get('PORT') ?? 8000) }, async (req) => {
|
||||||
|
const reqUrl = new URL(req.url)
|
||||||
|
|
||||||
|
// Get and check user-domain and user-login
|
||||||
|
const rawUserDomain = reqUrl.hostname.split('.')[0]
|
||||||
|
const userDomain = toUserDomain(rawUserDomain)
|
||||||
|
const user = toUser(userDomain)
|
||||||
|
|
||||||
|
console.log(`Getting portfolio of > @${user}`)
|
||||||
|
|
||||||
|
// Get relative source path
|
||||||
|
const filePath = `.${reqUrl.pathname}`
|
||||||
|
|
||||||
|
// Get source base url ("/dist" if available, "/" else)
|
||||||
|
const baseUrl = await getBaseUrl(user)
|
||||||
|
const fileUrl = getSourceUrl(filePath, baseUrl)
|
||||||
|
|
||||||
|
// Get source and mime type
|
||||||
|
const response = await fetch(fileUrl)
|
||||||
|
const ext = extname(fileUrl.pathname)
|
||||||
|
const mimeType = contentType(ext) ?? 'text/plain; charset=utf-8' // Assume plain text as default.
|
||||||
|
|
||||||
|
if (response.ok) {
|
||||||
|
// Update content-type if not bin file
|
||||||
|
if (response.headers.get('Content-Type') !== 'application/octet-stream') {
|
||||||
|
response.headers.set('Content-Type', mimeType)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stream original file to user
|
||||||
|
return response
|
||||||
|
}
|
||||||
|
|
||||||
|
return response
|
||||||
|
})
|
Loading…
Reference in a new issue