This commit is contained in:
commit
8183adc15e
18
.dockerignore
Normal file
18
.dockerignore
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
.kpt-pipeline/
|
||||||
|
k8s/
|
||||||
|
skaffold.yaml
|
||||||
|
README.md
|
||||||
|
.git/
|
||||||
|
node_modules/
|
||||||
|
.drone.yml
|
||||||
|
|
||||||
|
# Editor directories and files
|
||||||
|
.vscode/*
|
||||||
|
!.vscode/extensions.json
|
||||||
|
.idea
|
||||||
|
*.suo
|
||||||
|
*.ntvs*
|
||||||
|
*.njsproj
|
||||||
|
*.sln
|
||||||
|
*.sw?
|
||||||
|
*.kpt-pipeline
|
2
.drone.yml
Normal file
2
.drone.yml
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
kind: template
|
||||||
|
load: docker.yaml
|
174
.gitignore
vendored
Normal file
174
.gitignore
vendored
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore
|
||||||
|
|
||||||
|
# Logs
|
||||||
|
|
||||||
|
logs
|
||||||
|
_.log
|
||||||
|
npm-debug.log_
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
.pnpm-debug.log*
|
||||||
|
|
||||||
|
# Diagnostic reports (https://nodejs.org/api/report.html)
|
||||||
|
|
||||||
|
report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json
|
||||||
|
|
||||||
|
# Runtime data
|
||||||
|
|
||||||
|
pids
|
||||||
|
_.pid
|
||||||
|
_.seed
|
||||||
|
\*.pid.lock
|
||||||
|
|
||||||
|
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||||
|
|
||||||
|
lib-cov
|
||||||
|
|
||||||
|
# Coverage directory used by tools like istanbul
|
||||||
|
|
||||||
|
coverage
|
||||||
|
\*.lcov
|
||||||
|
|
||||||
|
# nyc test coverage
|
||||||
|
|
||||||
|
.nyc_output
|
||||||
|
|
||||||
|
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
||||||
|
|
||||||
|
.grunt
|
||||||
|
|
||||||
|
# Bower dependency directory (https://bower.io/)
|
||||||
|
|
||||||
|
bower_components
|
||||||
|
|
||||||
|
# node-waf configuration
|
||||||
|
|
||||||
|
.lock-wscript
|
||||||
|
|
||||||
|
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||||
|
|
||||||
|
build/Release
|
||||||
|
|
||||||
|
# Dependency directories
|
||||||
|
|
||||||
|
node_modules/
|
||||||
|
jspm_packages/
|
||||||
|
|
||||||
|
# Snowpack dependency directory (https://snowpack.dev/)
|
||||||
|
|
||||||
|
web_modules/
|
||||||
|
|
||||||
|
# TypeScript cache
|
||||||
|
|
||||||
|
\*.tsbuildinfo
|
||||||
|
|
||||||
|
# Optional npm cache directory
|
||||||
|
|
||||||
|
.npm
|
||||||
|
|
||||||
|
# Optional eslint cache
|
||||||
|
|
||||||
|
.eslintcache
|
||||||
|
|
||||||
|
# Optional stylelint cache
|
||||||
|
|
||||||
|
.stylelintcache
|
||||||
|
|
||||||
|
# Microbundle cache
|
||||||
|
|
||||||
|
.rpt2_cache/
|
||||||
|
.rts2_cache_cjs/
|
||||||
|
.rts2_cache_es/
|
||||||
|
.rts2_cache_umd/
|
||||||
|
|
||||||
|
# Optional REPL history
|
||||||
|
|
||||||
|
.node_repl_history
|
||||||
|
|
||||||
|
# Output of 'npm pack'
|
||||||
|
|
||||||
|
\*.tgz
|
||||||
|
|
||||||
|
# Yarn Integrity file
|
||||||
|
|
||||||
|
.yarn-integrity
|
||||||
|
|
||||||
|
# dotenv environment variable files
|
||||||
|
|
||||||
|
.env
|
||||||
|
.env.development.local
|
||||||
|
.env.test.local
|
||||||
|
.env.production.local
|
||||||
|
.env.local
|
||||||
|
|
||||||
|
# parcel-bundler cache (https://parceljs.org/)
|
||||||
|
|
||||||
|
.cache
|
||||||
|
.parcel-cache
|
||||||
|
|
||||||
|
# Next.js build output
|
||||||
|
|
||||||
|
.next
|
||||||
|
out
|
||||||
|
|
||||||
|
# Nuxt.js build / generate output
|
||||||
|
|
||||||
|
.nuxt
|
||||||
|
dist
|
||||||
|
|
||||||
|
# Gatsby files
|
||||||
|
|
||||||
|
.cache/
|
||||||
|
|
||||||
|
# Comment in the public line in if your project uses Gatsby and not Next.js
|
||||||
|
|
||||||
|
# https://nextjs.org/blog/next-9-1#public-directory-support
|
||||||
|
|
||||||
|
# public
|
||||||
|
|
||||||
|
# vuepress build output
|
||||||
|
|
||||||
|
.vuepress/dist
|
||||||
|
|
||||||
|
# vuepress v2.x temp and cache directory
|
||||||
|
|
||||||
|
.temp
|
||||||
|
.cache
|
||||||
|
|
||||||
|
# Docusaurus cache and generated files
|
||||||
|
|
||||||
|
.docusaurus
|
||||||
|
|
||||||
|
# Serverless directories
|
||||||
|
|
||||||
|
.serverless/
|
||||||
|
|
||||||
|
# FuseBox cache
|
||||||
|
|
||||||
|
.fusebox/
|
||||||
|
|
||||||
|
# DynamoDB Local files
|
||||||
|
|
||||||
|
.dynamodb/
|
||||||
|
|
||||||
|
# TernJS port file
|
||||||
|
|
||||||
|
.tern-port
|
||||||
|
|
||||||
|
# Stores VSCode versions used for testing VSCode extensions
|
||||||
|
|
||||||
|
.vscode-test
|
||||||
|
|
||||||
|
# yarn v2
|
||||||
|
|
||||||
|
.yarn/cache
|
||||||
|
.yarn/unplugged
|
||||||
|
.yarn/build-state.yml
|
||||||
|
.yarn/install-state.gz
|
||||||
|
.pnp.\*
|
||||||
|
|
||||||
|
|
||||||
|
.vscode
|
||||||
|
.idea/
|
||||||
|
node_nodules/
|
19
Dockerfile
Normal file
19
Dockerfile
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# pull official node image
|
||||||
|
FROM harbor.k-space.ee/docker.io/library/node:19
|
||||||
|
|
||||||
|
# define /app as working directory
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# copy package.json and package-lock.json to /app
|
||||||
|
COPY package.json /app
|
||||||
|
# COPY bun.lockb /app
|
||||||
|
|
||||||
|
# install node dependencies
|
||||||
|
# RUN bun install
|
||||||
|
RUN yarn install --production
|
||||||
|
COPY . /app
|
||||||
|
|
||||||
|
# bun install doesnt work in Docker for some reason: https://github.com/oven-sh/bun/issues/1590
|
||||||
|
FROM jarredsumner/bun:0.2.0 AS run
|
||||||
|
COPY --from=0 /app /app
|
||||||
|
ENTRYPOINT bun run index.ts
|
19
README.md
Normal file
19
README.md
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# camtiler-event-broker
|
||||||
|
|
||||||
|
Microservice to alter Camtiler log rows by creating presigned screenshot URLs.
|
||||||
|
|
||||||
|
Based on the novel, but experimental Bun runtime: https://github.com/oven-sh/bun/
|
||||||
|
|
||||||
|
To install dependencies:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bun install
|
||||||
|
```
|
||||||
|
|
||||||
|
To run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bun run index.ts
|
||||||
|
```
|
||||||
|
|
||||||
|
This project was created using `bun init` in bun v0.3.0. [Bun](https://bun.sh) is a fast all-in-one JavaScript runtime.
|
59
index.ts
Normal file
59
index.ts
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
import {HttpRequest} from "@aws-sdk/protocol-http";
|
||||||
|
import {S3RequestPresigner} from "@aws-sdk/s3-request-presigner";
|
||||||
|
import {parseUrl} from "@aws-sdk/url-parser";
|
||||||
|
import {Hash} from "@aws-sdk/hash-node";
|
||||||
|
import {fromEnv} from "@aws-sdk/credential-provider-env";
|
||||||
|
import {formatUrl} from "@aws-sdk/util-format-url";
|
||||||
|
|
||||||
|
// Minio set-up variables
|
||||||
|
const minioSchema = process.env.MINIO_SCHEMA;
|
||||||
|
const minioHostname = process.env.MINIO_HOSTNAME;
|
||||||
|
const minioPort = process.env.MINIO_PORT;
|
||||||
|
const minioBucket = process.env.MINIO_BUCKET;
|
||||||
|
|
||||||
|
const signer = async function (asset: string) {
|
||||||
|
const baseUrl = minioSchema + '://' + minioHostname + ((minioPort === '443' || minioPort === '80') ? '' : `:${minioPort}`)
|
||||||
|
+ '/' + minioBucket + '/'
|
||||||
|
const s3ObjectUrl = parseUrl(baseUrl + asset);
|
||||||
|
const presigner = new S3RequestPresigner({
|
||||||
|
credentials: fromEnv(), // AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY are read here.
|
||||||
|
region: 'us-east-1',
|
||||||
|
sha256: Hash.bind(null, "sha256"), // In Node.js
|
||||||
|
});
|
||||||
|
// Create a GET request from S3 url.
|
||||||
|
return await presigner.presign(new HttpRequest(s3ObjectUrl));
|
||||||
|
}
|
||||||
|
|
||||||
|
const getPromises = async function (resp: object, path: string): Promise<any> {
|
||||||
|
const screenshots = resp.screenshots ? resp.screenshots : []
|
||||||
|
if (path === '/details/') {
|
||||||
|
return screenshots.map(async (x) => {
|
||||||
|
return {
|
||||||
|
thumb: formatUrl(await signer(`thumb/${x}`)),
|
||||||
|
orig: formatUrl(await signer(`${x}`))
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else if (path === '/initial/' || path === '/query/' || path === '/streaming/') {
|
||||||
|
return screenshots.splice(0, 5).map(async (x) => {
|
||||||
|
return {
|
||||||
|
thumb: formatUrl(await signer(`thumb/${x}`)),
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default {
|
||||||
|
port: 3000,
|
||||||
|
async fetch(request: Request) {
|
||||||
|
let reqUrl = await parseUrl(request.url)
|
||||||
|
let req = await request.json();
|
||||||
|
|
||||||
|
return Promise.all(await getPromises(req, reqUrl.path)).then((r) => {
|
||||||
|
let resp = Object.assign({}, req)
|
||||||
|
resp.screenshots = r
|
||||||
|
return resp
|
||||||
|
}).then((resp) => {
|
||||||
|
return new Response(JSON.stringify(resp))
|
||||||
|
});
|
||||||
|
},
|
||||||
|
};
|
48
k8s/dev/deployment.yaml
Normal file
48
k8s/dev/deployment.yaml
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: camtiler-event-broker
|
||||||
|
spec:
|
||||||
|
type: ClusterIP
|
||||||
|
selector:
|
||||||
|
app: camtiler-event-broker
|
||||||
|
ports:
|
||||||
|
- protocol: TCP
|
||||||
|
port: 80
|
||||||
|
targetPort: 3000
|
||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: camtiler-event-broker
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: camtiler-event-broker
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: camtiler-event-broker
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: camtiler-event-broker
|
||||||
|
image: harbor.k-space.ee/playground/camtiler-event-broker
|
||||||
|
ports:
|
||||||
|
- containerPort: 3000
|
||||||
|
env:
|
||||||
|
- name: AWS_SECRET_ACCESS_KEY
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: minio-access-secret
|
||||||
|
key: secret
|
||||||
|
- name: AWS_ACCESS_KEY_ID
|
||||||
|
value: 'eventsource'
|
||||||
|
- name: MINIO_BUCKET
|
||||||
|
value: 'application'
|
||||||
|
- name: MINIO_HOSTNAME
|
||||||
|
value: 'cams-s3.k-space.ee'
|
||||||
|
- name: MINIO_PORT
|
||||||
|
value: '443'
|
||||||
|
- name: MINIO_SCHEMA
|
||||||
|
value: 'https'
|
17
package.json
Normal file
17
package.json
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"name": "camtiler-event-broker",
|
||||||
|
"module": "index.ts",
|
||||||
|
"devDependencies": {
|
||||||
|
"bun-types": "^0.3.0"
|
||||||
|
},
|
||||||
|
"type": "module",
|
||||||
|
"dependencies": {
|
||||||
|
"@aws-sdk/credential-provider-env": "^3.226.0",
|
||||||
|
"@aws-sdk/hash-node": "^3.226.0",
|
||||||
|
"@aws-sdk/protocol-http": "^3.226.0",
|
||||||
|
"@aws-sdk/s3-request-presigner": "^3.226.0",
|
||||||
|
"@aws-sdk/url-parser": "^3.226.0",
|
||||||
|
"@aws-sdk/util-format-url": "^3.226.0",
|
||||||
|
"http2": "^3.3.7"
|
||||||
|
}
|
||||||
|
}
|
28
skaffold.yaml
Normal file
28
skaffold.yaml
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
apiVersion: skaffold/v3
|
||||||
|
kind: Config
|
||||||
|
metadata:
|
||||||
|
name: camtiler-event-broker
|
||||||
|
|
||||||
|
build:
|
||||||
|
artifacts:
|
||||||
|
- image: harbor.k-space.ee/playground/camtiler-event-broker
|
||||||
|
docker:
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
kubectl: {}
|
||||||
|
|
||||||
|
manifests:
|
||||||
|
rawYaml:
|
||||||
|
- k8s/dev/deployment.yaml
|
||||||
|
|
||||||
|
profiles:
|
||||||
|
- name: dev
|
||||||
|
activation:
|
||||||
|
- command: dev
|
||||||
|
build:
|
||||||
|
artifacts:
|
||||||
|
- image: harbor.k-space.ee/playground/camtiler-event-broker
|
||||||
|
manifests:
|
||||||
|
rawYaml:
|
||||||
|
- k8s/dev/deployment.yaml
|
20
tsconfig.json
Normal file
20
tsconfig.json
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"lib": [
|
||||||
|
"ESNext"
|
||||||
|
],
|
||||||
|
"module": "esnext",
|
||||||
|
"target": "esnext",
|
||||||
|
"moduleResolution": "nodenext",
|
||||||
|
"strict": true,
|
||||||
|
"downlevelIteration": true,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"jsx": "preserve",
|
||||||
|
"allowSyntheticDefaultImports": true,
|
||||||
|
"forceConsistentCasingInFileNames": true,
|
||||||
|
"allowJs": true,
|
||||||
|
"types": [
|
||||||
|
"bun-types" // add Bun global
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user