@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.
@@ -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,
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unito/integration-sdk",
3
- "version": "2.3.9",
3
+ "version": "2.3.11",
4
4
  "description": "Integration SDK",
5
5
  "type": "module",
6
6
  "types": "dist/src/index.d.ts",
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((error as HttpError).status).send(error);
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,