@honua/app-platform 0.1.13 → 0.1.14

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.
@@ -1 +1 @@
1
- {"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../../src/contract/source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD,OAAO,EAIL,KAAK,mBAAmB,EAOzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGtE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,yBAAyB,EACzB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,yBAAyB,EAE1B,MAAM,qBAAqB,CAAC;AAe7B,OAAO,KAAK,EAAE,mBAAmB,EAAsB,MAAM,gBAAgB,CAAC;AAG9E,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAsB,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAoB9E,OAAO,KAAK,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAgB/G,OAAO,EAYL,KAAK,UAAU,EACf,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,OAAO,EAQZ,KAAK,QAAQ,EAOb,KAAK,gBAAgB,EACrB,KAAK,QAAQ,EAEd,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAEpE;AAED,iFAAiF;AACjF,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,oBAAoB,EAC7B,KAAK,GAAE;IACL,QAAQ,CAAC,mBAAmB,CAAC,EAAE,WAAW,CAAC,QAAQ,EAAE,yBAAyB,CAAC,CAAC;CAC5E,GACL,OAAO,CAwDT;AA+DD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,EACxC,UAAU,EAAE,gBAAgB,EAC5B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,gBAAgB,GACvB,qBAAqB,CAAC,CAAC,CAAC,CAkF1B;AAID;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,2BAA2B,CAAC,CAAC,EAC3C,UAAU,EAAE,gBAAgB,EAC5B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,gBAAgB,GACvB,qBAAqB,CAAC,CAAC,CAAC,CA4E1B;AAID;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EACjC,UAAU,EAAE,gBAAgB,EAC5B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,gBAAgB,GACvB,qBAAqB,CAAC,CAAC,CAAC,CAqM1B;AAID;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EACtC,UAAU,EAAE,gBAAgB,EAC5B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,gBAAgB,GACvB,qBAAqB,CAAC,CAAC,CAAC,CA4F1B;AAID;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gCAAgC,CAAC,CAAC,EAChD,UAAU,EAAE,gBAAgB,EAC5B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,gBAAgB,GACvB,qBAAqB,CAAC,CAAC,CAAC,CAQ1B;AAID;;;;;;;;;;;;GAYG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,EAC1C,UAAU,EAAE,gBAAgB,EAC5B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,gBAAgB,GACvB,qBAAqB,CAAC,CAAC,CAAC,CAa1B;AAID;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAC9B,UAAU,EAAE,gBAAgB,EAC5B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,gBAAgB,GACvB,qBAAqB,CAAC,CAAC,CAAC,CAsB1B;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAC7B,UAAU,EAAE,gBAAgB,EAC5B,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,gBAAgB,EACxB,IAAI,GAAE,0BAA+B,GACpC,qBAAqB,CAAC,CAAC,CAAC,CAqB1B;AAID;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAC7B,UAAU,EAAE,gBAAgB,EAC5B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,gBAAgB,GACvB,qBAAqB,CAAC,CAAC,CAAC,CAoB1B;AAID;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,UAAU,EAAE,gBAAgB,EAC5B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,gBAAgB,GACvB,qBAAqB,CAAC,CAAC,CAAC,CA4F1B;AAID;;;;;;;;;GASG;AACH;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,SAAS,CAAC,CAAC,EACzB,UAAU,EAAE,gBAAgB,EAC5B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,gBAAgB,GACvB,qBAAqB,CAAC,CAAC,CAAC,CA6F1B;AA0HD;;;;;GAKG;AACH;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAC1B,UAAU,EAAE,gBAAgB,EAC5B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,gBAAgB,GACvB,qBAAqB,CAAC,CAAC,CAAC,CAkC1B;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,UAAU,EAAE,gBAAgB,EAC5B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,gBAAgB,GACvB,qBAAqB,CAAC,CAAC,CAAC,CAyI1B;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,wBAAgB,SAAS,CAAC,CAAC,EACzB,UAAU,EAAE,gBAAgB,EAC5B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,gBAAgB,GACvB,qBAAqB,CAAC,CAAC,CAAC,CA+U1B;AAmZD;;;;;;;;;;;;;GAaG;AACH,gEAAgE;AAChE,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,eAAe,CAAC;AAE5D,uCAAuC;AACvC,MAAM,WAAW,kBAAkB;IACjC;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,kBAAkB,CAAC;CAC7C;AAYD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,UAAU,EAAE,gBAAgB,EAC5B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,gBAAgB,EACxB,OAAO,GAAE,kBAAuB,GAC/B,qBAAqB,CAAC,CAAC,CAAC,CAwK1B;AAqxED;;;;;;GAMG;AACH,OAAO,QAAQ,YAAY,CAAC;IAC1B,UAAU,cAAc;QACtB,6BAA6B,EAAE,iBAAiB,CAAC;QACjD,yBAAyB,EAAE,eAAe,CAAC;QAC3C,uBAAuB,EAAE,aAAa,CAAC;QACvC,2BAA2B,EAAE,iBAAiB,CAAC;QAC/C,8BAA8B,EAAE,oBAAoB,CAAC;QACrD,wBAAwB,EAAE,yBAAyB,CAAC;QACpD,cAAc,EAAE,yBAAyB,CAAC;QAC1C,WAAW,EAAE,eAAe,GAAG,aAAa,CAAC;QAC7C,UAAU,EAAE,YAAY,GAAG,qBAAqB,CAAC;QACjD,aAAa,EAAE,wBAAwB,CAAC;QACxC,eAAe,EAAE,iBAAiB,CAAC;QACnC,IAAI,EAAE,eAAe,CAAC;QACtB,GAAG,EAAE,mBAAmB,CAAC;QACzB,GAAG,EAAE,QAAQ,CAAC;QACd,WAAW,EAAE,aAAa,CAAC;QAC3B,IAAI,EAAE,SAAS,CAAC;QAChB,YAAY,EAAE,cAAc,CAAC;QAC7B,cAAc,EAAE,gBAAgB,CAAC;QACjC,KAAK,EAAE,mBAAmB,CAAC;QAC3B,OAAO,EAAE,mBAAmB,CAAC;KAC9B;CACF;AAID,2EAA2E;AAC3E,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,UAAU,CAAyB,CAAC;AAE/E,iEAAiE;AACjE,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAAC,QAAQ,CAe7C,CAAC"}
1
+ {"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../../src/contract/source.ts"],"names":[],"mappings":"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"}
@@ -1480,10 +1480,10 @@ export function wfsSource(descriptor, client, policy) {
1480
1480
  * does not issue network traffic.
1481
1481
  */
1482
1482
  let cachedFormat;
1483
- async function negotiateJsonOrThrow() {
1483
+ async function negotiateJsonOrThrow(signal) {
1484
1484
  if (cachedFormat)
1485
1485
  return cachedFormat;
1486
- const snapshot = await root.capabilities();
1486
+ const snapshot = await root.capabilities(signal ? { signal } : undefined);
1487
1487
  const choice = root.negotiateOutputFormat(snapshot);
1488
1488
  if (!choice) {
1489
1489
  throw new HonuaCapabilityNotSupportedError("query", descriptor.protocol, descriptor.id);
@@ -1589,7 +1589,7 @@ export function wfsSource(descriptor, client, policy) {
1589
1589
  // Unfiltered queryExtent: prefer the per-feature-type WGS84BoundingBox
1590
1590
  // from GetCapabilities so we avoid an extra HTTP request entirely.
1591
1591
  if (!hasExtentFilter(request) && request?.outSr === undefined) {
1592
- const snapshot = await root.capabilities();
1592
+ const snapshot = await root.capabilities(request?.signal ? { signal: request.signal } : undefined);
1593
1593
  const ft = snapshot.featureTypes.find((entry) => entry.name === typeName);
1594
1594
  if (ft?.wgs84BoundingBox) {
1595
1595
  return { extent: { ...ft.wgs84BoundingBox } };
@@ -1599,7 +1599,7 @@ export function wfsSource(descriptor, client, policy) {
1599
1599
  // covers all features the filter resolves to, not just the first
1600
1600
  // server-default page. Caller pagination is intentionally ignored —
1601
1601
  // queryExtent is a "what bbox holds the matching set" question.
1602
- const choice = await negotiateJsonOrThrow();
1602
+ const choice = await negotiateJsonOrThrow(request?.signal);
1603
1603
  const drainPageSize = 2000;
1604
1604
  const extentRequest = toWfsExtentDrainRequest(request);
1605
1605
  let xmin = Number.POSITIVE_INFINITY;
@@ -1614,7 +1614,7 @@ export function wfsSource(descriptor, client, policy) {
1614
1614
  ...extentRequest,
1615
1615
  pagination: { offset, limit: drainPageSize },
1616
1616
  };
1617
- const json = await runGetFeatureJson(featureType, choice, featureNamespace, await compileSourceQuery(pageRequest, "query"));
1617
+ const json = await runGetFeatureJson(featureType, choice, featureNamespace, await compileSourceQuery(pageRequest, "query"), request?.signal);
1618
1618
  const page = computeExtentFromFeatureCollection(json);
1619
1619
  count += page.count;
1620
1620
  if (page.extent) {
@@ -1697,7 +1697,7 @@ export function wfsSource(descriptor, client, policy) {
1697
1697
  const requestedLimit = request?.pagination?.limit;
1698
1698
  if (requestedLimit === 0)
1699
1699
  return [];
1700
- const choice = await negotiateJsonOrThrow();
1700
+ const choice = await negotiateJsonOrThrow(request?.signal);
1701
1701
  const limitCap = typeof requestedLimit === "number" && requestedLimit > 0 ? requestedLimit : undefined;
1702
1702
  const drainPageSize = 2000;
1703
1703
  const ids = [];
@@ -1712,7 +1712,7 @@ export function wfsSource(descriptor, client, policy) {
1712
1712
  ...idsRequest,
1713
1713
  pagination: { offset, limit: pageSize },
1714
1714
  };
1715
- const json = await runGetFeatureJson(featureType, choice, featureNamespace, await compileSourceQuery(pageRequest, "query"));
1715
+ const json = await runGetFeatureJson(featureType, choice, featureNamespace, await compileSourceQuery(pageRequest, "query"), request?.signal);
1716
1716
  const collection = json;
1717
1717
  const features = collection.features ?? [];
1718
1718
  for (const feature of features) {
@@ -1868,7 +1868,7 @@ function toWfsObjectIdsDrainRequest(request) {
1868
1868
  * GeoJSON FeatureCollection. The protocol compiler owns filter, projection,
1869
1869
  * paging, CRS, and transport selection so legacy drains do not duplicate it.
1870
1870
  */
1871
- async function runGetFeatureJson(featureType, choice, featureNamespace, compiled) {
1871
+ async function runGetFeatureJson(featureType, choice, featureNamespace, compiled, signal) {
1872
1872
  const typePrefix = compiled.typeName.includes(":")
1873
1873
  ? compiled.typeName.slice(0, compiled.typeName.indexOf(":"))
1874
1874
  : undefined;
@@ -1886,6 +1886,9 @@ async function runGetFeatureJson(featureType, choice, featureNamespace, compiled
1886
1886
  ...(compiled.count !== undefined ? { count: compiled.count } : {}),
1887
1887
  ...(compiled.startIndex !== undefined && compiled.startIndex > 0 ? { startIndex: compiled.startIndex } : {}),
1888
1888
  ...(compiled.srsName !== undefined ? { srsName: compiled.srsName } : {}),
1889
+ // The drains (queryExtent / queryObjectIds) issue many pages; every page
1890
+ // must observe the caller's cancellation, not just the first request.
1891
+ ...(signal ? { signal } : {}),
1889
1892
  };
1890
1893
  if (compiled.method === "POST" && compiled.filter !== undefined) {
1891
1894
  params.body = buildWfsPostGetFeatureBody({
@@ -1 +1 @@
1
- {"version":3,"file":"esri-geojson.d.ts","sourceRoot":"","sources":["../../../src/core/esri-geojson.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EACV,eAAe,EAIhB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EACV,YAAY,EAKZ,cAAc,EACd,YAAY,EACZ,qBAAqB,EACtB,MAAM,YAAY,CAAC;AA2MpB;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAClE,eAAe,GAAG,IAAI,CA0ExB;AAkBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,cAAc,CAQ1E;AAyBD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EAC5C,gBAAgB,CAAC,EAAE,qBAAqB,GACvC,YAAY,GAAG,IAAI,CAuCrB"}
1
+ {"version":3,"file":"esri-geojson.d.ts","sourceRoot":"","sources":["../../../src/core/esri-geojson.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EACV,eAAe,EAIhB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EACV,YAAY,EAKZ,cAAc,EACd,YAAY,EACZ,qBAAqB,EACtB,MAAM,YAAY,CAAC;AA2MpB;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAClE,eAAe,GAAG,IAAI,CA0ExB;AAkBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,cAAc,CAQ1E;AAyBD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EAC5C,gBAAgB,CAAC,EAAE,qBAAqB,GACvC,YAAY,GAAG,IAAI,CAyCrB"}
@@ -333,11 +333,13 @@ export function geoJsonToEsriGeometry(geometry, spatialReference) {
333
333
  const sr = spatialReference ? { spatialReference } : {};
334
334
  switch (geometry.type) {
335
335
  case "Point": {
336
- const [x, y] = geometry.coordinates;
336
+ const [x, y, z] = geometry.coordinates;
337
337
  if (typeof x !== "number" || typeof y !== "number") {
338
338
  return null;
339
339
  }
340
- return { x, y, ...sr };
340
+ // Keep the altitude of a 3D position: dropping it would hand back a
341
+ // different geometry than the source served.
342
+ return { x, y, ...(typeof z === "number" && Number.isFinite(z) ? { z } : {}), ...sr };
341
343
  }
342
344
  case "MultiPoint": {
343
345
  return { points: geometry.coordinates.map((position) => [...position]), ...sr };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@honua/app-platform",
3
- "version": "0.1.13",
3
+ "version": "0.1.14",
4
4
  "description": "Honua application-platform surfaces: app-shell, workspace, scene, operator, studio, and hosted-product clients",
5
5
  "keywords": [
6
6
  "gis",
@@ -121,7 +121,7 @@
121
121
  "proj4": "^2.20.9"
122
122
  },
123
123
  "peerDependencies": {
124
- "@honua/sdk": "0.1.13",
124
+ "@honua/sdk": "0.1.14",
125
125
  "@bufbuild/protobuf": "^2.0.0",
126
126
  "@connectrpc/connect": "^2.0.0",
127
127
  "@connectrpc/connect-web": "^2.0.0",
@@ -66,7 +66,7 @@ export interface OdataDeltaTransportOptions<TFeature = unknown> {
66
66
  /**
67
67
  * Absolute OData entity-set collection URL, e.g.
68
68
  * `"https://host/odata/Incidents"`. Every `@odata.nextLink` /
69
- * `@odata.deltaLink` this transport follows, and any resumed
69
+ * `@odata.deltaLink` and HTTP redirect this transport follows, and any resumed
70
70
  * `resumeFrom.deltaToken`, must resolve to this exact origin and path
71
71
  * (REQ-002).
72
72
  */
@@ -1 +1 @@
1
- {"version":3,"file":"odata-delta.d.ts","sourceRoot":"","sources":["../../../src/realtime/odata-delta.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,KAAK,EAIV,wBAAwB,EAEzB,MAAM,YAAY,CAAC;AAGpB,sFAAsF;AACtF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACjC;AAED,6FAA6F;AAC7F,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,8GAA8G;AAC9G,MAAM,WAAW,uBAAuB;IACtC,4DAA4D;IAC5D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,uGAAuG;IACvG,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,0BAA0B,CAAC,QAAQ,GAAG,OAAO;IAC5D;;;;;;OAMG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,6EAA6E;IAC7E,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,wFAAwF;IACxF,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,SAAS,CAAC;IAC3D,sHAAsH;IACtH,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,QAAQ,CAAC;IAC5D,gGAAgG;IAChG,QAAQ,CAAC,YAAY,CAAC,EAAE,sBAAsB,CAAC;IAC/C,iFAAiF;IACjF,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,wDAAwD;IACxD,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IAClC;;;;OAIG;IACH,QAAQ,CAAC,0BAA0B,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC;IACjF;;;;;;OAMG;IACH,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,OAAO,CAAC;IACzE,sFAAsF;IACtF,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,4EAA4E;IAC5E,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,6FAA6F;IAC7F,QAAQ,CAAC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IAC5C,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,uBAAuB,KAAK,IAAI,CAAC;IAC/D,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CAC7B;AAMD;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,GAAG,OAAO,EAC1D,OAAO,EAAE,0BAA0B,CAAC,QAAQ,CAAC,GAC5C,wBAAwB,CAAC,QAAQ,CAAC,CAkYpC"}
1
+ {"version":3,"file":"odata-delta.d.ts","sourceRoot":"","sources":["../../../src/realtime/odata-delta.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,KAAK,EAIV,wBAAwB,EAEzB,MAAM,YAAY,CAAC;AAGpB,sFAAsF;AACtF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACjC;AAED,6FAA6F;AAC7F,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,8GAA8G;AAC9G,MAAM,WAAW,uBAAuB;IACtC,4DAA4D;IAC5D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,uGAAuG;IACvG,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,0BAA0B,CAAC,QAAQ,GAAG,OAAO;IAC5D;;;;;;OAMG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,6EAA6E;IAC7E,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,wFAAwF;IACxF,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,SAAS,CAAC;IAC3D,sHAAsH;IACtH,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,QAAQ,CAAC;IAC5D,gGAAgG;IAChG,QAAQ,CAAC,YAAY,CAAC,EAAE,sBAAsB,CAAC;IAC/C,iFAAiF;IACjF,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,wDAAwD;IACxD,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IAClC;;;;OAIG;IACH,QAAQ,CAAC,0BAA0B,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC;IACjF;;;;;;OAMG;IACH,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,OAAO,CAAC;IACzE,sFAAsF;IACtF,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,4EAA4E;IAC5E,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,6FAA6F;IAC7F,QAAQ,CAAC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IAC5C,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,uBAAuB,KAAK,IAAI,CAAC;IAC/D,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CAC7B;AAQD;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,GAAG,OAAO,EAC1D,OAAO,EAAE,0BAA0B,CAAC,QAAQ,CAAC,GAC5C,wBAAwB,CAAC,QAAQ,CAAC,CAoapC"}
@@ -42,6 +42,8 @@ import { realtimeFailure } from "./wire.js";
42
42
  const DEFAULT_MAX_PAGES_PER_CYCLE = 500;
43
43
  const DEFAULT_MAX_SNAPSHOT_ROWS = 50_000;
44
44
  const DEFAULT_MAX_CONSECUTIVE_RESNAPSHOTS = 3;
45
+ const MAX_REDIRECTS = 5;
46
+ const REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);
45
47
  /**
46
48
  * Build a {@link RealtimeFeatureTransport} that polls an OData v4 entity
47
49
  * set's delta link. See the module doc for the full recovery/security model.
@@ -146,17 +148,43 @@ export function createOdataDeltaTransport(options) {
146
148
  }
147
149
  async function fetchOdataDocument(target, trackChanges) {
148
150
  const fetchImpl = resolveFetch(options.fetchImpl);
149
- const headers = { Accept: "application/json", ...(options.headers?.() ?? {}) };
150
- if (trackChanges)
151
- headers.Prefer = "odata.track-changes";
151
+ let currentUrl = target;
152
152
  let response;
153
- try {
154
- response = await fetchImpl(target, { method: "GET", headers, signal: controller.signal });
155
- }
156
- catch (cause) {
157
- if (controller.signal.aborted)
158
- throw cause;
159
- throw realtimeFailure("transport-gap", "OData delta request failed.", cause);
153
+ for (let redirects = 0;; redirects += 1) {
154
+ controller.signal.throwIfAborted();
155
+ const headers = { Accept: "application/json", ...(options.headers?.() ?? {}) };
156
+ if (trackChanges)
157
+ headers.Prefer = "odata.track-changes";
158
+ try {
159
+ response = await fetchImpl(currentUrl, {
160
+ method: "GET",
161
+ headers,
162
+ signal: controller.signal,
163
+ redirect: "manual",
164
+ });
165
+ }
166
+ catch (cause) {
167
+ if (controller.signal.aborted)
168
+ throw cause;
169
+ throw realtimeFailure("transport-gap", "OData delta request failed.", cause);
170
+ }
171
+ if (response.type !== "opaqueredirect" && !REDIRECT_STATUSES.has(response.status))
172
+ break;
173
+ // Release every redirect response before validating or following its destination.
174
+ await response.body?.cancel().catch(() => undefined);
175
+ if (response.type === "opaqueredirect") {
176
+ throw realtimeFailure("invalid-event", "OData delta redirect destination is unavailable; refusing to follow.", undefined);
177
+ }
178
+ if (redirects >= MAX_REDIRECTS) {
179
+ throw realtimeFailure("invalid-event", "OData delta request exceeded the redirect limit.", undefined);
180
+ }
181
+ const location = response.headers.get("Location");
182
+ if (!location) {
183
+ throw realtimeFailure("invalid-event", "OData delta redirect is missing a Location header.", undefined);
184
+ }
185
+ const redirectUrl = parseRelativeOdataUrl(location, currentUrl, "OData delta redirect Location is not a valid URL.");
186
+ assertSameOdataCollection(collectionUrl, redirectUrl);
187
+ currentUrl = redirectUrl.toString();
160
188
  }
161
189
  if (!response.ok) {
162
190
  const body = await safeReadJson(response);