Skip to content

Commit 21388b8

Browse files
committed
feat: add npm hello workflow and activity
Signed-off-by: anilb <epipav@gmail.com>
1 parent 5ed2d3c commit 21388b8

10 files changed

Lines changed: 80 additions & 71 deletions

File tree

docs/adr/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Use the `/adr` skill in Claude Code to record new ADRs or query past decisions.
1010
| --- | ----- | ------ | ---- |
1111
| [ADR-0001](./0001-packages-database.md) | Separate physical database for the packages domain | accepted | 2026-05-26 |
1212
| [ADR-0002](./0002-packages-worker-architecture.md) | Single-service, multi-entry-point architecture for packages_worker | accepted | 2026-05-25 |
13+
| [ADR-0003](./0003-packages-worker-temporal-parent.md) | Temporal ServiceWorker as the host for packages_worker scheduled workflows | accepted | 2026-05-26 |
1314

1415
## Why ADRs?
1516

pnpm-lock.yaml

Lines changed: 31 additions & 17 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

scripts/services/packages-worker.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ x-env-args: &env-args
44
DOCKER_BUILDKIT: 1
55
NODE_ENV: docker
66
SERVICE: packages-worker
7+
CROWD_TEMPORAL_TASKQUEUE: packages-worker
78
SHELL: /bin/sh
89
SUPPRESS_NO_CONFIG_WARNING: 'true'
910

services/apps/packages_worker/package.json

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,26 @@
22
"name": "@crowd/packages-worker",
33
"private": true,
44
"scripts": {
5-
"start:packages-worker": "SERVICE=packages-worker tsx src/bin/packages-worker.ts",
5+
"start:packages-worker": "CROWD_TEMPORAL_TASKQUEUE=packages-worker SERVICE=packages-worker tsx src/bin/packages-worker.ts",
66
"start:github-repos-enricher": "SERVICE=github-repos-enricher tsx src/bin/github-repos-enricher.ts",
7-
"dev:packages-worker": "SERVICE=packages-worker LOG_LEVEL=trace nodemon --watch src --watch ../../libs --ext ts --exec tsx --inspect=0.0.0.0:9233 src/bin/packages-worker.ts",
7+
"dev:packages-worker": "CROWD_TEMPORAL_TASKQUEUE=packages-worker SERVICE=packages-worker LOG_LEVEL=trace nodemon --watch src --watch ../../libs --ext ts --exec tsx --inspect=0.0.0.0:9233 src/bin/packages-worker.ts",
88
"dev:github-repos-enricher": "SERVICE=github-repos-enricher LOG_LEVEL=trace nodemon --watch src --watch ../../libs --ext ts --exec tsx --inspect=0.0.0.0:9234 src/bin/github-repos-enricher.ts",
9-
"dev:packages-worker:local": "set -a && . ../../../backend/.env.dist.local && . ../../../backend/.env.override.local && set +a && SERVICE=packages-worker LOG_LEVEL=trace nodemon --watch src --watch ../../libs --ext ts --exec tsx --inspect=0.0.0.0:9233 src/bin/packages-worker.ts",
9+
"dev:packages-worker:local": "set -a && . ../../../backend/.env.dist.local && . ../../../backend/.env.override.local && set +a && CROWD_TEMPORAL_TASKQUEUE=packages-worker SERVICE=packages-worker LOG_LEVEL=trace nodemon --watch src --watch ../../libs --ext ts --exec tsx --inspect=0.0.0.0:9233 src/bin/packages-worker.ts",
1010
"dev:github-repos-enricher:local": "set -a && . ../../../backend/.env.dist.local && . ../../../backend/.env.override.local && set +a && SERVICE=github-repos-enricher LOG_LEVEL=trace nodemon --watch src --watch ../../libs --ext ts --exec tsx --inspect=0.0.0.0:9234 src/bin/github-repos-enricher.ts",
1111
"lint": "npx eslint --ext .ts src --max-warnings=0",
1212
"format": "npx prettier --write \"src/**/*.ts\"",
1313
"format-check": "npx prettier --check .",
1414
"tsc-check": "tsc --noEmit"
1515
},
1616
"dependencies": {
17+
"@crowd/archetype-standard": "workspace:*",
18+
"@crowd/archetype-worker": "workspace:*",
1719
"@crowd/common": "workspace:*",
1820
"@crowd/data-access-layer": "workspace:*",
1921
"@crowd/database": "workspace:*",
2022
"@crowd/logging": "workspace:*",
23+
"@temporalio/client": "~1.11.8",
24+
"@temporalio/workflow": "~1.11.8",
2125
"tsx": "^4.7.1",
2226
"typescript": "^5.6.3"
2327
},
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { sayHiNpm } from './npm/activities'
Lines changed: 4 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,6 @@
1-
import fs from 'fs'
2-
import path from 'path'
1+
import { svc } from '../service'
32

