Skip to content

Commit 1050e73

Browse files
committed
Merge branch 'main' into v3/prod-error-handling
2 parents 0eb0251 + 03af44e commit 1050e73

23 files changed

+401
-355
lines changed

.changeset/cuddly-feet-approve.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"trigger.dev": patch
3+
---
4+
5+
Don’t swallow some error messages when deploying

.changeset/poor-flowers-cross.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"trigger.dev": patch
3+
---
4+
5+
Use the dashboard url instead of the API url for the View logs link

.changeset/pre.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
"chilled-hornets-move",
4949
"clean-pianos-listen",
5050
"cool-glasses-bake",
51+
"cuddly-feet-approve",
5152
"eight-pumas-float",
5253
"few-students-share",
5354
"green-bags-wink",
@@ -62,6 +63,7 @@
6263
"new-rivers-tell",
6364
"odd-poets-own",
6465
"polite-ducks-switch",
66+
"poor-flowers-cross",
6567
"rare-roses-float",
6668
"real-planets-stare",
6769
"sharp-zebras-serve",

.vscode/launch.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
{
2424
"type": "node-terminal",
2525
"request": "launch",
26-
"name": "Debug BYO Auth",
26+
"name": "Debug v2 job catalog",
2727
"command": "pnpm run byo-auth",
2828
"envFile": "${workspaceFolder}/references/job-catalog/.env",
2929
"cwd": "${workspaceFolder}/references/job-catalog",

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
### The open source background jobs framework
99

10-
[Discord](https://discord.gg/JtBAxBr2m3) | [Website](https://trigger.dev) | [Issues](https://github.com/triggerdotdev/trigger.dev/issues) | [Docs](https://trigger.dev/docs)
10+
[Discord](https://trigger.dev/discord) | [Website](https://trigger.dev) | [Issues](https://github.com/triggerdotdev/trigger.dev/issues) | [Docs](https://trigger.dev/docs)
1111

1212
[![Twitter](https://img.shields.io/twitter/url/https/twitter.com/triggerdotdev.svg?style=social&label=Follow%20%40trigger.dev)](https://twitter.com/triggerdotdev)
1313
[![GitHub Repo stars](https://img.shields.io/github/stars/triggerdotdev/trigger.dev?style=social)](https://github.com/triggerdotdev/trigger.dev)

apps/webapp/app/metrics.server.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { OpenMetricsContentType, Registry, collectDefaultMetrics, register } from "prom-client";
2+
import { singleton } from "./utils/singleton";
3+
import { env } from "./env.server";
4+
5+
export const metricsRegister = singleton("metricsRegister", initializeMetricsRegister);
6+
7+
function initializeMetricsRegister() {
8+
const registry = new Registry<OpenMetricsContentType>();
9+
10+
register.setDefaultLabels({
11+
serviceName: env.SERVICE_NAME,
12+
});
13+
14+
registry.setContentType("application/openmetrics-text; version=1.0.0; charset=utf-8");
15+
16+
collectDefaultMetrics({ register: registry });
17+
18+
return registry;
19+
}

apps/webapp/app/routes/metrics.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { LoaderFunctionArgs } from "@remix-run/server-runtime";
2+
import { metricsRegister } from "~/metrics.server";
3+
4+
export async function loader({ request }: LoaderFunctionArgs) {
5+
return new Response(await metricsRegister.metrics(), {
6+
headers: {
7+
"Content-Type": metricsRegister.contentType,
8+
},
9+
});
10+
}

apps/webapp/app/v3/authenticatedSocketConnection.server.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,10 @@ import {
66
} from "@trigger.dev/core/v3";
77
import { Evt } from "evt";
88
import { randomUUID } from "node:crypto";
9+
import type { CloseEvent, ErrorEvent, MessageEvent, WebSocket } from "ws";
910
import { AuthenticatedEnvironment } from "~/services/apiAuth.server";
1011
import { logger } from "~/services/logger.server";
1112
import { DevQueueConsumer } from "./marqs/devQueueConsumer.server";
12-
import type { WebSocket, MessageEvent, CloseEvent, ErrorEvent } from "ws";
13-
import { env } from "~/env.server";
1413

1514
export class AuthenticatedSocketConnection {
1615
public id: string;
@@ -93,7 +92,11 @@ export class AuthenticatedSocketConnection {
9392

9493
await this._consumer.stop();
9594

96-
this.onClose.post(ev);
95+
const result = this.onClose.post(ev);
96+
97+
logger.debug("[AuthenticatedSocketConnection] Called onClose", {
98+
result,
99+
});
97100
}
98101

99102
async #handleError(ev: ErrorEvent) {

apps/webapp/app/v3/handleWebsockets.server.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import { authenticateApiKey } from "~/services/apiAuth.server";
44
import { logger } from "~/services/logger.server";
55
import { singleton } from "../utils/singleton";
66
import { AuthenticatedSocketConnection } from "./authenticatedSocketConnection.server";
7+
import { Gauge } from "prom-client";
8+
import { metricsRegister } from "~/metrics.server";
79

810
export const wss = singleton("wss", initalizeWebSocketServer);
911

@@ -16,6 +18,15 @@ function initalizeWebSocketServer() {
1618

1719
authenticatedConnections = new Map();
1820

21+
new Gauge({
22+
name: "dev_authenticated_connections",
23+
help: "Number of authenticated dev connections",
24+
collect() {
25+
this.set(authenticatedConnections.size);
26+
},
27+
registers: [metricsRegister],
28+
});
29+
1930
return server;
2031
}
2132

@@ -47,8 +58,11 @@ async function handleWebSocketConnection(ws: WebSocket, req: IncomingMessage) {
4758

4859
authenticatedConnections.set(authenticatedConnection.id, authenticatedConnection);
4960

50-
authenticatedConnection.onClose.attach((closeEvent) => {
51-
logger.debug("Websocket closed", { closeEvent });
61+
authenticatedConnection.onClose.attachOnce((closeEvent) => {
62+
logger.debug("Websocket closed", {
63+
closeEvent,
64+
authenticatedConnectionId: authenticatedConnection.id,
65+
});
5266

5367
authenticatedConnections.delete(authenticatedConnection.id);
5468
});

apps/webapp/app/v3/marqs/devPubSub.server.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import { z } from "zod";
22
import { singleton } from "~/utils/singleton";
33
import { ZodPubSub, ZodSubscriber } from "../utils/zodPubSub.server";
44
import { env } from "~/env.server";
5+
import { Gauge } from "prom-client";
6+
import { metricsRegister } from "~/metrics.server";
57

68
const messageCatalog = {
79
CANCEL_ATTEMPT: z.object({
@@ -17,7 +19,7 @@ export type DevSubscriber = ZodSubscriber<typeof messageCatalog>;
1719
export const devPubSub = singleton("devPubSub", initializeDevPubSub);
1820

1921
function initializeDevPubSub() {
20-
return new ZodPubSub({
22+
const pubSub = new ZodPubSub({
2123
redis: {
2224
port: env.REDIS_PORT,
2325
host: env.REDIS_HOST,
@@ -28,4 +30,15 @@ function initializeDevPubSub() {
2830
},
2931
schema: messageCatalog,
3032
});
33+
34+
new Gauge({
35+
name: "dev_pub_sub_subscribers",
36+
help: "Number of dev pub sub subscribers",
37+
collect() {
38+
this.set(pubSub.subscriberCount);
39+
},
40+
registers: [metricsRegister],
41+
});
42+
43+
return pubSub;
3144
}

apps/webapp/app/v3/utils/zodPubSub.server.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Logger } from "@trigger.dev/core-backend";
22
import { ZodMessageCatalogSchema, ZodMessageHandler, ZodMessageSender } from "@trigger.dev/core/v3";
3+
import { Evt } from "evt";
34
import Redis, { RedisOptions } from "ioredis";
45
import { z } from "zod";
56
import { logger } from "~/services/logger.server";
@@ -26,6 +27,10 @@ class RedisZodSubscriber<TMessageCatalog extends ZodMessageCatalogSchema>
2627
private _listeners: Map<string, (payload: unknown) => Promise<void>> = new Map();
2728
private _messageHandler: ZodMessageHandler<TMessageCatalog>;
2829

30+
public onUnsubscribed: Evt<{
31+
pattern: string;
32+
}> = new Evt();
33+
2934
constructor(
3035
private readonly _pattern: string,
3136
private readonly _options: ZodPubSubOptions<TMessageCatalog>,
@@ -51,7 +56,9 @@ class RedisZodSubscriber<TMessageCatalog extends ZodMessageCatalogSchema>
5156

5257
public async stopListening(): Promise<void> {
5358
this._listeners.clear();
54-
await this._subscriber.unsubscribe();
59+
await this._subscriber.punsubscribe();
60+
61+
this.onUnsubscribed.post({ pattern: this._pattern });
5562
}
5663

5764
async #onMessage(pattern: string, channel: string, serializedMessage: string) {
@@ -90,6 +97,11 @@ class RedisZodSubscriber<TMessageCatalog extends ZodMessageCatalogSchema>
9097
export class ZodPubSub<TMessageCatalog extends ZodMessageCatalogSchema> {
9198
private _publisher: Redis;
9299
private _logger = logger.child({ module: "ZodPubSub" });
100+
private _subscriberCount = 0;
101+
102+
get subscriberCount() {
103+
return this._subscriberCount;
104+
}
93105

94106
constructor(private _options: ZodPubSubOptions<TMessageCatalog>) {
95107
this._publisher = new Redis(_options.redis);
@@ -112,6 +124,14 @@ export class ZodPubSub<TMessageCatalog extends ZodMessageCatalogSchema> {
112124

113125
await subscriber.initialize();
114126

127+
this._subscriberCount++;
128+
129+
subscriber.onUnsubscribed.attachOnce(({ pattern }) => {
130+
logger.debug("Subscriber unsubscribed", { pattern });
131+
132+
this._subscriberCount--;
133+
});
134+
115135
return subscriber;
116136
}
117137
}

apps/webapp/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@
126126
"posthog-node": "^3.1.3",
127127
"prism-react-renderer": "^1.3.5",
128128
"prismjs": "^1.29.0",
129+
"prom-client": "^15.1.0",
129130
"random-words": "^2.0.0",
130131
"react": "^18.2.0",
131132
"react-aria": "^3.31.1",

packages/cli-v3/CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# trigger.dev
22

3+
## 3.0.0-beta.9
4+
5+
### Patch Changes
6+
7+
- 279717b09: Don’t swallow some error messages when deploying
8+
- 328947dbf: Use the dashboard url instead of the API url for the View logs link
9+
310
## 3.0.0-beta.8
411

512
### Patch Changes

packages/cli-v3/package.json

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "trigger.dev",
3-
"version": "3.0.0-beta.8",
3+
"version": "3.0.0-beta.9",
44
"description": "A Command-Line Interface for Trigger.dev (v3) projects",
55
"main": "./dist/index.js",
66
"types": "./dist/index.d.ts",
@@ -38,7 +38,6 @@
3838
"@trigger.dev/core-apps": "workspace:*",
3939
"@trigger.dev/tsconfig": "workspace:*",
4040
"@types/gradient-string": "^1.1.2",
41-
"@types/jsonlines": "^0.1.5",
4241
"@types/mock-fs": "^4.13.1",
4342
"@types/node": "18",
4443
"@types/object-hash": "^3.0.6",
@@ -106,7 +105,6 @@
106105
"import-meta-resolve": "^4.0.0",
107106
"ink": "^4.4.1",
108107
"jsonc-parser": "^3.2.1",
109-
"jsonlines": "^0.1.1",
110108
"liquidjs": "^10.9.2",
111109
"mock-fs": "^5.2.0",
112110
"nanoid": "^4.0.2",
@@ -135,4 +133,4 @@
135133
"engines": {
136134
"node": ">=18.0.0"
137135
}
138-
}
136+
}

packages/cli-v3/src/commands/deploy.ts

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ import {
5555
parseNpmInstallError,
5656
} from "../utilities/deployErrors";
5757
import { safeJsonParse } from "../utilities/safeJsonParse";
58+
import { JavascriptProject } from "../utilities/javascriptProject";
5859

5960
const DeployCommandOptions = CommonCommandOptions.extend({
6061
skipTypecheck: z.boolean().default(false),
@@ -423,7 +424,8 @@ async function _deployCommand(dir: string, options: DeployCommandOptions) {
423424
}
424425

425426
const parsedError = finishedDeployment.errorData.stack
426-
? parseBuildErrorStack(finishedDeployment.errorData)
427+
? parseBuildErrorStack(finishedDeployment.errorData) ??
428+
finishedDeployment.errorData.message
427429
: finishedDeployment.errorData.message;
428430

429431
if (typeof parsedError === "string") {
@@ -1118,21 +1120,17 @@ async function compileProject(
11181120
// Get all the required dependencies from the metaOutputs and save them to /tmp/dir/package.json
11191121
const allImports = [...metaOutput.imports, ...entryPointMetaOutput.imports];
11201122

1121-
const externalPackageJson = await readJSONFile(join(config.projectDir, "package.json"));
1123+
const javascriptProject = new JavascriptProject(config.projectDir);
11221124

1123-
const dependencies = await gatherRequiredDependencies(
1124-
allImports,
1125-
config,
1126-
externalPackageJson
1127-
);
1125+
const dependencies = await gatherRequiredDependencies(allImports, config, javascriptProject);
11281126

11291127
const packageJsonContents = {
11301128
name: "trigger-worker",
11311129
version: "0.0.0",
11321130
description: "",
11331131
dependencies,
11341132
scripts: {
1135-
postinstall: externalPackageJson?.scripts?.postinstall,
1133+
...javascriptProject.scripts,
11361134
},
11371135
};
11381136

@@ -1377,7 +1375,7 @@ async function typecheckProject(config: ResolvedConfig, options: DeployCommandOp
13771375
async function gatherRequiredDependencies(
13781376
imports: Metafile["outputs"][string]["imports"],
13791377
config: ResolvedConfig,
1380-
projectPackageJson: any
1378+
project: JavascriptProject
13811379
) {
13821380
const dependencies: Record<string, string> = {};
13831381

@@ -1392,7 +1390,7 @@ async function gatherRequiredDependencies(
13921390
continue;
13931391
}
13941392

1395-
const externalDependencyVersion = (projectPackageJson?.dependencies ?? {})[packageName];
1393+
const externalDependencyVersion = await project.resolve(packageName);
13961394

13971395
if (externalDependencyVersion) {
13981396
dependencies[packageName] = stripWorkspaceFromVersion(externalDependencyVersion);
@@ -1420,10 +1418,9 @@ async function gatherRequiredDependencies(
14201418
dependencies[packageParts.name] = packageParts.version;
14211419
continue;
14221420
} else {
1423-
const externalDependencyVersion = {
1424-
...projectPackageJson?.devDependencies,
1425-
...projectPackageJson?.dependencies,
1426-
}[packageName];
1421+
const externalDependencyVersion = await project.resolve(packageParts.name, {
1422+
allowDev: true,
1423+
});
14271424

14281425
if (externalDependencyVersion) {
14291426
dependencies[packageParts.name] = externalDependencyVersion;

0 commit comments

Comments
 (0)