commit 499af1a6dd7cf64a35a12d3eaf915bafb4a755bc Author: Malted Date: Sun Mar 30 17:25:06 2025 -0400 Initial commit diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..afb03d4 --- /dev/null +++ b/Dockerfile @@ -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" ] + diff --git a/index.ts b/index.ts new file mode 100644 index 0000000..b665b85 --- /dev/null +++ b/index.ts @@ -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) + } + } +}) +