4-
import { getServiceLogger } from '@crowd/logging'
5-
6-
import { getPackagesDb } from '../db'
7-
8-
const log = getServiceLogger()
9-
10-
const liveFilePath = path.join(__dirname, '../tmp/packages-worker-live.tmp')
11-
const readyFilePath = path.join(__dirname, '../tmp/packages-worker-ready.tmp')
12-
13-
let shuttingDown = false
14-
15-
const shutdown = async () => {
16-
if (shuttingDown) return
17-
shuttingDown = true
18-
log.info('Shutting down packages-worker...')
19-
process.exit(0)
20-
}
21-
22-
process.on('SIGINT', shutdown)
23-
process.on('SIGTERM', shutdown)
24-
25-
const main = async () => {
26-
log.info('packages-worker starting...')
27-
28-
const qx = await getPackagesDb()
29-
await qx.selectOne('SELECT 1')
30-
log.info('Connected to packages-db.')
31-
32-
// Create tmp directory for health probe files
33-
fs.mkdirSync(path.dirname(liveFilePath), { recursive: true })
34-
35-
setInterval(async () => {
36-
if (shuttingDown) return
37-
try {
38-
await Promise.all([
39-
fs.promises.open(liveFilePath, 'a').then((f) => f.close()),
40-
fs.promises.open(readyFilePath, 'a').then((f) => f.close()),
41-
])
42-
} catch (err) {
43-
log.warn({ err }, 'Failed to write health probe files')
44-
}
45-
}, 5000)
46-
47-
log.info('packages-worker started, idle.')
48-
}
49-
50-
main().catch((err) => {
51-
log.error({ err }, 'packages-worker fatal error')
52-
process.exit(1)
3+
setImmediate(async () => {
4+
await svc.init()
5+
await svc.start()
536
})
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { getServiceChildLogger } from '@crowd/logging'
2+
3+
const log = getServiceChildLogger('npm')
4+
5+
export async function sayHiNpm(): Promise<string> {
6+
log.info('👋 hi from npm activity')
7+
return 'hi from npm'
8+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { proxyActivities } from '@temporalio/workflow'
2+
3+
import type * as activities from './activities'
4+
5+
const { sayHiNpm } = proxyActivities<typeof activities>({
6+
startToCloseTimeout: '1 minute',
7+
})
8+
9+
export async function npmHello(): Promise<void> {
10+
await sayHiNpm()
11+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { Config } from '@crowd/archetype-standard'
2+
import { Options, ServiceWorker } from '@crowd/archetype-worker'
3+
4+
const config: Config = {
5+
envvars: [],
6+
producer: { enabled: false },
7+
temporal: { enabled: true },
8+
redis: { enabled: false },
9+
}
10+
11+
const options: Options = {
12+
postgres: { enabled: false }, // packages-db is managed via getPackagesDb()
13+
}
14+
15+
export const svc = new ServiceWorker(config, options)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { npmHello } from './npm/workflows'

0 commit comments

Comments
 (0)