jinaga-server 3.6.0 → 3.7.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.
Files changed (32) hide show
  1. package/dist/authorization/authorization-keystore.d.ts +7 -1
  2. package/dist/authorization/authorization-keystore.js +16 -5
  3. package/dist/authorization/authorization-keystore.js.map +1 -1
  4. package/dist/feeds/feed-stream-session.d.ts +84 -0
  5. package/dist/feeds/feed-stream-session.js +331 -0
  6. package/dist/feeds/feed-stream-session.js.map +1 -0
  7. package/dist/http/router.d.ts +7 -3
  8. package/dist/http/router.js +130 -238
  9. package/dist/http/router.js.map +1 -1
  10. package/dist/index.d.ts +2 -1
  11. package/dist/index.js +5 -1
  12. package/dist/index.js.map +1 -1
  13. package/dist/jinaga-server.d.ts +7 -0
  14. package/dist/jinaga-server.js +1 -1
  15. package/dist/jinaga-server.js.map +1 -1
  16. package/docs/design/feeds-persistent-proxy-plan.md +11 -1
  17. package/integration-test/jinaga-test/package-lock.json +4 -4
  18. package/integration-test/jinaga-test/package.json +1 -1
  19. package/package.json +2 -2
  20. package/src/authorization/authorization-keystore.ts +33 -7
  21. package/src/feeds/feed-stream-session.ts +386 -0
  22. package/src/http/router.ts +149 -289
  23. package/src/index.ts +2 -1
  24. package/src/jinaga-server.ts +9 -2
  25. package/test/authorization/intermediateProjectionFeedSpec.ts +189 -0
  26. package/test/authorization/subscriptionIntersectionSpec.ts +12 -0
  27. package/test/feeds/feedStreamSessionRegressionSpec.ts +227 -0
  28. package/test/feeds/feedStreamSessionSpec.ts +351 -0
  29. package/test/http/feedStreamSessionIntegrationSpec.ts +202 -0
  30. package/test/http/graphSaveMultiHopAuthSpec.ts +126 -0
  31. package/test/http/lateAuthRecoverySpec.ts +191 -1
  32. package/test/http/streamFeedAnchorSpec.ts +3 -1
@@ -1,14 +1,20 @@
1
- import { Authorization, AuthorizationRules, DistributionRules, FactEnvelope, FactFeed, FactManager, FactReference, ReferencesByName, Specification, Storage, UserIdentity } from "jinaga";
1
+ import { Authorization, AuthorizationRules, DistributionDenialCode, DistributionRules, FactEnvelope, FactFeed, FactManager, FactReference, ReferencesByName, Specification, Storage, UserIdentity } from "jinaga";
2
2
  export interface DistributionIntersectionBranch {
3
3
  start: FactReference[];
4
4
  specification: Specification;
5
5
  }
6
+ export interface DistributionDenial {
7
+ reason: string;
8
+ code: DistributionDenialCode;
9
+ }
6
10
  export type DistributionBranchesResult = {
7
11
  type: "success";
8
12
  branches: DistributionIntersectionBranch[];
13
+ denial?: DistributionDenial;
9
14
  } | {
10
15
  type: "denied";
11
16
  reason: string;
17
+ code: DistributionDenialCode;
12
18
  };
