@openvtc/trust-tasks 0.27.1 → 0.27.3

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 (228) hide show
  1. package/CHANGELOG.md +218 -0
  2. package/dist/_runtime/consume.d.ts +2 -1
  3. package/dist/_runtime/consume.d.ts.map +1 -1
  4. package/dist/_runtime/consume.js +26 -1
  5. package/dist/_runtime/consume.js.map +1 -1
  6. package/dist/_runtime/document.d.ts +9 -0
  7. package/dist/_runtime/document.d.ts.map +1 -1
  8. package/dist/_runtime/document.js +15 -1
  9. package/dist/_runtime/document.js.map +1 -1
  10. package/dist/_runtime/freshness.d.ts +4 -2
  11. package/dist/_runtime/freshness.d.ts.map +1 -1
  12. package/dist/_runtime/freshness.js +9 -6
  13. package/dist/_runtime/freshness.js.map +1 -1
  14. package/dist/_shared/components.d.ts +346 -23
  15. package/dist/_shared/components.d.ts.map +1 -1
  16. package/dist/device/list/0.1/payload.d.ts +4 -4
  17. package/dist/device/list/0.1/payload.d.ts.map +1 -1
  18. package/dist/device/list/0.1/payload.js +4 -2
  19. package/dist/device/list/0.1/payload.js.map +1 -1
  20. package/dist/device/list/0.2/payload.d.ts +4 -4
  21. package/dist/device/list/0.2/payload.d.ts.map +1 -1
  22. package/dist/device/list/0.2/payload.js +4 -2
  23. package/dist/device/list/0.2/payload.js.map +1 -1
  24. package/dist/device/register/0.1/payload.d.ts +4 -4
  25. package/dist/device/register/0.1/payload.d.ts.map +1 -1
  26. package/dist/device/register/0.1/payload.js +4 -2
  27. package/dist/device/register/0.1/payload.js.map +1 -1
  28. package/dist/device/register/0.2/payload.d.ts +4 -4
  29. package/dist/device/register/0.2/payload.d.ts.map +1 -1
  30. package/dist/device/register/0.2/payload.js +4 -2
  31. package/dist/device/register/0.2/payload.js.map +1 -1
  32. package/dist/index.d.ts +25 -0
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +25 -0
  35. package/dist/index.js.map +1 -1
  36. package/dist/rooms/_shared/0.1/room.d.ts +1 -1
  37. package/dist/rooms/_shared/0.1/room.d.ts.map +1 -1
  38. package/dist/rooms/create/0.2/payload.d.ts +534 -0
  39. package/dist/rooms/create/0.2/payload.d.ts.map +1 -0
  40. package/dist/rooms/create/0.2/payload.js +293 -0
  41. package/dist/rooms/create/0.2/payload.js.map +1 -0
  42. package/dist/rooms/epoch/chain/0.2/payload.d.ts +534 -0
  43. package/dist/rooms/epoch/chain/0.2/payload.d.ts.map +1 -0
  44. package/dist/rooms/epoch/chain/0.2/payload.js +292 -0
  45. package/dist/rooms/epoch/chain/0.2/payload.js.map +1 -0
  46. package/dist/rooms/epoch/prune/0.2/payload.d.ts +467 -0
  47. package/dist/rooms/epoch/prune/0.2/payload.d.ts.map +1 -0
  48. package/dist/rooms/epoch/prune/0.2/payload.js +251 -0
  49. package/dist/rooms/epoch/prune/0.2/payload.js.map +1 -0
  50. package/dist/rooms/info/0.2/payload.d.ts +1129 -0
  51. package/dist/rooms/info/0.2/payload.d.ts.map +1 -0
  52. package/dist/rooms/info/0.2/payload.js +618 -0
  53. package/dist/rooms/info/0.2/payload.js.map +1 -0
  54. package/dist/rooms/keys/backfill/0.2/payload.d.ts +380 -0
  55. package/dist/rooms/keys/backfill/0.2/payload.d.ts.map +1 -0
  56. package/dist/rooms/keys/backfill/0.2/payload.js +197 -0
  57. package/dist/rooms/keys/backfill/0.2/payload.js.map +1 -0
  58. package/dist/rooms/keys/browse/0.1/payload.d.ts +4 -4
  59. package/dist/rooms/keys/browse/0.1/payload.js +2 -2
  60. package/dist/rooms/keys/browse/0.1/payload.js.map +1 -1
  61. package/dist/rooms/keys/browse/0.2/payload.d.ts +941 -0
  62. package/dist/rooms/keys/browse/0.2/payload.d.ts.map +1 -0
  63. package/dist/rooms/keys/browse/0.2/payload.js +558 -0
  64. package/dist/rooms/keys/browse/0.2/payload.js.map +1 -0
  65. package/dist/rooms/keys/chain/0.2/payload.d.ts +450 -0
  66. package/dist/rooms/keys/chain/0.2/payload.d.ts.map +1 -0
  67. package/dist/rooms/keys/chain/0.2/payload.js +248 -0
  68. package/dist/rooms/keys/chain/0.2/payload.js.map +1 -0
  69. package/dist/rooms/keys/profile/read/0.1/payload.d.ts +4 -4
  70. package/dist/rooms/keys/profile/read/0.1/payload.js +2 -2
  71. package/dist/rooms/keys/profile/read/0.1/payload.js.map +1 -1
  72. package/dist/rooms/keys/read/0.1/payload.d.ts +4 -4
  73. package/dist/rooms/keys/read/0.1/payload.js +2 -2
  74. package/dist/rooms/keys/read/0.1/payload.js.map +1 -1
  75. package/dist/rooms/owner/anchor/0.1/payload.d.ts +4 -4
  76. package/dist/rooms/owner/anchor/0.1/payload.js +2 -2
  77. package/dist/rooms/owner/anchor/0.1/payload.js.map +1 -1
  78. package/dist/rooms/records/get/0.1/payload.d.ts +4 -4
  79. package/dist/rooms/records/get/0.1/payload.js +2 -2
  80. package/dist/rooms/records/get/0.1/payload.js.map +1 -1
  81. package/dist/rooms/records/get/0.2/payload.d.ts +4 -4
  82. package/dist/rooms/records/get/0.2/payload.js +2 -2
  83. package/dist/rooms/records/get/0.2/payload.js.map +1 -1
  84. package/dist/rooms/records/list/0.1/payload.d.ts +4 -4
  85. package/dist/rooms/records/list/0.1/payload.js +2 -2
  86. package/dist/rooms/records/list/0.1/payload.js.map +1 -1
  87. package/dist/rooms/records/list/0.2/payload.d.ts +4 -4
  88. package/dist/rooms/records/list/0.2/payload.js +2 -2
  89. package/dist/rooms/records/list/0.2/payload.js.map +1 -1
  90. package/dist/rooms/records/list/0.3/payload.d.ts +970 -0
  91. package/dist/rooms/records/list/0.3/payload.d.ts.map +1 -0
  92. package/dist/rooms/records/list/0.3/payload.js +526 -0
  93. package/dist/rooms/records/list/0.3/payload.js.map +1 -0
  94. package/dist/rooms/records/prune/0.1/payload.d.ts +706 -0
  95. package/dist/rooms/records/prune/0.1/payload.d.ts.map +1 -0
  96. package/dist/rooms/records/prune/0.1/payload.js +374 -0
  97. package/dist/rooms/records/prune/0.1/payload.js.map +1 -0
  98. package/dist/rooms/records/put/0.3/payload.d.ts +1212 -0
  99. package/dist/rooms/records/put/0.3/payload.d.ts.map +1 -0
  100. package/dist/rooms/records/put/0.3/payload.js +646 -0
  101. package/dist/rooms/records/put/0.3/payload.js.map +1 -0
  102. package/dist/rooms/records/retention/set/0.1/payload.d.ts +521 -0
  103. package/dist/rooms/records/retention/set/0.1/payload.d.ts.map +1 -0
  104. package/dist/rooms/records/retention/set/0.1/payload.js +276 -0
  105. package/dist/rooms/records/retention/set/0.1/payload.js.map +1 -0
  106. package/dist/vault/credentials/present/0.1/payload.d.ts +407 -0
  107. package/dist/vault/credentials/present/0.1/payload.d.ts.map +1 -0
  108. package/dist/vault/credentials/present/0.1/payload.js +217 -0
  109. package/dist/vault/credentials/present/0.1/payload.js.map +1 -0
  110. package/dist/vault/credentials/query/0.1/payload.d.ts +12 -0
  111. package/dist/vault/credentials/query/0.1/payload.d.ts.map +1 -1
  112. package/dist/vault/credentials/query/0.1/payload.js +4 -0
  113. package/dist/vault/credentials/query/0.1/payload.js.map +1 -1
  114. package/dist/vta/webvh/dids/create/1.2/payload.d.ts +961 -0
  115. package/dist/vta/webvh/dids/create/1.2/payload.d.ts.map +1 -0
  116. package/dist/vta/webvh/dids/create/1.2/payload.js +480 -0
  117. package/dist/vta/webvh/dids/create/1.2/payload.js.map +1 -0
  118. package/dist/vtc/_shared/0.1/room-migration.d.ts +16 -0
  119. package/dist/vtc/_shared/0.1/room-migration.d.ts.map +1 -0
  120. package/dist/vtc/_shared/0.1/room-migration.js +6 -0
  121. package/dist/vtc/_shared/0.1/room-migration.js.map +1 -0
  122. package/dist/vtc/_shared/0.1/room-storage.d.ts +1 -1
  123. package/dist/vtc/_shared/0.1/room-storage.d.ts.map +1 -1
  124. package/dist/vtc/_shared/0.2/room-storage.d.ts +16 -0
  125. package/dist/vtc/_shared/0.2/room-storage.d.ts.map +1 -0
  126. package/dist/vtc/_shared/0.2/room-storage.js +6 -0
  127. package/dist/vtc/_shared/0.2/room-storage.js.map +1 -0
  128. package/dist/vtc/admin/events/_shared/0.4/topic.d.ts +31 -0
  129. package/dist/vtc/admin/events/_shared/0.4/topic.d.ts.map +1 -0
  130. package/dist/vtc/admin/events/_shared/0.4/topic.js +6 -0
  131. package/dist/vtc/admin/events/_shared/0.4/topic.js.map +1 -0
  132. package/dist/vtc/admin/events/event/0.4/payload.d.ts +172 -0
  133. package/dist/vtc/admin/events/event/0.4/payload.d.ts.map +1 -0
  134. package/dist/vtc/admin/events/event/0.4/payload.js +103 -0
  135. package/dist/vtc/admin/events/event/0.4/payload.js.map +1 -0
  136. package/dist/vtc/admin/events/subscribe/0.4/payload.d.ts +409 -0
  137. package/dist/vtc/admin/events/subscribe/0.4/payload.d.ts.map +1 -0
  138. package/dist/vtc/admin/events/subscribe/0.4/payload.js +238 -0
  139. package/dist/vtc/admin/events/subscribe/0.4/payload.js.map +1 -0
  140. package/dist/vtc/rooms/get/0.2/payload.d.ts +1966 -0
  141. package/dist/vtc/rooms/get/0.2/payload.d.ts.map +1 -0
  142. package/dist/vtc/rooms/get/0.2/payload.js +976 -0
  143. package/dist/vtc/rooms/get/0.2/payload.js.map +1 -0
  144. package/dist/vtc/rooms/storage/migrate/0.2/payload.d.ts +595 -0
  145. package/dist/vtc/rooms/storage/migrate/0.2/payload.d.ts.map +1 -0
  146. package/dist/vtc/rooms/storage/migrate/0.2/payload.js +336 -0
  147. package/dist/vtc/rooms/storage/migrate/0.2/payload.js.map +1 -0
  148. package/dist/vtc/storage/configs/create/0.1/payload.d.ts +1 -1
  149. package/dist/vtc/storage/configs/create/0.1/payload.d.ts.map +1 -1
  150. package/dist/vtc/storage/configs/create/0.2/payload.d.ts +1360 -0
  151. package/dist/vtc/storage/configs/create/0.2/payload.d.ts.map +1 -0
  152. package/dist/vtc/storage/configs/create/0.2/payload.js +783 -0
  153. package/dist/vtc/storage/configs/create/0.2/payload.js.map +1 -0
  154. package/dist/vtc/storage/configs/get/0.1/payload.d.ts +1 -1
  155. package/dist/vtc/storage/configs/get/0.1/payload.d.ts.map +1 -1
  156. package/dist/vtc/storage/configs/get/0.2/payload.d.ts +1854 -0
  157. package/dist/vtc/storage/configs/get/0.2/payload.d.ts.map +1 -0
  158. package/dist/vtc/storage/configs/get/0.2/payload.js +1075 -0
  159. package/dist/vtc/storage/configs/get/0.2/payload.js.map +1 -0
  160. package/dist/vtc/storage/configs/list/0.1/payload.d.ts +1 -1
  161. package/dist/vtc/storage/configs/list/0.1/payload.d.ts.map +1 -1
  162. package/dist/vtc/storage/configs/list/0.2/payload.d.ts +1955 -0
  163. package/dist/vtc/storage/configs/list/0.2/payload.d.ts.map +1 -0
  164. package/dist/vtc/storage/configs/list/0.2/payload.js +1125 -0
  165. package/dist/vtc/storage/configs/list/0.2/payload.js.map +1 -0
  166. package/dist/vtc/storage/configs/update/0.1/payload.d.ts +1 -1
  167. package/dist/vtc/storage/configs/update/0.1/payload.d.ts.map +1 -1
  168. package/dist/vtc/storage/configs/update/0.2/payload.d.ts +1362 -0
  169. package/dist/vtc/storage/configs/update/0.2/payload.d.ts.map +1 -0
  170. package/dist/vtc/storage/configs/update/0.2/payload.js +782 -0
  171. package/dist/vtc/storage/configs/update/0.2/payload.js.map +1 -0
  172. package/dist/vtc/storage/credentials/set/0.1/payload.d.ts +1 -1
  173. package/dist/vtc/storage/credentials/set/0.1/payload.d.ts.map +1 -1
  174. package/dist/vtc/storage/credentials/set/0.2/payload.d.ts +979 -0
  175. package/dist/vtc/storage/credentials/set/0.2/payload.d.ts.map +1 -0
  176. package/dist/vtc/storage/credentials/set/0.2/payload.js +573 -0
  177. package/dist/vtc/storage/credentials/set/0.2/payload.js.map +1 -0
  178. package/package.json +1 -1
  179. package/src/_runtime/consume.ts +26 -2
  180. package/src/_runtime/document.ts +17 -1
  181. package/src/_runtime/freshness.ts +9 -7
  182. package/src/_shared/components.ts +372 -23
  183. package/src/device/list/0.1/payload.ts +4 -2
  184. package/src/device/list/0.2/payload.ts +4 -2
  185. package/src/device/register/0.1/payload.ts +4 -2
  186. package/src/device/register/0.2/payload.ts +4 -2
  187. package/src/index.ts +25 -0
  188. package/src/rooms/_shared/0.1/room.ts +1 -1
  189. package/src/rooms/create/0.2/payload.ts +364 -0
  190. package/src/rooms/epoch/chain/0.2/payload.ts +347 -0
  191. package/src/rooms/epoch/prune/0.2/payload.ts +315 -0
  192. package/src/rooms/info/0.2/payload.ts +700 -0
  193. package/src/rooms/keys/backfill/0.2/payload.ts +260 -0
  194. package/src/rooms/keys/browse/0.1/payload.ts +2 -2
  195. package/src/rooms/keys/browse/0.2/payload.ts +628 -0
  196. package/src/rooms/keys/chain/0.2/payload.ts +308 -0
  197. package/src/rooms/keys/profile/read/0.1/payload.ts +2 -2
  198. package/src/rooms/keys/read/0.1/payload.ts +2 -2
  199. package/src/rooms/owner/anchor/0.1/payload.ts +2 -2
  200. package/src/rooms/records/get/0.1/payload.ts +2 -2
  201. package/src/rooms/records/get/0.2/payload.ts +2 -2
  202. package/src/rooms/records/list/0.1/payload.ts +2 -2
  203. package/src/rooms/records/list/0.2/payload.ts +2 -2
  204. package/src/rooms/records/list/0.3/payload.ts +601 -0
  205. package/src/rooms/records/prune/0.1/payload.ts +451 -0
  206. package/src/rooms/records/put/0.3/payload.ts +741 -0
  207. package/src/rooms/records/retention/set/0.1/payload.ts +338 -0
  208. package/src/vault/credentials/present/0.1/payload.ts +283 -0
  209. package/src/vault/credentials/query/0.1/payload.ts +8 -0
  210. package/src/vta/webvh/dids/create/1.2/payload.ts +660 -0
  211. package/src/vtc/_shared/0.1/room-migration.ts +17 -0
  212. package/src/vtc/_shared/0.1/room-storage.ts +1 -1
  213. package/src/vtc/_shared/0.2/room-storage.ts +17 -0
  214. package/src/vtc/admin/events/_shared/0.4/topic.ts +32 -0
  215. package/src/vtc/admin/events/event/0.4/payload.ts +137 -0
  216. package/src/vtc/admin/events/subscribe/0.4/payload.ts +318 -0
  217. package/src/vtc/rooms/get/0.2/payload.ts +1372 -0
  218. package/src/vtc/rooms/storage/migrate/0.2/payload.ts +408 -0
  219. package/src/vtc/storage/configs/create/0.1/payload.ts +1 -1
  220. package/src/vtc/storage/configs/create/0.2/payload.ts +830 -0
  221. package/src/vtc/storage/configs/get/0.1/payload.ts +1 -1
  222. package/src/vtc/storage/configs/get/0.2/payload.ts +1110 -0
  223. package/src/vtc/storage/configs/list/0.1/payload.ts +1 -1
  224. package/src/vtc/storage/configs/list/0.2/payload.ts +1177 -0
  225. package/src/vtc/storage/configs/update/0.1/payload.ts +1 -1
  226. package/src/vtc/storage/configs/update/0.2/payload.ts +829 -0
  227. package/src/vtc/storage/credentials/set/0.1/payload.ts +1 -1
  228. package/src/vtc/storage/credentials/set/0.2/payload.ts +619 -0
