Initial commit

This commit is contained in:
Malted 2025-03-30 17:25:06 -04:00
commit 499af1a6dd
No known key found for this signature in database
2 changed files with 97 additions and 0 deletions

39
Dockerfile Normal file
View file

@ -0,0 +1,39 @@
# use the official Bun image
# see all versions at https://hub.docker.com/r/oven/bun/tags
FROM oven/bun:1 AS base
WORKDIR /usr/src/app
# install dependencies into temp directory
# this will cache them and speed up future builds
FROM base AS install
RUN mkdir -p /temp/dev
COPY package.json bun.lock /temp/dev/
RUN cd /temp/dev && bun install --frozen-lockfile
# install with --production (exclude devDependencies)
RUN mkdir -p /temp/prod
COPY package.json bun.lock /temp/prod/
RUN cd /temp/prod && bun install --frozen-lockfile --production
# copy node_modules from temp directory
# then copy all (non-ignored) project files into the image
FROM base AS prerelease
COPY --from=install /temp/dev/node_modules node_modules
COPY . .
# [optional] tests & build
ENV NODE_ENV=production
RUN bun test
RUN bun run build
# copy production dependencies and source code into final image
FROM base AS release
COPY --from=install /temp/prod/node_modules node_modules
COPY --from=prerelease /usr/src/app/index.ts .
COPY --from=prerelease /usr/src/app/package.json .
# run the app
USER bun
EXPOSE 3000/tcp
ENTRYPOINT [ "bun", "run", "index.ts" ]

58
index.ts Normal file
View file

@ -0,0 +1,58 @@
import { sql } from "bun";
async function q(ip: string) {
return await sql`
select
net.network,
is_anonymous_proxy,
is_satellite_provider,
postal_code,
latitude,
longitude,
accuracy_radius,
is_anycast,
locale_code,
continent_code,
continent_name,
country_iso_code,
country_name,
subdivision_1_iso_code,
subdivision_1_name,
subdivision_2_iso_code,
subdivision_2_name,
city_name,
metro_code,
time_zone,
is_in_european_union,
autonomous_system_organization as isp_name
from geoip2_network net
left join geoip2_location location on (
net.geoname_id = location.geoname_id
)
left join geoip2_asn asn on (
asn.network >>= net.network
)
where net.network >>= ${ip};`
}
Bun.serve({
routes: {
"/ip": async (req, server) => {
const start = performance.now()
const ip = server.requestIP(req)
console.log({ip})
const [ipRes] = await q(ip.address)
console.log(Math.round(performance.now() - start) + " ms")
return Response.json(ipRes)
},
"/ip/:ip": async ({ params }) => {
const start = performance.now()
const [ipRes] = await q(params.ip)
console.log(Math.round(performance.now() - start) + " ms")
return Response.json(ipRes)
}
}
})