@orpc/shared 1.8.3 → 1.8.4
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/dist/index.d.mts +5 -3
- package/dist/index.d.ts +5 -3
- package/dist/index.mjs +42 -32
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -30,7 +30,7 @@ type OmitChainMethodDeep<T extends object, K extends keyof any> = {
|
|
|
30
30
|
|
|
31
31
|
declare const ORPC_NAME = "orpc";
|
|
32
32
|
declare const ORPC_SHARED_PACKAGE_NAME = "@orpc/shared";
|
|
33
|
-
declare const ORPC_SHARED_PACKAGE_VERSION = "1.8.
|
|
33
|
+
declare const ORPC_SHARED_PACKAGE_VERSION = "1.8.4";
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
36
|
* Error thrown when an operation is aborted.
|
|
@@ -291,9 +291,11 @@ interface AsyncIdQueueCloseOptions {
|
|
|
291
291
|
}
|
|
292
292
|
declare class AsyncIdQueue<T> {
|
|
293
293
|
private readonly openIds;
|
|
294
|
-
private readonly
|
|
295
|
-
private readonly
|
|
294
|
+
private readonly queues;
|
|
295
|
+
private readonly waiters;
|
|
296
296
|
get length(): number;
|
|
297
|
+
get waiterIds(): string[];
|
|
298
|
+
hasBufferedItems(id: string): boolean;
|
|
297
299
|
open(id: string): void;
|
|
298
300
|
isOpen(id: string): boolean;
|
|
299
301
|
push(id: string, item: T): void;
|
package/dist/index.d.ts
CHANGED
|
@@ -30,7 +30,7 @@ type OmitChainMethodDeep<T extends object, K extends keyof any> = {
|
|
|
30
30
|
|
|
31
31
|
declare const ORPC_NAME = "orpc";
|
|
32
32
|
declare const ORPC_SHARED_PACKAGE_NAME = "@orpc/shared";
|
|
33
|
-
declare const ORPC_SHARED_PACKAGE_VERSION = "1.8.
|
|
33
|
+
declare const ORPC_SHARED_PACKAGE_VERSION = "1.8.4";
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
36
|
* Error thrown when an operation is aborted.
|
|
@@ -291,9 +291,11 @@ interface AsyncIdQueueCloseOptions {
|
|
|
291
291
|
}
|
|
292
292
|
declare class AsyncIdQueue<T> {
|
|
293
293
|
private readonly openIds;
|
|
294
|
-
private readonly
|
|
295
|
-
private readonly
|
|
294
|
+
private readonly queues;
|
|
295
|
+
private readonly waiters;
|
|
296
296
|
get length(): number;
|
|
297
|
+
get waiterIds(): string[];
|
|
298
|
+
hasBufferedItems(id: string): boolean;
|
|
297
299
|
open(id: string): void;
|
|
298
300
|
isOpen(id: string): boolean;
|
|
299
301
|
push(id: string, item: T): void;
|
package/dist/index.mjs
CHANGED
|
@@ -21,7 +21,7 @@ function readAsBuffer(source) {
|
|
|
21
21
|
|
|
22
22
|
const ORPC_NAME = "orpc";
|
|
23
23
|
const ORPC_SHARED_PACKAGE_NAME = "@orpc/shared";
|
|
24
|
-
const ORPC_SHARED_PACKAGE_VERSION = "1.8.
|
|
24
|
+
const ORPC_SHARED_PACKAGE_VERSION = "1.8.4";
|
|
25
25
|
|
|
26
26
|
class AbortError extends Error {
|
|
27
27
|
constructor(...rest) {
|
|
@@ -153,11 +153,17 @@ async function runInSpanContext(span, fn) {
|
|
|
153
153
|
|
|
154
154
|
class AsyncIdQueue {
|
|
155
155
|
openIds = /* @__PURE__ */ new Set();
|
|
156
|
-
|
|
157
|
-
|
|
156
|
+
queues = /* @__PURE__ */ new Map();
|
|
157
|
+
waiters = /* @__PURE__ */ new Map();
|
|
158
158
|
get length() {
|
|
159
159
|
return this.openIds.size;
|
|
160
160
|
}
|
|
161
|
+
get waiterIds() {
|
|
162
|
+
return Array.from(this.waiters.keys());
|
|
163
|
+
}
|
|
164
|
+
hasBufferedItems(id) {
|
|
165
|
+
return Boolean(this.queues.get(id)?.length);
|
|
166
|
+
}
|
|
161
167
|
open(id) {
|
|
162
168
|
this.openIds.add(id);
|
|
163
169
|
}
|
|
@@ -166,59 +172,59 @@ class AsyncIdQueue {
|
|
|
166
172
|
}
|
|
167
173
|
push(id, item) {
|
|
168
174
|
this.assertOpen(id);
|
|
169
|
-
const pending = this.
|
|
175
|
+
const pending = this.waiters.get(id);
|
|
170
176
|
if (pending?.length) {
|
|
171
177
|
pending.shift()[0](item);
|
|
172
178
|
if (pending.length === 0) {
|
|
173
|
-
this.
|
|
179
|
+
this.waiters.delete(id);
|
|
174
180
|
}
|
|
175
181
|
} else {
|
|
176
|
-
const items = this.
|
|
182
|
+
const items = this.queues.get(id);
|
|
177
183
|
if (items) {
|
|
178
184
|
items.push(item);
|
|
179
185
|
} else {
|
|
180
|
-
this.
|
|
186
|
+
this.queues.set(id, [item]);
|
|
181
187
|
}
|
|
182
188
|
}
|
|
183
189
|
}
|
|
184
190
|
async pull(id) {
|
|
185
191
|
this.assertOpen(id);
|
|
186
|
-
const items = this.
|
|
192
|
+
const items = this.queues.get(id);
|
|
187
193
|
if (items?.length) {
|
|
188
194
|
const item = items.shift();
|
|
189
195
|
if (items.length === 0) {
|
|
190
|
-
this.
|
|
196
|
+
this.queues.delete(id);
|
|
191
197
|
}
|
|
192
198
|
return item;
|
|
193
199
|
}
|
|
194
200
|
return new Promise((resolve, reject) => {
|
|
195
|
-
const waitingPulls = this.
|
|
201
|
+
const waitingPulls = this.waiters.get(id);
|
|
196
202
|
const pending = [resolve, reject];
|
|
197
203
|
if (waitingPulls) {
|
|
198
204
|
waitingPulls.push(pending);
|
|
199
205
|
} else {
|
|
200
|
-
this.
|
|
206
|
+
this.waiters.set(id, [pending]);
|
|
201
207
|
}
|
|
202
208
|
});
|
|
203
209
|
}
|
|
204
210
|
close({ id, reason } = {}) {
|
|
205
211
|
if (id === void 0) {
|
|
206
|
-
this.
|
|
212
|
+
this.waiters.forEach((pendingPulls, id2) => {
|
|
207
213
|
pendingPulls.forEach(([, reject]) => {
|
|
208
214
|
reject(reason ?? new Error(`[AsyncIdQueue] Queue[${id2}] was closed or aborted while waiting for pulling.`));
|
|
209
215
|
});
|
|
210
216
|
});
|
|
211
|
-
this.
|
|
217
|
+
this.waiters.clear();
|
|
212
218
|
this.openIds.clear();
|
|
213
|
-
this.
|
|
219
|
+
this.queues.clear();
|
|
214
220
|
return;
|
|
215
221
|
}
|
|
216
|
-
this.
|
|
222
|
+
this.waiters.get(id)?.forEach(([, reject]) => {
|
|
217
223
|
reject(reason ?? new Error(`[AsyncIdQueue] Queue[${id}] was closed or aborted while waiting for pulling.`));
|
|
218
224
|
});
|
|
219
|
-
this.
|
|
225
|
+
this.waiters.delete(id);
|
|
220
226
|
this.openIds.delete(id);
|
|
221
|
-
this.
|
|
227
|
+
this.queues.delete(id);
|
|
222
228
|
}
|
|
223
229
|
assertOpen(id) {
|
|
224
230
|
if (!this.isOpen(id)) {
|
|
@@ -304,37 +310,41 @@ function replicateAsyncIterator(source, count) {
|
|
|
304
310
|
try {
|
|
305
311
|
while (true) {
|
|
306
312
|
const item = await source.next();
|
|
307
|
-
for (let
|
|
308
|
-
|
|
309
|
-
|
|
313
|
+
for (let i = 0; i < count; i++) {
|
|
314
|
+
const id = i.toString();
|
|
315
|
+
if (queue.isOpen(id)) {
|
|
316
|
+
queue.push(id, item);
|
|
310
317
|
}
|
|
311
318
|
}
|
|
312
319
|
if (item.done) {
|
|
313
320
|
break;
|
|
314
321
|
}
|
|
315
322
|
}
|
|
316
|
-
} catch (
|
|
317
|
-
error = { value:
|
|
323
|
+
} catch (reason) {
|
|
324
|
+
error = { value: reason };
|
|
325
|
+
queue.waiterIds.forEach((id) => {
|
|
326
|
+
queue.close({ id, reason });
|
|
327
|
+
});
|
|
318
328
|
}
|
|
319
329
|
});
|
|
320
|
-
for (let
|
|
321
|
-
|
|
330
|
+
for (let i = 0; i < count; i++) {
|
|
331
|
+
const id = i.toString();
|
|
332
|
+
queue.open(id);
|
|
322
333
|
replicated.push(new AsyncIteratorClass(
|
|
323
334
|
() => {
|
|
324
335
|
start();
|
|
325
336
|
return new Promise((resolve, reject) => {
|
|
326
|
-
queue.
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
});
|
|
337
|
+
if (!error || queue.hasBufferedItems(id)) {
|
|
338
|
+
queue.pull(id).then(resolve).catch(reject);
|
|
339
|
+
} else {
|
|
340
|
+
reject(error.value);
|
|
341
|
+
}
|
|
332
342
|
});
|
|
333
343
|
},
|
|
334
344
|
async (reason) => {
|
|
335
|
-
queue.close({ id
|
|
345
|
+
queue.close({ id });
|
|
336
346
|
if (reason !== "next") {
|
|
337
|
-
if (
|
|
347
|
+
if (!queue.length) {
|
|
338
348
|
await source?.return?.();
|
|
339
349
|
}
|
|
340
350
|
}
|