@edgestore/react 0.1.2 → 0.1.3-alpha.1

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.
@@ -4,10 +4,12 @@ import { type BucketFunctions } from './createNextProxy';
4
4
  type EdgeStoreContextValue<TRouter extends AnyRouter> = {
5
5
  edgestore: BucketFunctions<TRouter>;
6
6
  /**
7
- * In development, if this is a protected file, this function will add the token as a query param to the url.
8
- * This is needed because third party cookies don't work with http urls.
7
+ * This will re-run the Edge Store initialization process,
8
+ * which will run the `createContext` function again.
9
+ *
10
+ * Can be used after a sign-in or sign-out, for example.
9
11
  */
10
- getSrc: (url: string) => string;
12
+ reset: () => Promise<void>;
11
13
  };
12
14
  export declare function createEdgeStoreProvider<TRouter extends AnyRouter>(opts?: {
13
15
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"contextProvider.d.ts","sourceRoot":"","sources":["../src/contextProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAK1E,KAAK,qBAAqB,CAAC,OAAO,SAAS,SAAS,IAAI;IACtD,SAAS,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IACpC;;;OAGG;IACH,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;CACjC,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,OAAO,SAAS,SAAS,EAAE,IAAI,CAAC,EAAE;IACxE;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;;kBASa,MAAM,SAAS;QACzB;;;;;;WAMG;;;;EAgCN"}
1
+ {"version":3,"file":"contextProvider.d.ts","sourceRoot":"","sources":["../src/contextProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAK1E,KAAK,qBAAqB,CAAC,OAAO,SAAS,SAAS,IAAI;IACtD,SAAS,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IACpC;;;;;OAKG;IACH,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,OAAO,SAAS,SAAS,EAAE,IAAI,CAAC,EAAE;IACxE;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;;kBASa,MAAM,SAAS;QACzB;;;;;;WAMG;;;;EAgCN"}
@@ -28,14 +28,10 @@ export type BucketFunctions<TRouter extends AnyRouter> = {
28
28
  }>;
29
29
  confirmUpload: (params: {
30
30
  url: string;
31
- }) => Promise<{
32
- success: boolean;
33
- }>;
31
+ }) => Promise<void>;
34
32
  delete: (params: {
35
33
  url: string;
36
- }) => Promise<{
37
- success: boolean;
38
- }>;
34
+ }) => Promise<void>;
39
35
  };
40
36
  };
41
37
  type OnProgressChangeHandler = (progress: number) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"createNextProxy.d.ts","sourceRoot":"","sources":["../src/createNextProxy.ts"],"names":[],"mappings":";AACA,OAAO,EACL,KAAK,SAAS,EACd,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,CAAC;AAG7B,MAAM,MAAM,eAAe,CAAC,OAAO,SAAS,SAAS,IAAI;KACtD,CAAC,IAAI,MAAM,OAAO,CAAC,SAAS,CAAC,GAAG;QAC/B,MAAM,EAAE,CACN,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,KAAK,GACjE;YACE,IAAI,EAAE,IAAI,CAAC;YACX,gBAAgB,CAAC,EAAE,uBAAuB,CAAC;YAC3C,OAAO,CAAC,EAAE,aAAa,CAAC;SACzB,GACD;YACE,IAAI,EAAE,IAAI,CAAC;YACX,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YACvD,gBAAgB,CAAC,EAAE,uBAAuB,CAAC;YAC3C,OAAO,CAAC,EAAE,aAAa,CAAC;SACzB,KACF,OAAO,CACV,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,SAAS,OAAO,GACjD;YACE,GAAG,EAAE,MAAM,CAAC;YACZ,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;YAC5B,IAAI,EAAE,MAAM,CAAC;YACb,UAAU,EAAE,IAAI,CAAC;YACjB,QAAQ,EAAE,mBAAmB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrD,IAAI,EAAE,qBAAqB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACpD,GACD;YACE,GAAG,EAAE,MAAM,CAAC;YACZ,IAAI,EAAE,MAAM,CAAC;YACb,UAAU,EAAE,IAAI,CAAC;YACjB,QAAQ,EAAE,mBAAmB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrD,IAAI,EAAE,qBAAqB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACpD,CACN,CAAC;QACF,aAAa,EAAE,CAAC,MAAM,EAAE;YAAE,GAAG,EAAE,MAAM,CAAA;SAAE,KAAK,OAAO,CAAC;YAClD,OAAO,EAAE,OAAO,CAAC;SAClB,CAAC,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,EAAE;YAAE,GAAG,EAAE,MAAM,CAAA;SAAE,KAAK,OAAO,CAAC;YAC3C,OAAO,EAAE,OAAO,CAAC;SAClB,CAAC,CAAC;KACJ;CACF,CAAC;AAEF,KAAK,uBAAuB,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;AAE1D,KAAK,aAAa,GAAG;IACnB;;;;;;;;;;OAUG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,wBAAgB,eAAe,CAAC,OAAO,SAAS,SAAS,EAAE,EACzD,OAAO,EACP,iBAAiB,EACjB,oBAAwB,GACzB,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAClD,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,4BAuCA"}