@@ -304,7 +304,8 @@ export interface ConsumeOptions<P, R> {
304
304
  *
305
305
  * Return a success response, an {@link ErrorResponse} to refuse, or nothing
306
306
  * at all for a specification that defines no success response (§4.4.1) —
307
- * which yields the `accepted` outcome.
307
+ * which yields the `accepted` outcome. A throw aborts the pipeline, releases
308
+ * the item-11 claim so the document can be resent, and is rethrown.
308
309
  */
309
310
  handler: (
310
311
  doc: TrustTaskDocument<P>,
@@ -514,10 +515,33 @@ export async function consumeInbound<P, R>(
514
515
  case "fresh":
515
516
  claim = { guard, digest };
516
517
  break;
518
+ default:
519
+ // A guard answering with a verdict this runtime does not know has
520
+ // not said the document is fresh. Executing anyway would skip item
521
+ // 11, so fail closed, as for a guard that cannot answer at all.
522
+ return route({
523
+ code: "unavailable",
524
+ message: REPLAY_RECORD_UNAVAILABLE,
525
+ retryable: true,
526
+ });
517
527
  }
518
528
  }
519
529
 
520
- const result = await handler(doc, resolved.parties);
530
+ let result: Awaited<ReturnType<typeof handler>>;
531
+ try {
532
+ result = await handler(doc, resolved.parties);
533
+ } catch (e) {
534
+ // The handler did not finish, so nothing says the effect happened.
535
+ // Holding the claim would answer every resend with an in-flight duplicate
536
+ // until the record expired: the document could not be retried, and the
537
+ // producer would never learn why.
538
+ try {
539
+ await claim?.guard.release?.(doc.id, claim.digest);
540
+ } catch {
541
+ /* best-effort */
542
+ }
543
+ throw e;
544
+ }
521
545
 
522
546
  if (result === undefined || result === null) {
523
547
  // Fire-and-forget: nothing to cache, but the claim stands — the effect
@@ -237,13 +237,29 @@ export const TRUST_TASK_ERROR_TYPE_URI = "https://trusttasks.org/spec/trust-task
237
237
  *
238
238
  * @param now Milliseconds since the epoch, as from `Date.now()`.
239
239
  */
240
+ /**
241
+ * Parse an RFC 3339 `date-time` (SPEC §4.2) to epoch milliseconds, or `NaN`.
242
+ *
243
+ * Stricter than `Date.parse`, which reads a timestamp with no zone designator
244
+ * as *local* time and accepts forms RFC 3339 does not (a bare date, `Jan 1
245
+ * 2026`). The Rust and Go runtimes refuse both, and an instant that depends on
246
+ * the consumer's time zone is not one instant at all.
247
+ */
248
+ export function parseRfc3339(value: string): number {
249
+ if (!RFC3339.test(value)) return NaN;
250
+ return Date.parse(value.toUpperCase());
251
+ }
252
+
253
+ const RFC3339 =
254
+ /^\d{4}-\d{2}-\d{2}[Tt]\d{2}:\d{2}:\d{2}(\.\d+)?([Zz]|[+-]\d{2}:\d{2})$/;
255
+
240
256
  export function validateBasic<P>(
241
257
  doc: TrustTaskDocument<P>,
242
258
  now: number,
243
259
  myVid: string,
244
260
  ): RejectReason | null {
245
261
  if (doc.expiresAt !== undefined) {
246
- const expiresAt = Date.parse(doc.expiresAt);
262
+ const expiresAt = parseRfc3339(doc.expiresAt);
247
263
  if (Number.isNaN(expiresAt)) {
248
264
  return {
249
265
  code: "malformedRequest",
@@ -20,7 +20,7 @@
20
20
  * be kept forever.
21
21
  */
22
22
 
23
- import type { RejectReason, TrustTaskDocument } from "./document.js";
23
+ import { parseRfc3339, type RejectReason, type TrustTaskDocument } from "./document.js";
24
24
 
25
25
  /** The clock-skew tolerance SPEC §4.2 sanctions ("typically ≤ 60s"), in ms. */
26
26
  export const DEFAULT_SKEW_MS = 60_000;
@@ -125,14 +125,14 @@ export function validateFreshness<P>(
125
125
  });
126
126
 
127
127
  if (doc.issuedAt !== undefined) {
128
- const issuedAt = Date.parse(doc.issuedAt);
128
+ const issuedAt = parseRfc3339(doc.issuedAt);
129
129
  if (Number.isNaN(issuedAt)) {
130
130
  return malformed("issuedAt is not a valid RFC 3339 timestamp");
131
131
  }
132
132
  if (issuedAt > now + policy.skewMs) return malformed(FUTURE_ISSUED_AT);
133
133
 
134
134
  if (doc.expiresAt !== undefined) {
135
- const expiresAt = Date.parse(doc.expiresAt);
135
+ const expiresAt = parseRfc3339(doc.expiresAt);
136
136
  // A malformed `expiresAt` is `validateBasic`'s to report; skip it here
137
137
  // rather than raise a second, differently-worded rejection for it.
138
138
  if (!Number.isNaN(expiresAt) && expiresAt <= issuedAt) {
@@ -160,7 +160,9 @@ export function validateFreshness<P>(
160
160
  * this consumer's willingness to execute it, which SPEC §7.2 makes the same
161
161
  * instant as the end of the record's required retention.
162
162
  *
163
- * `expiresAt` fixes it where present; otherwise `issuedAt + maxAgeMs`.
163
+ * `expiresAt` fixes it where present; otherwise `issuedAt + maxAgeMs + skewMs`
164
+ * — the same bound {@link validateFreshness} accepts up to, so a replay arriving
165
+ * inside the skew allowance still finds the record.
164
166
  * `undefined` means this policy places no bound on the document, in which case
165
167
  * a consumer **MUST NOT** execute a consequential task on it — there is no
166
168
  * window in which to keep the record.
@@ -171,13 +173,13 @@ export function recordExpiry<P>(
171
173
  now: number,
172
174
  ): number | undefined {
173
175
  if (doc.expiresAt !== undefined) {
174
- const expiresAt = Date.parse(doc.expiresAt);
176
+ const expiresAt = parseRfc3339(doc.expiresAt);
175
177
  if (!Number.isNaN(expiresAt)) return expiresAt;
176
178
  }
177
179
  if (policy.maxAgeMs === undefined) return undefined;
178
- const issuedAt = doc.issuedAt === undefined ? NaN : Date.parse(doc.issuedAt);
180
+ const issuedAt = doc.issuedAt === undefined ? NaN : parseRfc3339(doc.issuedAt);
179
181
  // Fall back to `now` when the producer stamped no usable `issuedAt`: the
180
182
  // record then lives a full window from first sight, which is the longest the
181
183
  // document could still be arriving from a queue.
182
- return (Number.isNaN(issuedAt) ? now : issuedAt) + policy.maxAgeMs;
184
+ return (Number.isNaN(issuedAt) ? now : issuedAt) + policy.maxAgeMs + policy.skewMs;
183
185
  }