1
- import { AttemptStatus , RetrieveRunResponse , RunStatus , logger } from "@trigger.dev/core/v3" ;
2
- import { TaskRunAttemptStatus , TaskRunStatus } from "@trigger.dev/database" ;
1
+ import {
2
+ AttemptStatus ,
3
+ RetrieveRunResponse ,
4
+ RunStatus ,
5
+ SerializedError ,
6
+ TaskRunError ,
7
+ conditionallyImportPacket ,
8
+ createJsonErrorObject ,
9
+ logger ,
10
+ parsePacket ,
11
+ } from "@trigger.dev/core/v3" ;
12
+ import { Prisma , TaskRunAttemptStatus , TaskRunStatus } from "@trigger.dev/database" ;
3
13
import assertNever from "assert-never" ;
4
14
import { AuthenticatedEnvironment } from "~/services/apiAuth.server" ;
5
15
import { BasePresenter } from "./basePresenter.server" ;
@@ -23,6 +33,7 @@ export class ApiRetrieveRunPresenter extends BasePresenter {
23
33
} ,
24
34
} ,
25
35
lockedToVersion : true ,
36
+ schedule : true ,
26
37
} ,
27
38
} ) ;
28
39
@@ -32,14 +43,68 @@ export class ApiRetrieveRunPresenter extends BasePresenter {
32
43
return undefined ;
33
44
}
34
45
46
+ let $payload : any ;
47
+ let $output : any ;
48
+
49
+ if ( showSecretDetails ) {
50
+ const payloadPacket = await conditionallyImportPacket ( {
51
+ data : taskRun . payload ,
52
+ dataType : taskRun . payloadType ,
53
+ } ) ;
54
+
55
+ $payload =
56
+ payloadPacket . dataType === "application/json"
57
+ ? await parsePacket ( payloadPacket )
58
+ : payloadPacket . data ;
59
+
60
+ if ( taskRun . status === "COMPLETED_SUCCESSFULLY" ) {
61
+ const completedAttempt = taskRun . attempts . find (
62
+ ( a ) => a . status === "COMPLETED" && typeof a . output !== null
63
+ ) ;
64
+
65
+ if ( completedAttempt && completedAttempt . output ) {
66
+ const outputPacket = await conditionallyImportPacket ( {
67
+ data : completedAttempt . output ,
68
+ dataType : completedAttempt . outputType ,
69
+ } ) ;
70
+
71
+ $output = await parsePacket ( outputPacket ) ;
72
+ }
73
+ }
74
+ }
75
+
76
+ const apiStatus = ApiRetrieveRunPresenter . apiStatusFromRunStatus ( taskRun . status ) ;
77
+
35
78
return {
36
79
id : taskRun . friendlyId ,
37
- status : ApiRetrieveRunPresenter . apiStatusFromRunStatus ( taskRun . status ) ,
80
+ status : apiStatus ,
38
81
taskIdentifier : taskRun . taskIdentifier ,
39
82
idempotencyKey : taskRun . idempotencyKey ?? undefined ,
40
83
version : taskRun . lockedToVersion ? taskRun . lockedToVersion . version : undefined ,
41
84
createdAt : taskRun . createdAt ?? undefined ,
42
85
updatedAt : taskRun . updatedAt ?? undefined ,
86
+ startedAt : taskRun . lockedAt ?? undefined ,
87
+ finishedAt : ApiRetrieveRunPresenter . isStatusFinished ( apiStatus )
88
+ ? taskRun . updatedAt
89
+ : undefined ,
90
+ payload : $payload ,
91
+ output : $output ,
92
+ isTest : taskRun . isTest ,
93
+ schedule : taskRun . schedule
94
+ ? {
95
+ id : taskRun . schedule . friendlyId ,
96
+ externalId : taskRun . schedule . externalId ?? undefined ,
97
+ deduplicationKey : taskRun . schedule . userProvidedDeduplicationKey
98
+ ? taskRun . schedule . deduplicationKey
99
+ : undefined ,
100
+ generator : {
101
+ type : "CRON" ,
102
+ expression : taskRun . schedule . generatorExpression ,
103
+ description : taskRun . schedule . generatorDescription ,
104
+ } ,
105
+ }
106
+ : undefined ,
107
+ ...ApiRetrieveRunPresenter . apiBooleanHelpersFromRunStatus ( apiStatus ) ,
43
108
attempts : ! showSecretDetails
44
109
? [ ]
45
110
: taskRun . attempts . map ( ( a ) => ( {
@@ -49,34 +114,68 @@ export class ApiRetrieveRunPresenter extends BasePresenter {
49
114
updatedAt : a . updatedAt ?? undefined ,
50
115
startedAt : a . startedAt ?? undefined ,
51
116
completedAt : a . completedAt ?? undefined ,
117
+ error : ApiRetrieveRunPresenter . apiErrorFromError ( a . error ) ,
52
118
} ) ) ,
53
119
} ;
54
120
} ) ;
55
121
}
56
122
123
+ static apiErrorFromError ( error : Prisma . JsonValue ) : SerializedError | undefined {
124
+ if ( ! error ) {
125
+ return ;
126
+ }
127
+
128
+ const errorData = TaskRunError . safeParse ( error ) ;
129
+
130
+ if ( errorData . success ) {
131
+ return createJsonErrorObject ( errorData . data ) ;
132
+ }
133
+ }
134
+
135
+ static isStatusFinished ( status : RunStatus ) {
136
+ return (
137
+ status === "COMPLETED" ||
138
+ status === "FAILED" ||
139
+ status === "CANCELED" ||
140
+ status === "INTERRUPTED" ||
141
+ status === "CRASHED" ||
142
+ status === "SYSTEM_FAILURE"
143
+ ) ;
144
+ }
145
+
57
146
static apiStatusFromRunStatus ( status : TaskRunStatus ) : RunStatus {
58
147
switch ( status ) {
59
- case "WAITING_FOR_DEPLOY" :
148
+ case "WAITING_FOR_DEPLOY" : {
149
+ return "WAITING_FOR_DEPLOY" ;
150
+ }
60
151
case "PENDING" : {
61
- return "PENDING" ;
152
+ return "QUEUED" ;
153
+ }
154
+ case "PAUSED" :
155
+ case "WAITING_TO_RESUME" : {
156
+ return "FROZEN" ;
157
+ }
158
+ case "RETRYING_AFTER_FAILURE" : {
159
+ return "REATTEMPTING" ;
62
160
}
63
- case "RETRYING_AFTER_FAILURE" :
64
161
case "EXECUTING" : {
65
162
return "EXECUTING" ;
66
163
}
67
- case "WAITING_TO_RESUME" :
68
- case "PAUSED" : {
69
- return "PAUSED" ;
70
- }
71
164
case "CANCELED" : {
72
165
return "CANCELED" ;
73
166
}
74
167
case "COMPLETED_SUCCESSFULLY" : {
75
168
return "COMPLETED" ;
76
169
}
77
- case "SYSTEM_FAILURE" :
78
- case "INTERRUPTED" :
79
- case "CRASHED" :
170
+ case "SYSTEM_FAILURE" : {
171
+ return "SYSTEM_FAILURE" ;
172
+ }
173
+ case "INTERRUPTED" : {
174
+ return "INTERRUPTED" ;
175
+ }
176
+ case "CRASHED" : {
177
+ return "CRASHED" ;
178
+ }
80
179
case "COMPLETED_WITH_ERRORS" : {
81
180
return "FAILED" ;
82
181
}
@@ -86,6 +185,30 @@ export class ApiRetrieveRunPresenter extends BasePresenter {
86
185
}
87
186
}
88
187
188
+ static apiBooleanHelpersFromRunStatus ( status : RunStatus ) {
189
+ const isQueued = status === "QUEUED" || status === "WAITING_FOR_DEPLOY" ;
190
+ const isExecuting = status === "EXECUTING" || status === "REATTEMPTING" || status === "FROZEN" ;
191
+ const isCompleted =
192
+ status === "COMPLETED" ||
193
+ status === "CANCELED" ||
194
+ status === "FAILED" ||
195
+ status === "CRASHED" ||
196
+ status === "INTERRUPTED" ||
197
+ status === "SYSTEM_FAILURE" ;
198
+ const isFailed = isCompleted && status !== "COMPLETED" ;
199
+ const isSuccess = isCompleted && status === "COMPLETED" ;
200
+ const isCancelled = status === "CANCELED" ;
201
+
202
+ return {
203
+ isQueued,
204
+ isExecuting,
205
+ isCompleted,
206
+ isFailed,
207
+ isSuccess,
208
+ isCancelled,
209
+ } ;
210
+ }
211
+
89
212
static apiStatusFromAttemptStatus ( status : TaskRunAttemptStatus ) : AttemptStatus {
90
213
switch ( status ) {
91
214
case "PENDING" : {
0 commit comments