1
+ {"version":3,"file":"createNextProxy.d.ts","sourceRoot":"","sources":["../src/createNextProxy.ts"],"names":[],"mappings":";AACA,OAAO,EACL,KAAK,SAAS,EACd,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,CAAC;AAG7B,MAAM,MAAM,eAAe,CAAC,OAAO,SAAS,SAAS,IAAI;KACtD,CAAC,IAAI,MAAM,OAAO,CAAC,SAAS,CAAC,GAAG;QAC/B,MAAM,EAAE,CACN,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,KAAK,GACjE;YACE,IAAI,EAAE,IAAI,CAAC;YACX,gBAAgB,CAAC,EAAE,uBAAuB,CAAC;YAC3C,OAAO,CAAC,EAAE,aAAa,CAAC;SACzB,GACD;YACE,IAAI,EAAE,IAAI,CAAC;YACX,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YACvD,gBAAgB,CAAC,EAAE,uBAAuB,CAAC;YAC3C,OAAO,CAAC,EAAE,aAAa,CAAC;SACzB,KACF,OAAO,CACV,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,SAAS,OAAO,GACjD;YACE,GAAG,EAAE,MAAM,CAAC;YACZ,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;YAC5B,IAAI,EAAE,MAAM,CAAC;YACb,UAAU,EAAE,IAAI,CAAC;YACjB,QAAQ,EAAE,mBAAmB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrD,IAAI,EAAE,qBAAqB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACpD,GACD;YACE,GAAG,EAAE,MAAM,CAAC;YACZ,IAAI,EAAE,MAAM,CAAC;YACb,UAAU,EAAE,IAAI,CAAC;YACjB,QAAQ,EAAE,mBAAmB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrD,IAAI,EAAE,qBAAqB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACpD,CACN,CAAC;QACF,aAAa,EAAE,CAAC,MAAM,EAAE;YAAE,GAAG,EAAE,MAAM,CAAA;SAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,EAAE,CAAC,MAAM,EAAE;YAAE,GAAG,EAAE,MAAM,CAAA;SAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KACpD;CACF,CAAC;AAEF,KAAK,uBAAuB,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;AAE1D,KAAK,aAAa,GAAG;IACnB;;;;;;;;;;OAUG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,wBAAgB,eAAe,CAAC,OAAO,SAAS,SAAS,EAAE,EACzD,OAAO,EACP,iBAAiB,EACjB,oBAAwB,GACzB,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAClD,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,4BA6CA"}
package/dist/index.js CHANGED
@@ -52,16 +52,22 @@ function createNextProxy({ apiPath, uploadingCountRef, maxConcurrentUploads = 5
52
52
  }
53
53
  },
