@unito/integration-sdk 2.3.9 → 2.3.11
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.
- package/dist/src/handler.js +14 -6
- package/dist/src/index.cjs +17 -6
- package/dist/src/resources/provider.js +3 -0
- package/dist/test/resources/provider.test.js +27 -0
- package/package.json +1 -1
- package/src/handler.ts +19 -9
- package/src/resources/provider.ts +2 -0
- package/test/resources/provider.test.ts +31 -0
package/dist/src/handler.js
CHANGED
|
@@ -137,17 +137,25 @@ export class Handler {
|
|
|
137
137
|
* This is why we need to use busboy to parse the form data, extract the information about the file and pass it to the handler.
|
|
138
138
|
*/
|
|
139
139
|
const bb = busboy({ headers: req.headers });
|
|
140
|
+
const formFields = {};
|
|
141
|
+
bb.on('field', (name, value) => {
|
|
142
|
+
formFields[name] = value;
|
|
143
|
+
});
|
|
140
144
|
bb.on('file', async (_name, file, info) => {
|
|
141
145
|
try {
|
|
146
|
+
const body = {
|
|
147
|
+
file: file,
|
|
148
|
+
mimeType: info.mimeType,
|
|
149
|
+
encoding: info.encoding,
|
|
150
|
+
filename: info.filename,
|
|
151
|
+
};
|
|
152
|
+
if (formFields.fileSize) {
|
|
153
|
+
body.fileSize = Number(formFields.fileSize);
|
|
154
|
+
}
|
|
142
155
|
const createdBlob = await handler({
|
|
143
156
|
credentials: res.locals.credentials,
|
|
144
157
|
secrets: res.locals.secrets,
|
|
145
|
-
body
|
|
146
|
-
file: file,
|
|
147
|
-
mimeType: info.mimeType,
|
|
148
|
-
encoding: info.encoding,
|
|
149
|
-
filename: info.filename,
|
|
150
|
-
},
|
|
158
|
+
body,
|
|
151
159
|
logger: res.locals.logger,
|
|
152
160
|
signal: res.locals.signal,
|
|
153
161
|
params: req.params,
|
package/dist/src/index.cjs
CHANGED
|
@@ -642,17 +642,25 @@ class Handler {
|
|
|
642
642
|
* This is why we need to use busboy to parse the form data, extract the information about the file and pass it to the handler.
|
|
643
643
|
*/
|
|
644
644
|
const bb = busboy({ headers: req.headers });
|
|
645
|
+
const formFields = {};
|
|
646
|
+
bb.on('field', (name, value) => {
|
|
647
|
+
formFields[name] = value;
|
|
648
|
+
});
|
|
645
649
|
bb.on('file', async (_name, file, info) => {
|
|
646
650
|
try {
|
|
651
|
+
const body = {
|
|
652
|
+
file: file,
|
|
653
|
+
mimeType: info.mimeType,
|
|
654
|
+
encoding: info.encoding,
|
|
655
|
+
filename: info.filename,
|
|
656
|
+
};
|
|
657
|
+
if (formFields.fileSize) {
|
|
658
|
+
body.fileSize = Number(formFields.fileSize);
|
|
659
|
+
}
|
|
647
660
|
const createdBlob = await handler({
|
|
648
661
|
credentials: res.locals.credentials,
|
|
649
662
|
secrets: res.locals.secrets,
|
|
650
|
-
body
|
|
651
|
-
file: file,
|
|
652
|
-
mimeType: info.mimeType,
|
|
653
|
-
encoding: info.encoding,
|
|
654
|
-
filename: info.filename,
|
|
655
|
-
},
|
|
663
|
+
body,
|
|
656
664
|
logger: res.locals.logger,
|
|
657
665
|
signal: res.locals.signal,
|
|
658
666
|
params: req.params,
|
|
@@ -1471,6 +1479,9 @@ class Provider {
|
|
|
1471
1479
|
if (/^https?:\/\//.test(endpoint)) {
|
|
1472
1480
|
absoluteUrl = endpoint;
|
|
1473
1481
|
}
|
|
1482
|
+
else if (endpoint === '') {
|
|
1483
|
+
absoluteUrl = providerUrl;
|
|
1484
|
+
}
|
|
1474
1485
|
else {
|
|
1475
1486
|
absoluteUrl = [providerUrl, endpoint.charAt(0) === '/' ? endpoint.substring(1) : endpoint].join('/');
|
|
1476
1487
|
}
|
|
@@ -260,6 +260,9 @@ export class Provider {
|
|
|
260
260
|
if (/^https?:\/\//.test(endpoint)) {
|
|
261
261
|
absoluteUrl = endpoint;
|
|
262
262
|
}
|
|
263
|
+
else if (endpoint === '') {
|
|
264
|
+
absoluteUrl = providerUrl;
|
|
265
|
+
}
|
|
263
266
|
else {
|
|
264
267
|
absoluteUrl = [providerUrl, endpoint.charAt(0) === '/' ? endpoint.substring(1) : endpoint].join('/');
|
|
265
268
|
}
|
|
@@ -212,6 +212,33 @@ describe('Provider', () => {
|
|
|
212
212
|
]);
|
|
213
213
|
assert.deepEqual(actualResponse, { status: 200, headers: response.headers, body: { data: 'value' } });
|
|
214
214
|
});
|
|
215
|
+
it('gets on provider url', async (context) => {
|
|
216
|
+
const response = new Response('{"data": "value"}', {
|
|
217
|
+
status: 200,
|
|
218
|
+
headers: { 'Content-Type': 'application/json' },
|
|
219
|
+
});
|
|
220
|
+
const fetchMock = context.mock.method(global, 'fetch', () => Promise.resolve(response));
|
|
221
|
+
const actualResponse = await provider.get('', {
|
|
222
|
+
credentials: { apiKey: 'apikey#1111', unitoCredentialId: '123' },
|
|
223
|
+
logger: logger,
|
|
224
|
+
signal: new AbortController().signal,
|
|
225
|
+
});
|
|
226
|
+
assert.equal(fetchMock.mock.calls.length, 1);
|
|
227
|
+
assert.deepEqual(fetchMock.mock.calls[0]?.arguments, [
|
|
228
|
+
'www.myApi.com',
|
|
229
|
+
{
|
|
230
|
+
method: 'GET',
|
|
231
|
+
body: null,
|
|
232
|
+
signal: new AbortController().signal,
|
|
233
|
+
headers: {
|
|
234
|
+
Accept: 'application/json',
|
|
235
|
+
'X-Custom-Provider-Header': 'value',
|
|
236
|
+
'X-Provider-Credential-Header': 'apikey#1111',
|
|
237
|
+
},
|
|
238
|
+
},
|
|
239
|
+
]);
|
|
240
|
+
assert.deepEqual(actualResponse, { status: 200, headers: response.headers, body: { data: 'value' } });
|
|
241
|
+
});
|
|
215
242
|
it('post with url encoded body', async (context) => {
|
|
216
243
|
const response = new Response('{"data": "value"}', {
|
|
217
244
|
status: 201,
|
package/package.json
CHANGED
package/src/handler.ts
CHANGED
|
@@ -352,17 +352,29 @@ export class Handler {
|
|
|
352
352
|
* This is why we need to use busboy to parse the form data, extract the information about the file and pass it to the handler.
|
|
353
353
|
*/
|
|
354
354
|
const bb = busboy({ headers: req.headers });
|
|
355
|
+
const formFields: Record<string, string> = {};
|
|
356
|
+
|
|
357
|
+
bb.on('field', (name, value) => {
|
|
358
|
+
formFields[name] = value;
|
|
359
|
+
});
|
|
360
|
+
|
|
355
361
|
bb.on('file', async (_name, file, info: FileInfo) => {
|
|
356
362
|
try {
|
|
363
|
+
const body: API.CreateBlobRequestPayload = {
|
|
364
|
+
file: file,
|
|
365
|
+
mimeType: info.mimeType,
|
|
366
|
+
encoding: info.encoding,
|
|
367
|
+
filename: info.filename,
|
|
368
|
+
};
|
|
369
|
+
|
|
370
|
+
if (formFields.fileSize) {
|
|
371
|
+
body.fileSize = Number(formFields.fileSize);
|
|
372
|
+
}
|
|
373
|
+
|
|
357
374
|
const createdBlob = await handler({
|
|
358
375
|
credentials: res.locals.credentials,
|
|
359
376
|
secrets: res.locals.secrets,
|
|
360
|
-
body
|
|
361
|
-
file: file,
|
|
362
|
-
mimeType: info.mimeType,
|
|
363
|
-
encoding: info.encoding,
|
|
364
|
-
filename: info.filename,
|
|
365
|
-
},
|
|
377
|
+
body,
|
|
366
378
|
logger: res.locals.logger,
|
|
367
379
|
signal: res.locals.signal,
|
|
368
380
|
params: req.params,
|
|
@@ -371,17 +383,15 @@ export class Handler {
|
|
|
371
383
|
res.status(201).send(createdBlob);
|
|
372
384
|
} catch (error) {
|
|
373
385
|
if (error instanceof HttpError) {
|
|
374
|
-
res.status(
|
|
386
|
+
res.status(error.status).send(error);
|
|
375
387
|
} else {
|
|
376
388
|
res.status(500).send({ message: `Error creating the blob: ${error}` });
|
|
377
389
|
}
|
|
378
390
|
}
|
|
379
391
|
});
|
|
380
|
-
|
|
381
392
|
bb.on('error', error => {
|
|
382
393
|
res.status(500).send({ message: `Error parsing the form data: ${error}` });
|
|
383
394
|
});
|
|
384
|
-
|
|
385
395
|
req.pipe(bb);
|
|
386
396
|
});
|
|
387
397
|
}
|
|
@@ -362,6 +362,8 @@ export class Provider {
|
|
|
362
362
|
|
|
363
363
|
if (/^https?:\/\//.test(endpoint)) {
|
|
364
364
|
absoluteUrl = endpoint;
|
|
365
|
+
} else if (endpoint === '') {
|
|
366
|
+
absoluteUrl = providerUrl;
|
|
365
367
|
} else {
|
|
366
368
|
absoluteUrl = [providerUrl, endpoint.charAt(0) === '/' ? endpoint.substring(1) : endpoint].join('/');
|
|
367
369
|
}
|
|
@@ -253,6 +253,37 @@ describe('Provider', () => {
|
|
|
253
253
|
assert.deepEqual(actualResponse, { status: 200, headers: response.headers, body: { data: 'value' } });
|
|
254
254
|
});
|
|
255
255
|
|
|
256
|
+
it('gets on provider url', async context => {
|
|
257
|
+
const response = new Response('{"data": "value"}', {
|
|
258
|
+
status: 200,
|
|
259
|
+
headers: { 'Content-Type': 'application/json' },
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
const fetchMock = context.mock.method(global, 'fetch', () => Promise.resolve(response));
|
|
263
|
+
|
|
264
|
+
const actualResponse = await provider.get('', {
|
|
265
|
+
credentials: { apiKey: 'apikey#1111', unitoCredentialId: '123' },
|
|
266
|
+
logger: logger,
|
|
267
|
+
signal: new AbortController().signal,
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
assert.equal(fetchMock.mock.calls.length, 1);
|
|
271
|
+
assert.deepEqual(fetchMock.mock.calls[0]?.arguments, [
|
|
272
|
+
'www.myApi.com',
|
|
273
|
+
{
|
|
274
|
+
method: 'GET',
|
|
275
|
+
body: null,
|
|
276
|
+
signal: new AbortController().signal,
|
|
277
|
+
headers: {
|
|
278
|
+
Accept: 'application/json',
|
|
279
|
+
'X-Custom-Provider-Header': 'value',
|
|
280
|
+
'X-Provider-Credential-Header': 'apikey#1111',
|
|
281
|
+
},
|
|
282
|
+
},
|
|
283
|
+
]);
|
|
284
|
+
assert.deepEqual(actualResponse, { status: 200, headers: response.headers, body: { data: 'value' } });
|
|
285
|
+
});
|
|
286
|
+
|
|
256
287
|
it('post with url encoded body', async context => {
|
|
257
288
|
const response = new Response('{"data": "value"}', {
|
|
258
289
|
status: 201,
|