chrome-webstore-upload 3.1.4 → 4.0.0-0

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.
Files changed (3) hide show
  1. package/index.d.ts +2 -1
  2. package/index.js +14 -2
  3. package/package.json +2 -2
package/index.d.ts CHANGED
@@ -28,10 +28,11 @@ declare class APIClient {
28
28
  refreshToken: string;
29
29
  clientSecret: string | undefined;
30
30
  constructor(options: APIClientOptions);
31
- uploadExisting(readStream: ReadStream | ReadableStream, token?: string | Promise<string>): Promise<ItemResource>;
31
+ uploadExisting(readStream: ReadStream | ReadableStream, token?: string | Promise<string>, maxAwaitInProgressResponseSeconds?: number): Promise<ItemResource>;
32
32
  publish(target?: string, token?: string | Promise<string>, deployPercentage?: number | undefined): Promise<PublishResponse>;
33
33
  get(projection?: string, token?: string | Promise<string>): Promise<ItemResource>;
34
34
  fetchToken(): Promise<string>;
35
+ _waitUploadSuccess(response: ItemResource, maxAwaitInProgressResponseSeconds: number): Promise<ItemResource>;
35
36
  _headers(token: string): {
36
37
  Authorization: string;
37
38
  'x-goog-api-version': string;
package/index.js CHANGED
@@ -14,6 +14,7 @@ const publishURI = ({ extensionId, target = 'default', deployPercentage }) => {
14
14
  };
15
15
  const getURI = (id, projection) => `${rootURI}/chromewebstore/v1.1/items/${id}?projection=${projection}`;
16
16
  const requiredFields = ['extensionId', 'clientId', 'refreshToken'];
17
+ const retryIntervalSeconds = 2;
17
18
  function throwIfNotOk(request, response) {
18
19
  if (!request.ok) {
19
20
  const error = new Error(request.statusText ?? 'Unknown error');
@@ -43,7 +44,7 @@ class APIClient {
43
44
  this.refreshToken = options.refreshToken;
44
45
  this.clientSecret = options.clientSecret;
45
46
  }
46
- async uploadExisting(readStream, token = this.fetchToken()) {
47
+ async uploadExisting(readStream, token = this.fetchToken(), maxAwaitInProgressResponseSeconds = 0) {
47
48
  if (!readStream) {
48
49
  throw new Error('Read stream missing');
49
50
  }
@@ -58,7 +59,7 @@ class APIClient {
58
59
  });
59
60
  const response = await request.json();
60
61
  throwIfNotOk(request, response);
61
- return response;
62
+ return this._waitUploadSuccess(response, maxAwaitInProgressResponseSeconds);
62
63
  }
63
64
  async publish(target = 'default', token = this.fetchToken(), deployPercentage = undefined) {
64
65
  const { extensionId } = this;
@@ -102,6 +103,17 @@ class APIClient {
102
103
  throwIfNotOk(request, response);
103
104
  return response.access_token;
104
105
  }
106
+ async _waitUploadSuccess(response, maxAwaitInProgressResponseSeconds) {
107
+ if (response.uploadState !== 'IN_PROGRESS' || maxAwaitInProgressResponseSeconds < retryIntervalSeconds) {
108
+ return response;
109
+ }
110
+ // Wait before checking again
111
+ await new Promise(resolve => {
112
+ setTimeout(resolve, retryIntervalSeconds * 1000);
113
+ });
114
+ // Retry fetching the item resource
115
+ return this._waitUploadSuccess(await this.get('DRAFT'), maxAwaitInProgressResponseSeconds - retryIntervalSeconds);
116
+ }
105
117
  _headers(token) {
106
118
  return {
107
119
  Authorization: `Bearer ${token}`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chrome-webstore-upload",
3
- "version": "3.1.4",
3
+ "version": "4.0.0-0",
4
4
  "description": "Upload Chrome Extensions to the Chrome Web Store",
5
5
  "keywords": [
6
6
  "chrome",
@@ -68,7 +68,7 @@
68
68
  "node-fetch": "^2.7.0",
69
69
  "typescript": "^5.3.3",
70
70
  "utc-version": "^2.0.2",
71
- "vitest": "^1.6.0",
71
+ "vitest": "^3.2.4",
72
72
  "xo": "^0.58.0"
73
73
  },
74
74
  "engines": {