Send additional metadata about a workflow when initializing the host
This commit is contained in:
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@trigger.dev/sdk": patch
|
||||
---
|
||||
|
||||
Send additional metadata about a workflow when initializing the host
|
||||
@@ -1,6 +1,6 @@
|
||||
import * as github from "@trigger.dev/github/internal";
|
||||
import type { WorkflowMetadata } from "internal-platform";
|
||||
import { WorkflowMetadataSchema } from "internal-platform";
|
||||
import type { RegisteredWorkflow } from "internal-platform";
|
||||
import { RegisteredWorkflowSchema } from "internal-platform";
|
||||
import crypto from "node:crypto";
|
||||
import type { PrismaClient } from "~/db.server";
|
||||
import { prisma } from "~/db.server";
|
||||
@@ -22,7 +22,7 @@ export class RegisterWorkflow {
|
||||
organization: Organization,
|
||||
environment: RuntimeEnvironment
|
||||
) {
|
||||
const validation = WorkflowMetadataSchema.safeParse(payload);
|
||||
const validation = RegisteredWorkflowSchema.safeParse(payload);
|
||||
|
||||
if (!validation.success) {
|
||||
return {
|
||||
@@ -79,7 +79,7 @@ export class RegisterWorkflow {
|
||||
|
||||
async #upsertEventRule(
|
||||
workflow: Workflow,
|
||||
payload: WorkflowMetadata,
|
||||
payload: RegisteredWorkflow,
|
||||
organization: Organization,
|
||||
environment: RuntimeEnvironment
|
||||
) {
|
||||
@@ -107,7 +107,7 @@ export class RegisterWorkflow {
|
||||
|
||||
async #upsertWorkflow(
|
||||
slug: string,
|
||||
payload: WorkflowMetadata,
|
||||
payload: RegisteredWorkflow,
|
||||
organization: Organization
|
||||
) {
|
||||
const existingWorkflow = await this.#prismaClient.workflow.findUnique({
|
||||
@@ -136,6 +136,7 @@ export class RegisterWorkflow {
|
||||
service: payload.trigger.service,
|
||||
eventNames: payload.trigger.name,
|
||||
triggerTtlInSeconds: payload.triggerTTL,
|
||||
metadata: payload.metadata ? JSON.parse(payload.metadata) : undefined,
|
||||
jsonSchema:
|
||||
"schema" in payload.trigger
|
||||
? payload.trigger.schema
|
||||
@@ -180,7 +181,7 @@ export class RegisterWorkflow {
|
||||
}
|
||||
|
||||
async upsertSource(
|
||||
payload: WorkflowMetadata,
|
||||
payload: RegisteredWorkflow,
|
||||
organization: Organization,
|
||||
workflow: Workflow,
|
||||
environment: RuntimeEnvironment
|
||||
@@ -276,7 +277,7 @@ export class RegisterWorkflow {
|
||||
}
|
||||
|
||||
async #upsertWebhookSource(
|
||||
payload: WorkflowMetadata,
|
||||
payload: RegisteredWorkflow,
|
||||
organization: Organization,
|
||||
workflow: Workflow
|
||||
) {
|
||||
@@ -358,7 +359,7 @@ export class RegisterWorkflow {
|
||||
}
|
||||
}
|
||||
|
||||
#keyForExternalSource(payload: WorkflowMetadata): string {
|
||||
#keyForExternalSource(payload: RegisteredWorkflow): string {
|
||||
if (payload.trigger.type === "WEBHOOK") {
|
||||
switch (payload.trigger.service) {
|
||||
case "github": {
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
-- AlterTable
|
||||
ALTER TABLE "Workflow" ADD COLUMN "metadata" JSONB;
|
||||
@@ -123,8 +123,8 @@ model Workflow {
|
||||
title String
|
||||
|
||||
packageJson Json?
|
||||
|
||||
jsonSchema Json?
|
||||
jsonSchema Json?
|
||||
metadata Json?
|
||||
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
@@ -387,6 +387,7 @@ export class TriggerServer {
|
||||
version: data.packageVersion,
|
||||
},
|
||||
triggerTTL: data.triggerTTL,
|
||||
metadata: data.metadata ? JSON.stringify(data.metadata) : undefined,
|
||||
});
|
||||
|
||||
this.#workflowId = response.workflow.id;
|
||||
|
||||
@@ -15,6 +15,7 @@ const SerializableSchema = z.union([
|
||||
z.boolean(),
|
||||
z.null(),
|
||||
z.date(),
|
||||
z.undefined(),
|
||||
]);
|
||||
type Serializable = z.infer<typeof SerializableSchema>;
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ import {
|
||||
FetchRequestSchema,
|
||||
InitializeRunOnceSchema,
|
||||
RetrySchema,
|
||||
SerializableJsonSchema,
|
||||
TriggerMetadataSchema,
|
||||
WaitSchema,
|
||||
} from "@trigger.dev/common-schemas";
|
||||
@@ -95,6 +96,7 @@ export const ServerRPCSchema = {
|
||||
packageVersion: z.string(),
|
||||
packageName: z.string(),
|
||||
triggerTTL: z.number().optional(),
|
||||
metadata: SerializableJsonSchema.optional(),
|
||||
}),
|
||||
response: z
|
||||
.discriminatedUnion("type", [
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { z } from "zod";
|
||||
import { UpdateWorkflowRun, WorkflowMetadata } from "../schemas";
|
||||
import { UpdateWorkflowRun, RegisteredWorkflow } from "../schemas";
|
||||
import fetch from "node-fetch";
|
||||
import { Logger } from "../logger";
|
||||
|
||||
@@ -62,7 +62,7 @@ export class InternalApiClient {
|
||||
);
|
||||
}
|
||||
|
||||
async registerWorkflow(workflow: WorkflowMetadata) {
|
||||
async registerWorkflow(workflow: RegisteredWorkflow) {
|
||||
const responseSchema = z.object({
|
||||
workflow: z.object({
|
||||
id: z.string(),
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
import { TriggerMetadataSchema } from "@trigger.dev/common-schemas";
|
||||
import {
|
||||
SerializableJsonSchema,
|
||||
TriggerMetadataSchema,
|
||||
} from "@trigger.dev/common-schemas";
|
||||
import { z } from "zod";
|
||||
|
||||
export const PackageMetadataSchema = z.object({
|
||||
@@ -6,15 +9,16 @@ export const PackageMetadataSchema = z.object({
|
||||
version: z.string(),
|
||||
});
|
||||
|
||||
export const WorkflowMetadataSchema = z.object({
|
||||
export const RegisteredWorkflowSchema = z.object({
|
||||
id: z.string(),
|
||||
name: z.string(),
|
||||
trigger: TriggerMetadataSchema,
|
||||
package: PackageMetadataSchema,
|
||||
triggerTTL: z.number().optional(),
|
||||
metadata: z.string().optional(),
|
||||
});
|
||||
|
||||
export type WorkflowMetadata = z.infer<typeof WorkflowMetadataSchema>;
|
||||
export type RegisteredWorkflow = z.infer<typeof RegisteredWorkflowSchema>;
|
||||
|
||||
export const UpdateRunningWorkflowRunSchema = z.object({
|
||||
status: z.literal("RUNNING"),
|
||||
|
||||
@@ -41,6 +41,8 @@
|
||||
"debug": "^4.3.4",
|
||||
"evt": "^2.4.13",
|
||||
"get-caller-file": "^2.0.5",
|
||||
"git-remote-origin-url": "^4.0.0",
|
||||
"git-repo-info": "^2.1.1",
|
||||
"node-fetch": "2.6.x",
|
||||
"slug": "^6.0.0",
|
||||
"terminal-link": "^3.0.0",
|
||||
@@ -50,5 +52,8 @@
|
||||
"zod": "^3.20.2",
|
||||
"zod-error": "^1.1.0",
|
||||
"zod-to-json-schema": "^3.20.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -17,6 +17,8 @@ import { TriggerContext, TriggerFetch } from "./types";
|
||||
import { generateErrorMessage, ErrorMessageOptions } from "zod-error";
|
||||
import terminalLink from "terminal-link";
|
||||
import chalk from "chalk";
|
||||
import getRepoInfo from "git-repo-info";
|
||||
import gitRemoteOriginUrl from "git-remote-origin-url";
|
||||
|
||||
const zodErrorMessageOptions: ErrorMessageOptions = {
|
||||
delimiter: {
|
||||
@@ -732,6 +734,13 @@ export class TriggerClient<TSchema extends z.ZodTypeAny> {
|
||||
throw new Error("Cannot initialize host without an RPC connection");
|
||||
}
|
||||
|
||||
const repoInfo = safeGetRepoInfo();
|
||||
const remoteUrl = repoInfo
|
||||
? await getRemoteUrl(repoInfo.commonGitDir)
|
||||
: undefined;
|
||||
|
||||
const packageMetadata = getTriggerPackageEnvVars(process.env);
|
||||
|
||||
const response = await this.#send("INITIALIZE_HOST_V2", {
|
||||
apiKey: this.#apiKey,
|
||||
workflowId: this.#trigger.id,
|
||||
@@ -740,6 +749,19 @@ export class TriggerClient<TSchema extends z.ZodTypeAny> {
|
||||
packageVersion: pkg.version,
|
||||
packageName: pkg.name,
|
||||
triggerTTL: this.#options.triggerTTL,
|
||||
metadata: {
|
||||
git: repoInfo
|
||||
? {
|
||||
sha: repoInfo.sha,
|
||||
branch: repoInfo.branch,
|
||||
committer: repoInfo.committer,
|
||||
committerDate: repoInfo.committerDate,
|
||||
commitMessage: repoInfo.commitMessage,
|
||||
origin: remoteUrl,
|
||||
}
|
||||
: undefined,
|
||||
packageMetadata,
|
||||
},
|
||||
});
|
||||
|
||||
if (!response) {
|
||||
@@ -798,3 +820,37 @@ function highPrecisionTimestamp() {
|
||||
|
||||
return seconds * 1e9 + nanoseconds;
|
||||
}
|
||||
|
||||
// Gets the environment variables prefixed with npm_package_triggerdotdev_ and returns them as an object
|
||||
function getTriggerPackageEnvVars(
|
||||
env: NodeJS.ProcessEnv
|
||||
): Record<string, string | number | boolean> {
|
||||
if (!env) {
|
||||
return {};
|
||||
}
|
||||
|
||||
const envVars = Object.entries(env)
|
||||
.filter(([key]) => key.startsWith("npm_package_triggerdotdev_"))
|
||||
.map(([key, value]) => [
|
||||
key.replace("npm_package_triggerdotdev_", ""),
|
||||
value,
|
||||
]);
|
||||
|
||||
return Object.fromEntries(envVars);
|
||||
}
|
||||
|
||||
async function getRemoteUrl(cwd: string) {
|
||||
try {
|
||||
return await gitRemoteOriginUrl({ cwd });
|
||||
} catch (err) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
function safeGetRepoInfo() {
|
||||
try {
|
||||
return getRepoInfo();
|
||||
} catch (err) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Generated
+22
@@ -1222,6 +1222,8 @@ importers:
|
||||
debug: ^4.3.4
|
||||
evt: ^2.4.13
|
||||
get-caller-file: ^2.0.5
|
||||
git-remote-origin-url: ^4.0.0
|
||||
git-repo-info: ^2.1.1
|
||||
internal-bridge: workspace:*
|
||||
node-fetch: 2.6.x
|
||||
rimraf: ^3.0.2
|
||||
@@ -1240,6 +1242,8 @@ importers:
|
||||
debug: 4.3.4
|
||||
evt: 2.4.13
|
||||
get-caller-file: 2.0.5
|
||||
git-remote-origin-url: 4.0.0
|
||||
git-repo-info: 2.1.1
|
||||
node-fetch: 2.6.7
|
||||
slug: 6.1.0
|
||||
terminal-link: 3.0.0
|
||||
@@ -11443,6 +11447,24 @@ packages:
|
||||
resolution: {integrity: sha512-Y7wLWcrLUXwk2noSka166byGCvhMtDRpgHdzCno1UQv/n/Hegp++a2xBWJL1lJarnKD3SWaljD+0z1ztqxuKyQ==}
|
||||
dev: true
|
||||
|
||||
/git-remote-origin-url/4.0.0:
|
||||
resolution: {integrity: sha512-EAxDksNdjuWgmVW9pVvA9jQDi/dmTaiDONktIy7qiRRhBZUI4FQK1YvBvteuTSX24aNKg9lfgxNYJEeeSXe6DA==}
|
||||
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
|
||||
dependencies:
|
||||
gitconfiglocal: 2.1.0
|
||||
dev: false
|
||||
|
||||
/git-repo-info/2.1.1:
|
||||
resolution: {integrity: sha512-8aCohiDo4jwjOwma4FmYFd3i97urZulL8XL24nIPxuE+GZnfsAyy/g2Shqx6OjUiFKUXZM+Yy+KHnOmmA3FVcg==}
|
||||
engines: {node: '>= 4.0'}
|
||||
dev: false
|
||||
|
||||
/gitconfiglocal/2.1.0:
|
||||
resolution: {integrity: sha512-qoerOEliJn3z+Zyn1HW2F6eoYJqKwS6MgC9cztTLUB/xLWX8gD/6T60pKn4+t/d6tP7JlybI7Z3z+I572CR/Vg==}
|
||||
dependencies:
|
||||
ini: 1.3.8
|
||||
dev: false
|
||||
|
||||
/glob-parent/3.1.0:
|
||||
resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==}
|
||||
dependencies:
|
||||
|
||||
Reference in New Issue
Block a user