@telecrypt-io/storage 0.2.11 → 0.2.13

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.
@@ -3,6 +3,7 @@ import { Method } from "matrix-js-sdk/lib/http-api/method.js";
3
3
  import { ClientPrefix } from "matrix-js-sdk/lib/http-api/prefix.js";
4
4
  import { encryptAttachment, decryptAttachment } from "matrix-encrypt-attachment";
5
5
  import { decodeRecoveryKey } from "matrix-js-sdk/lib/crypto-api/recovery-key.js";
6
+ const recoveryCallbackQueues = new WeakMap();
6
7
  export class TeleCryptIOStorage {
7
8
  client;
8
9
  constructor(client) {
@@ -135,21 +136,26 @@ export class TeleCryptIOStorage {
135
136
  * object in the first place (see `create()`'s doc comment).
136
137
  */
137
138
  async withSecretStorageKey(privateKey, fn) {
138
- const callbacks = this.client.cryptoCallbacks;
139
- const prevGetKey = callbacks.getSecretStorageKey;
140
- const prevCache = callbacks.cacheSecretStorageKey;
141
- callbacks.getSecretStorageKey = async ({ keys }) => {
142
- const keyId = Object.keys(keys)[0];
143
- return [keyId, privateKey];
144
- };
145
- callbacks.cacheSecretStorageKey = () => { };
146
- try {
147
- return await fn();
148
- }
149
- finally {
150
- callbacks.getSecretStorageKey = prevGetKey;
151
- callbacks.cacheSecretStorageKey = prevCache;
152
- }
139
+ const previous = recoveryCallbackQueues.get(this.client) ?? Promise.resolve();
140
+ const run = previous.then(async () => {
141
+ const callbacks = this.client.cryptoCallbacks;
142
+ const prevGetKey = callbacks.getSecretStorageKey;
143
+ const prevCache = callbacks.cacheSecretStorageKey;
144
+ callbacks.getSecretStorageKey = async ({ keys }) => {
145
+ const keyId = Object.keys(keys)[0];
146
+ return [keyId, privateKey];
147
+ };
148
+ callbacks.cacheSecretStorageKey = () => { };
149
+ try {
150
+ return await fn();
151
+ }
152
+ finally {
153
+ callbacks.getSecretStorageKey = prevGetKey;
154
+ callbacks.cacheSecretStorageKey = prevCache;
155
+ }
156
+ });
157
+ recoveryCallbackQueues.set(this.client, run.then(() => undefined, () => undefined));
158
+ return run;
153
159
  }
154
160
  /**
155
161
  * Bootstraps cross-signing and secret storage with a brand-new server-side
package/dist/core/oidc.js CHANGED
@@ -179,11 +179,31 @@ export async function refreshOidcToken(tokenEndpoint, clientId, refreshToken) {
179
179
  const body = await res.text();
180
180
  throw new CliError(`OIDC token refresh failed (${res.status}): ${body}`);
181
181
  }
182
- const data = (await res.json());
182
+ const data = await res.json();
183
+ if (!data || typeof data !== "object") {
184
+ throw new CliError("OIDC token refresh returned an invalid response");
185
+ }
186
+ const record = data;
187
+ const accessToken = record.access_token;
188
+ const nextRefreshToken = record.refresh_token;
189
+ const expiresIn = record.expires_in;
190
+ if (typeof accessToken !== "string" || accessToken.trim() === "") {
191
+ throw new CliError("OIDC token refresh returned no access token");
192
+ }
193
+ if (nextRefreshToken !== undefined &&
194
+ (typeof nextRefreshToken !== "string" || nextRefreshToken.trim() === "")) {
195
+ throw new CliError("OIDC token refresh returned an invalid refresh token");
196
+ }
197
+ if (expiresIn !== undefined &&
198
+ (typeof expiresIn !== "number" || !Number.isFinite(expiresIn) || expiresIn < 0)) {
199
+ throw new CliError("OIDC token refresh returned an invalid expiry");
200
+ }
183
201
  return {
184
- accessToken: data.access_token,
185
- refreshToken: data.refresh_token,
186
- expiry: data.expires_in ? new Date(Date.now() + data.expires_in * 1000) : undefined,
202
+ accessToken,
203
+ refreshToken: nextRefreshToken,
204
+ expiry: expiresIn === undefined
205
+ ? undefined
206
+ : new Date(Date.now() + expiresIn * 1000),
187
207
  };
188
208
  }
189
209
  /**
@@ -195,7 +195,7 @@ export async function unshareFolder(storage, folderId, userId) {
195
195
  }
196
196
  export async function listMembers(storage, folderId) {
197
197
  const tree = await resolveTree(storage, folderId);
198
- return storage.listMembers(tree);
198
+ return withRateLimitRetry("listMembers", () => storage.listMembers(tree));
199
199
  }
200
200
  export async function listFiles(storage, folderId) {
201
201
  const tree = await resolveTree(storage, folderId);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@telecrypt-io/storage",
3
- "version": "0.2.11",
3
+ "version": "0.2.13",
4
4
  "license": "BUSL-1.1",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",