54
54
  confirmUpload: async (params)=>{
55
- return await confirmUpload(params, {
55
+ const { success } = await confirmUpload(params, {
56
56
  bucketName: bucketName,
57
57
  apiPath
58
58
  });
59
+ if (!success) {
60
+ throw new EdgeStoreError('Failed to confirm upload');
61
+ }
59
62
  },
60
63
  delete: async (params)=>{
61
- return await deleteFile(params, {
64
+ const { success } = await deleteFile(params, {
62
65
  bucketName: bucketName,
63
66
  apiPath
64
67
  });
68
+ if (!success) {
69
+ throw new EdgeStoreError('Failed to delete file');
70
+ }
65
71
  }
66
72
  };
67
73
  return bucketFunctions;
@@ -110,9 +116,7 @@ async function uploadFile({ file, input, onProgressChange, options }, { apiPath,
110
116
  thumbnailUrl: json.thumbnailUrl ? getUrl(json.thumbnailUrl, apiPath) : null,
111
117
  size: json.size,
112
118
  uploadedAt: new Date(json.uploadedAt),
113
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
114
119
  path: json.path,
115
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
116
120
  metadata: json.metadata
117
121
  };
118
122
  } catch (e) {
@@ -232,9 +236,7 @@ async function confirmUpload({ url }, { apiPath, bucketName }) {
232
236
  if (!res.ok) {
233
237
  throw new EdgeStoreError('An error occurred');
234
238
  }
235
- return {
236
- success: true
237
- };
239
+ return res.json();
238
240
  }
239
241
  async function deleteFile({ url }, { apiPath, bucketName }) {
240
242
  const res = await fetch(`${apiPath}/delete-file`, {
@@ -250,9 +252,7 @@ async function deleteFile({ url }, { apiPath, bucketName }) {
250
252
  if (!res.ok) {
251
253
  throw new EdgeStoreError('An error occurred');
252
254
  }
253
- return {
254
- success: true
255
- };
255
+ return res.json();
256
256
  }
257
257
  async function queuedPromises({ items, fn, maxParallel, maxRetries = 0 }) {
258
258
  const results = new Array(items.length);
@@ -321,38 +321,28 @@ function createEdgeStoreProvider(opts) {
321
321
  }
322
322
  function EdgeStoreProviderInner({ children, context, basePath, maxConcurrentUploads }) {
323
323
  const apiPath = basePath ? `${basePath}` : '/api/edgestore';
324
- const [token, setToken] = React__namespace.useState(null);
325
324
  const uploadingCountRef = React__namespace.useRef(0);
326
325
  React__namespace.useEffect(()=>{
327
- void fetch(`${apiPath}/init`, {
328
- method: 'POST'
329
- }).then(async (res)=>{
330
- if (res.ok) {
331
- const json = await res.json();
332
- setToken(json.token);
333
- await fetch(`${DEFAULT_BASE_URL}/_init`, {
334
- method: 'GET',
335
- headers: {
336
- 'x-edgestore-token': json.token
337
- }
338
- });
339
- }
340
- });
326
+ void init();
341
327
  // eslint-disable-next-line react-hooks/exhaustive-deps
342
328
  }, []);
343
- function getSrc(url) {
344
- if (// in production we use cookies, so we don't need a token
345
- process.env.NODE_ENV === 'production' || // public urls don't need a token
346
- // e.g. https://files.edgestore.dev/project/bucket/_public/...
347
- url.match(/^https?:\/\/[^\/]+\/[^\/]+\/[^\/]+\/_public\/.+/)) {
348
- return `${url}`;
349
- } else {
350
- // in development, third party cookies don't work, so we need to pass the token as a query param
351
- const uri = new URL(url);
352
- uri.searchParams.set('token', token ?? '');
353
- return `${uri}`;
329
+ async function init() {
330
+ const res = await fetch(`${apiPath}/init`, {
331
+ method: 'POST'
332
+ });
333
+ if (res.ok) {
334
+ const json = await res.json();
335
+ await fetch(`${DEFAULT_BASE_URL}/_init`, {
336
+ method: 'GET',
337
+ headers: {
338
+ 'x-edgestore-token': json.token
339
+ }
340
+ });
354
341
  }
355
342
  }
343
+ async function reset() {
344
+ await init();
345
+ }
356
346
  return /*#__PURE__*/ React__namespace.createElement(React__namespace.Fragment, null, /*#__PURE__*/ React__namespace.createElement(context.Provider, {
357
347
  value: {
358
348
  edgestore: createNextProxy({
@@ -360,7 +350,7 @@ function EdgeStoreProviderInner({ children, context, basePath, maxConcurrentUplo
360
350
  uploadingCountRef,
361
351
  maxConcurrentUploads
362
352
  }),
363
- getSrc
353
+ reset
364
354
  }
365
355
  }, children));
366
356
  }
package/dist/index.mjs CHANGED
@@ -28,16 +28,22 @@ function createNextProxy({ apiPath, uploadingCountRef, maxConcurrentUploads = 5
28
28
  }
29
29
  },
30
30
  confirmUpload: async (params)=>{
31
- return await confirmUpload(params, {
31
+ const { success } = await confirmUpload(params, {
32
32
  bucketName: bucketName,
33
33
  apiPath
34
34
  });
35
+ if (!success) {
36
+ throw new EdgeStoreError('Failed to confirm upload');
37
+ }
35
38
  },
36
39
  delete: async (params)=>{
37
- return await deleteFile(params, {
40
+ const { success } = await deleteFile(params, {
38
41
  bucketName: bucketName,
39
42
  apiPath
40
43
  });
44
+ if (!success) {
45
+ throw new EdgeStoreError('Failed to delete file');
46
+ }
41
47
  }
42
48
  };
43
49
  return bucketFunctions;
@@ -86,9 +92,7 @@ async function uploadFile({ file, input, onProgressChange, options }, { apiPath,
86
92
  thumbnailUrl: json.thumbnailUrl ? getUrl(json.thumbnailUrl, apiPath) : null,
87
93
  size: json.size,
88
94
  uploadedAt: new Date(json.uploadedAt),
89
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
90
95
  path: json.path,
91
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
92
96
  metadata: json.metadata
93
97
  };
94
98
  } catch (e) {
@@ -208,9 +212,7 @@ async function confirmUpload({ url }, { apiPath, bucketName }) {
208
212
  if (!res.ok) {
209
213
  throw new EdgeStoreError('An error occurred');
210
214
  }
211
- return {
212
- success: true
213
- };
215
+ return res.json();
214
216
  }
215
217
  async function deleteFile({ url }, { apiPath, bucketName }) {
216
218
  const res = await fetch(`${apiPath}/delete-file`, {
@@ -226,9 +228,7 @@ async function deleteFile({ url }, { apiPath, bucketName }) {
226
228
  if (!res.ok) {
227
229
  throw new EdgeStoreError('An error occurred');
228
230
  }
229
- return {
230
- success: true
231
- };
231
+ return res.json();
232
232
  }
233
233
  async function queuedPromises({ items, fn, maxParallel, maxRetries = 0 }) {
234
234
  const results = new Array(items.length);
@@ -297,38 +297,28 @@ function createEdgeStoreProvider(opts) {
297
297
  }
298
298
  function EdgeStoreProviderInner({ children, context, basePath, maxConcurrentUploads }) {
299
299
  const apiPath = basePath ? `${basePath}` : '/api/edgestore';
300
- const [token, setToken] = React.useState(null);
301
300
  const uploadingCountRef = React.useRef(0);
302
301
  React.useEffect(()=>{
303
- void fetch(`${apiPath}/init`, {
304
- method: 'POST'
305
- }).then(async (res)=>{
306
- if (res.ok) {
307
- const json = await res.json();
308
- setToken(json.token);
309
- await fetch(`${DEFAULT_BASE_URL}/_init`, {
310
- method: 'GET',
311
- headers: {
312
- 'x-edgestore-token': json.token
313
- }
314
- });
315
- }
316
- });
302
+ void init();
317
303
  // eslint-disable-next-line react-hooks/exhaustive-deps
318
304
  }, []);
319
- function getSrc(url) {
320
- if (// in production we use cookies, so we don't need a token
321
- process.env.NODE_ENV === 'production' || // public urls don't need a token
322
- // e.g. https://files.edgestore.dev/project/bucket/_public/...
323
- url.match(/^https?:\/\/[^\/]+\/[^\/]+\/[^\/]+\/_public\/.+/)) {
324
- return `${url}`;
325
- } else {
326
- // in development, third party cookies don't work, so we need to pass the token as a query param
327
- const uri = new URL(url);
328
- uri.searchParams.set('token', token ?? '');
329
- return `${uri}`;
305
+ async function init() {
306
+ const res = await fetch(`${apiPath}/init`, {
307
+ method: 'POST'
308
+ });
309
+ if (res.ok) {
310
+ const json = await res.json();
311
+ await fetch(`${DEFAULT_BASE_URL}/_init`, {
312
+ method: 'GET',
313
+ headers: {
314
+ 'x-edgestore-token': json.token
315
+ }
316
+ });
330
317
  }
331
318
  }
319
+ async function reset() {
320
+ await init();
321
+ }
332
322
  return /*#__PURE__*/ React.createElement(React.Fragment, null, /*#__PURE__*/ React.createElement(context.Provider, {
333
323
  value: {
334
324
  edgestore: createNextProxy({
@@ -336,7 +326,7 @@ function EdgeStoreProviderInner({ children, context, basePath, maxConcurrentUplo
336
326
  uploadingCountRef,
337
327
  maxConcurrentUploads
338
328
  }),
339
- getSrc
329
+ reset
340
330
  }
341
331
  }, children));
342
332
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@edgestore/react",
3
- "version": "0.1.2",
3
+ "version": "0.1.3-alpha.1",
4
4
  "description": "Upload files with ease from React/Next.js",
5
5
  "homepage": "https://edgestore.dev",
6
6
  "repository": "https://github.com/edgestorejs/edgestore.git",
@@ -19,12 +19,6 @@
19
19
  "edgestore",
20
20
  "edge-store"
21
21
  ],
22
- "scripts": {
23
- "build": "rollup --config rollup.config.ts --configPlugin rollup-plugin-swc3",
24
- "dev": "pnpm build --watch",
25
- "codegen:entrypoints": "tsx entrypoints.script.ts",
26
- "lint": "eslint --cache --ext \".js,.ts,.tsx\" --ignore-path ../../.gitignore --report-unused-disable-directives src"
27
- },
28
22
  "exports": {
29
23
  "./package.json": "./package.json",
30
24
  ".": {
@@ -54,14 +48,14 @@
54
48
  "uuid": "^9.0.0"
55
49
  },
56
50
  "peerDependencies": {
57
- "@edgestore/server": "0.1.2",
51
+ "@edgestore/server": "0.1.3-alpha.1",
58
52
  "next": "*",
59
53
  "react": ">=16.8.0",
60
54
  "react-dom": ">=16.8.0",
61
55
  "zod": ">=3.0.0"
62
56
  },
63
57
  "devDependencies": {
64
- "@edgestore/server": "0.1.2",
58
+ "@edgestore/server": "0.1.3-alpha.1",
65
59
  "@types/cookie": "^0.5.1",
66
60
  "@types/node": "^18.11.18",
67
61
  "@types/uuid": "^9.0.1",
@@ -71,5 +65,11 @@
71
65
  "typescript": "^5.1.6",
72
66
  "zod": "^3.21.4"
73
67
  },
74
- "gitHead": "99519b57aa7a5cbbe5cab16b85a70d437cb87435"
75
- }
68
+ "gitHead": "d83c9799cd38def8b37f6c752332c568c37cf329",
69
+ "scripts": {
70
+ "build": "rollup --config rollup.config.ts --configPlugin rollup-plugin-swc3",
71
+ "dev": "pnpm build --watch",
72
+ "codegen:entrypoints": "tsx entrypoints.script.ts",
73
+ "lint": "eslint --cache --ext \".js,.ts,.tsx\" --ignore-path ../../.gitignore --report-unused-disable-directives src"
74
+ }
75
+ }
@@ -8,10 +8,12 @@ const DEFAULT_BASE_URL =
8
8
  type EdgeStoreContextValue<TRouter extends AnyRouter> = {
9
9
  edgestore: BucketFunctions<TRouter>;
10
10
  /**
11
- * In development, if this is a protected file, this function will add the token as a query param to the url.
12
- * This is needed because third party cookies don't work with http urls.
11
+ * This will re-run the Edge Store initialization process,
12
+ * which will run the `createContext` function again.
13
+ *
14
+ * Can be used after a sign-in or sign-out, for example.
13
15
  */
14
- getSrc: (url: string) => string;
16
+ reset: () => Promise<void>;
15
17
  };
16
18
 
17
19
  export function createEdgeStoreProvider<TRouter extends AnyRouter>(opts?: {
@@ -85,43 +87,31 @@ function EdgeStoreProviderInner<TRouter extends AnyRouter>({
85
87
  maxConcurrentUploads?: number;
86
88
  }) {
87
89
  const apiPath = basePath ? `${basePath}` : '/api/edgestore';
88
- const [token, setToken] = React.useState<string | null>(null);
89
90
  const uploadingCountRef = React.useRef(0);
90
91
  React.useEffect(() => {
91
- void fetch(`${apiPath}/init`, {
92
- method: 'POST',
93
- }).then(async (res) => {
94
- if (res.ok) {
95
- const json = await res.json();
96
- setToken(json.token);
97
- await fetch(`${DEFAULT_BASE_URL}/_init`, {
98
- method: 'GET',
99
- headers: {
100
- 'x-edgestore-token': json.token,
101
- },
102
- });
103
- }
104
- });
92
+ void init();
105
93
  // eslint-disable-next-line react-hooks/exhaustive-deps
106
94
  }, []);
107
95
 
108
- function getSrc(url: string) {
109
- if (
110
- // in production we use cookies, so we don't need a token
111
- process.env.NODE_ENV === 'production' ||
112
- // public urls don't need a token
113
- // e.g. https://files.edgestore.dev/project/bucket/_public/...
114
- url.match(/^https?:\/\/[^\/]+\/[^\/]+\/[^\/]+\/_public\/.+/)
115
- ) {
116
- return `${url}`;
117
- } else {
118
- // in development, third party cookies don't work, so we need to pass the token as a query param
119
- const uri = new URL(url);
120
- uri.searchParams.set('token', token ?? '');
121
- return `${uri}`;
96
+ async function init() {
97
+ const res = await fetch(`${apiPath}/init`, {
98
+ method: 'POST',
99
+ });
100
+ if (res.ok) {
101
+ const json = await res.json();
102
+ await fetch(`${DEFAULT_BASE_URL}/_init`, {
103
+ method: 'GET',
104
+ headers: {
105
+ 'x-edgestore-token': json.token,
106
+ },
107
+ });
122
108
  }
123
109
  }
124
110
 
111
+ async function reset() {
112
+ await init();
113
+ }
114
+
125
115
  return (
126
116
  <>
127
117
  <context.Provider
@@ -131,7 +121,7 @@ function EdgeStoreProviderInner<TRouter extends AnyRouter>({
131
121
  uploadingCountRef,
132
122
  maxConcurrentUploads,
133
123
  }),
134
- getSrc,
124
+ reset,
135
125
  }}
136
126
  >
137
127
  {children}
@@ -40,12 +40,8 @@ export type BucketFunctions<TRouter extends AnyRouter> = {
40
40
  path: InferBucketPathObject<TRouter['buckets'][K]>;
41
41
  }
42
42
  >;
43
- confirmUpload: (params: { url: string }) => Promise<{
44
- success: boolean;
45
- }>;
46
- delete: (params: { url: string }) => Promise<{
47
- success: boolean;
48
- }>;
43
+ confirmUpload: (params: { url: string }) => Promise<void>;
44
+ delete: (params: { url: string }) => Promise<void>;
49
45
  };
50
46
  };
51
47
 
@@ -113,16 +109,22 @@ export function createNextProxy<TRouter extends AnyRouter>({
113
109
  }
114
110
  },
115
111
  confirmUpload: async (params: { url: string }) => {
116
- return await confirmUpload(params, {
112
+ const { success } = await confirmUpload(params, {
117
113
  bucketName: bucketName as string,
118
114
  apiPath,
119
115
  });
116
+ if (!success) {
117
+ throw new EdgeStoreError('Failed to confirm upload');
118
+ }
120
119
  },
121
120
  delete: async (params: { url: string }) => {
122
- return await deleteFile(params, {
121
+ const { success } = await deleteFile(params, {
123
122
  bucketName: bucketName as string,
124
123
  apiPath,
125
124
  });
125
+ if (!success) {
126
+ throw new EdgeStoreError('Failed to delete file');
127
+ }
126
128
  },
127
129
  };
128
130
  return bucketFunctions;
@@ -193,9 +195,7 @@ async function uploadFile(
193
195
  : null,
194
196
  size: json.size,
195
197
  uploadedAt: new Date(json.uploadedAt),
196
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
197
198
  path: json.path as any,
198
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
199
199
  metadata: json.metadata as any,
200
200
  };
201
201
  } catch (e) {
@@ -361,7 +361,7 @@ async function confirmUpload(
361
361
  if (!res.ok) {
362
362
  throw new EdgeStoreError('An error occurred');
363
363
  }
364
- return { success: true };
364
+ return res.json();
365
365
  }
366
366
 
367
367
  async function deleteFile(
@@ -391,7 +391,7 @@ async function deleteFile(
391
391
  if (!res.ok) {
392
392
  throw new EdgeStoreError('An error occurred');
393
393
  }
394
- return { success: true };
394
+ return res.json();
395
395
  }
396
396
 
397
397
  async function queuedPromises<TType, TRes>({