@agentunion/fastaun-browser 0.5.18 → 0.5.20
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/CHANGELOG.md +172 -79
- package/_packed_docs/CHANGELOG.md +172 -79
- package/_packed_docs/INDEX.md +244 -116
- package/_packed_docs/KITE_DOCS_GUIDE.md +98 -69
- package/_packed_docs/agent.md/SCHEMA.md +245 -205
- package/_packed_docs/agent.md//350/277/234/347/250/213agent.md/347/274/223/345/255/230/344/270/216etag/351/200/217/344/274/240/346/226/271/346/241/210.md +11 -11
- package/_packed_docs/aun/345/210/206/345/270/203/345/274/217/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md +42 -15
- package/_packed_docs/aun/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md +4 -4
- package/_packed_docs/protocol/01-/350/272/253/344/273/275/344/270/216/345/207/255/350/257/201/345/215/217/350/256/256-auth.md +45 -134
- package/_packed_docs/protocol/06-/346/234/215/345/212/241/345/215/217/350/256/256.md +1072 -1072
- package/_packed_docs/protocol/07-/351/224/231/350/257/257/347/240/201/344/270/216/347/212/266/346/200/201/346/234/272.md +5 -20
- package/_packed_docs/protocol/10-Group-/345/255/220/345/215/217/350/256/256.md +687 -668
- package/_packed_docs/protocol/11-Storage-/345/255/220/345/215/217/350/256/256.md +19 -28
- package/_packed_docs/protocol/Ownership/345/215/217/350/256/256/345/256/232/344/271/211.md +443 -0
- package/_packed_docs/protocol/Ownership/345/215/217/350/256/256/345/256/232/344/271/2112.0.md +161 -0
- package/_packed_docs/protocol/Ownership/345/215/217/350/256/256/345/256/232/344/271/2112.1.md +658 -0
- package/_packed_docs/protocol/Ownership/345/215/217/350/256/256/345/256/232/344/271/2113.0.md +233 -0
- package/_packed_docs/protocol/agent.md/SCHEMA.md +4 -0
- package/_packed_docs/sdk/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +1 -1
- package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +68 -61
- package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +1 -1
- package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +279 -285
- package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +3 -3
- package/_packed_docs/sdk/09-group-rpc-manual.md +271 -235
- package/_packed_docs/sdk/09-message-rpc-manual.md +47 -6
- package/_packed_docs/sdk/09-storage-rpc-manual.md +70 -68
- package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +63 -34
- package/_packed_docs/sdk/INDEX.md +105 -34
- package/_packed_docs/sdk/Ownership-SDK/345/256/236/347/216/260/346/214/207/345/215/227.md +169 -0
- package/_packed_docs/sdk/Ownership-SDK/347/274/226/346/216/222/346/214/207/345/215/227.md +349 -0
- package/_packed_docs/sdk/Ownership-SDK/347/274/226/346/216/222/346/214/207/345/215/2272.1.md +922 -0
- package/_packed_docs/sdk/Ownership-SDK/351/233/206/346/210/220/346/214/207/345/215/227.md +270 -0
- package/_packed_docs/sdk/Ownership2.1-SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +300 -0
- package/_packed_docs/sdk/Ownership2.1-SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +382 -0
- package/_packed_docs/sdk/Ownership2.1-TDD/345/210/206/351/230/266/346/256/265/345/256/236/346/226/275/350/256/241/345/210/222.md +708 -0
- package/_packed_docs/sdk/Ownership2.1/350/257/246/347/273/206/350/256/276/350/256/241.md +476 -0
- package/_packed_docs/sdk/Ownership/347/256/241/347/220/206/344/270/223/351/242/230.md +559 -0
- package/_packed_docs/sdk/ProtectedHeaders/347/224/250/346/263/225/344/270/223/351/242/230.md +299 -0
- package/_packed_docs/sdk//345/207/255/350/257/201/344/270/216/347/273/204/347/273/207/346/234/215/345/212/241SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +173 -0
- package/_packed_docs/sdk//345/207/255/350/257/201/344/270/216/347/273/204/347/273/207/346/234/215/345/212/241SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +211 -0
- package/_packed_docs//350/267/250/350/256/276/345/244/207/345/267/262/350/257/273/346/234/252/350/257/273SDK/345/256/236/347/216/260/347/247/273/346/244/215/346/214/207/345/215/227.md +331 -0
- package/_packed_docs//350/267/250/350/256/276/345/244/207/345/267/262/350/257/273/346/234/252/350/257/273SDK/351/233/206/346/210/220/346/214/207/345/215/227.md +207 -0
- package/_packed_docs//350/267/250/350/256/276/345/244/207/345/267/262/350/257/273/346/234/252/350/257/273/344/273/243/347/240/201/345/256/241/346/237/245/346/212/245/345/221/212.md +252 -0
- package/_packed_docs//350/267/250/350/256/276/345/244/207/345/267/262/350/257/273/346/234/252/350/257/273/345/256/236/346/226/275/350/256/241/345/210/222.md +156 -0
- package/_packed_docs//350/267/250/350/256/276/345/244/207/345/267/262/350/257/273/346/234/252/350/257/273/346/226/271/346/241/210.md +273 -0
- package/_packed_docs//350/267/250/350/256/276/345/244/207/345/267/262/350/257/273/346/234/252/350/257/273/350/257/246/347/273/206/350/256/276/350/256/241.md +211 -0
- package/dist/agent-md-schema.d.ts +17 -3
- package/dist/agent-md-schema.d.ts.map +1 -1
- package/dist/agent-md-schema.js +94 -26
- package/dist/agent-md-schema.js.map +1 -1
- package/dist/agent-md.d.ts +54 -3
- package/dist/agent-md.d.ts.map +1 -1
- package/dist/agent-md.js +711 -65
- package/dist/agent-md.js.map +1 -1
- package/dist/aid-store.d.ts +58 -46
- package/dist/aid-store.d.ts.map +1 -1
- package/dist/aid-store.js +254 -248
- package/dist/aid-store.js.map +1 -1
- package/dist/aid.d.ts +4 -1
- package/dist/aid.d.ts.map +1 -1
- package/dist/aid.js +27 -33
- package/dist/aid.js.map +1 -1
- package/dist/auth.d.ts +4 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +426 -39
- package/dist/auth.js.map +1 -1
- package/dist/bundle.js +38179 -32054
- package/dist/cert-utils.d.ts +50 -2
- package/dist/cert-utils.d.ts.map +1 -1
- package/dist/cert-utils.js +105 -47
- package/dist/cert-utils.js.map +1 -1
- package/dist/client/delivery.d.ts +22 -1
- package/dist/client/delivery.d.ts.map +1 -1
- package/dist/client/delivery.js +389 -78
- package/dist/client/delivery.js.map +1 -1
- package/dist/client/rpc-pipeline.d.ts.map +1 -1
- package/dist/client/rpc-pipeline.js +103 -77
- package/dist/client/rpc-pipeline.js.map +1 -1
- package/dist/client/v2-e2ee.d.ts +1 -0
- package/dist/client/v2-e2ee.d.ts.map +1 -1
- package/dist/client/v2-e2ee.js +182 -89
- package/dist/client/v2-e2ee.js.map +1 -1
- package/dist/client.d.ts +100 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +1220 -25
- package/dist/client.js.map +1 -1
- package/dist/crypto.d.ts.map +1 -1
- package/dist/crypto.js +8 -6
- package/dist/crypto.js.map +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +3 -2
- package/dist/errors.js.map +1 -1
- package/dist/events.d.ts +9 -2
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +72 -13
- package/dist/events.js.map +1 -1
- package/dist/facades.d.ts +82 -2
- package/dist/facades.d.ts.map +1 -1
- package/dist/facades.js +100 -6
- package/dist/facades.js.map +1 -1
- package/dist/index.d.ts +7 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/keystore/index.d.ts +17 -0
- package/dist/keystore/index.d.ts.map +1 -1
- package/dist/keystore/indexeddb-shared.d.ts +10 -1
- package/dist/keystore/indexeddb-shared.d.ts.map +1 -1
- package/dist/keystore/indexeddb-shared.js +111 -0
- package/dist/keystore/indexeddb-shared.js.map +1 -1
- package/dist/keystore/indexeddb-token-store.d.ts +7 -1
- package/dist/keystore/indexeddb-token-store.d.ts.map +1 -1
- package/dist/keystore/indexeddb-token-store.js +30 -1
- package/dist/keystore/indexeddb-token-store.js.map +1 -1
- package/dist/org-protocol.d.ts +98 -0
- package/dist/org-protocol.d.ts.map +1 -0
- package/dist/org-protocol.js +1802 -0
- package/dist/org-protocol.js.map +1 -0
- package/dist/ownership-proof.d.ts +93 -5
- package/dist/ownership-proof.d.ts.map +1 -1
- package/dist/ownership-proof.js +239 -53
- package/dist/ownership-proof.js.map +1 -1
- package/dist/ownership-v21.d.ts +194 -0
- package/dist/ownership-v21.d.ts.map +1 -0
- package/dist/ownership-v21.js +678 -0
- package/dist/ownership-v21.js.map +1 -0
- package/dist/ownership-workflow.d.ts +151 -0
- package/dist/ownership-workflow.d.ts.map +1 -0
- package/dist/ownership-workflow.js +1229 -0
- package/dist/ownership-workflow.js.map +1 -0
- package/dist/seq-tracker.d.ts +1 -0
- package/dist/seq-tracker.d.ts.map +1 -1
- package/dist/seq-tracker.js +10 -2
- package/dist/seq-tracker.js.map +1 -1
- package/dist/tools/cross-sdk-agent.d.ts +83 -0
- package/dist/tools/cross-sdk-agent.d.ts.map +1 -1
- package/dist/tools/cross-sdk-agent.js +415 -7
- package/dist/tools/cross-sdk-agent.js.map +1 -1
- package/dist/transport.d.ts +7 -0
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +90 -2
- package/dist/transport.js.map +1 -1
- package/dist/v2/e2ee/decrypt.d.ts +1 -0
- package/dist/v2/e2ee/decrypt.d.ts.map +1 -1
- package/dist/v2/e2ee/decrypt.js +9 -1
- package/dist/v2/e2ee/decrypt.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc-pipeline.d.ts","sourceRoot":"","sources":["../../src/client/rpc-pipeline.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rpc-pipeline.d.ts","sourceRoot":"","sources":["../../src/client/rpc-pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { normalizeSlotId, slotIsolationKey } from '../config.js';
|
|
2
2
|
import { ClientSignatureError, ConnectionError, PermissionError, TimeoutError, ValidationError } from '../errors.js';
|
|
3
|
-
import { parseCertMetadata } from '../cert-utils.js';
|
|
3
|
+
import { parseCertMetadata, verifySignatureWithCert } from '../cert-utils.js';
|
|
4
|
+
import { orgRequestParams, validateOrgRequestJSON } from '../org-protocol.js';
|
|
5
|
+
import { canonicalJson as canonicalClientRequest } from '../v2/crypto/canonical.js';
|
|
4
6
|
import { validateAIDFormat, validateGroupIDFormat } from '../validators.js';
|
|
5
7
|
import { p1363ToDer, pemToArrayBuffer, uint8ToBase64 } from '../crypto.js';
|
|
6
8
|
import { ConnectionState, isJsonObject, } from '../types.js';
|
|
@@ -132,6 +134,7 @@ async function signingCertFingerprint(certPem) {
|
|
|
132
134
|
}
|
|
133
135
|
const PULL_GATE_STALE_MS = 35_000;
|
|
134
136
|
const PULL_GATE_OPERATION_TIMEOUT_MS = 35_000;
|
|
137
|
+
const PULL_GATE_MAX_ACTIVE = 4;
|
|
135
138
|
function sameIdentityAdmissionRejection(error, original) {
|
|
136
139
|
const errorCode = Number(error?.code);
|
|
137
140
|
const originalCode = Number(original?.code);
|
|
@@ -526,7 +529,10 @@ export class RpcPipeline {
|
|
|
526
529
|
}
|
|
527
530
|
async applyClientSignature(method, params) {
|
|
528
531
|
try {
|
|
529
|
-
if (
|
|
532
|
+
if (method.startsWith('org.')) {
|
|
533
|
+
params.aad = orgRequestParams(method, params).aad;
|
|
534
|
+
}
|
|
535
|
+
else if (!SIGNED_METHODS.has(method)) {
|
|
530
536
|
return;
|
|
531
537
|
}
|
|
532
538
|
if (this.shouldSkipClientSignature(method, params)) {
|
|
@@ -551,8 +557,11 @@ export class RpcPipeline {
|
|
|
551
557
|
const currentAid = (internal && typeof internal === 'object')
|
|
552
558
|
? internal
|
|
553
559
|
: this.runtime.client._currentAid;
|
|
554
|
-
if (!currentAid?.privateKeyPem)
|
|
560
|
+
if (!currentAid?.privateKeyPem) {
|
|
561
|
+
if (method.startsWith('org.'))
|
|
562
|
+
throw new ClientSignatureError('组织请求签名身份不可用');
|
|
555
563
|
return;
|
|
564
|
+
}
|
|
556
565
|
try {
|
|
557
566
|
const aid = currentAid.aid;
|
|
558
567
|
const certPem = currentAid.certPem ?? '';
|
|
@@ -570,11 +579,19 @@ export class RpcPipeline {
|
|
|
570
579
|
paramsForHash[k] = v;
|
|
571
580
|
}
|
|
572
581
|
}
|
|
573
|
-
|
|
582
|
+
if (method.startsWith('org.'))
|
|
583
|
+
validateOrgRequestJSON(paramsForHash);
|
|
584
|
+
const paramsJson = method.startsWith('org.') ? new TextDecoder().decode(canonicalClientRequest(paramsForHash)) : stableStringify(paramsForHash);
|
|
574
585
|
const paramsHashBuf = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(paramsJson));
|
|
575
586
|
const paramsHash = Array.from(new Uint8Array(paramsHashBuf))
|
|
576
587
|
.map(b => b.toString(16).padStart(2, '0'))
|
|
577
588
|
.join('');
|
|
589
|
+
if (params.client_signature !== undefined) {
|
|
590
|
+
const existing = params.client_signature;
|
|
591
|
+
if (!isJsonObject(existing) || existing.aid !== aid || existing.cert_fingerprint !== await signingCertFingerprint(certPem) || existing.params_hash !== paramsHash || typeof existing.timestamp !== 'string' || !/^\d+$/.test(existing.timestamp) || typeof existing.signature !== 'string' || !await verifySignatureWithCert(certPem, existing.signature, new TextEncoder().encode(`${method}|${aid}|${existing.timestamp}|${paramsHash}`)))
|
|
592
|
+
throw new Error('已有客户端签名与请求内容不一致');
|
|
593
|
+
return;
|
|
594
|
+
}
|
|
578
595
|
const signData = new TextEncoder().encode(`${method}|${aid}|${ts}|${paramsHash}`);
|
|
579
596
|
const cryptoKey = await signingPrivateKey(currentAid.privateKeyPem);
|
|
580
597
|
const sigP1363 = await crypto.subtle.sign({ name: 'ECDSA', hash: 'SHA-256' }, cryptoKey, signData);
|
|
@@ -647,7 +664,7 @@ export class RpcPipeline {
|
|
|
647
664
|
const name = this.pullGateName(key);
|
|
648
665
|
let state = this.pullGateStates.get(name);
|
|
649
666
|
if (!state) {
|
|
650
|
-
state = {
|
|
667
|
+
state = { activeByNamespace: new Map(), foreground: [], background: [], byKey: new Map(), lifecycle: new Map(), watchdog: null };
|
|
651
668
|
this.pullGateStates.set(name, state);
|
|
652
669
|
}
|
|
653
670
|
this.startPullGateWatchdog(state, name);
|
|
@@ -677,21 +694,23 @@ export class RpcPipeline {
|
|
|
677
694
|
}
|
|
678
695
|
}
|
|
679
696
|
checkPullGate(state, name) {
|
|
680
|
-
const
|
|
681
|
-
if (
|
|
697
|
+
const activeJobs = [...state.activeByNamespace.values()];
|
|
698
|
+
if (activeJobs.length === 0) {
|
|
682
699
|
this.drainPullGate(state);
|
|
683
700
|
return;
|
|
684
701
|
}
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
702
|
+
for (const active of activeJobs) {
|
|
703
|
+
if (!active.pullingStartedAt || Date.now() - active.pullingStartedAt < this.pullGateOperationTimeoutMs())
|
|
704
|
+
continue;
|
|
705
|
+
if (active.timedOut)
|
|
706
|
+
continue;
|
|
707
|
+
active.timedOut = true;
|
|
708
|
+
active.invalidated = true;
|
|
709
|
+
active.cancel?.();
|
|
710
|
+
const err = new TimeoutError(`pull gate timeout: ${active.namespace}`, { retryable: true });
|
|
711
|
+
this.runtime.client._clientLog?.warn(`pull gate watchdog timeout: gate=${name} key=${active.key}`);
|
|
712
|
+
active.reject(err);
|
|
713
|
+
}
|
|
695
714
|
}
|
|
696
715
|
realtimePullNamespace(key) {
|
|
697
716
|
for (const marker of ['|tail|', '|forward|']) {
|
|
@@ -711,7 +730,7 @@ export class RpcPipeline {
|
|
|
711
730
|
if (typeof cancel !== 'function' || !key)
|
|
712
731
|
return request;
|
|
713
732
|
const state = this.pullGateStates.get(this.pullGateName(key));
|
|
714
|
-
const active = state?.
|
|
733
|
+
const active = [...(state?.activeByNamespace.values() ?? [])].find((candidate) => candidate.key === key);
|
|
715
734
|
if (!active || active.key !== key || active.timedOut || active.invalidated)
|
|
716
735
|
return request;
|
|
717
736
|
const boundCancel = () => cancel.call(request);
|
|
@@ -744,7 +763,7 @@ export class RpcPipeline {
|
|
|
744
763
|
return false;
|
|
745
764
|
return this.realtimePullNamespace(job.key) === normalized;
|
|
746
765
|
};
|
|
747
|
-
return
|
|
766
|
+
return [...state.activeByNamespace.values()].some(matches)
|
|
748
767
|
|| state.foreground.some(matches)
|
|
749
768
|
|| state.background.some(matches);
|
|
750
769
|
}
|
|
@@ -776,13 +795,13 @@ export class RpcPipeline {
|
|
|
776
795
|
if (!state)
|
|
777
796
|
return false;
|
|
778
797
|
const matches = (job) => job !== null && job.namespace === ns;
|
|
779
|
-
return
|
|
798
|
+
return [...state.activeByNamespace.values()].some(matches) || state.foreground.some(matches) || state.background.some(matches);
|
|
780
799
|
}
|
|
781
800
|
hasAnyPullActivity() {
|
|
782
801
|
if (this.pullWorkTokens.size > 0)
|
|
783
802
|
return true;
|
|
784
803
|
for (const state of this.pullGateStates.values()) {
|
|
785
|
-
if (state.
|
|
804
|
+
if (state.activeByNamespace.size > 0 || state.foreground.length > 0 || state.background.length > 0)
|
|
786
805
|
return true;
|
|
787
806
|
}
|
|
788
807
|
return false;
|
|
@@ -823,7 +842,9 @@ export class RpcPipeline {
|
|
|
823
842
|
}
|
|
824
843
|
const key = `${normalized}|inline|seq=${seq}`;
|
|
825
844
|
const state = this.pullGateState(key);
|
|
826
|
-
if (state.
|
|
845
|
+
if (state.activeByNamespace.has(normalized)
|
|
846
|
+
|| state.foreground.some((job) => job.namespace === normalized)
|
|
847
|
+
|| state.background.some((job) => job.namespace === normalized)) {
|
|
827
848
|
return { acquired: false };
|
|
828
849
|
}
|
|
829
850
|
const guard = {
|
|
@@ -854,8 +875,8 @@ export class RpcPipeline {
|
|
|
854
875
|
}
|
|
855
876
|
finally {
|
|
856
877
|
this.inlineRealtimeScopes.delete(normalized);
|
|
857
|
-
if (state.
|
|
858
|
-
state.
|
|
878
|
+
if (state.activeByNamespace.get(normalized) === guard)
|
|
879
|
+
state.activeByNamespace.delete(normalized);
|
|
859
880
|
this.drainPullGate(state);
|
|
860
881
|
this.runtime.client._delivery?.onPullGateIdle?.(normalized);
|
|
861
882
|
this.armQueuedPullTimers(state);
|
|
@@ -867,7 +888,7 @@ export class RpcPipeline {
|
|
|
867
888
|
if (this.inlineRealtimeScopes.has(this.pullScopeKey(key)))
|
|
868
889
|
return null;
|
|
869
890
|
const serialized = this.pullGateStates.get(this.pullGateName(key));
|
|
870
|
-
if (serialized?.
|
|
891
|
+
if ([...(serialized?.activeByNamespace.values() ?? [])].some((job) => job.inline === true))
|
|
871
892
|
return null;
|
|
872
893
|
const client = this.runtime.client;
|
|
873
894
|
const now = Date.now();
|
|
@@ -897,7 +918,7 @@ export class RpcPipeline {
|
|
|
897
918
|
const ns = this.pullScopeKey(namespace);
|
|
898
919
|
if (!ns)
|
|
899
920
|
return true;
|
|
900
|
-
const active = this.pullGateStates.get(this.pullGateName(ns))?.
|
|
921
|
+
const active = this.pullGateStates.get(this.pullGateName(ns))?.activeByNamespace.get(ns);
|
|
901
922
|
return !active || active.namespace !== ns || (!active.timedOut && !active.invalidated);
|
|
902
923
|
}
|
|
903
924
|
invalidatePulls() {
|
|
@@ -907,8 +928,8 @@ export class RpcPipeline {
|
|
|
907
928
|
const waits = [];
|
|
908
929
|
for (const state of this.pullGateStates.values()) {
|
|
909
930
|
const jobs = new Set();
|
|
910
|
-
|
|
911
|
-
jobs.add(
|
|
931
|
+
for (const active of state.activeByNamespace.values())
|
|
932
|
+
jobs.add(active);
|
|
912
933
|
for (const job of state.foreground)
|
|
913
934
|
jobs.add(job);
|
|
914
935
|
for (const job of state.background)
|
|
@@ -973,7 +994,7 @@ export class RpcPipeline {
|
|
|
973
994
|
const candidate = state.byKey.get(key);
|
|
974
995
|
const existing = candidate && !candidate.timedOut && !candidate.invalidated ? candidate : null;
|
|
975
996
|
if (existing) {
|
|
976
|
-
if (!background && existing.background &&
|
|
997
|
+
if (!background && existing.background && ![...state.activeByNamespace.values()].includes(existing)) {
|
|
977
998
|
const index = state.background.indexOf(existing);
|
|
978
999
|
if (index >= 0)
|
|
979
1000
|
state.background.splice(index, 1);
|
|
@@ -1022,8 +1043,8 @@ export class RpcPipeline {
|
|
|
1022
1043
|
return;
|
|
1023
1044
|
const state = this.pullGateState(key);
|
|
1024
1045
|
const namespace = this.pullScopeKey(key);
|
|
1025
|
-
const job = state.
|
|
1026
|
-
if (!job
|
|
1046
|
+
const job = [...state.activeByNamespace.values()].find((candidate) => candidate.key === key) ?? null;
|
|
1047
|
+
if (!job)
|
|
1027
1048
|
return;
|
|
1028
1049
|
const replacementKey = String(nextKey || key);
|
|
1029
1050
|
if (state.byKey.get(job.key) === job)
|
|
@@ -1036,7 +1057,7 @@ export class RpcPipeline {
|
|
|
1036
1057
|
state.lifecycle.set(namespace, 'pulled');
|
|
1037
1058
|
job.suspended = true;
|
|
1038
1059
|
job.resume = new Promise((resolve) => { job.resumeResolve = resolve; });
|
|
1039
|
-
state.
|
|
1060
|
+
state.activeByNamespace.delete(namespace);
|
|
1040
1061
|
(job.background ? state.background : state.foreground).push(job);
|
|
1041
1062
|
this.drainPullGate(state);
|
|
1042
1063
|
if (job.resume) {
|
|
@@ -1056,58 +1077,63 @@ export class RpcPipeline {
|
|
|
1056
1077
|
if (!ns)
|
|
1057
1078
|
return;
|
|
1058
1079
|
const state = this.pullGateStates.get(this.pullGateName(ns));
|
|
1059
|
-
if (!state || state.
|
|
1080
|
+
if (!state || !state.activeByNamespace.has(ns))
|
|
1060
1081
|
return;
|
|
1061
1082
|
state.lifecycle.set(ns, lifecycle);
|
|
1062
1083
|
}
|
|
1063
1084
|
drainPullGate(state) {
|
|
1064
|
-
if (state.active)
|
|
1065
|
-
return;
|
|
1066
1085
|
const takeRunnable = (queue) => {
|
|
1067
|
-
const index = queue.findIndex((candidate) => !this.inlineRealtimeScopes.has(candidate.namespace)
|
|
1086
|
+
const index = queue.findIndex((candidate) => (!this.inlineRealtimeScopes.has(candidate.namespace)
|
|
1087
|
+
&& !state.activeByNamespace.has(candidate.namespace)));
|
|
1068
1088
|
return index >= 0 ? queue.splice(index, 1)[0] : undefined;
|
|
1069
1089
|
};
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
job.
|
|
1085
|
-
resumeResolve
|
|
1086
|
-
|
|
1090
|
+
while (state.activeByNamespace.size < PULL_GATE_MAX_ACTIVE) {
|
|
1091
|
+
const foregroundJob = takeRunnable(state.foreground);
|
|
1092
|
+
const foregroundDrained = foregroundJob !== undefined && state.foreground.length === 0;
|
|
1093
|
+
const job = foregroundJob ?? takeRunnable(state.background);
|
|
1094
|
+
if (!job)
|
|
1095
|
+
break;
|
|
1096
|
+
state.activeByNamespace.set(job.namespace, job);
|
|
1097
|
+
this.runtime.client._delivery?.onPullStarted?.(job.namespace);
|
|
1098
|
+
if (foregroundDrained)
|
|
1099
|
+
this.runtime.client._delivery?.onForegroundPullsDrained?.();
|
|
1100
|
+
if (job.timer)
|
|
1101
|
+
clearTimeout(job.timer);
|
|
1102
|
+
job.pullingStartedAt = Date.now();
|
|
1103
|
+
job.timedOut = false;
|
|
1104
|
+
state.lifecycle.set(job.namespace, 'pulling');
|
|
1105
|
+
const resumeResolve = job.resumeResolve;
|
|
1106
|
+
job.resume = null;
|
|
1107
|
+
job.resumeResolve = null;
|
|
1108
|
+
if (job.suspended) {
|
|
1109
|
+
job.suspended = false;
|
|
1110
|
+
resumeResolve?.();
|
|
1111
|
+
continue;
|
|
1112
|
+
}
|
|
1113
|
+
job.running = true;
|
|
1114
|
+
let failed = false;
|
|
1115
|
+
void this.executePullOperation(job.operation, job.background).then((value) => { if (!job.timedOut && !job.invalidated)
|
|
1116
|
+
job.resolve(value); }, (error) => {
|
|
1117
|
+
failed = true;
|
|
1118
|
+
if (!job.timedOut && !job.invalidated)
|
|
1119
|
+
job.reject(error);
|
|
1120
|
+
}).finally(() => {
|
|
1121
|
+
this.pullWorkTokens.delete(job.workToken);
|
|
1122
|
+
state.lifecycle.set(job.namespace, 'idle');
|
|
1123
|
+
if (state.activeByNamespace.get(job.namespace) === job)
|
|
1124
|
+
state.activeByNamespace.delete(job.namespace);
|
|
1125
|
+
if (state.byKey.get(job.key) === job)
|
|
1126
|
+
state.byKey.delete(job.key);
|
|
1127
|
+
this.drainPullGate(state);
|
|
1128
|
+
job.settledResolve?.();
|
|
1129
|
+
job.settledResolve = null;
|
|
1130
|
+
if (!job.invalidated)
|
|
1131
|
+
this.runtime.client._delivery?.onPullGateIdle?.(job.namespace);
|
|
1132
|
+
if (failed || job.invalidated)
|
|
1133
|
+
this.runtime.client._delivery?.onPullAborted?.();
|
|
1134
|
+
this.runtime.client._delivery?.onPullWorkSettled?.();
|
|
1135
|
+
});
|
|
1087
1136
|
}
|
|
1088
|
-
job.running = true;
|
|
1089
|
-
let failed = false;
|
|
1090
|
-
void this.executePullOperation(job.operation, job.background).then((value) => { if (!job.timedOut && !job.invalidated)
|
|
1091
|
-
job.resolve(value); }, (error) => {
|
|
1092
|
-
failed = true;
|
|
1093
|
-
if (!job.timedOut && !job.invalidated)
|
|
1094
|
-
job.reject(error);
|
|
1095
|
-
}).finally(() => {
|
|
1096
|
-
this.pullWorkTokens.delete(job.workToken);
|
|
1097
|
-
state.lifecycle.set(job.namespace, 'idle');
|
|
1098
|
-
if (state.active === job)
|
|
1099
|
-
state.active = null;
|
|
1100
|
-
if (state.byKey.get(job.key) === job)
|
|
1101
|
-
state.byKey.delete(job.key);
|
|
1102
|
-
this.drainPullGate(state);
|
|
1103
|
-
job.settledResolve?.();
|
|
1104
|
-
job.settledResolve = null;
|
|
1105
|
-
if (!job.invalidated)
|
|
1106
|
-
this.runtime.client._delivery?.onPullGateIdle?.(job.namespace);
|
|
1107
|
-
if (failed || job.invalidated)
|
|
1108
|
-
this.runtime.client._delivery?.onPullAborted?.();
|
|
1109
|
-
this.runtime.client._delivery?.onPullWorkSettled?.();
|
|
1110
|
-
});
|
|
1111
1137
|
}
|
|
1112
1138
|
armQueuedPullTimers(_state) { }
|
|
1113
1139
|
async rawCall(method, params, options) {
|
|
@@ -1116,7 +1142,7 @@ export class RpcPipeline {
|
|
|
1116
1142
|
const rpcBackground = Boolean(payload._rpc_background) || client._backgroundRpcDepth > 0 || options?.background === true;
|
|
1117
1143
|
delete payload._rpc_background;
|
|
1118
1144
|
const signed = options?.signed ?? true;
|
|
1119
|
-
if (signed) {
|
|
1145
|
+
if (signed || method.startsWith('org.')) {
|
|
1120
1146
|
await this.applyClientSignature(method, payload);
|
|
1121
1147
|
}
|
|
1122
1148
|
const timeout = options?.timeout;
|