r2-explorer 0.2.0 → 0.2.2
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/README.md +76 -0
- package/bin/r2-explorer.js +23 -3
- package/dist/cjs/api/core.js +23 -0
- package/dist/cjs/api/createFolder.js +60 -0
- package/dist/cjs/api/deleteObject.js +61 -0
- package/dist/cjs/api/downloadFile.js +68 -0
- package/dist/cjs/api/listContents.js +72 -0
- package/dist/cjs/api/listDisks.js +57 -0
- package/dist/cjs/api/renameObject.js +72 -0
- package/dist/cjs/api/uploadFiles.js +77 -0
- package/dist/cjs/index.js +65 -0
- package/dist/esm/api/core.js +19 -0
- package/dist/esm/api/createFolder.js +56 -0
- package/dist/esm/api/deleteObject.js +57 -0
- package/dist/esm/api/downloadFile.js +64 -0
- package/dist/esm/api/listContents.js +68 -0
- package/dist/esm/api/listDisks.js +53 -0
- package/dist/esm/api/renameObject.js +68 -0
- package/dist/esm/api/uploadFiles.js +73 -0
- package/dist/esm/index.js +58 -0
- package/dist/index.js +311 -195
- package/dist/types/api/core.d.ts +1 -0
- package/dist/types/api/createFolder.d.ts +1 -0
- package/dist/types/api/deleteObject.d.ts +1 -0
- package/dist/types/api/downloadFile.d.ts +1 -0
- package/dist/types/api/listContents.d.ts +1 -0
- package/dist/types/api/listDisks.d.ts +1 -0
- package/dist/types/api/renameObject.d.ts +1 -0
- package/dist/types/api/uploadFiles.d.ts +1 -0
- package/dist/types/index.d.ts +2 -0
- package/package.json +77 -17
- package/.eslintrc.yml +0 -31
- package/rollup.config.js +0 -40
- package/spa/favicon.png +0 -0
- package/spa/index.html +0 -1
- package/spa/js/app.js +0 -127
- package/spa/js/app.js.map +0 -1
- package/src/api/core.js +0 -12
- package/src/api/createFolder.js +0 -13
- package/src/api/deleteObject.js +0 -15
- package/src/api/downloadFile.js +0 -23
- package/src/api/listContents.js +0 -27
- package/src/api/listDisks.js +0 -15
- package/src/api/renameObject.js +0 -24
- package/src/api/uploadFiles.js +0 -23
- package/src/index.js +0 -60
- package/wrangler.toml +0 -15
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.R2Explorer = void 0;
|
|
7
|
+
var itty_router_1 = require("itty-router");
|
|
8
|
+
var listDisks_1 = require("./api/listDisks");
|
|
9
|
+
var listContents_1 = require("./api/listContents");
|
|
10
|
+
var uploadFiles_1 = require("./api/uploadFiles");
|
|
11
|
+
var createFolder_1 = require("./api/createFolder");
|
|
12
|
+
var deleteObject_1 = require("./api/deleteObject");
|
|
13
|
+
var renameObject_1 = require("./api/renameObject");
|
|
14
|
+
var downloadFile_1 = require("./api/downloadFile");
|
|
15
|
+
// @ts-ignore
|
|
16
|
+
var explorer_index_html_1 = __importDefault(require("explorer:index.html"));
|
|
17
|
+
// @ts-ignore
|
|
18
|
+
var app_js_1 = __importDefault(require("explorer:js/app.js"));
|
|
19
|
+
// @ts-ignore
|
|
20
|
+
var explorer_favicon_png_1 = __importDefault(require("explorer:favicon.png"));
|
|
21
|
+
function R2Explorer() {
|
|
22
|
+
var router = (0, itty_router_1.Router)();
|
|
23
|
+
router.get('/', function () {
|
|
24
|
+
return new Response(atob(explorer_index_html_1.default), {
|
|
25
|
+
status: 200,
|
|
26
|
+
headers: {
|
|
27
|
+
'content-type': 'text/html;charset=UTF-8',
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
router.get('/js/app.js', function () {
|
|
32
|
+
return new Response(atob(app_js_1.default), {
|
|
33
|
+
status: 200,
|
|
34
|
+
headers: {
|
|
35
|
+
'content-type': 'text/js;charset=UTF-8',
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
router.get('/favicon.png', function () {
|
|
40
|
+
return new Response(atob(explorer_favicon_png_1.default), {
|
|
41
|
+
status: 200,
|
|
42
|
+
headers: {
|
|
43
|
+
'content-type': 'image/png',
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
router.get('/api/disks', listDisks_1.listDisks);
|
|
48
|
+
router.get('/api/disks/:disk', listContents_1.listContents);
|
|
49
|
+
router.post('/api/disks/:disk/rename', renameObject_1.renameObject);
|
|
50
|
+
router.post('/api/disks/:disk/folder', createFolder_1.createFolder);
|
|
51
|
+
router.post('/api/disks/:disk/download-file', downloadFile_1.downloadFile);
|
|
52
|
+
router.post('/api/disks/:disk/upload', uploadFiles_1.uploadFiles);
|
|
53
|
+
router.post('/api/disks/:disk/delete', deleteObject_1.deleteObject);
|
|
54
|
+
router.get('/api/*', function (request, env, context) {
|
|
55
|
+
return new Response(JSON.stringify({ msg: '404, not found!' }), {
|
|
56
|
+
headers: {
|
|
57
|
+
'content-type': 'application/json;charset=UTF-8',
|
|
58
|
+
},
|
|
59
|
+
status: 404,
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
router.all('*', function () { return new Response('404, not found!', { status: 404 }); });
|
|
63
|
+
return router;
|
|
64
|
+
}
|
|
65
|
+
exports.R2Explorer = R2Explorer;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
var __assign = (this && this.__assign) || function () {
|
|
2
|
+
__assign = Object.assign || function(t) {
|
|
3
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
+
s = arguments[i];
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
+
t[p] = s[p];
|
|
7
|
+
}
|
|
8
|
+
return t;
|
|
9
|
+
};
|
|
10
|
+
return __assign.apply(this, arguments);
|
|
11
|
+
};
|
|
12
|
+
export function JsonResponse(json, status, headers) {
|
|
13
|
+
if (status === void 0) { status = 200; }
|
|
14
|
+
if (headers === void 0) { headers = {}; }
|
|
15
|
+
return new Response(JSON.stringify(json), {
|
|
16
|
+
headers: __assign({ 'content-type': 'application/json;charset=UTF-8', 'access-control-allow-origin': '*', 'access-control-allow-headers': '*', 'access-control-allow-methods': '*' }, headers),
|
|
17
|
+
status: status,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
12
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
+
function step(op) {
|
|
15
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
+
switch (op[0]) {
|
|
20
|
+
case 0: case 1: t = op; break;
|
|
21
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
+
default:
|
|
25
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
+
if (t[2]) _.ops.pop();
|
|
30
|
+
_.trys.pop(); continue;
|
|
31
|
+
}
|
|
32
|
+
op = body.call(thisArg, _);
|
|
33
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
import { JsonResponse } from './core';
|
|
38
|
+
export function createFolder(request, env, context) {
|
|
39
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
40
|
+
var body, disk, bucket, path, data;
|
|
41
|
+
return __generator(this, function (_a) {
|
|
42
|
+
switch (_a.label) {
|
|
43
|
+
case 0: return [4 /*yield*/, request.json()];
|
|
44
|
+
case 1:
|
|
45
|
+
body = _a.sent();
|
|
46
|
+
disk = request.params.disk;
|
|
47
|
+
bucket = env[disk];
|
|
48
|
+
path = body.path;
|
|
49
|
+
return [4 /*yield*/, bucket.put(path, 'Folder placeholder')];
|
|
50
|
+
case 2:
|
|
51
|
+
data = _a.sent();
|
|
52
|
+
return [2 /*return*/, JsonResponse(data)];
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
12
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
+
function step(op) {
|
|
15
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
+
switch (op[0]) {
|
|
20
|
+
case 0: case 1: t = op; break;
|
|
21
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
+
default:
|
|
25
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
+
if (t[2]) _.ops.pop();
|
|
30
|
+
_.trys.pop(); continue;
|
|
31
|
+
}
|
|
32
|
+
op = body.call(thisArg, _);
|
|
33
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
import { JsonResponse } from './core';
|
|
38
|
+
export function deleteObject(request, env, context) {
|
|
39
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
40
|
+
var body, disk, bucket, name, path;
|
|
41
|
+
return __generator(this, function (_a) {
|
|
42
|
+
switch (_a.label) {
|
|
43
|
+
case 0: return [4 /*yield*/, request.json()];
|
|
44
|
+
case 1:
|
|
45
|
+
body = _a.sent();
|
|
46
|
+
disk = request.params.disk;
|
|
47
|
+
bucket = env[disk];
|
|
48
|
+
name = body.name;
|
|
49
|
+
path = body.path;
|
|
50
|
+
return [4 /*yield*/, bucket.delete("".concat(path).concat(name))];
|
|
51
|
+
case 2:
|
|
52
|
+
_a.sent();
|
|
53
|
+
return [2 /*return*/, JsonResponse({})];
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
12
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
+
function step(op) {
|
|
15
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
+
switch (op[0]) {
|
|
20
|
+
case 0: case 1: t = op; break;
|
|
21
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
+
default:
|
|
25
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
+
if (t[2]) _.ops.pop();
|
|
30
|
+
_.trys.pop(); continue;
|
|
31
|
+
}
|
|
32
|
+
op = body.call(thisArg, _);
|
|
33
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
export function downloadFile(request, env, context) {
|
|
38
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
39
|
+
var body, disk, bucket, name, path, object, headers;
|
|
40
|
+
return __generator(this, function (_a) {
|
|
41
|
+
switch (_a.label) {
|
|
42
|
+
case 0: return [4 /*yield*/, request.json()];
|
|
43
|
+
case 1:
|
|
44
|
+
body = _a.sent();
|
|
45
|
+
disk = request.params.disk;
|
|
46
|
+
bucket = env[disk];
|
|
47
|
+
name = body.name;
|
|
48
|
+
path = body.path;
|
|
49
|
+
return [4 /*yield*/, bucket.get("".concat(path).concat(name))];
|
|
50
|
+
case 2:
|
|
51
|
+
object = _a.sent();
|
|
52
|
+
if (object === null) {
|
|
53
|
+
return [2 /*return*/, new Response('Object Not Found', { status: 404 })];
|
|
54
|
+
}
|
|
55
|
+
headers = new Headers();
|
|
56
|
+
object.writeHttpMetadata(headers);
|
|
57
|
+
headers.set('etag', object.httpEtag);
|
|
58
|
+
return [2 /*return*/, new Response(object.body, {
|
|
59
|
+
headers: headers,
|
|
60
|
+
})];
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
12
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
+
function step(op) {
|
|
15
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
+
switch (op[0]) {
|
|
20
|
+
case 0: case 1: t = op; break;
|
|
21
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
+
default:
|
|
25
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
+
if (t[2]) _.ops.pop();
|
|
30
|
+
_.trys.pop(); continue;
|
|
31
|
+
}
|
|
32
|
+
op = body.call(thisArg, _);
|
|
33
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
import { JsonResponse } from './core';
|
|
38
|
+
export function listContents(request, env, context) {
|
|
39
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
40
|
+
var disk, bucket, path, contents, prefixes, data, _i, _a, obj, _b, _c, prefix;
|
|
41
|
+
return __generator(this, function (_d) {
|
|
42
|
+
switch (_d.label) {
|
|
43
|
+
case 0:
|
|
44
|
+
disk = request.params.disk;
|
|
45
|
+
bucket = env[disk];
|
|
46
|
+
path = (request.query || '').path;
|
|
47
|
+
contents = [];
|
|
48
|
+
prefixes = [];
|
|
49
|
+
return [4 /*yield*/, bucket.list({ prefix: path, delimiter: '/' })];
|
|
50
|
+
case 1:
|
|
51
|
+
data = _d.sent();
|
|
52
|
+
if (data.objects) {
|
|
53
|
+
for (_i = 0, _a = data.objects; _i < _a.length; _i++) {
|
|
54
|
+
obj = _a[_i];
|
|
55
|
+
contents.push({ Key: obj.key, Size: obj.size, LastModified: obj.uploaded });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (data.delimitedPrefixes) {
|
|
59
|
+
for (_b = 0, _c = data.delimitedPrefixes; _b < _c.length; _b++) {
|
|
60
|
+
prefix = _c[_b];
|
|
61
|
+
prefixes.push({ Prefix: prefix });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return [2 /*return*/, JsonResponse({ Contents: contents, CommonPrefixes: prefixes })];
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
12
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
+
function step(op) {
|
|
15
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
+
switch (op[0]) {
|
|
20
|
+
case 0: case 1: t = op; break;
|
|
21
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
+
default:
|
|
25
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
+
if (t[2]) _.ops.pop();
|
|
30
|
+
_.trys.pop(); continue;
|
|
31
|
+
}
|
|
32
|
+
op = body.call(thisArg, _);
|
|
33
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
import { JsonResponse } from './core';
|
|
38
|
+
export function listDisks(request, env, context) {
|
|
39
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
40
|
+
var buckets, _i, _a, _b, key, value;
|
|
41
|
+
return __generator(this, function (_c) {
|
|
42
|
+
buckets = [];
|
|
43
|
+
for (_i = 0, _a = Object.entries(env); _i < _a.length; _i++) {
|
|
44
|
+
_b = _a[_i], key = _b[0], value = _b[1];
|
|
45
|
+
// @ts-ignore
|
|
46
|
+
if (value.get && value.put) {
|
|
47
|
+
buckets.push({ Name: key });
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return [2 /*return*/, JsonResponse({ Buckets: buckets })];
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
12
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
+
function step(op) {
|
|
15
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
+
switch (op[0]) {
|
|
20
|
+
case 0: case 1: t = op; break;
|
|
21
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
+
default:
|
|
25
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
+
if (t[2]) _.ops.pop();
|
|
30
|
+
_.trys.pop(); continue;
|
|
31
|
+
}
|
|
32
|
+
op = body.call(thisArg, _);
|
|
33
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
export function renameObject(request, env, context) {
|
|
38
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
39
|
+
var body, disk, bucket, path, oldName, newName, object, headers;
|
|
40
|
+
return __generator(this, function (_a) {
|
|
41
|
+
switch (_a.label) {
|
|
42
|
+
case 0: return [4 /*yield*/, request.json()];
|
|
43
|
+
case 1:
|
|
44
|
+
body = _a.sent();
|
|
45
|
+
disk = request.params.disk;
|
|
46
|
+
bucket = env[disk];
|
|
47
|
+
path = body.path;
|
|
48
|
+
oldName = body.oldName;
|
|
49
|
+
newName = body.newName;
|
|
50
|
+
return [4 /*yield*/, bucket.get("".concat(path).concat(oldName))];
|
|
51
|
+
case 2:
|
|
52
|
+
object = _a.sent();
|
|
53
|
+
return [4 /*yield*/, bucket.put("".concat(path).concat(newName), object.body)];
|
|
54
|
+
case 3:
|
|
55
|
+
_a.sent();
|
|
56
|
+
return [4 /*yield*/, bucket.delete("".concat(path).concat(oldName))];
|
|
57
|
+
case 4:
|
|
58
|
+
_a.sent();
|
|
59
|
+
headers = new Headers();
|
|
60
|
+
object.writeHttpMetadata(headers);
|
|
61
|
+
headers.set('etag', object.httpEtag);
|
|
62
|
+
return [2 /*return*/, new Response(object.body, {
|
|
63
|
+
headers: headers,
|
|
64
|
+
})];
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
12
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
+
function step(op) {
|
|
15
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
+
switch (op[0]) {
|
|
20
|
+
case 0: case 1: t = op; break;
|
|
21
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
+
default:
|
|
25
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
+
if (t[2]) _.ops.pop();
|
|
30
|
+
_.trys.pop(); continue;
|
|
31
|
+
}
|
|
32
|
+
op = body.call(thisArg, _);
|
|
33
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
import { JsonResponse } from './core';
|
|
38
|
+
export function uploadFiles(request, env, context) {
|
|
39
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
40
|
+
var form, disk, bucket, path, files;
|
|
41
|
+
var _this = this;
|
|
42
|
+
return __generator(this, function (_a) {
|
|
43
|
+
switch (_a.label) {
|
|
44
|
+
case 0: return [4 /*yield*/, request.formData()];
|
|
45
|
+
case 1:
|
|
46
|
+
form = _a.sent();
|
|
47
|
+
disk = request.params.disk;
|
|
48
|
+
bucket = env[disk];
|
|
49
|
+
path = request.query.path;
|
|
50
|
+
files = form.get('files');
|
|
51
|
+
if (!Array.isArray(files)) return [3 /*break*/, 2];
|
|
52
|
+
Array.from(files).forEach(function (file) { return __awaiter(_this, void 0, void 0, function () {
|
|
53
|
+
return __generator(this, function (_a) {
|
|
54
|
+
switch (_a.label) {
|
|
55
|
+
case 0: return [4 /*yield*/, bucket.put("".concat(path).concat(file.name), file)];
|
|
56
|
+
case 1:
|
|
57
|
+
_a.sent();
|
|
58
|
+
return [2 /*return*/];
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}); });
|
|
62
|
+
return [3 /*break*/, 4];
|
|
63
|
+
case 2:
|
|
64
|
+
console.log(files);
|
|
65
|
+
return [4 /*yield*/, bucket.put("".concat(path).concat(files.name), files)];
|
|
66
|
+
case 3:
|
|
67
|
+
_a.sent();
|
|
68
|
+
_a.label = 4;
|
|
69
|
+
case 4: return [2 /*return*/, JsonResponse({ status: 'ok' })];
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Router } from 'itty-router';
|
|
2
|
+
import { listDisks } from './api/listDisks';
|
|
3
|
+
import { listContents } from './api/listContents';
|
|
4
|
+
import { uploadFiles } from './api/uploadFiles';
|
|
5
|
+
import { createFolder } from './api/createFolder';
|
|
6
|
+
import { deleteObject } from './api/deleteObject';
|
|
7
|
+
import { renameObject } from './api/renameObject';
|
|
8
|
+
import { downloadFile } from './api/downloadFile';
|
|
9
|
+
// @ts-ignore
|
|
10
|
+
import html from 'explorer:index.html';
|
|
11
|
+
// @ts-ignore
|
|
12
|
+
import app from 'explorer:js/app.js';
|
|
13
|
+
// @ts-ignore
|
|
14
|
+
import favicon from 'explorer:favicon.png';
|
|
15
|
+
export function R2Explorer() {
|
|
16
|
+
var router = Router();
|
|
17
|
+
router.get('/', function () {
|
|
18
|
+
return new Response(atob(html), {
|
|
19
|
+
status: 200,
|
|
20
|
+
headers: {
|
|
21
|
+
'content-type': 'text/html;charset=UTF-8',
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
router.get('/js/app.js', function () {
|
|
26
|
+
return new Response(atob(app), {
|
|
27
|
+
status: 200,
|
|
28
|
+
headers: {
|
|
29
|
+
'content-type': 'text/js;charset=UTF-8',
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
router.get('/favicon.png', function () {
|
|
34
|
+
return new Response(atob(favicon), {
|
|
35
|
+
status: 200,
|
|
36
|
+
headers: {
|
|
37
|
+
'content-type': 'image/png',
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
router.get('/api/disks', listDisks);
|
|
42
|
+
router.get('/api/disks/:disk', listContents);
|
|
43
|
+
router.post('/api/disks/:disk/rename', renameObject);
|
|
44
|
+
router.post('/api/disks/:disk/folder', createFolder);
|
|
45
|
+
router.post('/api/disks/:disk/download-file', downloadFile);
|
|
46
|
+
router.post('/api/disks/:disk/upload', uploadFiles);
|
|
47
|
+
router.post('/api/disks/:disk/delete', deleteObject);
|
|
48
|
+
router.get('/api/*', function (request, env, context) {
|
|
49
|
+
return new Response(JSON.stringify({ msg: '404, not found!' }), {
|
|
50
|
+
headers: {
|
|
51
|
+
'content-type': 'application/json;charset=UTF-8',
|
|
52
|
+
},
|
|
53
|
+
status: 404,
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
router.all('*', function () { return new Response('404, not found!', { status: 404 }); });
|
|
57
|
+
return router;
|
|
58
|
+
}
|