arvo-core 1.1.5 → 1.1.7
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.
|
@@ -26,9 +26,7 @@ export default class ArvoEventFactory<TUri extends string = string, TType extend
|
|
|
26
26
|
* @returns The created ArvoEvent as per the accept record of the contract.
|
|
27
27
|
* @throws If the event data fails validation against the contract.
|
|
28
28
|
*/
|
|
29
|
-
accepts<TExtension extends Record<string, any>>(event: Omit<CreateArvoEvent<z.infer<TAcceptSchema>, TType>, 'type'
|
|
30
|
-
to: string;
|
|
31
|
-
}, extensions?: TExtension): import("..").ArvoEvent<z.TypeOf<TAcceptSchema>, TExtension, TType>;
|
|
29
|
+
accepts<TExtension extends Record<string, any>>(event: Omit<CreateArvoEvent<z.infer<TAcceptSchema>, TType>, 'type' | 'datacontenttype' | 'dataschema'>, extensions?: TExtension): import("..").ArvoEvent<z.TypeOf<TAcceptSchema>, TExtension, TType>;
|
|
32
30
|
/**
|
|
33
31
|
* Creates an ArvoEvent as per one of the emits record in the contract.
|
|
34
32
|
*
|
|
@@ -39,9 +37,7 @@ export default class ArvoEventFactory<TUri extends string = string, TType extend
|
|
|
39
37
|
* @returns The created ArvoEvent as per one of the emits records of the contract.
|
|
40
38
|
* @throws If the event data fails validation against the contract.
|
|
41
39
|
*/
|
|
42
|
-
emits<U extends keyof TEmits & string, TExtension extends Record<string, any>>(event: CreateArvoEvent<z.infer<TEmits[U]>, U
|
|
43
|
-
to: string;
|
|
44
|
-
}, extensions?: TExtension): import("..").ArvoEvent<z.TypeOf<TEmits[U]>, TExtension, U>;
|
|
40
|
+
emits<U extends keyof TEmits & string, TExtension extends Record<string, any>>(event: Omit<CreateArvoEvent<z.infer<TEmits[U]>, U>, 'datacontenttype' | 'dataschema'>, extensions?: TExtension): import("..").ArvoEvent<z.TypeOf<TEmits[U]>, TExtension, U>;
|
|
45
41
|
/**
|
|
46
42
|
* Creates a system error ArvoEvent.
|
|
47
43
|
*
|
|
@@ -50,9 +46,8 @@ export default class ArvoEventFactory<TUri extends string = string, TType extend
|
|
|
50
46
|
* @param [extensions] - Optional extensions to add to the event.
|
|
51
47
|
* @returns The created system error ArvoEvent.
|
|
52
48
|
*/
|
|
53
|
-
systemError<TExtension extends Record<string, any>>(event: Omit<CreateArvoEvent<any, any>, 'data' | 'type'> & {
|
|
49
|
+
systemError<TExtension extends Record<string, any>>(event: Omit<CreateArvoEvent<any, any>, 'data' | 'type' | 'datacontenttype' | 'dataschema'> & {
|
|
54
50
|
error: Error;
|
|
55
|
-
to: string;
|
|
56
51
|
}, extensions?: TExtension): import("..").ArvoEvent<{
|
|
57
52
|
errorMessage: string;
|
|
58
53
|
errorName: string;
|
|
@@ -127,8 +127,8 @@ var ArvoEventFactory = /** @class */ (function () {
|
|
|
127
127
|
var _a;
|
|
128
128
|
span.setStatus({ code: api_1.SpanStatusCode.OK });
|
|
129
129
|
try {
|
|
130
|
-
var error = event.error,
|
|
131
|
-
return (0, helpers_1.createArvoEvent)(__assign(__assign({},
|
|
130
|
+
var error = event.error, _event = __rest(event, ["error"]);
|
|
131
|
+
return (0, helpers_1.createArvoEvent)(__assign(__assign({}, _event), { type: "sys.".concat(_this.contract.accepts.type, ".error"), data: {
|
|
132
132
|
errorName: error.name,
|
|
133
133
|
errorMessage: error.message,
|
|
134
134
|
errorStack: (_a = error.stack) !== null && _a !== void 0 ? _a : null,
|
|
@@ -30,4 +30,51 @@ export default class ArvoEventHttp {
|
|
|
30
30
|
* @throws {Error} If required fields are missing or if there's an error parsing the input.
|
|
31
31
|
*/
|
|
32
32
|
static importFromStructured(config: ArvoEventHttpConfig): ArvoEvent;
|
|
33
|
+
/**
|
|
34
|
+
* Validates the content type of the HTTP request.
|
|
35
|
+
* @param actual - The actual content type from the request.
|
|
36
|
+
* @param expected - The expected content type.
|
|
37
|
+
* @throws {Error} If the actual content type doesn't match the expected one.
|
|
38
|
+
*/
|
|
39
|
+
private static validateContentType;
|
|
40
|
+
/**
|
|
41
|
+
* Extracts event fields from the HTTP headers.
|
|
42
|
+
* @param headers - The HTTP headers containing event information.
|
|
43
|
+
* @returns An object with extracted event fields.
|
|
44
|
+
*/
|
|
45
|
+
private static extractEventFieldsFromHeaders;
|
|
46
|
+
/**
|
|
47
|
+
* Creates an error message for a missing required field.
|
|
48
|
+
* @param type - The type of the missing field.
|
|
49
|
+
* @param isHeader - A flag to distinguish between headers and structured payload
|
|
50
|
+
* @returns A formatted error message string.
|
|
51
|
+
*/
|
|
52
|
+
private static createErrorMessageForMissingField;
|
|
53
|
+
/**
|
|
54
|
+
* Validates that all required fields are present in the event data.
|
|
55
|
+
* @param event - The event data to validate.
|
|
56
|
+
* @param isHeader - A flag to distinguish between headers and structured payload
|
|
57
|
+
* @throws {Error} If any required field is missing.
|
|
58
|
+
*/
|
|
59
|
+
private static validateRequiredFields;
|
|
60
|
+
/**
|
|
61
|
+
* Extracts extension fields from the HTTP headers.
|
|
62
|
+
* @param headers - The HTTP headers containing event information.
|
|
63
|
+
* @returns An object with extracted extension fields.
|
|
64
|
+
*/
|
|
65
|
+
private static extractExtensions;
|
|
66
|
+
/**
|
|
67
|
+
* Creates an ArvoEvent instance from extracted event data, payload, and extensions.
|
|
68
|
+
* @param event - The extracted event data.
|
|
69
|
+
* @param data - The event payload.
|
|
70
|
+
* @param extensions - The extracted extension fields.
|
|
71
|
+
* @returns A new ArvoEvent instance.
|
|
72
|
+
*/
|
|
73
|
+
private static createArvoEvent;
|
|
74
|
+
/**
|
|
75
|
+
* Creates an ArvoEvent instance from structured event data.
|
|
76
|
+
* @param eventData - The structured event data.
|
|
77
|
+
* @returns A new ArvoEvent instance.
|
|
78
|
+
*/
|
|
79
|
+
private static createArvoEventFromStructured;
|
|
33
80
|
}
|
|
@@ -87,75 +87,12 @@ var ArvoEventHttp = /** @class */ (function () {
|
|
|
87
87
|
* @throws {Error} If required fields are missing or if there's an error parsing the input.
|
|
88
88
|
*/
|
|
89
89
|
ArvoEventHttp.importFromBinary = function (config) {
|
|
90
|
-
var _a, _b
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
'id',
|
|
97
|
-
'type',
|
|
98
|
-
'accesscontrol',
|
|
99
|
-
'executionunits',
|
|
100
|
-
'traceparent',
|
|
101
|
-
'tracestate',
|
|
102
|
-
'datacontenttype',
|
|
103
|
-
'specversion',
|
|
104
|
-
'time',
|
|
105
|
-
'source',
|
|
106
|
-
'subject',
|
|
107
|
-
'to',
|
|
108
|
-
'redirectto',
|
|
109
|
-
'dataschema',
|
|
110
|
-
];
|
|
111
|
-
var event_1 = {};
|
|
112
|
-
// Extract event fields from headers
|
|
113
|
-
for (var _i = 0, eventFields_1 = eventFields; _i < eventFields_1.length; _i++) {
|
|
114
|
-
var field = eventFields_1[_i];
|
|
115
|
-
var headerKey = "ce-".concat(field);
|
|
116
|
-
if (headerKey in config.headers) {
|
|
117
|
-
event_1[field] = config.headers[headerKey];
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
// Validate required fields
|
|
121
|
-
if (!event_1.type || !event_1.source || !event_1.subject) {
|
|
122
|
-
throw new Error('Missing required header fields: ce-type, ce-source, or ce-subject');
|
|
123
|
-
}
|
|
124
|
-
// Extract extensions
|
|
125
|
-
var prefixedEventFields_1 = eventFields.map(function (item) { return "ce-".concat(item); });
|
|
126
|
-
var extensions = Object.entries(config.headers)
|
|
127
|
-
.filter(function (_a) {
|
|
128
|
-
var key = _a[0];
|
|
129
|
-
return key.startsWith('ce-') && !prefixedEventFields_1.includes(key);
|
|
130
|
-
})
|
|
131
|
-
.reduce(function (acc, _a) {
|
|
132
|
-
var key = _a[0], value = _a[1];
|
|
133
|
-
acc[key.slice(3)] = value;
|
|
134
|
-
return acc;
|
|
135
|
-
}, {});
|
|
136
|
-
// Create and return ArvoEvent
|
|
137
|
-
return new ArvoEvent_1.default({
|
|
138
|
-
id: (_a = event_1.id) !== null && _a !== void 0 ? _a : (0, uuid_1.v4)(),
|
|
139
|
-
type: event_1.type,
|
|
140
|
-
accesscontrol: (_b = event_1.accesscontrol) !== null && _b !== void 0 ? _b : null,
|
|
141
|
-
executionunits: event_1.executionunits
|
|
142
|
-
? Number(event_1.executionunits)
|
|
143
|
-
: null,
|
|
144
|
-
traceparent: (_c = event_1.traceparent) !== null && _c !== void 0 ? _c : null,
|
|
145
|
-
tracestate: (_d = event_1.tracestate) !== null && _d !== void 0 ? _d : null,
|
|
146
|
-
datacontenttype: (_e = event_1.datacontenttype) !== null && _e !== void 0 ? _e : schema_1.ArvoDataContentType,
|
|
147
|
-
specversion: (_f = event_1.specversion) !== null && _f !== void 0 ? _f : '1.0',
|
|
148
|
-
time: (_g = event_1.time) !== null && _g !== void 0 ? _g : (0, utils_1.createTimestamp)(),
|
|
149
|
-
source: event_1.source,
|
|
150
|
-
subject: event_1.subject,
|
|
151
|
-
to: (_h = event_1.to) !== null && _h !== void 0 ? _h : null,
|
|
152
|
-
redirectto: (_j = event_1.redirectto) !== null && _j !== void 0 ? _j : null,
|
|
153
|
-
dataschema: (_k = event_1.dataschema) !== null && _k !== void 0 ? _k : null,
|
|
154
|
-
}, config.data, extensions);
|
|
155
|
-
}
|
|
156
|
-
catch (error) {
|
|
157
|
-
throw new Error("Failed to import ArvoEvent from binary: ".concat(error.message));
|
|
158
|
-
}
|
|
90
|
+
var _a, _b;
|
|
91
|
+
this.validateContentType((_b = (_a = config.headers['content-type']) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : '', 'application/json');
|
|
92
|
+
var event = this.extractEventFieldsFromHeaders(config.headers);
|
|
93
|
+
this.validateRequiredFields(event, true);
|
|
94
|
+
var extensions = this.extractExtensions(config.headers);
|
|
95
|
+
return this.createArvoEvent(event, config.data, extensions);
|
|
159
96
|
};
|
|
160
97
|
/**
|
|
161
98
|
* Imports an ArvoEvent from a structured-mode HTTP representation.
|
|
@@ -164,35 +101,164 @@ var ArvoEventHttp = /** @class */ (function () {
|
|
|
164
101
|
* @throws {Error} If required fields are missing or if there's an error parsing the input.
|
|
165
102
|
*/
|
|
166
103
|
ArvoEventHttp.importFromStructured = function (config) {
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
datacontenttype: datacontenttype !== null && datacontenttype !== void 0 ? datacontenttype : schema_1.ArvoDataContentType,
|
|
183
|
-
specversion: specversion !== null && specversion !== void 0 ? specversion : '1.0',
|
|
184
|
-
dataschema: dataschema !== null && dataschema !== void 0 ? dataschema : null,
|
|
185
|
-
to: to !== null && to !== void 0 ? to : null,
|
|
186
|
-
accesscontrol: accesscontrol !== null && accesscontrol !== void 0 ? accesscontrol : null,
|
|
187
|
-
redirectto: redirectto !== null && redirectto !== void 0 ? redirectto : null,
|
|
188
|
-
executionunits: executionunits ? Number(executionunits) : null,
|
|
189
|
-
traceparent: traceparent !== null && traceparent !== void 0 ? traceparent : null,
|
|
190
|
-
tracestate: tracestate !== null && tracestate !== void 0 ? tracestate : null,
|
|
191
|
-
}, data !== null && data !== void 0 ? data : {}, extensions);
|
|
104
|
+
var _a, _b;
|
|
105
|
+
this.validateContentType((_b = (_a = config.headers['content-type']) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : '', schema_1.ArvoDataContentType);
|
|
106
|
+
var eventData = config.data;
|
|
107
|
+
this.validateRequiredFields(eventData, false);
|
|
108
|
+
return this.createArvoEventFromStructured(eventData);
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* Validates the content type of the HTTP request.
|
|
112
|
+
* @param actual - The actual content type from the request.
|
|
113
|
+
* @param expected - The expected content type.
|
|
114
|
+
* @throws {Error} If the actual content type doesn't match the expected one.
|
|
115
|
+
*/
|
|
116
|
+
ArvoEventHttp.validateContentType = function (actual, expected) {
|
|
117
|
+
if (actual !== expected) {
|
|
118
|
+
throw new Error("Invalid content-type: ".concat(actual, ". Expected: ").concat(expected));
|
|
192
119
|
}
|
|
193
|
-
|
|
194
|
-
|
|
120
|
+
};
|
|
121
|
+
/**
|
|
122
|
+
* Extracts event fields from the HTTP headers.
|
|
123
|
+
* @param headers - The HTTP headers containing event information.
|
|
124
|
+
* @returns An object with extracted event fields.
|
|
125
|
+
*/
|
|
126
|
+
ArvoEventHttp.extractEventFieldsFromHeaders = function (headers) {
|
|
127
|
+
var eventFields = [
|
|
128
|
+
'id',
|
|
129
|
+
'type',
|
|
130
|
+
'accesscontrol',
|
|
131
|
+
'executionunits',
|
|
132
|
+
'traceparent',
|
|
133
|
+
'tracestate',
|
|
134
|
+
'datacontenttype',
|
|
135
|
+
'specversion',
|
|
136
|
+
'time',
|
|
137
|
+
'source',
|
|
138
|
+
'subject',
|
|
139
|
+
'to',
|
|
140
|
+
'redirectto',
|
|
141
|
+
'dataschema',
|
|
142
|
+
];
|
|
143
|
+
return Object.fromEntries(eventFields
|
|
144
|
+
.map(function (field) { return ["ce-".concat(field), headers["ce-".concat(field)]]; })
|
|
145
|
+
.filter(function (_a) {
|
|
146
|
+
var value = _a[1];
|
|
147
|
+
return value !== undefined;
|
|
148
|
+
})
|
|
149
|
+
.map(function (_a) {
|
|
150
|
+
var key = _a[0], value = _a[1];
|
|
151
|
+
return [key.slice(3), value];
|
|
152
|
+
}));
|
|
153
|
+
};
|
|
154
|
+
/**
|
|
155
|
+
* Creates an error message for a missing required field.
|
|
156
|
+
* @param type - The type of the missing field.
|
|
157
|
+
* @param isHeader - A flag to distinguish between headers and structured payload
|
|
158
|
+
* @returns A formatted error message string.
|
|
159
|
+
*/
|
|
160
|
+
ArvoEventHttp.createErrorMessageForMissingField = function (type, isHeader) {
|
|
161
|
+
if (isHeader) {
|
|
162
|
+
return "Missing required header field(s): ".concat(type);
|
|
195
163
|
}
|
|
164
|
+
return "Missing required field(s): ".concat(type);
|
|
165
|
+
};
|
|
166
|
+
/**
|
|
167
|
+
* Validates that all required fields are present in the event data.
|
|
168
|
+
* @param event - The event data to validate.
|
|
169
|
+
* @param isHeader - A flag to distinguish between headers and structured payload
|
|
170
|
+
* @throws {Error} If any required field is missing.
|
|
171
|
+
*/
|
|
172
|
+
ArvoEventHttp.validateRequiredFields = function (event, isHeader) {
|
|
173
|
+
['type', 'source', 'subject'].forEach(function (field) {
|
|
174
|
+
if (!event[field]) {
|
|
175
|
+
throw new Error(ArvoEventHttp.createErrorMessageForMissingField(isHeader ? "ce-".concat(field) : field, isHeader));
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
};
|
|
179
|
+
/**
|
|
180
|
+
* Extracts extension fields from the HTTP headers.
|
|
181
|
+
* @param headers - The HTTP headers containing event information.
|
|
182
|
+
* @returns An object with extracted extension fields.
|
|
183
|
+
*/
|
|
184
|
+
ArvoEventHttp.extractExtensions = function (headers) {
|
|
185
|
+
var eventFields = [
|
|
186
|
+
'id',
|
|
187
|
+
'type',
|
|
188
|
+
'accesscontrol',
|
|
189
|
+
'executionunits',
|
|
190
|
+
'traceparent',
|
|
191
|
+
'tracestate',
|
|
192
|
+
'datacontenttype',
|
|
193
|
+
'specversion',
|
|
194
|
+
'time',
|
|
195
|
+
'source',
|
|
196
|
+
'subject',
|
|
197
|
+
'to',
|
|
198
|
+
'redirectto',
|
|
199
|
+
'dataschema',
|
|
200
|
+
];
|
|
201
|
+
return Object.fromEntries(Object.entries(headers)
|
|
202
|
+
.filter(function (_a) {
|
|
203
|
+
var key = _a[0];
|
|
204
|
+
return key.startsWith('ce-') && !eventFields.includes(key.slice(3));
|
|
205
|
+
})
|
|
206
|
+
.map(function (_a) {
|
|
207
|
+
var key = _a[0], value = _a[1];
|
|
208
|
+
return [key.slice(3), value];
|
|
209
|
+
}));
|
|
210
|
+
};
|
|
211
|
+
/**
|
|
212
|
+
* Creates an ArvoEvent instance from extracted event data, payload, and extensions.
|
|
213
|
+
* @param event - The extracted event data.
|
|
214
|
+
* @param data - The event payload.
|
|
215
|
+
* @param extensions - The extracted extension fields.
|
|
216
|
+
* @returns A new ArvoEvent instance.
|
|
217
|
+
*/
|
|
218
|
+
ArvoEventHttp.createArvoEvent = function (event, data, extensions) {
|
|
219
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
220
|
+
return new ArvoEvent_1.default({
|
|
221
|
+
id: (_a = event.id) !== null && _a !== void 0 ? _a : (0, uuid_1.v4)(),
|
|
222
|
+
type: event.type,
|
|
223
|
+
accesscontrol: (_b = event.accesscontrol) !== null && _b !== void 0 ? _b : null,
|
|
224
|
+
executionunits: event.executionunits
|
|
225
|
+
? Number(event.executionunits)
|
|
226
|
+
: null,
|
|
227
|
+
traceparent: (_c = event.traceparent) !== null && _c !== void 0 ? _c : null,
|
|
228
|
+
tracestate: (_d = event.tracestate) !== null && _d !== void 0 ? _d : null,
|
|
229
|
+
datacontenttype: (_e = event.datacontenttype) !== null && _e !== void 0 ? _e : schema_1.ArvoDataContentType,
|
|
230
|
+
specversion: (_f = event.specversion) !== null && _f !== void 0 ? _f : '1.0',
|
|
231
|
+
time: (_g = event.time) !== null && _g !== void 0 ? _g : (0, utils_1.createTimestamp)(),
|
|
232
|
+
source: event.source,
|
|
233
|
+
subject: event.subject,
|
|
234
|
+
to: (_h = event.to) !== null && _h !== void 0 ? _h : null,
|
|
235
|
+
redirectto: (_j = event.redirectto) !== null && _j !== void 0 ? _j : null,
|
|
236
|
+
dataschema: (_k = event.dataschema) !== null && _k !== void 0 ? _k : null,
|
|
237
|
+
}, data, extensions);
|
|
238
|
+
};
|
|
239
|
+
/**
|
|
240
|
+
* Creates an ArvoEvent instance from structured event data.
|
|
241
|
+
* @param eventData - The structured event data.
|
|
242
|
+
* @returns A new ArvoEvent instance.
|
|
243
|
+
*/
|
|
244
|
+
ArvoEventHttp.createArvoEventFromStructured = function (eventData) {
|
|
245
|
+
var id = eventData.id, type = eventData.type, source = eventData.source, subject = eventData.subject, time = eventData.time, datacontenttype = eventData.datacontenttype, specversion = eventData.specversion, dataschema = eventData.dataschema, data = eventData.data, to = eventData.to, accesscontrol = eventData.accesscontrol, redirectto = eventData.redirectto, executionunits = eventData.executionunits, traceparent = eventData.traceparent, tracestate = eventData.tracestate, extensions = __rest(eventData, ["id", "type", "source", "subject", "time", "datacontenttype", "specversion", "dataschema", "data", "to", "accesscontrol", "redirectto", "executionunits", "traceparent", "tracestate"]);
|
|
246
|
+
return ArvoEventHttp.createArvoEvent({
|
|
247
|
+
id: id !== null && id !== void 0 ? id : (0, uuid_1.v4)(),
|
|
248
|
+
type: type,
|
|
249
|
+
source: source,
|
|
250
|
+
subject: subject,
|
|
251
|
+
time: time !== null && time !== void 0 ? time : (0, utils_1.createTimestamp)(),
|
|
252
|
+
datacontenttype: datacontenttype !== null && datacontenttype !== void 0 ? datacontenttype : schema_1.ArvoDataContentType,
|
|
253
|
+
specversion: specversion !== null && specversion !== void 0 ? specversion : '1.0',
|
|
254
|
+
dataschema: dataschema !== null && dataschema !== void 0 ? dataschema : null,
|
|
255
|
+
to: to !== null && to !== void 0 ? to : null,
|
|
256
|
+
accesscontrol: accesscontrol !== null && accesscontrol !== void 0 ? accesscontrol : null,
|
|
257
|
+
redirectto: redirectto !== null && redirectto !== void 0 ? redirectto : null,
|
|
258
|
+
executionunits: executionunits ? Number(executionunits) : null,
|
|
259
|
+
traceparent: traceparent !== null && traceparent !== void 0 ? traceparent : null,
|
|
260
|
+
tracestate: tracestate !== null && tracestate !== void 0 ? tracestate : null,
|
|
261
|
+
}, data !== null && data !== void 0 ? data : {}, extensions);
|
|
196
262
|
};
|
|
197
263
|
return ArvoEventHttp;
|
|
198
264
|
}());
|