13
19
  export type FeedResult = {
14
20
  type: "success";
@@ -12,6 +12,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.AuthorizationKeystore = void 0;
13
13
  const jinaga_1 = require("jinaga");
14
14
  const distributed_fact_cache_1 = require("./distributed-fact-cache");
15
+ function factKey(reference) {
16
+ return `${reference.type}:${reference.hash}`;
17
+ }
15
18
  class AuthorizationKeystore {
16
19
  constructor(factManager, store, keystore, authorizationRules, distributionRules) {
17
20
  this.factManager = factManager;
@@ -129,14 +132,15 @@ class AuthorizationKeystore {
129
132
  const signedFacts = (userIdentity && factsToSign.length > 0)
130
133
  ? yield this.keystore.signFacts(userIdentity, factsToSign)
131
134
  : [];
135
+ const envelopeByFact = new Map(envelopes.map(e => [factKey(e.fact), e]));
136
+ const signedFactByFact = new Map(signedFacts.map(f => [factKey(f.fact), f]));
132
137
  const authorizedEnvelopes = results.map(r => {
133
- const isFact = (0, jinaga_1.factReferenceEquals)(r.fact);
134
- const envelope = envelopes.find(e => isFact(e.fact));
138
+ const envelope = envelopeByFact.get(factKey(r.fact));
135
139
  if (!envelope) {
136
140
  throw new Error("Fact not found in envelopes.");
137
141
  }
138
142
  if (r.verdict === "Accept") {
139
- const signedFact = signedFacts.find(f => isFact(f.fact));
143
+ const signedFact = signedFactByFact.get(factKey(r.fact));
140
144
  const userSignatures = signedFact
141
145
  ? signedFact.signatures
142
146
  : [];
@@ -191,11 +195,18 @@ class AuthorizationKeystore {
191
195
  if (canDistribute.type === "success") {
192
196
  return { type: "success", branches: [{ start, specification }] };
193
197
  }
198
+ // Preserve the structured engine failure so the caller can classify
199
+ // the feed (issue #168 S1). `canDistribute` is narrowed to a failure
200
+ // here, so `code`/`reason` are available.
201
+ const denial = { reason: canDistribute.reason, code: canDistribute.code };
194
202
  const result = yield this.distributionEngine.intersectForSubscribe(start, specification, userReference);
195
203
  if (!result.intersected) {
196
- return { type: "denied", reason: canDistribute.reason };
204
+ return { type: "denied", reason: denial.reason, code: denial.code };
197
205
  }
198
- return { type: "success", branches: result.branches };
206
+ // Authorized via intersection: the spec is denied for this user right
207
+ // now (denial carries why) but self-heals once the authorizing fact
208
+ // arrives. The router reports this as `reactive`.
209
+ return { type: "success", branches: result.branches, denial };
199
210
  });
200
211
  }
201
212
  }
@@ -1 +1 @@
1
- {"version":3,"file":"authorization-keystore.js","sourceRoot":"","sources":["../../src/authorization/authorization-keystore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"authorization-keystore.js","sourceRoot":"","sources":["../../src/authorization/authorization-keystore.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAkBgB;AA+ChB,qEAAgE;AAEhE,SAAS,OAAO,CAAC,SAAwB;IACrC,OAAO,GAAG,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;AACjD,CAAC;AAED,MAAa,qBAAqB;IAK9B,YACY,WAAwB,EACxB,KAAc,EACd,QAAkB,EAC1B,kBAA6C,EAC7C,iBAA2C;QAJnC,gBAAW,GAAX,WAAW,CAAa;QACxB,UAAK,GAAL,KAAK,CAAS;QACd,aAAQ,GAAR,QAAQ,CAAU;QALtB,qBAAgB,GAAyB,IAAI,6CAAoB,EAAE,CAAC;QASxE,IAAI,CAAC,mBAAmB,GAAG,kBAAkB;YACzC,IAAI,4BAAmB,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QACvD,IAAI,CAAC,kBAAkB,GAAG,iBAAiB;YACvC,IAAI,2BAAkB,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC;IAEK,mBAAmB,CAAC,YAA0B;;YAChD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;YACvE,MAAM,SAAS,GAAG;gBACA;oBACV,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,EAAE;iBACjB;aACJ,CAAC;YACF,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACjC,OAAO,QAAQ,CAAC;QACpB,CAAC;KAAA;IAEK,IAAI,CAAC,YAAiC,EAAE,KAAsB,EAAE,aAA4B;;YAC9F,IAAI,IAAI,CAAC,kBAAkB,EAAE;gBACzB,MAAM,aAAa,GAAyB,YAAY;oBACpD,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC;oBAC/C,CAAC,CAAC,IAAI,CAAC;gBACX,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,iCAC1D,GAAG,KACN,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,IAC9B,EAAE,EAAsB,CAAC,CAAC;gBAC5B,6DAA6D;gBAC7D,MAAM,KAAK,GAAG,IAAA,mBAAU,EAAC,aAAa,CAAC,CAAC;gBACxC,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;gBACzG,IAAI,aAAa,CAAC,IAAI,KAAK,SAAS,EAAE;oBAClC,MAAM,IAAI,kBAAS,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;iBAC7C;aACJ;YACD,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QAC7D,CAAC;KAAA;IAEK,IAAI,CAAC,YAAiC,EAAE,aAA4B,EAAE,KAAsB,EAAE,QAAgB;;YAChH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,YAAY,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC7F,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE;gBAC1B,MAAM,IAAI,kBAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;aACtC;YACD,OAAO,MAAM,CAAC,IAAI,CAAC;QACvB,CAAC;KAAA;IAEK,oBAAoB,CAAC,YAAiC,EAAE,aAA4B,EAAE,KAAsB,EAAE,QAAgB;;YAChI,IAAI,IAAI,CAAC,kBAAkB,EAAE;gBACzB,MAAM,aAAa,GAAyB,YAAY;oBACpD,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC;oBAC/C,CAAC,CAAC,IAAI,CAAC;gBACX,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,iCAC1D,GAAG,KACN,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,IAC9B,EAAE,EAAsB,CAAC,CAAC;gBAC5B,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,CAAC,aAAa,CAAC,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;gBACnH,IAAI,aAAa,CAAC,IAAI,KAAK,SAAS,EAAE;oBAClC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,EAAE,CAAC;iBAC3D;gBACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;gBACvE,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM;qBACjC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;qBAC7B,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAA,4BAAmB,EAAC,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;gBAC1F,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;gBACzD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;aAC9C;YACD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC5F,CAAC;KAAA;IAEK,eAAe,CAAC,YAAiC,EAAE,aAA4B,EAAE,KAAsB,EAAE,QAAgB;;YAC3H,iEAAiE;YACjE,mEAAmE;YACnE,+DAA+D;YAC/D,iEAAiE;YACjE,mEAAmE;YACnE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YACvE,IAAI,IAAI,CAAC,kBAAkB,EAAE;gBACzB,MAAM,aAAa,GAAyB,YAAY;oBACpD,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC;oBAC/C,CAAC,CAAC,IAAI,CAAC;gBACX,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM;qBACjC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;qBAC7B,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAA,4BAAmB,EAAC,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;gBAC1F,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;aAC5D;YACD,OAAO,QAAQ,CAAC;QACpB,CAAC;KAAA;IAEK,IAAI,CAAC,YAA0B,EAAE,UAA2B;;YAC9D,IAAI,IAAI,CAAC,kBAAkB,EAAE;gBACzB,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACrF,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;gBAC9E,IAAI,CAAC,aAAa,EAAE;oBAChB,MAAM,IAAI,kBAAS,CAAC,cAAc,CAAC,CAAC;iBACvC;aACJ;YACD,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnD,CAAC;KAAA;IAEK,IAAI,CAAC,YAAiC,EAAE,SAAyB;;YACnE,IAAI,IAAI,CAAC,mBAAmB,EAAE;gBAC1B,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACrF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;gBACnF,MAAM,QAAQ,GAAc,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;oBACjF,CAAC,CAAC,CAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAE;oBAC/B,CAAC,CAAC,EAAE,CAAC;gBACT,MAAM,WAAW,GAAG,OAAO;qBACtB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;qBACtF,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACtB,MAAM,WAAW,GAAG,CAAC,YAAY,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;oBACxD,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC;oBAC1D,CAAC,CAAC,EAAE,CAAC;gBACT,MAAM,cAAc,GAAG,IAAI,GAAG,CAC1B,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9C,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAC5B,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChD,MAAM,mBAAmB,GAAmB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;oBACxD,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;oBACrD,IAAI,CAAC,QAAQ,EAAE;wBACX,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;qBACnD;oBACD,IAAI,CAAC,CAAC,OAAO,KAAK,QAAQ,EAAE;wBACxB,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;wBACzD,MAAM,cAAc,GAAG,UAAU;4BAC7B,CAAC,CAAC,UAAU,CAAC,UAAU;4BACvB,CAAC,CAAC,EAAE,CAAC;wBACT,OAAO;4BACH,IAAI,EAAE,CAAC,CAAC,IAAI;4BACZ,UAAU,EAAE,QAAQ,CAAC,UAAU;iCAC1B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;iCAClD,MAAM,CAAC,cAAc,CAAC;yBAC9B,CAAC;qBACL;yBACI,IAAI,CAAC,CAAC,OAAO,KAAK,UAAU,EAAE;wBAC/B,OAAO,QAAQ,CAAC;qBACnB;yBACI;wBACD,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;qBAC1C;gBACL,CAAC,CAAC,CAAC;gBACH,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;gBACxE,OAAO,cAAc,CAAC;aACzB;iBACI;gBACD,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC9D,OAAO,cAAc,CAAC;aACzB;QACL,CAAC;KAAA;IAEK,kBAAkB,CAAC,YAAiC,EAAE,KAAsB,EAAE,UAA4B;;YAC5G,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBAC1B,OAAO;aACV;YAED,MAAM,aAAa,GAAyB,YAAY;gBACpD,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC;gBAC/C,CAAC,CAAC,IAAI,CAAC;YACX,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;YACzG,IAAI,aAAa,CAAC,IAAI,KAAK,SAAS,EAAE;gBAClC,MAAM,IAAI,kBAAS,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;aAC7C;QACL,CAAC;KAAA;IAEK,6BAA6B,CAC/B,YAAiC,EACjC,aAA4B,EAC5B,UAA4B;;YAE5B,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACrE,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBAC1B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC;aACpE;YACD,MAAM,aAAa,GAAyB,YAAY;gBACpD,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC;gBAC/C,CAAC,CAAC,IAAI,CAAC;YACX,MAAM,WAAW,GAAG,IAAA,mBAAU,EAAC,aAAa,CAAC,CAAC;YAC9C,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,WAAW,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;YAC/G,IAAI,aAAa,CAAC,IAAI,KAAK,SAAS,EAAE;gBAClC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC;aACpE;YACD,oEAAoE;YACpE,qEAAqE;YACrE,0CAA0C;YAC1C,MAAM,MAAM,GAAuB,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,aAAa,CAAC,IAAI,EAAE,CAAC;YAC9F,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,KAAK,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;YACxG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;gBACrB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;aACvE;YACD,sEAAsE;YACtE,oEAAoE;YACpE,kDAAkD;YAClD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;QAClE,CAAC;KAAA;CACJ;AA5MD,sDA4MC"}
@@ -0,0 +1,84 @@
1
+ import { FactManager, FactReference, FeedObject, FeedResponse } from "jinaga";
2
+ import { FeedResult } from "../authorization/authorization-keystore";
3
+ import { Stream } from "../http/stream";
4
+ /**
5
+ * A function that queries the feed for the next page of tuples, starting
6
+ * from the supplied bookmark. Returns a {@link FeedResult} so the session
7
+ * can keep the stream alive when distribution is denied at query time.
8
+ */
9
+ export type FeedQuery = (bookmark: string) => Promise<FeedResult>;
10
+ export interface FeedStreamSessionConfig {
11
+ /** Maximum number of pages to stream before giving up (infinite-loop guard). */
12
+ maxInitialPages: number;
13
+ /** Maximum number of references the waitlist may hold before the stream is dropped. */
14
+ waitlistCap: number;
15
+ /** Insert a small delay every N pages to avoid overwhelming the database. */
16
+ pageDelayEvery: number;
17
+ /** Length of the delay inserted by {@link pageDelayEvery}, in milliseconds. */
18
+ pageDelayMs: number;
19
+ }
20
+ export declare const defaultFeedStreamSessionConfig: FeedStreamSessionConfig;
21
+ /**
22
+ * Per-connection proxy for a streaming feed subscription.
23
+ *
24
+ * The session funnels every fetch and stream operation through a single
25
+ * "query cycle" driven by the current bookmark. Inverse observers never
26
+ * fetch or stream directly; they only enqueue fact references onto a
27
+ * waitlist and wake the cycle. This serialization removes the race between
28
+ * listener callbacks and bookmark mutation, guarantees tuple completeness,
29
+ * and ensures no update is lost when facts arrive between pages.
30
+ *
31
+ * See docs/design/feeds-persistent-proxy-plan.md for the full design.
32
+ */
33
+ export declare class FeedStreamSession {
34
+ private readonly query;
35
+ private readonly factManager;
36
+ private readonly feedDefinition;
37
+ private readonly startReferences;
38
+ private readonly givenHash;
39
+ private readonly stream;
40
+ private readonly connectionId;
41
+ private bookmark;
42
+ private readonly config;
43
+ private readonly waitlist;
44
+ private activeCycle;
45
+ private needsCycle;
46
+ private shuttingDown;
47
+ private listeners;
48
+ private readonly telemetry;
49
+ constructor(query: FeedQuery, factManager: FactManager, feedDefinition: FeedObject, startReferences: FactReference[], givenHash: string, stream: Stream<FeedResponse>, initialBookmark: string, connectionId?: string, config?: Partial<FeedStreamSessionConfig>);
50
+ /** Current number of references on the waitlist (observability/testing). */
51
+ get waitlistSize(): number;
52
+ /**
53
+ * Register inverse and anchor observers, then kick off the initial
54
+ * paginated backfill. Resolves once the observers are registered; the
55
+ * cycle continues to run asynchronously, feeding the stream.
56
+ */
57
+ start(): void;
58
+ /**
59
+ * Tear down all observers and prevent any further cycles. Idempotent.
60
+ */
61
+ dispose(): void;
62
+ /**
63
+ * Add fact references to the waitlist and wake the cycle. Called by the
64
+ * inverse observers; never fetches or streams directly.
65
+ */
66
+ onInverseMatch(references: FactReference[]): void;
67
+ /**
68
+ * Start a cycle if one is not already running. If a cycle is active,
69
+ * mark that another pass is needed once it completes.
70
+ */
71
+ private wake;
72
+ /**
73
+ * The single serialized query cycle. Pages through the feed until both
74
+ * the query returns no tuples and the waitlist is empty, then emits a
75
+ * SYNC frame. Guarded by activeCycle so no two cycles run concurrently.
76
+ */
77
+ private runCycle;
78
+ private streamPage;
79
+ private streamSync;
80
+ private removeFromWaitlist;
81
+ private delay;
82
+ private registerInverseListeners;
83
+ private registerAnchorListeners;
84
+ }
@@ -0,0 +1,331 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.FeedStreamSession = exports.defaultFeedStreamSessionConfig = void 0;
13
+ const jinaga_1 = require("jinaga");
14
+ exports.defaultFeedStreamSessionConfig = {
15
+ maxInitialPages: 1000,
16
+ waitlistCap: 50000,
17
+ pageDelayEvery: 10,
18
+ pageDelayMs: 10
19
+ };
20
+ function referenceKey(reference) {
21
+ return `${reference.type}:${reference.hash}`;
22
+ }
23
+ function dedupeReferences(references) {
24
+ const seen = new Set();
25
+ const result = [];
26
+ for (const reference of references) {
27
+ const key = referenceKey(reference);
28
+ if (!seen.has(key)) {
29
+ seen.add(key);
30
+ result.push(reference);
31
+ }
32
+ }
33
+ return result;
34
+ }
35
+ /**
36
+ * Per-connection proxy for a streaming feed subscription.
37
+ *
38
+ * The session funnels every fetch and stream operation through a single
39
+ * "query cycle" driven by the current bookmark. Inverse observers never
40
+ * fetch or stream directly; they only enqueue fact references onto a
41
+ * waitlist and wake the cycle. This serialization removes the race between
42
+ * listener callbacks and bookmark mutation, guarantees tuple completeness,
43
+ * and ensures no update is lost when facts arrive between pages.
44
+ *
45
+ * See docs/design/feeds-persistent-proxy-plan.md for the full design.
46
+ */
47
+ class FeedStreamSession {
48
+ constructor(query, factManager, feedDefinition, startReferences, givenHash, stream, initialBookmark, connectionId = Math.random().toString(36).substring(2, 10), config = {}) {
49
+ this.query = query;
50
+ this.factManager = factManager;
51
+ this.feedDefinition = feedDefinition;
52
+ this.startReferences = startReferences;
53
+ this.givenHash = givenHash;
54
+ this.stream = stream;
55
+ this.connectionId = connectionId;
56
+ // Waitlist of fact references surfaced by inverse observers, keyed by
57
+ // "{type}:{hash}" so duplicates collapse. A reference stays on the
58
+ // waitlist until the tuple that contains it is streamed, preserving
59
+ // tuple completeness.
60
+ this.waitlist = new Map();
61
+ // Single-cycle execution guard. Only one runCycle() executes at a time;
62
+ // wake-ups that arrive while a cycle runs set needsCycle so the loop
63
+ // re-evaluates before returning.
64
+ this.activeCycle = false;
65
+ this.needsCycle = false;
66
+ this.shuttingDown = false;
67
+ this.listeners = [];
68
+ this.telemetry = {
69
+ initialPages: 0,
70
+ referencesStreamed: 0,
71
+ cycles: 0,
72
+ syncFrames: 0,
73
+ waitlistRestarts: 0,
74
+ waitlistHighWater: 0
75
+ };
76
+ this.bookmark = initialBookmark;
77
+ this.config = Object.assign(Object.assign({}, exports.defaultFeedStreamSessionConfig), config);
78
+ }
79
+ /** Current number of references on the waitlist (observability/testing). */
80
+ get waitlistSize() {
81
+ return this.waitlist.size;
82
+ }
83
+ /**
84
+ * Register inverse and anchor observers, then kick off the initial
85
+ * paginated backfill. Resolves once the observers are registered; the
86
+ * cycle continues to run asynchronously, feeding the stream.
87
+ */
88
+ start() {
89
+ this.registerInverseListeners();
90
+ this.registerAnchorListeners();
91
+ // Kick off the initial backfill. Errors are isolated so a failed
92
+ // cycle never rejects the caller's setup path.
93
+ this.wake();
94
+ }
95
+ /**
96
+ * Tear down all observers and prevent any further cycles. Idempotent.
97
+ */
98
+ dispose() {
99
+ if (this.shuttingDown) {
100
+ return;
101
+ }
102
+ this.shuttingDown = true;
103
+ for (const listener of this.listeners) {
104
+ try {
105
+ this.factManager.removeSpecificationListener(listener);
106
+ }
107
+ catch (error) {
108
+ jinaga_1.Trace.error(error);
109
+ }
110
+ }
111
+ this.listeners = [];
112
+ // Use a stable metric name so a metrics backend does not see
113
+ // unbounded cardinality from per-connection IDs. The connection ID
114
+ // is logged separately for correlation.
115
+ jinaga_1.Trace.info(`Feed stream session ${this.connectionId} closed`);
116
+ jinaga_1.Trace.metric("Feed stream session closed", {
117
+ initialPages: this.telemetry.initialPages,
118
+ referencesStreamed: this.telemetry.referencesStreamed,
119
+ cycles: this.telemetry.cycles,
120
+ syncFrames: this.telemetry.syncFrames,
121
+ waitlistRestarts: this.telemetry.waitlistRestarts,
122
+ waitlistHighWater: this.telemetry.waitlistHighWater
123
+ });
124
+ }
125
+ /**
126
+ * Add fact references to the waitlist and wake the cycle. Called by the
127
+ * inverse observers; never fetches or streams directly.
128
+ */
129
+ onInverseMatch(references) {
130
+ if (this.shuttingDown) {
131
+ return;
132
+ }
133
+ for (const reference of references) {
134
+ this.waitlist.set(referenceKey(reference), reference);
135
+ }
136
+ if (this.waitlist.size > this.telemetry.waitlistHighWater) {
137
+ this.telemetry.waitlistHighWater = this.waitlist.size;
138
+ }
139
+ if (this.waitlist.size > this.config.waitlistCap) {
140
+ jinaga_1.Trace.warn(`Feed stream session ${this.connectionId} waitlist exceeded cap ` +
141
+ `(${this.waitlist.size} > ${this.config.waitlistCap}); closing stream.`);
142
+ this.dispose();
143
+ this.stream.close();
144
+ return;
145
+ }
146
+ this.wake();
147
+ }
148
+ /**
149
+ * Start a cycle if one is not already running. If a cycle is active,
150
+ * mark that another pass is needed once it completes.
151
+ */
152
+ wake() {
153
+ if (this.shuttingDown) {
154
+ return;
155
+ }
156
+ if (this.activeCycle) {
157
+ this.needsCycle = true;
158
+ return;
159
+ }
160
+ // Run the cycle without awaiting; isolate failures.
161
+ void this.runCycle().catch(error => jinaga_1.Trace.error(error));
162
+ }
163
+ /**
164
+ * The single serialized query cycle. Pages through the feed until both
165
+ * the query returns no tuples and the waitlist is empty, then emits a
166
+ * SYNC frame. Guarded by activeCycle so no two cycles run concurrently.
167
+ */
168
+ runCycle() {
169
+ return __awaiter(this, void 0, void 0, function* () {
170
+ if (this.activeCycle) {
171
+ this.needsCycle = true;
172
+ return;
173
+ }
174
+ this.activeCycle = true;
175
+ this.telemetry.cycles++;
176
+ try {
177
+ let pagesThisCycle = 0;
178
+ let keepGoing = true;
179
+ while (keepGoing && !this.shuttingDown) {
180
+ this.needsCycle = false;
181
+ const result = yield this.query(this.bookmark);
182
+ if (this.shuttingDown) {
183
+ break;
184
+ }
185
+ if (result.type === "denied") {
186
+ // Distribution denied at query time. Keep the stream
187
+ // alive (an authorizing fact may arrive later and wake a
188
+ // new cycle) but stop the loop without emitting SYNC,
189
+ // since we are not actually caught up.
190
+ jinaga_1.Trace.info(`Feed stream session ${this.connectionId} query denied: ${result.reason}`);
191
+ break;
192
+ }
193
+ const feed = result.feed;
194
+ if (feed.tuples.length > 0) {
195
+ const references = dedupeReferences(feed.tuples.flatMap(t => t.facts));
196
+ this.streamPage(references, feed.bookmark);
197
+ this.removeFromWaitlist(references);
198
+ pagesThisCycle++;
199
+ this.telemetry.initialPages++;
200
+ if (feed.bookmark === this.bookmark) {
201
+ // The store returned results but the bookmark did not
202
+ // advance, meaning it cannot paginate further (e.g.
203
+ // MemoryStore returns the full result set on every
204
+ // call). Everything available has been delivered, so
205
+ // treat this as caught-up: drop any waitlist entries
206
+ // that the full page did not satisfy and emit SYNC.
207
+ // Re-querying with the same bookmark would loop
208
+ // forever re-delivering identical tuples.
209
+ this.waitlist.clear();
210
+ this.streamSync();
211
+ keepGoing = false;
212
+ }
213
+ else {
214
+ this.bookmark = feed.bookmark;
215
+ if (pagesThisCycle >= this.config.maxInitialPages) {
216
+ jinaga_1.Trace.warn(`Feed stream session ${this.connectionId} hit max page limit ` +
217
+ `(${this.config.maxInitialPages}); ending cycle.`);
218
+ break;
219
+ }
220
+ if (this.config.pageDelayEvery > 0 &&
221
+ pagesThisCycle % this.config.pageDelayEvery === 0) {
222
+ yield this.delay(this.config.pageDelayMs);
223
+ }
224
+ // Continue paging.
225
+ }
226
+ }
227
+ else {
228
+ // No tuples this query.
229
+ if (this.waitlist.size === 0) {
230
+ this.streamSync();
231
+ keepGoing = false;
232
+ }
233
+ else if (this.needsCycle) {
234
+ // A wake arrived during this query; re-run so the
235
+ // just-arrived facts get a chance to produce tuples.
236
+ this.telemetry.waitlistRestarts++;
237
+ }
238
+ else {
239
+ // The waitlist holds references whose tuples are not
240
+ // completable at the current bookmark (e.g. a missing
241
+ // predecessor). They cannot produce a tuple now, so
242
+ // drop them to avoid spinning and emit SYNC. A later
243
+ // trigger will re-add them once they are completable.
244
+ this.waitlist.clear();
245
+ this.streamSync();
246
+ keepGoing = false;
247
+ }
248
+ }
249
+ }
250
+ }
251
+ finally {
252
+ this.activeCycle = false;
253
+ // A wake that arrived as the loop exited must start a fresh
254
+ // cycle, since this one already cleared activeCycle.
255
+ if (this.needsCycle && !this.shuttingDown) {
256
+ this.needsCycle = false;
257
+ this.wake();
258
+ }
259
+ }
260
+ });
261
+ }
262
+ streamPage(references, bookmark) {
263
+ const response = { references, bookmark };
264
+ this.telemetry.referencesStreamed += references.length;
265
+ this.stream.feed(response);
266
+ }
267
+ streamSync() {
268
+ const response = { references: [], bookmark: this.bookmark };
269
+ this.telemetry.syncFrames++;
270
+ this.stream.feed(response);
271
+ }
272
+ removeFromWaitlist(references) {
273
+ for (const reference of references) {
274
+ this.waitlist.delete(referenceKey(reference));
275
+ }
276
+ }
277
+ delay(ms) {
278
+ return new Promise(resolve => setTimeout(resolve, ms));
279
+ }
280
+ registerInverseListeners() {
281
+ const inverses = (0, jinaga_1.invertSpecification)(this.feedDefinition.feed);
282
+ for (const inverse of inverses) {
283
+ const listener = this.factManager.addSpecificationListener(inverse.inverseSpecification, (results) => __awaiter(this, void 0, void 0, function* () {
284
+ if (this.shuttingDown) {
285
+ return;
286
+ }
287
+ // Only enqueue results whose given subset matches this
288
+ // subscription's given.
289
+ const matching = results.filter(pr => this.givenHash === (0, jinaga_1.computeTupleSubsetHash)(pr.tuple, inverse.givenSubset));
290
+ if (matching.length === 0) {
291
+ return;
292
+ }
293
+ const references = dedupeReferences(matching.flatMap(pr => Object.values(pr.tuple)));
294
+ this.onInverseMatch(references);
295
+ }));
296
+ this.listeners.push(listener);
297
+ }
298
+ }
299
+ registerAnchorListeners() {
300
+ // Anchor listeners (jinaga.js#129): the inverse-listener path only
301
+ // fires when a descendant of the given arrives. If the given fact
302
+ // itself isn't yet in the store when the client subscribes, no
303
+ // inverse can deliver results until the given is recorded. Register
304
+ // a listener per unique anchor that wakes the cycle the moment a
305
+ // saved fact matches the anchor's (type, hash). The anchor itself is
306
+ // not added to the waitlist; the query will surface its descendants.
307
+ const uniqueAnchors = this.startReferences.filter((s, i, arr) => arr.findIndex(other => other.type === s.type && other.hash === s.hash) === i);
308
+ for (const anchor of uniqueAnchors) {
309
+ const anchorSpec = {
310
+ given: [{ label: { name: "x", type: anchor.type }, conditions: [] }],
311
+ matches: [],
312
+ projection: { type: "fact", label: "x" }
313
+ };
314
+ const listener = this.factManager.addSpecificationListener(anchorSpec, (results) => __awaiter(this, void 0, void 0, function* () {
315
+ if (this.shuttingDown) {
316
+ return;
317
+ }
318
+ const matched = results.some(pr => {
319
+ const ref = pr.tuple && pr.tuple.x;
320
+ return ref && ref.type === anchor.type && ref.hash === anchor.hash;
321
+ });
322
+ if (matched) {
323
+ this.wake();
324
+ }
325
+ }));
326
+ this.listeners.push(listener);
327
+ }
328
+ }
329
+ }
330
+ exports.FeedStreamSession = FeedStreamSession;
331
+ //# sourceMappingURL=feed-stream-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feed-stream-session.js","sourceRoot":"","sources":["../../src/feeds/feed-stream-session.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { Handler } from "express";
2
2
  import { Authorization, FactManager, FeedCache, ProfileMessage } from "jinaga";
3
3
  import { SubscriptionAuthorizer } from "../authorization/authorization-keystore";
4
+ import { FeedStreamSessionConfig } from "../feeds/feed-stream-session";
4
5
  export interface RequestUser {
5
6
  provider: string;
6
7
  id: string;
@@ -11,9 +12,10 @@ export declare class HttpRouter {
11
12
  private authorization;
12
13
  private feedCache;
13
14
  private allowedOrigin;
15
+ private feedStreamConfig;
14
16
  handler: Handler;
15
17
  private intersectedFeedOwners;
16
- constructor(factManager: FactManager, authorization: Authorization & SubscriptionAuthorizer, feedCache: FeedCache, allowedOrigin: string | string[] | ((origin: string, callback: (err: Error | null, allow?: boolean) => void) => void));
18
+ constructor(factManager: FactManager, authorization: Authorization & SubscriptionAuthorizer, feedCache: FeedCache, allowedOrigin: string | string[] | ((origin: string, callback: (err: Error | null, allow?: boolean) => void) => void), feedStreamConfig?: Partial<FeedStreamSessionConfig>);
17
19
  private login;
18
20
  private load;
19
21
  private save;
@@ -29,10 +31,12 @@ export declare class HttpRouter {
29
31
  private queryFeed;
30
32
  private feed;
31
33
  private streamFeed;
32
- private streamAllInitialResults;
33
- private streamFeedResponse;
34
34
  private getKnownFacts;
35
35
  private selectStart;
36
36
  private setOptions;
37
37
  private applyAllowOrigin;
38
38
  }
39
+ export declare class FeedNotFound extends Error {
40
+ readonly feedHash: string;
41
+ constructor(feedHash: string);
42
+ }