@edgestore/server 0.0.0-alpha.12
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 +86 -0
- package/adapters/next/app/index.d.ts +1 -0
- package/adapters/next/app/index.js +1 -0
- package/adapters/next/index.d.ts +1 -0
- package/adapters/next/index.js +1 -0
- package/adapters/next/pages/index.d.ts +1 -0
- package/adapters/next/pages/index.js +1 -0
- package/core/index.d.ts +1 -0
- package/core/index.js +1 -0
- package/dist/adapters/imageTypes.d.ts +2 -0
- package/dist/adapters/imageTypes.d.ts.map +1 -0
- package/dist/adapters/next/app/index.d.ts +14 -0
- package/dist/adapters/next/app/index.d.ts.map +1 -0
- package/dist/adapters/next/app/index.js +95 -0
- package/dist/adapters/next/app/index.mjs +91 -0
- package/dist/adapters/next/pages/index.d.ts +15 -0
- package/dist/adapters/next/pages/index.d.ts.map +1 -0
- package/dist/adapters/next/pages/index.js +69 -0
- package/dist/adapters/next/pages/index.mjs +65 -0
- package/dist/adapters/shared.d.ts +79 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/core/client/index.d.ts +81 -0
- package/dist/core/client/index.d.ts.map +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +96 -0
- package/dist/core/index.mjs +91 -0
- package/dist/core/internals/bucketBuilder.d.ts +199 -0
- package/dist/core/internals/bucketBuilder.d.ts.map +1 -0
- package/dist/core/internals/createPathParamProxy.d.ts +21 -0
- package/dist/core/internals/createPathParamProxy.d.ts.map +1 -0
- package/dist/core/sdk/index.d.ts +200 -0
- package/dist/core/sdk/index.d.ts.map +1 -0
- package/dist/index-3999aae6.js +187 -0
- package/dist/index-3cc4d530.js +183 -0
- package/dist/index-ca41982b.mjs +183 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +213 -0
- package/dist/index.mjs +209 -0
- package/dist/libs/errors/EdgeStoreCredentialsError.d.ts +5 -0
- package/dist/libs/errors/EdgeStoreCredentialsError.d.ts.map +1 -0
- package/dist/libs/errors/EdgeStoreError.d.ts +16 -0
- package/dist/libs/errors/EdgeStoreError.d.ts.map +1 -0
- package/dist/providers/aws/index.d.ts +9 -0
- package/dist/providers/aws/index.d.ts.map +1 -0
- package/dist/providers/aws/index.js +81 -0
- package/dist/providers/aws/index.mjs +77 -0
- package/dist/providers/edgestore/index.d.ts +8 -0
- package/dist/providers/edgestore/index.d.ts.map +1 -0
- package/dist/providers/edgestore/index.js +121 -0
- package/dist/providers/edgestore/index.mjs +117 -0
- package/dist/providers/index.d.ts +3 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/types.d.ts +91 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/shared-43667670.mjs +232 -0
- package/dist/shared-6bef8919.js +227 -0
- package/dist/shared-f7607e44.js +239 -0
- package/dist/types.d.ts +88 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +96 -0
- package/providers/aws/index.d.ts +1 -0
- package/providers/aws/index.js +1 -0
- package/providers/edgestore/index.d.ts +1 -0
- package/providers/edgestore/index.js +1 -0
- package/src/adapters/imageTypes.ts +10 -0
- package/src/adapters/next/app/index.ts +111 -0
- package/src/adapters/next/pages/index.ts +84 -0
- package/src/adapters/shared.ts +306 -0
- package/src/core/client/index.ts +202 -0
- package/src/core/index.ts +10 -0
- package/src/core/internals/bucketBuilder.ts +462 -0
- package/src/core/internals/createPathParamProxy.ts +40 -0
- package/src/core/sdk/index.ts +381 -0
- package/src/index.ts +1 -0
- package/src/libs/errors/EdgeStoreCredentialsError.ts +12 -0
- package/src/libs/errors/EdgeStoreError.ts +25 -0
- package/src/providers/aws/index.ts +109 -0
- package/src/providers/edgestore/index.ts +140 -0
- package/src/providers/index.ts +2 -0
- package/src/providers/types.ts +107 -0
- package/src/types.ts +139 -0
package/README.md
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Getting Started
|
|
2
|
+
|
|
3
|
+
### Next.js Setup
|
|
4
|
+
|
|
5
|
+
#### Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @edgestore/react
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
#### Environment Variables
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# .env
|
|
15
|
+
EDGE_STORE_ACCESS_KEY=your-access-key
|
|
16
|
+
EDGE_STORE_SECRET_KEY=your-secret-key
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
#### API Route
|
|
20
|
+
|
|
21
|
+
```jsx
|
|
22
|
+
// pages/api/edgestore/[...edgestore].js
|
|
23
|
+
import EdgeStore from '@edgestore/react/next';
|
|
24
|
+
|
|
25
|
+
export default EdgeStore();
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
#### Provider
|
|
29
|
+
|
|
30
|
+
```jsx
|
|
31
|
+
// pages/_app.jsx
|
|
32
|
+
import { EdgeStoreProvider } from '@edgestore/react';
|
|
33
|
+
|
|
34
|
+
export default function App({ Component, pageProps }) {
|
|
35
|
+
return (
|
|
36
|
+
<EdgeStoreProvider>
|
|
37
|
+
<Component {...pageProps} />
|
|
38
|
+
</EdgeStoreProvider>
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Upload image
|
|
44
|
+
|
|
45
|
+
```jsx
|
|
46
|
+
import { useEdgeStore } from '@edgestore/react';
|
|
47
|
+
|
|
48
|
+
const Page = () => {
|
|
49
|
+
const [file, setFile] = useState(null);
|
|
50
|
+
const { upload } = useEdgeStore();
|
|
51
|
+
|
|
52
|
+
return (
|
|
53
|
+
<div>
|
|
54
|
+
<input type="file" onChange={(e) => setFile(e.target.files[0])} />
|
|
55
|
+
<button
|
|
56
|
+
onClick={async () => {
|
|
57
|
+
await upload({
|
|
58
|
+
file,
|
|
59
|
+
key: 'path/to/image.jpg',
|
|
60
|
+
});
|
|
61
|
+
}}
|
|
62
|
+
>
|
|
63
|
+
Upload
|
|
64
|
+
</button>
|
|
65
|
+
</div>
|
|
66
|
+
);
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export default Page;
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Show image
|
|
73
|
+
|
|
74
|
+
```jsx
|
|
75
|
+
import { useEdgeStore } from '@edgestore/react';
|
|
76
|
+
|
|
77
|
+
const Page = () => {
|
|
78
|
+
const { getImgSrc } = useEdgeStore();
|
|
79
|
+
|
|
80
|
+
return (
|
|
81
|
+
<div>
|
|
82
|
+
<img src={getImgSrc('path/to/image.jpg')} />
|
|
83
|
+
</div>
|
|
84
|
+
);
|
|
85
|
+
};
|
|
86
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../../../dist/adapters/next/app';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = require('../../../dist/adapters/next/app');
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../../dist/adapters/next';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = require('../../dist/adapters/next');
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../../../dist/adapters/next/pages';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = require('../../../dist/adapters/next/pages');
|
package/core/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../dist/core';
|
package/core/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = require('../dist/core');
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imageTypes.d.ts","sourceRoot":"","sources":["../../src/adapters/imageTypes.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,UAS5B,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { NextRequest } from 'next/server';
|
|
2
|
+
import { EdgeStoreRouter } from '../../../core/internals/bucketBuilder';
|
|
3
|
+
import { Provider } from '../../../providers/types';
|
|
4
|
+
import { MaybePromise } from '../../../types';
|
|
5
|
+
export type CreateContextOptions = {
|
|
6
|
+
req: NextRequest;
|
|
7
|
+
};
|
|
8
|
+
export type Config<TCtx> = {
|
|
9
|
+
provider?: Provider;
|
|
10
|
+
router: EdgeStoreRouter<TCtx>;
|
|
11
|
+
createContext: (opts: CreateContextOptions) => MaybePromise<TCtx>;
|
|
12
|
+
};
|
|
13
|
+
export declare function createEdgeStoreNextHandler<TCtx>(config: Config<TCtx>): (req: NextRequest) => Promise<Response>;
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/adapters/next/app/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAKxE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAW9C,MAAM,MAAM,oBAAoB,GAAG;IACjC,GAAG,EAAE,WAAW,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,MAAM,CAAC,IAAI,IAAI;IACzB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;IAC9B,aAAa,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;CACnE,CAAC;AAEF,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,SAEhD,WAAW,uBAgF/B"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var shared = require('../../../shared-f7607e44.js');
|
|
6
|
+
var providers_edgestore_index = require('../../../providers/edgestore/index.js');
|
|
7
|
+
require('@panva/hkdf');
|
|
8
|
+
require('cookie');
|
|
9
|
+
require('jose');
|
|
10
|
+
require('uuid');
|
|
11
|
+
require('@swc/helpers/_/_define_property');
|
|
12
|
+
require('../../../index-3999aae6.js');
|
|
13
|
+
|
|
14
|
+
function createEdgeStoreNextHandler(config) {
|
|
15
|
+
const { provider = providers_edgestore_index.EdgeStoreProvider() } = config;
|
|
16
|
+
return async (req)=>{
|
|
17
|
+
try {
|
|
18
|
+
if (req.nextUrl.pathname === '/api/edgestore/init') {
|
|
19
|
+
const ctx = await config.createContext({
|
|
20
|
+
req
|
|
21
|
+
});
|
|
22
|
+
const { newCookies, token, baseUrl } = await shared.init({
|
|
23
|
+
ctx,
|
|
24
|
+
provider,
|
|
25
|
+
router: config.router
|
|
26
|
+
});
|
|
27
|
+
return new Response(JSON.stringify({
|
|
28
|
+
token,
|
|
29
|
+
baseUrl
|
|
30
|
+
}), {
|
|
31
|
+
status: 200,
|
|
32
|
+
headers: {
|
|
33
|
+
'Content-Type': 'application/json',
|
|
34
|
+
'Set-Cookie': newCookies.join('; ')
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
} else if (req.nextUrl.pathname === '/api/edgestore/request-upload') {
|
|
38
|
+
const res = await shared.requestUpload({
|
|
39
|
+
provider,
|
|
40
|
+
router: config.router,
|
|
41
|
+
body: await req.json(),
|
|
42
|
+
ctxToken: req.cookies.get('edgestore-ctx')?.value
|
|
43
|
+
});
|
|
44
|
+
return new Response(JSON.stringify(res), {
|
|
45
|
+
status: 200,
|
|
46
|
+
headers: {
|
|
47
|
+
'Content-Type': 'application/json'
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
} else if (req.nextUrl.pathname === '/api/edgestore/request-upload-parts') {
|
|
51
|
+
const res = await shared.requestUploadParts({
|
|
52
|
+
provider,
|
|
53
|
+
router: config.router,
|
|
54
|
+
body: await req.json(),
|
|
55
|
+
ctxToken: req.cookies.get('edgestore-ctx')?.value
|
|
56
|
+
});
|
|
57
|
+
return new Response(JSON.stringify(res), {
|
|
58
|
+
status: 200,
|
|
59
|
+
headers: {
|
|
60
|
+
'Content-Type': 'application/json'
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
} else if (req.nextUrl.pathname === '/api/edgestore/delete-file') {
|
|
64
|
+
await shared.deleteFile({
|
|
65
|
+
provider,
|
|
66
|
+
router: config.router,
|
|
67
|
+
body: await req.json(),
|
|
68
|
+
ctxToken: req.cookies.get('edgestore-ctx')?.value
|
|
69
|
+
});
|
|
70
|
+
return new Response(null, {
|
|
71
|
+
status: 200
|
|
72
|
+
});
|
|
73
|
+
} else {
|
|
74
|
+
return new Response(null, {
|
|
75
|
+
status: 404
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
} catch (err) {
|
|
79
|
+
if (err instanceof shared.EdgeStoreError) {
|
|
80
|
+
return new Response(err.message, {
|
|
81
|
+
status: shared.EDGE_STORE_ERROR_CODES[err.code]
|
|
82
|
+
});
|
|
83
|
+
} else if (err instanceof Error) {
|
|
84
|
+
return new Response(err.message, {
|
|
85
|
+
status: 500
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
return new Response('Internal server error', {
|
|
89
|
+
status: 500
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
exports.createEdgeStoreNextHandler = createEdgeStoreNextHandler;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { i as init, r as requestUpload, a as requestUploadParts, d as deleteFile, E as EdgeStoreError, b as EDGE_STORE_ERROR_CODES } from '../../../shared-43667670.mjs';
|
|
2
|
+
import { EdgeStoreProvider } from '../../../providers/edgestore/index.mjs';
|
|
3
|
+
import '@panva/hkdf';
|
|
4
|
+
import 'cookie';
|
|
5
|
+
import 'jose';
|
|
6
|
+
import 'uuid';
|
|
7
|
+
import '@swc/helpers/_/_define_property';
|
|
8
|
+
import '../../../index-ca41982b.mjs';
|
|
9
|
+
|
|
10
|
+
function createEdgeStoreNextHandler(config) {
|
|
11
|
+
const { provider = EdgeStoreProvider() } = config;
|
|
12
|
+
return async (req)=>{
|
|
13
|
+
try {
|
|
14
|
+
if (req.nextUrl.pathname === '/api/edgestore/init') {
|
|
15
|
+
const ctx = await config.createContext({
|
|
16
|
+
req
|
|
17
|
+
});
|
|
18
|
+
const { newCookies, token, baseUrl } = await init({
|
|
19
|
+
ctx,
|
|
20
|
+
provider,
|
|
21
|
+
router: config.router
|
|
22
|
+
});
|
|
23
|
+
return new Response(JSON.stringify({
|
|
24
|
+
token,
|
|
25
|
+
baseUrl
|
|
26
|
+
}), {
|
|
27
|
+
status: 200,
|
|
28
|
+
headers: {
|
|
29
|
+
'Content-Type': 'application/json',
|
|
30
|
+
'Set-Cookie': newCookies.join('; ')
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
} else if (req.nextUrl.pathname === '/api/edgestore/request-upload') {
|
|
34
|
+
const res = await requestUpload({
|
|
35
|
+
provider,
|
|
36
|
+
router: config.router,
|
|
37
|
+
body: await req.json(),
|
|
38
|
+
ctxToken: req.cookies.get('edgestore-ctx')?.value
|
|
39
|
+
});
|
|
40
|
+
return new Response(JSON.stringify(res), {
|
|
41
|
+
status: 200,
|
|
42
|
+
headers: {
|
|
43
|
+
'Content-Type': 'application/json'
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
} else if (req.nextUrl.pathname === '/api/edgestore/request-upload-parts') {
|
|
47
|
+
const res = await requestUploadParts({
|
|
48
|
+
provider,
|
|
49
|
+
router: config.router,
|
|
50
|
+
body: await req.json(),
|
|
51
|
+
ctxToken: req.cookies.get('edgestore-ctx')?.value
|
|
52
|
+
});
|
|
53
|
+
return new Response(JSON.stringify(res), {
|
|
54
|
+
status: 200,
|
|
55
|
+
headers: {
|
|
56
|
+
'Content-Type': 'application/json'
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
} else if (req.nextUrl.pathname === '/api/edgestore/delete-file') {
|
|
60
|
+
await deleteFile({
|
|
61
|
+
provider,
|
|
62
|
+
router: config.router,
|
|
63
|
+
body: await req.json(),
|
|
64
|
+
ctxToken: req.cookies.get('edgestore-ctx')?.value
|
|
65
|
+
});
|
|
66
|
+
return new Response(null, {
|
|
67
|
+
status: 200
|
|
68
|
+
});
|
|
69
|
+
} else {
|
|
70
|
+
return new Response(null, {
|
|
71
|
+
status: 404
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
} catch (err) {
|
|
75
|
+
if (err instanceof EdgeStoreError) {
|
|
76
|
+
return new Response(err.message, {
|
|
77
|
+
status: EDGE_STORE_ERROR_CODES[err.code]
|
|
78
|
+
});
|
|
79
|
+
} else if (err instanceof Error) {
|
|
80
|
+
return new Response(err.message, {
|
|
81
|
+
status: 500
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
return new Response('Internal server error', {
|
|
85
|
+
status: 500
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export { createEdgeStoreNextHandler };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { NextApiRequest, NextApiResponse } from 'next/types';
|
|
2
|
+
import { EdgeStoreRouter } from '../../../core/internals/bucketBuilder';
|
|
3
|
+
import { Provider } from '../../../providers/types';
|
|
4
|
+
import { MaybePromise } from '../../../types';
|
|
5
|
+
export type CreateContextOptions = {
|
|
6
|
+
req: NextApiRequest;
|
|
7
|
+
res: NextApiResponse;
|
|
8
|
+
};
|
|
9
|
+
export type Config<TCtx> = {
|
|
10
|
+
provider?: Provider;
|
|
11
|
+
router: EdgeStoreRouter<TCtx>;
|
|
12
|
+
createContext: (opts: CreateContextOptions) => MaybePromise<TCtx>;
|
|
13
|
+
};
|
|
14
|
+
export declare function createEdgeStoreNextHandler<TCtx>(config: Config<TCtx>): (req: NextApiRequest, res: NextApiResponse) => Promise<void>;
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/adapters/next/pages/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAKxE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAW9C,MAAM,MAAM,oBAAoB,GAAG;IACjC,GAAG,EAAE,cAAc,CAAC;IACpB,GAAG,EAAE,eAAe,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,MAAM,CAAC,IAAI,IAAI;IACzB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;IAC9B,aAAa,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;CACnE,CAAC;AAEF,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,SAEhD,cAAc,OAAO,eAAe,mBAoDxD"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var shared = require('../../../shared-f7607e44.js');
|
|
6
|
+
var providers_edgestore_index = require('../../../providers/edgestore/index.js');
|
|
7
|
+
require('@panva/hkdf');
|
|
8
|
+
require('cookie');
|
|
9
|
+
require('jose');
|
|
10
|
+
require('uuid');
|
|
11
|
+
require('@swc/helpers/_/_define_property');
|
|
12
|
+
require('../../../index-3999aae6.js');
|
|
13
|
+
|
|
14
|
+
function createEdgeStoreNextHandler(config) {
|
|
15
|
+
const { provider = providers_edgestore_index.EdgeStoreProvider() } = config;
|
|
16
|
+
return async (req, res)=>{
|
|
17
|
+
try {
|
|
18
|
+
if (req.url === '/api/edgestore/init') {
|
|
19
|
+
const ctx = await config.createContext({
|
|
20
|
+
req,
|
|
21
|
+
res
|
|
22
|
+
});
|
|
23
|
+
const { newCookies, token, baseUrl } = await shared.init({
|
|
24
|
+
ctx,
|
|
25
|
+
provider,
|
|
26
|
+
router: config.router
|
|
27
|
+
});
|
|
28
|
+
res.setHeader('Set-Cookie', newCookies);
|
|
29
|
+
res.json({
|
|
30
|
+
token,
|
|
31
|
+
baseUrl
|
|
32
|
+
});
|
|
33
|
+
} else if (req.url === '/api/edgestore/request-upload') {
|
|
34
|
+
res.json(await shared.requestUpload({
|
|
35
|
+
provider,
|
|
36
|
+
router: config.router,
|
|
37
|
+
body: req.body,
|
|
38
|
+
ctxToken: req.cookies['edgestore-ctx']
|
|
39
|
+
}));
|
|
40
|
+
} else if (req.url === '/api/edgestore/request-upload-parts') {
|
|
41
|
+
res.json(await shared.requestUploadParts({
|
|
42
|
+
provider,
|
|
43
|
+
router: config.router,
|
|
44
|
+
body: req.body,
|
|
45
|
+
ctxToken: req.cookies['edgestore-ctx']
|
|
46
|
+
}));
|
|
47
|
+
} else if (req.url === '/api/edgestore/delete-file') {
|
|
48
|
+
await shared.deleteFile({
|
|
49
|
+
provider,
|
|
50
|
+
router: config.router,
|
|
51
|
+
body: req.body,
|
|
52
|
+
ctxToken: req.cookies['edgestore-ctx']
|
|
53
|
+
});
|
|
54
|
+
res.status(200).end();
|
|
55
|
+
} else {
|
|
56
|
+
res.status(404).end();
|
|
57
|
+
}
|
|
58
|
+
} catch (err) {
|
|
59
|
+
if (err instanceof shared.EdgeStoreError) {
|
|
60
|
+
res.status(shared.EDGE_STORE_ERROR_CODES[err.code]).send(err.message);
|
|
61
|
+
} else if (err instanceof Error) {
|
|
62
|
+
res.status(500).send(err.message);
|
|
63
|
+
}
|
|
64
|
+
res.status(500).send('Internal server error');
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
exports.createEdgeStoreNextHandler = createEdgeStoreNextHandler;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { i as init, r as requestUpload, a as requestUploadParts, d as deleteFile, E as EdgeStoreError, b as EDGE_STORE_ERROR_CODES } from '../../../shared-43667670.mjs';
|
|
2
|
+
import { EdgeStoreProvider } from '../../../providers/edgestore/index.mjs';
|
|
3
|
+
import '@panva/hkdf';
|
|
4
|
+
import 'cookie';
|
|
5
|
+
import 'jose';
|
|
6
|
+
import 'uuid';
|
|
7
|
+
import '@swc/helpers/_/_define_property';
|
|
8
|
+
import '../../../index-ca41982b.mjs';
|
|
9
|
+
|
|
10
|
+
function createEdgeStoreNextHandler(config) {
|
|
11
|
+
const { provider = EdgeStoreProvider() } = config;
|
|
12
|
+
return async (req, res)=>{
|
|
13
|
+
try {
|
|
14
|
+
if (req.url === '/api/edgestore/init') {
|
|
15
|
+
const ctx = await config.createContext({
|
|
16
|
+
req,
|
|
17
|
+
res
|
|
18
|
+
});
|
|
19
|
+
const { newCookies, token, baseUrl } = await init({
|
|
20
|
+
ctx,
|
|
21
|
+
provider,
|
|
22
|
+
router: config.router
|
|
23
|
+
});
|
|
24
|
+
res.setHeader('Set-Cookie', newCookies);
|
|
25
|
+
res.json({
|
|
26
|
+
token,
|
|
27
|
+
baseUrl
|
|
28
|
+
});
|
|
29
|
+
} else if (req.url === '/api/edgestore/request-upload') {
|
|
30
|
+
res.json(await requestUpload({
|
|
31
|
+
provider,
|
|
32
|
+
router: config.router,
|
|
33
|
+
body: req.body,
|
|
34
|
+
ctxToken: req.cookies['edgestore-ctx']
|
|
35
|
+
}));
|
|
36
|
+
} else if (req.url === '/api/edgestore/request-upload-parts') {
|
|
37
|
+
res.json(await requestUploadParts({
|
|
38
|
+
provider,
|
|
39
|
+
router: config.router,
|
|
40
|
+
body: req.body,
|
|
41
|
+
ctxToken: req.cookies['edgestore-ctx']
|
|
42
|
+
}));
|
|
43
|
+
} else if (req.url === '/api/edgestore/delete-file') {
|
|
44
|
+
await deleteFile({
|
|
45
|
+
provider,
|
|
46
|
+
router: config.router,
|
|
47
|
+
body: req.body,
|
|
48
|
+
ctxToken: req.cookies['edgestore-ctx']
|
|
49
|
+
});
|
|
50
|
+
res.status(200).end();
|
|
51
|
+
} else {
|
|
52
|
+
res.status(404).end();
|
|
53
|
+
}
|
|
54
|
+
} catch (err) {
|
|
55
|
+
if (err instanceof EdgeStoreError) {
|
|
56
|
+
res.status(EDGE_STORE_ERROR_CODES[err.code]).send(err.message);
|
|
57
|
+
} else if (err instanceof Error) {
|
|
58
|
+
res.status(500).send(err.message);
|
|
59
|
+
}
|
|
60
|
+
res.status(500).send('Internal server error');
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export { createEdgeStoreNextHandler };
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { EdgeStoreRouter } from '../core/internals/bucketBuilder';
|
|
2
|
+
import { Provider } from '../providers/types';
|
|
3
|
+
export declare function init<TCtx>(params: {
|
|
4
|
+
provider: Provider;
|
|
5
|
+
router: EdgeStoreRouter<TCtx>;
|
|
6
|
+
ctx: TCtx;
|
|
7
|
+
}): Promise<{
|
|
8
|
+
newCookies: string[];
|
|
9
|
+
token: string | undefined;
|
|
10
|
+
baseUrl: import("../types").MaybePromise<string>;
|
|
11
|
+
}>;
|
|
12
|
+
export type RequestUploadBody = {
|
|
13
|
+
bucketName: string;
|
|
14
|
+
input: any;
|
|
15
|
+
fileInfo: {
|
|
16
|
+
size: number;
|
|
17
|
+
type: string;
|
|
18
|
+
extension: string;
|
|
19
|
+
replaceTargetUrl?: string;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
export declare function requestUpload<TCtx>(params: {
|
|
23
|
+
provider: Provider;
|
|
24
|
+
router: EdgeStoreRouter<TCtx>;
|
|
25
|
+
ctxToken: string | undefined;
|
|
26
|
+
body: RequestUploadBody;
|
|
27
|
+
}): Promise<{
|
|
28
|
+
size: number;
|
|
29
|
+
uploadedAt: string;
|
|
30
|
+
path: {
|
|
31
|
+
key: string;
|
|
32
|
+
value: string;
|
|
33
|
+
}[];
|
|
34
|
+
metadata: any;
|
|
35
|
+
uploadUrl: string;
|
|
36
|
+
accessUrl: string;
|
|
37
|
+
} | {
|
|
38
|
+
size: number;
|
|
39
|
+
uploadedAt: string;
|
|
40
|
+
path: {
|
|
41
|
+
key: string;
|
|
42
|
+
value: string;
|
|
43
|
+
}[];
|
|
44
|
+
metadata: any;
|
|
45
|
+
multipart: {
|
|
46
|
+
uploadId: string;
|
|
47
|
+
partSize: number;
|
|
48
|
+
totalParts: number;
|
|
49
|
+
parts: {
|
|
50
|
+
partNumber: number;
|
|
51
|
+
uploadUrl: string;
|
|
52
|
+
}[];
|
|
53
|
+
};
|
|
54
|
+
accessUrl: string;
|
|
55
|
+
}>;
|
|
56
|
+
export type RequestUploadPartsParams = {
|
|
57
|
+
multipart: {
|
|
58
|
+
uploadId: string;
|
|
59
|
+
parts: number[];
|
|
60
|
+
};
|
|
61
|
+
path: string;
|
|
62
|
+
};
|
|
63
|
+
export declare function requestUploadParts<TCtx>(params: {
|
|
64
|
+
provider: Provider;
|
|
65
|
+
router: EdgeStoreRouter<TCtx>;
|
|
66
|
+
ctxToken: string | undefined;
|
|
67
|
+
body: RequestUploadPartsParams;
|
|
68
|
+
}): Promise<import("../providers/types").RequestUploadPartsRes>;
|
|
69
|
+
export type DeleteFileBody = {
|
|
70
|
+
bucketName: string;
|
|
71
|
+
url: string;
|
|
72
|
+
};
|
|
73
|
+
export declare function deleteFile<TCtx>(params: {
|
|
74
|
+
provider: Provider;
|
|
75
|
+
router: EdgeStoreRouter<TCtx>;
|
|
76
|
+
ctxToken: string | undefined;
|
|
77
|
+
body: DeleteFileBody;
|
|
78
|
+
}): Promise<void>;
|
|
79
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/adapters/shared.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,eAAe,EAChB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAM9C,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE;IACvC,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;IAC9B,GAAG,EAAE,IAAI,CAAC;CACX;;;;GA4BA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,GAAG,CAAC;IACX,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH,CAAC;AAEF,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE;IAChD,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;IAC9B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,IAAI,EAAE,iBAAiB,CAAC;CACzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoEA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,EAAE;QACT,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC;IACF,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE;IACrD,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;IAC9B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,IAAI,EAAE,wBAAwB,CAAC;CAChC,+DAsBA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE;IAC7C,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;IAC9B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,IAAI,EAAE,cAAc,CAAC;CACtB,iBAwCA"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { AnyRouter, Comparison } from '..';
|
|
2
|
+
import { Simplify } from '../../types';
|
|
3
|
+
import { AnyBuilder, InferBucketPathKeys, InferMetadataObject } from '../internals/bucketBuilder';
|
|
4
|
+
export type GetFileRes<TBucket extends AnyBuilder> = {
|
|
5
|
+
url: string;
|
|
6
|
+
size: number;
|
|
7
|
+
uploadedAt: Date;
|
|
8
|
+
metadata: InferMetadataObject<TBucket>;
|
|
9
|
+
path: {
|
|
10
|
+
[TKey in InferBucketPathKeys<TBucket>]: string;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
type Filter<TBucket extends AnyBuilder> = {
|
|
14
|
+
AND?: Filter<TBucket>[];
|
|
15
|
+
OR?: Filter<TBucket>[];
|
|
16
|
+
uploadedAt?: Comparison<Date>;
|
|
17
|
+
path?: {
|
|
18
|
+
[K in InferBucketPathKeys<TBucket>]?: Comparison;
|
|
19
|
+
};
|
|
20
|
+
metadata?: {
|
|
21
|
+
[K in keyof InferMetadataObject<TBucket>]?: Comparison;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
export type ListFilesRequest<TBucket extends AnyBuilder> = {
|
|
25
|
+
filter?: Filter<TBucket>;
|
|
26
|
+
pagination?: {
|
|
27
|
+
currentPage: number;
|
|
28
|
+
pageSize: number;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
export type ListFilesResponse<TBucket extends AnyBuilder> = {
|
|
32
|
+
data: {
|
|
33
|
+
url: string;
|
|
34
|
+
thumbnailUrl: TBucket['_def']['type'] extends 'IMAGE' ? string | null : never;
|
|
35
|
+
size: number;
|
|
36
|
+
uploadedAt: Date;
|
|
37
|
+
metadata: InferMetadataObject<TBucket>;
|
|
38
|
+
path: {
|
|
39
|
+
[TKey in InferBucketPathKeys<TBucket>]: string;
|
|
40
|
+
};
|
|
41
|
+
}[];
|
|
42
|
+
pagination: {
|
|
43
|
+
currentPage: number;
|
|
44
|
+
totalPages: number;
|
|
45
|
+
totalCount: number;
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
type EdgeStoreClient<TRouter extends AnyRouter> = {
|
|
49
|
+
[K in keyof TRouter['buckets']]: {
|
|
50
|
+
getFile: (params: {
|
|
51
|
+
url: string;
|
|
52
|
+
}) => Promise<GetFileRes<TRouter['buckets'][K]>>;
|
|
53
|
+
/**
|
|
54
|
+
* Programmatically delete a file.
|
|
55
|
+
*/
|
|
56
|
+
deleteFile: (params: {
|
|
57
|
+
url: string;
|
|
58
|
+
}) => Promise<{
|
|
59
|
+
success: boolean;
|
|
60
|
+
}>;
|
|
61
|
+
/**
|
|
62
|
+
* List files in a bucket.
|
|
63
|
+
*
|
|
64
|
+
* You can also filter the results by passing a filter object.
|
|
65
|
+
* The results are paginated.
|
|
66
|
+
*/
|
|
67
|
+
listFiles: (params?: ListFilesRequest<TRouter['buckets'][K]>) => Promise<ListFilesResponse<TRouter['buckets'][K]>>;
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
export declare function initEdgeStoreClient<TRouter extends AnyRouter>(config: {
|
|
71
|
+
router: TRouter;
|
|
72
|
+
accessKey?: string;
|
|
73
|
+
secretKey?: string;
|
|
74
|
+
}): EdgeStoreClient<TRouter>;
|
|
75
|
+
export type InferClientResponse<TRouter extends AnyRouter> = {
|
|
76
|
+
[TBucketName in keyof TRouter['buckets']]: {
|
|
77
|
+
[TClienFn in keyof EdgeStoreClient<TRouter>[TBucketName]]: Simplify<Awaited<ReturnType<EdgeStoreClient<TRouter>[TBucketName][TClienFn]>>>;
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
export {};
|
|
81
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/client/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { EdgeStoreRouter } from './internals/bucketBuilder';
|
|
2
|
+
export * from './client';
|
|
3
|
+
export * from './sdk';
|
|
4
|
+
export type { InferBucketPathKeys, InferMetadataObject, } from './internals/bucketBuilder';
|
|
5
|
+
export type AnyRouter = EdgeStoreRouter<any>;
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,cAAc,UAAU,CAAC;AACzB,cAAc,OAAO,CAAC;AACtB,YAAY,EACV,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,2BAA2B,CAAC;AAEnC,MAAM,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC"}
|