@forestadmin/mcp-server 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,4 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
37
|
};
|
|
@@ -6,7 +39,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
39
|
exports.default = declareListRelatedTool;
|
|
7
40
|
const zod_1 = require("zod");
|
|
8
41
|
const list_js_1 = require("./list.js");
|
|
9
|
-
const activity_logs_creator_js_1 =
|
|
42
|
+
const activity_logs_creator_js_1 = __importStar(require("../utils/activity-logs-creator.js"));
|
|
10
43
|
const agent_caller_js_1 = __importDefault(require("../utils/agent-caller.js"));
|
|
11
44
|
const error_parser_js_1 = __importDefault(require("../utils/error-parser.js"));
|
|
12
45
|
const schema_fetcher_js_1 = require("../utils/schema-fetcher.js");
|
|
@@ -60,7 +93,7 @@ function declareListRelatedTool(mcpServer, forestServerUrl, logger, collectionNa
|
|
|
60
93
|
labelParts.push('filter');
|
|
61
94
|
}
|
|
62
95
|
const extraLabel = labelParts.length > 0 ? ` with ${labelParts.join(' and ')}` : '';
|
|
63
|
-
await (0, activity_logs_creator_js_1.default)(forestServerUrl, extra, 'listRelatedData', {
|
|
96
|
+
const activityLog = await (0, activity_logs_creator_js_1.default)(forestServerUrl, extra, 'listRelatedData', {
|
|
64
97
|
collectionName: options.collectionName,
|
|
65
98
|
recordId: options.parentRecordId,
|
|
66
99
|
label: `list relation "${options.relationName}"${extraLabel}`,
|
|
@@ -69,19 +102,36 @@ function declareListRelatedTool(mcpServer, forestServerUrl, logger, collectionNa
|
|
|
69
102
|
const relation = rpcClient
|
|
70
103
|
.collection(options.collectionName)
|
|
71
104
|
.relation(options.relationName, options.parentRecordId);
|
|
105
|
+
let response;
|
|
72
106
|
if (options.enableCount) {
|
|
73
107
|
const [records, totalCount] = await Promise.all([
|
|
74
108
|
relation.list(options),
|
|
75
109
|
relation.count(options),
|
|
76
110
|
]);
|
|
77
|
-
|
|
111
|
+
response = { records, totalCount };
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
const records = await relation.list(options);
|
|
115
|
+
response = { records };
|
|
78
116
|
}
|
|
79
|
-
|
|
80
|
-
|
|
117
|
+
(0, activity_logs_creator_js_1.markActivityLogAsSucceeded)({
|
|
118
|
+
forestServerUrl,
|
|
119
|
+
request: extra,
|
|
120
|
+
activityLog,
|
|
121
|
+
logger,
|
|
122
|
+
});
|
|
123
|
+
return { content: [{ type: 'text', text: JSON.stringify(response) }] };
|
|
81
124
|
}
|
|
82
125
|
catch (error) {
|
|
126
|
+
(0, activity_logs_creator_js_1.markActivityLogAsFailed)({
|
|
127
|
+
forestServerUrl,
|
|
128
|
+
request: extra,
|
|
129
|
+
activityLog,
|
|
130
|
+
errorMessage: error?.message,
|
|
131
|
+
logger,
|
|
132
|
+
});
|
|
83
133
|
throw await enhanceErrorWithContext(error, forestServerUrl, options);
|
|
84
134
|
}
|
|
85
135
|
}, logger);
|
|
86
136
|
}
|
|
87
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
137
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1yZWxhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rvb2xzL2xpc3QtcmVsYXRlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdGQSx5Q0FpRkM7QUE3SkQsNkJBQXdCO0FBRXhCLHVDQUFvRDtBQUVwRCw4RkFHMkM7QUFDM0MsK0VBQW1EO0FBQ25ELCtFQUF1RDtBQUN2RCxrRUFBc0Y7QUFDdEYseUZBQW9FO0FBRXBFLFNBQVMsMEJBQTBCLENBQUMsZUFBeUI7SUFDM0QsT0FBTztRQUNMLEdBQUcsSUFBQSxpQ0FBdUIsRUFBQyxlQUFlLENBQUM7UUFDM0MsWUFBWSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7UUFDeEIsY0FBYyxFQUFFLE9BQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7S0FDbEQsQ0FBQztBQUNKLENBQUM7QUFPRDs7O0dBR0c7QUFDSCxLQUFLLFVBQVUsdUJBQXVCLENBQ3BDLEtBQWMsRUFDZCxlQUF1QixFQUN2QixPQUF3QjtJQUV4QixNQUFNLFdBQVcsR0FBRyxJQUFBLHlCQUFlLEVBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0MsTUFBTSxZQUFZLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTVFLElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLElBQUEseUNBQXFCLEVBQ2xDLE1BQU0sSUFBQSxxQ0FBaUIsRUFBQyxlQUFlLENBQUMsRUFDeEMsT0FBTyxDQUFDLGNBQWMsQ0FDdkIsQ0FBQztRQUVGLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQ25DLEtBQUssQ0FBQyxFQUFFLENBQUMs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
|
package/dist/tools/list.js
CHANGED
|
@@ -1,4 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
37
|
};
|
|
@@ -7,7 +40,7 @@ exports.createListArgumentShape = createListArgumentShape;
|
|
|
7
40
|
exports.default = declareListTool;
|
|
8
41
|
const zod_1 = require("zod");
|
|
9
42
|
const filter_js_1 = __importDefault(require("../schemas/filter.js"));
|
|
10
|
-
const activity_logs_creator_js_1 =
|
|
43
|
+
const activity_logs_creator_js_1 = __importStar(require("../utils/activity-logs-creator.js"));
|
|
11
44
|
const agent_caller_js_1 = __importDefault(require("../utils/agent-caller.js"));
|
|
12
45
|
const error_parser_js_1 = __importDefault(require("../utils/error-parser.js"));
|
|
13
46
|
const schema_fetcher_js_1 = require("../utils/schema-fetcher.js");
|
|
@@ -78,24 +111,41 @@ function declareListTool(mcpServer, forestServerUrl, logger, collectionNames = [
|
|
|
78
111
|
else if (options.filters) {
|
|
79
112
|
actionType = 'filter';
|
|
80
113
|
}
|
|
81
|
-
await (0, activity_logs_creator_js_1.default)(forestServerUrl, extra, actionType, {
|
|
114
|
+
const activityLog = await (0, activity_logs_creator_js_1.default)(forestServerUrl, extra, actionType, {
|
|
82
115
|
collectionName: options.collectionName,
|
|
83
116
|
});
|
|
84
117
|
try {
|
|
85
118
|
const collection = rpcClient.collection(options.collectionName);
|
|
119
|
+
let response;
|
|
86
120
|
if (options.enableCount) {
|
|
87
121
|
const [records, totalCount] = await Promise.all([
|
|
88
122
|
collection.list(options),
|
|
89
123
|
collection.count(options),
|
|
90
124
|
]);
|
|
91
|
-
|
|
125
|
+
response = { records, totalCount };
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
const records = await collection.list(options);
|
|
129
|
+
response = { records };
|
|
92
130
|
}
|
|
93
|
-
|
|
94
|
-
|
|
131
|
+
(0, activity_logs_creator_js_1.markActivityLogAsSucceeded)({
|
|
132
|
+
forestServerUrl,
|
|
133
|
+
request: extra,
|
|
134
|
+
activityLog,
|
|
135
|
+
logger,
|
|
136
|
+
});
|
|
137
|
+
return { content: [{ type: 'text', text: JSON.stringify(response) }] };
|
|
95
138
|
}
|
|
96
139
|
catch (error) {
|
|
97
140
|
// Parse error text if it's a JSON string from the agent
|
|
98
141
|
const errorDetail = (0, error_parser_js_1.default)(error);
|
|
142
|
+
(0, activity_logs_creator_js_1.markActivityLogAsFailed)({
|
|
143
|
+
forestServerUrl,
|
|
144
|
+
request: extra,
|
|
145
|
+
activityLog,
|
|
146
|
+
errorMessage: errorDetail || error.message,
|
|
147
|
+
logger,
|
|
148
|
+
});
|
|
99
149
|
if (errorDetail?.includes('Invalid sort')) {
|
|
100
150
|
const fields = (0, schema_fetcher_js_1.getFieldsOfCollection)(await (0, schema_fetcher_js_1.fetchForestSchema)(forestServerUrl), options.collectionName);
|
|
101
151
|
throw new Error(`The sort field provided is invalid for this collection. Available fields for the collection ${options.collectionName} are: ${fields
|
|
@@ -107,4 +157,4 @@ function declareListTool(mcpServer, forestServerUrl, logger, collectionNames = [
|
|
|
107
157
|
}
|
|
108
158
|
}, logger);
|
|
109
159
|
}
|
|
110
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
160
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29scy9saXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0VBLDBEQU1DO0FBRUQsa0NBd0ZDO0FBaEtELDZCQUF3QjtBQUV4QixxRUFBZ0Q7QUFDaEQsOEZBRzJDO0FBQzNDLCtFQUFtRDtBQUNuRCwrRUFBdUQ7QUFDdkQsa0VBQXNGO0FBQ3RGLHlGQUFvRTtBQUVwRSw0RUFBNEU7QUFDNUUsTUFBTSxxQkFBcUIsR0FBRyxPQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0lBQy9DLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtRQUFFLE9BQU8sR0FBRyxDQUFDO0lBRXhDLElBQUksQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AscUVBQXFFO1FBQ3JFLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztBQUNILENBQUMsRUFBRSxtQkFBWSxDQUFDLENBQUM7QUFFakIsTUFBTSxrQkFBa0IsR0FBRyxPQUFDLENBQUMsTUFBTSxDQUFDO0lBQ2xDLGNBQWMsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFO0lBQzFCLE1BQU0sRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzdCLE9BQU8sRUFBRSxxQkFBcUI7U0FDM0IsUUFBUSxDQUNQLG9KQUFvSixDQUNySjtTQUNBLFFBQVEsRUFBRTtJQUNiLElBQUksRUFBRSxPQUFDO1NBQ0osTUFBTSxDQUFDO1FBQ04sS0FBSyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7UUFDakIsU0FBUyxFQUFFLE9BQUMsQ0FBQyxPQUFPLEVBQUU7S0FDdkIsQ0FBQztTQUNELFFBQVEsRUFBRTtJQUNiLHNCQUFzQixFQUFFLE9BQUM7U0FDdEIs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
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Logger } from '../server.js';
|
|
1
2
|
import type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol';
|
|
2
3
|
import type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types';
|
|
3
4
|
/**
|
|
@@ -6,10 +7,32 @@ import type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sd
|
|
|
6
7
|
* @see packages/private-api/src/config/activity-logs.ts
|
|
7
8
|
*/
|
|
8
9
|
export type ActivityLogAction = 'index' | 'search' | 'filter' | 'action' | 'create' | 'update' | 'delete' | 'listRelatedData';
|
|
9
|
-
|
|
10
|
+
type ActivityLogResponse = {
|
|
11
|
+
id: string;
|
|
12
|
+
attributes: {
|
|
13
|
+
index: string;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
export default function createPendingActivityLog(forestServerUrl: string, request: RequestHandlerExtra<ServerRequest, ServerNotification>, action: ActivityLogAction, extra?: {
|
|
10
17
|
collectionName?: string;
|
|
11
18
|
recordId?: string | number;
|
|
12
19
|
recordIds?: string[] | number[];
|
|
13
20
|
label?: string;
|
|
14
|
-
}): Promise<
|
|
21
|
+
}): Promise<ActivityLogResponse>;
|
|
22
|
+
interface MarkActivityLogAsFailedOptions {
|
|
23
|
+
forestServerUrl: string;
|
|
24
|
+
request: RequestHandlerExtra<ServerRequest, ServerNotification>;
|
|
25
|
+
activityLog: ActivityLogResponse;
|
|
26
|
+
errorMessage: string;
|
|
27
|
+
logger: Logger;
|
|
28
|
+
}
|
|
29
|
+
export declare function markActivityLogAsFailed(options: MarkActivityLogAsFailedOptions): void;
|
|
30
|
+
interface MarkActivityLogAsSucceededOptions {
|
|
31
|
+
forestServerUrl: string;
|
|
32
|
+
request: RequestHandlerExtra<ServerRequest, ServerNotification>;
|
|
33
|
+
activityLog: ActivityLogResponse;
|
|
34
|
+
logger: Logger;
|
|
35
|
+
}
|
|
36
|
+
export declare function markActivityLogAsSucceeded(options: MarkActivityLogAsSucceededOptions): void;
|
|
37
|
+
export {};
|
|
15
38
|
//# sourceMappingURL=activity-logs-creator.d.ts.map
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.default =
|
|
3
|
+
exports.default = createPendingActivityLog;
|
|
4
|
+
exports.markActivityLogAsFailed = markActivityLogAsFailed;
|
|
5
|
+
exports.markActivityLogAsSucceeded = markActivityLogAsSucceeded;
|
|
4
6
|
const ACTION_TO_TYPE = {
|
|
5
7
|
index: 'read',
|
|
6
8
|
search: 'read',
|
|
@@ -11,7 +13,7 @@ const ACTION_TO_TYPE = {
|
|
|
11
13
|
delete: 'write',
|
|
12
14
|
listRelatedData: 'read',
|
|
13
15
|
};
|
|
14
|
-
async function
|
|
16
|
+
async function createPendingActivityLog(forestServerUrl, request, action, extra) {
|
|
15
17
|
const type = ACTION_TO_TYPE[action];
|
|
16
18
|
const forestServerToken = request.authInfo?.extra?.forestServerToken;
|
|
17
19
|
const renderingId = request.authInfo?.extra?.renderingId;
|
|
@@ -30,6 +32,7 @@ async function createActivityLog(forestServerUrl, request, action, extra) {
|
|
|
30
32
|
type,
|
|
31
33
|
action,
|
|
32
34
|
label: extra?.label,
|
|
35
|
+
status: 'pending',
|
|
33
36
|
records: (extra?.recordIds || (extra?.recordId ? [extra.recordId] : [])),
|
|
34
37
|
},
|
|
35
38
|
relationships: {
|
|
@@ -54,5 +57,60 @@ async function createActivityLog(forestServerUrl, request, action, extra) {
|
|
|
54
57
|
if (!response.ok) {
|
|
55
58
|
throw new Error(`Failed to create activity log: ${await response.text()}`);
|
|
56
59
|
}
|
|
60
|
+
const { data: activityLog } = (await response.json());
|
|
61
|
+
return activityLog;
|
|
57
62
|
}
|
|
58
|
-
|
|
63
|
+
async function updateActivityLogStatus(options) {
|
|
64
|
+
const { forestServerUrl, request, activityLog, status, errorMessage, logger } = options;
|
|
65
|
+
const forestServerToken = request.authInfo?.extra?.forestServerToken;
|
|
66
|
+
const response = await fetch(`${forestServerUrl}/api/activity-logs-requests/${activityLog.attributes.index}/${activityLog.id}`, {
|
|
67
|
+
method: 'PATCH',
|
|
68
|
+
headers: {
|
|
69
|
+
'Content-Type': 'application/json',
|
|
70
|
+
'Forest-Application-Source': 'MCP',
|
|
71
|
+
Authorization: `Bearer ${forestServerToken}`,
|
|
72
|
+
},
|
|
73
|
+
body: JSON.stringify({
|
|
74
|
+
data: {
|
|
75
|
+
id: activityLog.id,
|
|
76
|
+
type: 'activity-logs-requests',
|
|
77
|
+
attributes: {
|
|
78
|
+
status,
|
|
79
|
+
...(errorMessage && { errorMessage }),
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
}),
|
|
83
|
+
});
|
|
84
|
+
if (!response.ok) {
|
|
85
|
+
const responseText = await response.text();
|
|
86
|
+
logger('Error', `Failed to update activity log status to '${status}': ${responseText}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function markActivityLogAsFailed(options) {
|
|
90
|
+
const { forestServerUrl, request, activityLog, errorMessage, logger } = options;
|
|
91
|
+
// Fire-and-forget: don't block error response on activity log update
|
|
92
|
+
updateActivityLogStatus({
|
|
93
|
+
forestServerUrl,
|
|
94
|
+
request,
|
|
95
|
+
activityLog,
|
|
96
|
+
status: 'failed',
|
|
97
|
+
errorMessage,
|
|
98
|
+
logger,
|
|
99
|
+
}).catch(error => {
|
|
100
|
+
logger('Error', `Unexpected error updating activity log to 'failed': ${error}`);
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
function markActivityLogAsSucceeded(options) {
|
|
104
|
+
const { forestServerUrl, request, activityLog, logger } = options;
|
|
105
|
+
// Fire-and-forget: don't block successful response on activity log update
|
|
106
|
+
updateActivityLogStatus({
|
|
107
|
+
forestServerUrl,
|
|
108
|
+
request,
|
|
109
|
+
activityLog,
|
|
110
|
+
status: 'succeeded',
|
|
111
|
+
logger,
|
|
112
|
+
}).catch(error => {
|
|
113
|
+
logger('Error', `Unexpected error updating activity log to 'succeeded': ${error}`);
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZpdHktbG9ncy1jcmVhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2FjdGl2aXR5LWxvZ3MtY3JlYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXFDQSwyQ0E2REM7QUFtREQsMERBYUM7QUFTRCxnRUFZQztBQXBLRCxNQUFNLGNBQWMsR0FBZ0Q7SUFDbEUsS0FBSyxFQUFFLE1BQU07SUFDYixNQUFNLEVBQUUsTUFBTTtJQUNkLE1BQU0sRUFBRSxNQUFNO0lBQ2QsTUFBTSxFQUFFLE9BQU87SUFDZixNQUFNLEVBQUUsT0FBTztJQUNmLE1BQU0sRUFBRSxPQUFPO0lBQ2YsTUFBTSxFQUFFLE9BQU87SUFDZixlQUFlLEVBQUUsTUFBTTtDQUN4QixDQUFDO0FBU2EsS0FBSyxVQUFVLHdCQUF3QixDQUNwRCxlQUF1QixFQUN2QixPQUErRCxFQUMvRCxNQUF5QixFQUN6QixLQUtDO0lBRUQsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXBDLE1BQU0saUJBQWlCLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsaUJBQTJCLENBQUM7SUFDL0UsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsV0FBcUIsQ0FBQztJQUVuRSxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLGVBQWUsNkJBQTZCLEVBQUU7UUFDNUUsTUFBTSxFQUFFLE1BQU07UUFDZCxPQUFPLEVBQUU7WUFDUCxjQUFjLEVBQUUsa0JBQWtCO1lBQ2xDLDJCQUEyQixFQUFFLEtBQUs7WUFDbEMsYUFBYSxFQUFFLFVBQVUsaUJBQWlCLEVBQUU7U0FDN0M7UUFDRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNuQixJQUFJLEVBQUU7Z0JBQ0osRUFBRSxFQUFFLENBQUM7Z0JBQ0wsSUFBSSxFQUFFLHdCQUF3QjtnQkFDOUIsVUFBVSxF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
|