Skip to content

Commit

Permalink
pangea-node-sdk: support source-url in Share upload
Browse files Browse the repository at this point in the history
  • Loading branch information
kenany committed Oct 16, 2024
1 parent c3e2b55 commit 9e65da7
Show file tree
Hide file tree
Showing 8 changed files with 86 additions and 47 deletions.
4 changes: 2 additions & 2 deletions examples/share/README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Pangea Store Service Example
# Pangea Secure Share examples

## Setup

Expand All @@ -8,5 +8,5 @@ Set up environment variables ([Instructions](https://pangea.cloud/docs/getting-s

```
yarn install
node folder_create_n_delete.mjs
node folder_create_and_delete.mjs
```
8 changes: 2 additions & 6 deletions examples/share/folder_create_and_delete.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,13 @@ const folderPath = "/sdk_examples/node/delete/" + time;
(async () => {
try {
console.log("Creating folder...");
const respCreate = await client.folderCreate({
path: folderPath,
});
const respCreate = await client.folderCreate({ folder: folderPath });

const id = respCreate.result.object.id;
console.log(`Folder create success. Folder ID: ${id}`);

console.log("Deleting folder...");
const respDelete = await client.delete({
id: id,
});
const respDelete = await client.delete({ id });

console.log(`Deleted ${respDelete.result.count} item(s)`);
} catch (e) {
Expand Down
1 change: 1 addition & 0 deletions examples/share/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"private": true,
"author": "Pangea",
"license": "MIT",
"packageManager": "yarn@1.22.22",
"dependencies": {
"citty": "^0.1.6",
"pangea-node-sdk": "file:../../packages/pangea-node-sdk"
Expand Down
4 changes: 2 additions & 2 deletions examples/share/put_transfer_method_post_url.mjs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/* eslint-disable no-console */

import { PangeaConfig, ShareService, TransferMethod } from "pangea-node-sdk";
import * as fs from "fs";
import { readFileSync } from "node:fs";

// Load Pangea token and domain from environment variables
const token = process.env.PANGEA_SHARE_TOKEN;
Expand All @@ -21,7 +21,7 @@ const filepath = "./testfile.pdf";
const name = time + "_file_post_url";

// Read file content as buffer
const data = fs.readFileSync(filepath);
const data = readFileSync(filepath);

// Send Put request setting transfer_method to post-url
// SDK will request an upload url, post the file to that url and then poll the upload result to Share service
Expand Down
68 changes: 37 additions & 31 deletions examples/share/yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -21,42 +21,42 @@
tslib "^2.6.2"

"@aws-sdk/types@^3.222.0":
version "3.533.0"
resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.533.0.tgz#4c4ade8f41f153295c69f1dea812dcd6154613e3"
integrity sha512-mFb0701oLRcJ7Y2unlrszzk9rr2P6nt2A4Bdz4K5WOsY4f4hsdbcYkrzA1NPmIUTEttU9JT0YG+8z0XxLEX4Aw==
version "3.664.0"
resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.664.0.tgz#e6de1c0a2cdfe4f1e43271223dc0b55e613ced58"
integrity sha512-+GtXktvVgpreM2b+NJL9OqZGsOzHwlCUrO8jgQUvH/yA6Kd8QO2YFhQCp0C9sSzTteZJVqGBu8E0CQurxJHPbw==
dependencies:
"@smithy/types" "^2.11.0"
tslib "^2.5.0"
"@smithy/types" "^3.5.0"
tslib "^2.6.2"

"@smithy/is-array-buffer@^2.1.1":
version "2.1.1"
resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-2.1.1.tgz#07b4c77ae67ed58a84400c76edd482271f9f957b"
integrity sha512-xozSQrcUinPpNPNPds4S7z/FakDTh1MZWtRP/2vQtYB/u3HYrX2UXuZs+VhaKBd6Vc7g2XPr2ZtwGBNDN6fNKQ==
"@smithy/is-array-buffer@^2.2.0":
version "2.2.0"
resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz#f84f0d9f9a36601a9ca9381688bd1b726fd39111"
integrity sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==
dependencies:
tslib "^2.5.0"
tslib "^2.6.2"

"@smithy/types@^2.11.0":
version "2.11.0"
resolved "https://registry.yarnpkg.com/@smithy/types/-/types-2.11.0.tgz#d40c27302151be243d3a7319a154b7d7d5775021"
integrity sha512-AR0SXO7FuAskfNhyGfSTThpLRntDI5bOrU0xrpVYU0rZyjl3LBXInZFMTP/NNSd7IS6Ksdtar0QvnrPRIhVrLQ==
"@smithy/types@^3.5.0":
version "3.5.0"
resolved "https://registry.yarnpkg.com/@smithy/types/-/types-3.5.0.tgz#9589e154c50d9c5d00feb7d818112ef8fc285d6e"
integrity sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==
dependencies:
tslib "^2.5.0"
tslib "^2.6.2"

"@smithy/util-buffer-from@^2.1.1":
version "2.1.1"
resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-2.1.1.tgz#f9346bf8b23c5ba6f6bdb61dd9db779441ba8d08"
integrity sha512-clhNjbyfqIv9Md2Mg6FffGVrJxw7bgK7s3Iax36xnfVj6cg0fUG7I4RH0XgXJF8bxi+saY5HR21g2UPKSxVCXg==
"@smithy/util-buffer-from@^2.2.0":
version "2.2.0"
resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz#6fc88585165ec73f8681d426d96de5d402021e4b"
integrity sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==
dependencies:
"@smithy/is-array-buffer" "^2.1.1"
tslib "^2.5.0"
"@smithy/is-array-buffer" "^2.2.0"
tslib "^2.6.2"

"@smithy/util-utf8@^2.0.0":
version "2.2.0"
resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-2.2.0.tgz#e352a81adc0491fbdc0086a00950d7e8333e211f"
integrity sha512-hBsKr5BqrDrKS8qy+YcV7/htmMGxriA1PREOf/8AGBhHIZnfilVv1Waf1OyKhSbFW15U/8+gcMUQ9/Kk5qwpHQ==
version "2.3.0"
resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-2.3.0.tgz#dd96d7640363259924a214313c3cf16e7dd329c5"
integrity sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==
dependencies:
"@smithy/util-buffer-from" "^2.1.1"
tslib "^2.5.0"
"@smithy/util-buffer-from" "^2.2.0"
tslib "^2.6.2"

citty@^0.1.6:
version "0.1.6"
Expand Down Expand Up @@ -95,6 +95,11 @@ js-sha3@^0.8.0:
resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840"
integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==

json-canon@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json-canon/-/json-canon-1.0.1.tgz#ce815a1d02e1b02c97b21154c7a844321e314184"
integrity sha512-PQcj4PFOTAQxE8PgoQ4KrM0DcKWZd7S3ELOON8rmysl9I8JuFMgxu1H9v+oZsTPjjkpeS3IHPwLjr7d+gKygnw==

merkle-tools@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/merkle-tools/-/merkle-tools-1.4.1.tgz#d08799886a6d51f5ee2bf0195f967b3cc3afd62c"
Expand All @@ -103,12 +108,13 @@ merkle-tools@^1.4.1:
js-sha3 "^0.8.0"

"pangea-node-sdk@file:../../packages/pangea-node-sdk":
version "3.11.0"
version "4.0.0"
dependencies:
"@aws-crypto/crc32c" "^5.2.0"
crypto-js "^4.2.0"
form-data-encoder "^4.0.2"
formdata-node "^6.0.3"
json-canon "^1.0.1"
merkle-tools "^1.4.1"
promise-retry "^2.0.1"

Expand All @@ -125,7 +131,7 @@ retry@^0.12.0:
resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==

tslib@^2.5.0, tslib@^2.6.2:
version "2.6.2"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae"
integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==
tslib@^2.6.2:
version "2.8.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.0.tgz#d124c86c3c05a40a91e6fdea4021bd31d377971b"
integrity sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==
15 changes: 11 additions & 4 deletions packages/pangea-node-sdk/src/request.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import { Buffer } from "node:buffer";
import fs from "node:fs";
import { FormDataEncoder } from "form-data-encoder";
import { FormData } from "formdata-node";
import { File, FormData } from "formdata-node";
import { fileFromPath } from "formdata-node/file-from-path";
import promiseRetry from "promise-retry";

import PangeaConfig, { version } from "./config.js";
import { PangeaErrors } from "./errors.js";
import { AttachedFile, PangeaResponse } from "./response.js";
Expand Down Expand Up @@ -174,9 +176,14 @@ class PangeaRequest {
return await this.httpPost(url, request);
}

private async getFileToForm(file: Blob | Buffer | string) {
private async getFileToForm(
file: Blob | Buffer | string
): Promise<Blob | File> {
if (typeof file === "string") {
return await fileFromPath(file);
return await fileFromPath(file, "file");
}
if (Buffer.isBuffer(file)) {
return new Blob([file]);
}
return file;
}
Expand Down Expand Up @@ -234,7 +241,7 @@ class PangeaRequest {
}

// Right now, only accept the file with name "file"
form.append("file", await this.getFileToForm(fileData.file));
form.append("file", await this.getFileToForm(fileData.file), "file");

const response = await this.httpPost(url, {
body: form,
Expand Down
24 changes: 22 additions & 2 deletions packages/pangea-node-sdk/src/services/share.ts
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,14 @@ class ShareService extends BaseService {
return this.post("v1/list", request);
}

put(
request: Share.PutRequest,
fileData: FileData
): Promise<PangeaResponse<Share.PutResult>>;
put(
request: Share.PutRequest & { transfer_method: TransferMethod.SOURCE_URL }
): Promise<PangeaResponse<Share.PutResult>>;

/**
* @summary Upload a file
* @description Upload a file.
Expand Down Expand Up @@ -161,8 +169,20 @@ class ShareService extends BaseService {
*/
put(
request: Share.PutRequest,
fileData: FileData
fileData?: FileData
): Promise<PangeaResponse<Share.PutResult>> {
// With `source-url`, no file data is needed.
if (request.transfer_method === TransferMethod.SOURCE_URL) {
return this.post("v1/put", request);
}

// Otherwise, file data is required.
if (!fileData) {
throw new TypeError(
"`fileData` is required when `transfer_method` is not `SOURCE_URL`."
);
}

let fsData = {} as FileUploadParams;

if (
Expand All @@ -173,7 +193,7 @@ class ShareService extends BaseService {
request.crc32c = fsData.crc32c;
request.sha256 = fsData.sha256;
request.size = fsData.size;
} else if (getFileSize(fileData.file) == 0) {
} else if (getFileSize(fileData.file) === 0) {
request.size = 0;
}

Expand Down
9 changes: 9 additions & 0 deletions packages/pangea-node-sdk/tests/integration/share.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -477,3 +477,12 @@ it("Item life cycle", async () => {
expect(respList.result.count).toBe(2);
expect(respList.result.objects.length).toBe(2);
});

it("transfer via `source-url`", async () => {
const response = await client.put({
transfer_method: TransferMethod.SOURCE_URL,
source_url: "https://www.google.com/robots.txt",
});
expect(response.status).toBe("Success");
expect(response.success).toBeTruthy();
});

0 comments on commit 9e65da7

Please sign in to comment.