@abloatai/transaction 0.59.2 → 0.61.0

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 (275) hide show
  1. package/dist/auth/apiKey.d.ts +10 -11
  2. package/dist/auth/apiKey.d.ts.map +1 -1
  3. package/dist/auth/apiKey.js +15 -29
  4. package/dist/auth/apiKey.js.map +1 -1
  5. package/dist/auth/browserCredentialSafety.js +1 -1
  6. package/dist/auth/browserCredentialSafety.js.map +1 -1
  7. package/dist/auth/capability.d.ts +15 -15
  8. package/dist/auth/capabilityLifecycle.d.ts +3 -3
  9. package/dist/auth/capabilityLifecycle.d.ts.map +1 -1
  10. package/dist/auth/capabilityLifecycle.js +2 -1
  11. package/dist/auth/capabilityLifecycle.js.map +1 -1
  12. package/dist/auth/credentialEndpoint.js +1 -1
  13. package/dist/auth/credentialEndpoint.js.map +1 -1
  14. package/dist/auth/credentialResult.d.ts +2 -1
  15. package/dist/auth/credentialResult.d.ts.map +1 -1
  16. package/dist/auth/credentialResult.js.map +1 -1
  17. package/dist/auth/credentialSource.js.map +1 -1
  18. package/dist/auth/identity.js.map +1 -1
  19. package/dist/auth/schemas.d.ts +5 -5
  20. package/dist/auth/sessionIssuanceProtocol.d.ts +8 -8
  21. package/dist/auth/sessionIssuanceProtocol.d.ts.map +1 -1
  22. package/dist/branches.d.ts +38 -38
  23. package/dist/claims/admission.d.ts +4 -0
  24. package/dist/claims/admission.d.ts.map +1 -0
  25. package/dist/claims/admission.js +32 -0
  26. package/dist/claims/admission.js.map +1 -0
  27. package/dist/claims/awaitGrant.d.ts.map +1 -1
  28. package/dist/claims/awaitGrant.js +4 -38
  29. package/dist/claims/awaitGrant.js.map +1 -1
  30. package/dist/claims/conflict.d.ts +55 -0
  31. package/dist/claims/conflict.d.ts.map +1 -0
  32. package/dist/claims/conflict.js +71 -0
  33. package/dist/claims/conflict.js.map +1 -0
  34. package/dist/claims/contract.d.ts +39 -27
  35. package/dist/claims/contract.d.ts.map +1 -1
  36. package/dist/claims/contract.js +2 -0
  37. package/dist/claims/contract.js.map +1 -1
  38. package/dist/claims/eventContract.d.ts +18 -18
  39. package/dist/claims/events.d.ts +1 -1
  40. package/dist/claims/events.d.ts.map +1 -1
  41. package/dist/claims/index.d.ts +2 -0
  42. package/dist/claims/index.d.ts.map +1 -1
  43. package/dist/claims/index.js +1 -0
  44. package/dist/claims/index.js.map +1 -1
  45. package/dist/claims/routes.d.ts +9 -9
  46. package/dist/claims/routes.d.ts.map +1 -1
  47. package/dist/claims/trace.d.ts.map +1 -1
  48. package/dist/claims/trace.js.map +1 -1
  49. package/dist/client/ablo.d.ts +11 -8
  50. package/dist/client/ablo.d.ts.map +1 -1
  51. package/dist/client/ablo.js +5 -6
  52. package/dist/client/ablo.js.map +1 -1
  53. package/dist/client/resources/httpResources.d.ts +1 -169
  54. package/dist/client/resources/httpResources.d.ts.map +1 -1
  55. package/dist/client/resources/httpResources.js +1 -1
  56. package/dist/client/resources/httpResources.js.map +1 -1
  57. package/dist/client/resources/modelOperations.d.ts +6 -15
  58. package/dist/client/resources/modelOperations.d.ts.map +1 -1
  59. package/dist/client/resources/where.d.ts +12 -12
  60. package/dist/client/surface.d.ts +1 -1
  61. package/dist/client/surface.d.ts.map +1 -1
  62. package/dist/client/surface.js +2 -4
  63. package/dist/client/surface.js.map +1 -1
  64. package/dist/commit/confirmation/commitEnvelope.d.ts +7 -7
  65. package/dist/commit/confirmation/httpCommitEnvelope.d.ts +1 -1
  66. package/dist/commit/confirmation/pendingWrite.d.ts +5 -5
  67. package/dist/commit/contract.d.ts +249 -249
  68. package/dist/commit/contract.d.ts.map +1 -1
  69. package/dist/coordination/index.d.ts +2 -2
  70. package/dist/coordination/index.d.ts.map +1 -1
  71. package/dist/coordination/index.js +4 -5
  72. package/dist/coordination/index.js.map +1 -1
  73. package/dist/coordination/schema.d.ts +64 -101
  74. package/dist/coordination/schema.d.ts.map +1 -1
  75. package/dist/coordination/schema.js +14 -69
  76. package/dist/coordination/schema.js.map +1 -1
  77. package/dist/environment.d.ts +3 -3
  78. package/dist/environment.d.ts.map +1 -1
  79. package/dist/environment.js.map +1 -1
  80. package/dist/errorCodes.d.ts +4 -5
  81. package/dist/errorCodes.d.ts.map +1 -1
  82. package/dist/errorCodes.js +15 -9
  83. package/dist/errorCodes.js.map +1 -1
  84. package/dist/errorObservation.d.ts +14 -14
  85. package/dist/errors.d.ts +17 -11
  86. package/dist/errors.d.ts.map +1 -1
  87. package/dist/errors.js +101 -5
  88. package/dist/errors.js.map +1 -1
  89. package/dist/keys/index.d.ts +1 -1
  90. package/dist/keys/index.d.ts.map +1 -1
  91. package/dist/keys/index.js.map +1 -1
  92. package/dist/observation/contract.d.ts +34 -34
  93. package/dist/observation/feedContract.d.ts +86 -86
  94. package/dist/observation/persistence/syncDeltaRow.d.ts +23 -23
  95. package/dist/observation/persistence/syncDeltaRow.d.ts.map +1 -1
  96. package/dist/pricing.d.ts +12 -12
  97. package/dist/schema/audit.js.map +1 -1
  98. package/dist/schema/ddl.js.map +1 -1
  99. package/dist/schema/ddlLock.js.map +1 -1
  100. package/dist/schema/deployment/contracts.d.ts +64 -64
  101. package/dist/schema/deployment/index.js.map +1 -1
  102. package/dist/schema/deployment/reconcile.js.map +1 -1
  103. package/dist/schema/diff.js.map +1 -1
  104. package/dist/schema/field.d.ts +1 -1
  105. package/dist/schema/field.d.ts.map +1 -1
  106. package/dist/schema/loadStrategy.d.ts +2 -2
  107. package/dist/schema/loadStrategy.d.ts.map +1 -1
  108. package/dist/schema/openapi.js.map +1 -1
  109. package/dist/schema/relation.d.ts +3 -3
  110. package/dist/schema/relation.d.ts.map +1 -1
  111. package/dist/schema/residency.d.ts +1 -1
  112. package/dist/schema/roles.d.ts +1 -1
  113. package/dist/schema/roles.d.ts.map +1 -1
  114. package/dist/schema/roles.js.map +1 -1
  115. package/dist/schema/schema.d.ts +1 -1
  116. package/dist/schema/schema.d.ts.map +1 -1
  117. package/dist/schema/serialize.js.map +1 -1
  118. package/dist/schema/sugar.d.ts.map +1 -1
  119. package/dist/schema/tenancy.d.ts +2 -2
  120. package/dist/server/storageMode.d.ts +1 -1
  121. package/dist/sessions/client.d.ts +29 -0
  122. package/dist/sessions/client.d.ts.map +1 -0
  123. package/dist/sessions/client.js +69 -0
  124. package/dist/sessions/client.js.map +1 -0
  125. package/dist/sessions/contract.d.ts +97 -0
  126. package/dist/sessions/contract.d.ts.map +1 -0
  127. package/dist/sessions/contract.js +5 -0
  128. package/dist/sessions/contract.js.map +1 -0
  129. package/dist/{auth/sessionMint.d.ts → sessions/create.d.ts} +4 -4
  130. package/dist/sessions/create.d.ts.map +1 -0
  131. package/dist/{auth/sessionMint.js → sessions/create.js} +11 -10
  132. package/dist/sessions/create.js.map +1 -0
  133. package/dist/sessions/handler.d.ts +23 -0
  134. package/dist/sessions/handler.d.ts.map +1 -0
  135. package/dist/sessions/handler.js +55 -0
  136. package/dist/sessions/handler.js.map +1 -0
  137. package/dist/sessions/index.d.ts +14 -0
  138. package/dist/sessions/index.d.ts.map +1 -0
  139. package/dist/sessions/index.js +14 -0
  140. package/dist/sessions/index.js.map +1 -0
  141. package/dist/{transport/connection/credentialLifecycle.d.ts → sessions/lifecycle.d.ts} +6 -6
  142. package/dist/sessions/lifecycle.d.ts.map +1 -0
  143. package/dist/{transport/connection/credentialLifecycle.js → sessions/lifecycle.js} +5 -5
  144. package/dist/sessions/lifecycle.js.map +1 -0
  145. package/dist/sessions/source.d.ts +24 -0
  146. package/dist/sessions/source.d.ts.map +1 -0
  147. package/dist/sessions/source.js +56 -0
  148. package/dist/sessions/source.js.map +1 -0
  149. package/dist/source/adapters/adapterProfile.d.ts +6 -6
  150. package/dist/source/adapters/conformance.js.map +1 -1
  151. package/dist/source/adapters/contract.d.ts +14 -14
  152. package/dist/source/adapters/kysely.js.map +1 -1
  153. package/dist/source/adapters/memory.js.map +1 -1
  154. package/dist/source/adapters/prisma.js.map +1 -1
  155. package/dist/source/connector/client.d.ts.map +1 -1
  156. package/dist/source/connector/client.js.map +1 -1
  157. package/dist/source/connector/protocol.d.ts.map +1 -1
  158. package/dist/source/delivery/pushQueue.d.ts.map +1 -1
  159. package/dist/source/delivery/pushQueue.js.map +1 -1
  160. package/dist/source/endpoint/signing.d.ts +4 -4
  161. package/dist/source/endpoint/signing.d.ts.map +1 -1
  162. package/dist/source/outbox/contract.d.ts +4 -4
  163. package/dist/testing/fixtures/httpResponses.d.ts +2 -2
  164. package/dist/testing/fixtures/httpResponses.d.ts.map +1 -1
  165. package/dist/testing/fixtures/httpResponses.js.map +1 -1
  166. package/dist/transport/connection/index.d.ts +0 -1
  167. package/dist/transport/connection/index.d.ts.map +1 -1
  168. package/dist/transport/connection/index.js +0 -1
  169. package/dist/transport/connection/index.js.map +1 -1
  170. package/dist/transport/connection/manager.d.ts +1 -1
  171. package/dist/transport/connection/manager.d.ts.map +1 -1
  172. package/dist/transport/connection/manager.js.map +1 -1
  173. package/dist/transport/connection/networkProbe.d.ts +5 -18
  174. package/dist/transport/connection/networkProbe.d.ts.map +1 -1
  175. package/dist/transport/connection/networkProbe.js.map +1 -1
  176. package/dist/transport/http/claimWait.d.ts +9 -0
  177. package/dist/transport/http/claimWait.d.ts.map +1 -0
  178. package/dist/transport/http/claimWait.js +74 -0
  179. package/dist/transport/http/claimWait.js.map +1 -0
  180. package/dist/transport/http/client.d.ts +11 -19
  181. package/dist/transport/http/client.d.ts.map +1 -1
  182. package/dist/transport/http/client.js +15 -18
  183. package/dist/transport/http/client.js.map +1 -1
  184. package/dist/transport/http/contract.d.ts +57 -0
  185. package/dist/transport/http/contract.d.ts.map +1 -0
  186. package/dist/transport/http/contract.js +3 -0
  187. package/dist/transport/http/contract.js.map +1 -0
  188. package/dist/transport/http/index.d.ts +1 -0
  189. package/dist/transport/http/index.d.ts.map +1 -1
  190. package/dist/transport/http/index.js +1 -0
  191. package/dist/transport/http/index.js.map +1 -1
  192. package/dist/transport/http/options.d.ts +4 -1
  193. package/dist/transport/http/options.d.ts.map +1 -1
  194. package/dist/transport/http/transport.d.ts +1 -84
  195. package/dist/transport/http/transport.d.ts.map +1 -1
  196. package/dist/transport/http/transport.js +16 -134
  197. package/dist/transport/http/transport.js.map +1 -1
  198. package/dist/transport/websocket/commitFrames.d.ts +1 -2
  199. package/dist/transport/websocket/commitFrames.d.ts.map +1 -1
  200. package/dist/transport/websocket/commitFrames.js.map +1 -1
  201. package/dist/transport/websocket/frameHandlers.d.ts +0 -14
  202. package/dist/transport/websocket/frameHandlers.d.ts.map +1 -1
  203. package/dist/transport/websocket/frameHandlers.js +4 -71
  204. package/dist/transport/websocket/frameHandlers.js.map +1 -1
  205. package/dist/transport/websocket/heartbeat.d.ts.map +1 -1
  206. package/dist/transport/websocket/heartbeat.js.map +1 -1
  207. package/dist/transport/websocket/session.d.ts.map +1 -1
  208. package/dist/transport/websocket/session.js +137 -64
  209. package/dist/transport/websocket/session.js.map +1 -1
  210. package/dist/transport/websocket/sessionContract.d.ts +4 -15
  211. package/dist/transport/websocket/sessionContract.d.ts.map +1 -1
  212. package/dist/transport/websocket/transport.d.ts +6 -42
  213. package/dist/transport/websocket/transport.d.ts.map +1 -1
  214. package/dist/transport/websocket/transport.js +14 -101
  215. package/dist/transport/websocket/transport.js.map +1 -1
  216. package/dist/wire/accountResponses.d.ts +31 -31
  217. package/dist/wire/auth.d.ts +3 -3
  218. package/dist/wire/bootstrapReason.d.ts +2 -2
  219. package/dist/wire/dataSourceResponses.d.ts +2 -2
  220. package/dist/wire/dataSourceResponses.d.ts.map +1 -1
  221. package/dist/wire/frames.d.ts +8 -8
  222. package/dist/wire/inboundFrames.d.ts +60 -63
  223. package/dist/wire/inboundFrames.d.ts.map +1 -1
  224. package/dist/wire/inboundFrames.js +5 -6
  225. package/dist/wire/inboundFrames.js.map +1 -1
  226. package/dist/wire/listEnvelope.js.map +1 -1
  227. package/dist/wire/modelResponses.d.ts +2 -2
  228. package/dist/wire/modelShape.d.ts +4 -4
  229. package/dist/wire/pricing.d.ts +3 -3
  230. package/dist/wire/protocolVersion.d.ts.map +1 -1
  231. package/package.json +6 -1
  232. package/src/auth/apiKey.ts +25 -44
  233. package/src/auth/browserCredentialSafety.ts +1 -1
  234. package/src/auth/capabilityLifecycle.ts +3 -2
  235. package/src/auth/credentialEndpoint.ts +1 -1
  236. package/src/auth/credentialResult.ts +2 -0
  237. package/src/claims/admission.ts +49 -0
  238. package/src/claims/awaitGrant.ts +3 -52
  239. package/src/claims/conflict.ts +103 -0
  240. package/src/claims/contract.ts +2 -0
  241. package/src/claims/events.ts +1 -2
  242. package/src/claims/index.ts +11 -0
  243. package/src/client/ablo.ts +15 -10
  244. package/src/client/resources/httpResources.ts +2 -174
  245. package/src/client/resources/modelOperations.ts +0 -10
  246. package/src/client/surface.ts +2 -4
  247. package/src/coordination/index.ts +4 -9
  248. package/src/coordination/schema.ts +18 -81
  249. package/src/errorCodes.ts +21 -13
  250. package/src/errors.ts +116 -4
  251. package/src/sessions/client.ts +121 -0
  252. package/src/sessions/contract.ts +116 -0
  253. package/src/{auth/sessionMint.ts → sessions/create.ts} +13 -12
  254. package/src/sessions/handler.ts +96 -0
  255. package/src/sessions/index.ts +13 -0
  256. package/src/{transport/connection/credentialLifecycle.ts → sessions/lifecycle.ts} +5 -5
  257. package/src/sessions/source.ts +94 -0
  258. package/src/transport/connection/index.ts +0 -1
  259. package/src/transport/connection/manager.ts +1 -1
  260. package/src/transport/http/claimWait.ts +108 -0
  261. package/src/transport/http/client.ts +27 -36
  262. package/src/transport/http/contract.ts +71 -0
  263. package/src/transport/http/index.ts +1 -0
  264. package/src/transport/http/options.ts +4 -1
  265. package/src/transport/http/transport.ts +22 -275
  266. package/src/transport/websocket/commitFrames.ts +0 -2
  267. package/src/transport/websocket/frameHandlers.ts +7 -102
  268. package/src/transport/websocket/session.ts +162 -73
  269. package/src/transport/websocket/sessionContract.ts +4 -13
  270. package/src/transport/websocket/transport.ts +15 -137
  271. package/src/wire/inboundFrames.ts +5 -6
  272. package/dist/auth/sessionMint.d.ts.map +0 -1
  273. package/dist/auth/sessionMint.js.map +0 -1
  274. package/dist/transport/connection/credentialLifecycle.d.ts.map +0 -1
  275. package/dist/transport/connection/credentialLifecycle.js.map +0 -1
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Server-side session issuer.
3
+ *
4
+ * This is deliberately separate from `Ablo(...)`: the participant client owns
5
+ * schema model properties, while this client owns credential issuance and
6
+ * lifecycle administration. A schema model named `sessions` therefore remains
7
+ * available as `ablo.sessions` like every other model.
8
+ */
9
+ import type { CredentialProvider } from '../auth/credentialResult.js';
10
+ import type { Schema, SchemaRecord } from '../schema/schema.js';
11
+ import type { AbloSession, CreateSessionParams, RevokeSessionParams, RotateSessionParams, SessionRevocation, SessionRotation } from './contract.js';
12
+ import { type SessionHandler, type SessionHandlerOptions } from './handler.js';
13
+ export interface SessionsOptions<S extends SchemaRecord> {
14
+ readonly schema: Schema<S>;
15
+ readonly apiKey?: string | CredentialProvider | null;
16
+ readonly baseURL?: string | null;
17
+ readonly bootstrapBaseUrl?: string;
18
+ readonly fetch?: typeof globalThis.fetch;
19
+ readonly dangerouslyAllowBrowser?: boolean;
20
+ }
21
+ export interface SessionsClient<S extends SchemaRecord> {
22
+ create(params: CreateSessionParams<S>): Promise<AbloSession>;
23
+ handler<Principal>(options: SessionHandlerOptions<S, Principal>): SessionHandler;
24
+ revoke(params: RevokeSessionParams): Promise<SessionRevocation>;
25
+ rotate(params: RotateSessionParams): Promise<SessionRotation>;
26
+ }
27
+ /** Construct the server-side issuer for user and agent sessions. */
28
+ export declare function Sessions<const S extends SchemaRecord>(options: SessionsOptions<S>): SessionsClient<S>;
29
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/sessions/client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAiBtE,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EACV,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EAChB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC3B,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,YAAY;IACrD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAAC;IACrD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IACzC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,OAAO,CAAC;CAC5C;AAED,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,YAAY;IACpD,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7D,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,qBAAqB,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,cAAc,CAAC;IACjF,MAAM,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAChE,MAAM,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CAC/D;AAED,oEAAoE;AACpE,wBAAgB,QAAQ,CAAC,KAAK,CAAC,CAAC,SAAS,YAAY,EACnD,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,GAC1B,cAAc,CAAC,CAAC,CAAC,CA2DnB"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Server-side session issuer.
3
+ *
4
+ * This is deliberately separate from `Ablo(...)`: the participant client owns
5
+ * schema model properties, while this client owns credential issuance and
6
+ * lifecycle administration. A schema model named `sessions` therefore remains
7
+ * available as `ablo.sessions` like every other model.
8
+ */
9
+ import { assertBrowserSafety, readProcessEnv, rejectRemovedDatabaseUrlOption, resolveApiKey, resolveApiKeyValue, resolveBaseURL, resolveBootstrapBaseUrl, warnIfCliKeyMismatch, } from '../auth/apiKey.js';
10
+ import { modelWireNames } from '../auth/capability.js';
11
+ import { revokeCapability, rotateCapability, } from '../auth/capabilityLifecycle.js';
12
+ import { AbloAuthenticationError } from '../errors.js';
13
+ import { createSession } from './create.js';
14
+ import { createSessionHandler, } from './handler.js';
15
+ /** Construct the server-side issuer for user and agent sessions. */
16
+ export function Sessions(options) {
17
+ const env = readProcessEnv();
18
+ const authInput = { options, env };
19
+ const configuredApiKey = resolveApiKey(authInput);
20
+ void warnIfCliKeyMismatch(authInput);
21
+ rejectRemovedDatabaseUrlOption(options);
22
+ assertBrowserSafety({
23
+ apiKey: configuredApiKey,
24
+ dangerouslyAllowBrowser: options.dangerouslyAllowBrowser,
25
+ });
26
+ const baseUrl = resolveBootstrapBaseUrl({
27
+ url: resolveBaseURL(authInput),
28
+ bootstrapBaseUrl: options.bootstrapBaseUrl,
29
+ }).replace(/\/+$/, '');
30
+ const modelTypenames = modelWireNames(options.schema.models);
31
+ async function secret() {
32
+ const apiKey = await resolveApiKeyValue(configuredApiKey);
33
+ if (!apiKey) {
34
+ throw new AbloAuthenticationError('Sessions requires a secret (sk_) API key and must be constructed on the backend.', { code: 'apikey_missing' });
35
+ }
36
+ return apiKey;
37
+ }
38
+ async function create(params) {
39
+ return createSession(params, {
40
+ apiKey: await secret(),
41
+ baseUrl,
42
+ modelTypenames,
43
+ ...(options.fetch ? { fetch: options.fetch } : {}),
44
+ });
45
+ }
46
+ return {
47
+ create,
48
+ handler: (handlerOptions) => createSessionHandler(create, handlerOptions),
49
+ async revoke({ id }) {
50
+ return revokeCapability({
51
+ apiKey: await secret(),
52
+ baseUrl,
53
+ id,
54
+ ...(options.fetch ? { fetch: options.fetch } : {}),
55
+ });
56
+ },
57
+ async rotate({ id, graceSeconds, ttlSeconds }) {
58
+ return rotateCapability({
59
+ apiKey: await secret(),
60
+ baseUrl,
61
+ id,
62
+ ...(graceSeconds !== undefined ? { graceSeconds } : {}),
63
+ ...(ttlSeconds !== undefined ? { ttlSeconds } : {}),
64
+ ...(options.fetch ? { fetch: options.fetch } : {}),
65
+ });
66
+ },
67
+ };
68
+ }
69
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/sessions/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ import type { CapabilityCan, CapabilityOperation, EffectiveAuthority } from '../auth/capability.js';
2
+ import type { CredentialEndpointSuccess } from '../auth/credentialEndpointProtocol.js';
3
+ import type { SchemaRecord } from '../schema/schema.js';
4
+ import type { SyncGroupInput } from '../schema/roles.js';
5
+ /** The bearer-bearing part of a session returned by `sessions.create()`. */
6
+ export interface SessionCredential {
7
+ readonly object: 'session';
8
+ /** The short-lived `ek_` or `rk_` bearer used by the scoped client. */
9
+ readonly token: string;
10
+ /** ISO-8601 hard expiry for this credential. */
11
+ readonly expiresAt: string;
12
+ }
13
+ /** Result accepted from a session provider or canonical browser mint endpoint. */
14
+ export type SessionProviderResult = SessionCredential | CredentialEndpointSuccess | null;
15
+ /** Re-mints the same logical actor's scoped session for a long-lived client. */
16
+ export type SessionProvider = () => Promise<SessionProviderResult>;
17
+ /** Browser-safe route that mints the signed-in actor's short-lived session. */
18
+ export interface SessionEndpoint {
19
+ readonly endpoint: string;
20
+ readonly timeoutMs?: number;
21
+ readonly allowCrossOrigin?: boolean;
22
+ }
23
+ /** Every supported source for `Ablo({ session })`. */
24
+ export type SessionSource = SessionCredential | SessionProvider | SessionEndpoint;
25
+ /** Public session scope; transport-specific sync naming stays below this boundary. */
26
+ export type SessionScope = Omit<EffectiveAuthority, 'syncGroups'> & {
27
+ readonly groups: readonly string[];
28
+ };
29
+ export declare function sessionScope(authority: EffectiveAuthority): SessionScope;
30
+ /** A single data operation a scoped session may perform on a model. */
31
+ export type SessionOperation = CapabilityOperation;
32
+ /** Parameters for issuing a short-lived end-user (`ek_`) session. */
33
+ export interface CreateUserSessionParams<S extends SchemaRecord> {
34
+ readonly user: {
35
+ readonly id: string;
36
+ };
37
+ readonly organizationId?: string;
38
+ readonly schemaProject?: {
39
+ readonly organizationId: string;
40
+ readonly projectId: string;
41
+ };
42
+ readonly groups?: readonly SyncGroupInput[];
43
+ readonly can: CapabilityCan<S>;
44
+ readonly ttlSeconds?: number;
45
+ readonly userMeta?: Record<string, unknown>;
46
+ readonly agent?: never;
47
+ }
48
+ /** Parameters for issuing a short-lived scoped agent (`rk_`) session. */
49
+ export interface CreateAgentSessionParams<S extends SchemaRecord> {
50
+ readonly agent: {
51
+ readonly id: string;
52
+ };
53
+ readonly onBehalfOf?: {
54
+ readonly user: {
55
+ readonly id: string;
56
+ };
57
+ };
58
+ readonly can: CapabilityCan<S>;
59
+ readonly groups?: readonly SyncGroupInput[];
60
+ readonly ttlSeconds?: number;
61
+ readonly userMeta?: Record<string, unknown>;
62
+ readonly user?: never;
63
+ }
64
+ /** The one typed issuance input; its subject selects user or agent identity. */
65
+ export type CreateSessionParams<S extends SchemaRecord> = CreateUserSessionParams<S> | CreateAgentSessionParams<S>;
66
+ /** A minted session. `token` is the secret the holder presents as its bearer. */
67
+ export interface AbloSession extends SessionCredential {
68
+ readonly id: string;
69
+ readonly organizationId: string;
70
+ readonly scope: SessionScope;
71
+ readonly userMeta: Record<string, unknown>;
72
+ }
73
+ export interface SessionRevocation {
74
+ readonly id: string;
75
+ readonly deleted: true;
76
+ readonly activeSessionsClosed: number;
77
+ }
78
+ export interface SessionRotation {
79
+ readonly id: string;
80
+ readonly token: string;
81
+ readonly expiresAt: string | null;
82
+ readonly organizationId: string;
83
+ readonly scope: SessionScope;
84
+ readonly rotatedFrom: {
85
+ readonly id: string;
86
+ readonly expiresAt: string;
87
+ };
88
+ }
89
+ export interface RevokeSessionParams {
90
+ readonly id: string;
91
+ }
92
+ export interface RotateSessionParams {
93
+ readonly id: string;
94
+ readonly graceSeconds?: number;
95
+ readonly ttlSeconds?: number;
96
+ }
97
+ //# sourceMappingURL=contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/sessions/contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export function sessionScope(authority) {
2
+ const { syncGroups, ...scope } = authority;
3
+ return { ...scope, groups: syncGroups };
4
+ }
5
+ //# sourceMappingURL=contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/sessions/contract.ts"],"names":[],"mappings":"AA0CA,MAAM,UAAU,YAAY,CAAC,SAA6B;IACxD,MAAM,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,GAAG,SAAS,CAAC;IAC3C,OAAO,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAC1C,CAAC"}
@@ -1,11 +1,11 @@
1
1
  import type { SchemaRecord } from '../schema/schema.js';
2
- import type { AbloSession, CreateSessionParams } from '../client/resources/httpResources.js';
2
+ import type { AbloSession, CreateSessionParams } from './contract.js';
3
3
  /**
4
4
  * The resolved control-plane details a mint needs: a secret key, a base URL,
5
5
  * and an optional `fetch`. When `fetch` is omitted, the auth helpers fall back
6
6
  * to the runtime's global `fetch`.
7
7
  */
8
- export interface MintSessionContext {
8
+ export interface CreateSessionContext {
9
9
  readonly apiKey: string;
10
10
  readonly baseUrl: string;
11
11
  readonly fetch?: typeof fetch;
@@ -25,5 +25,5 @@ export interface MintSessionContext {
25
25
  * Routes the `{ user }` or `{ agent }` request to the matching mint endpoint
26
26
  * and reshapes the response into an {@link AbloSession}.
27
27
  */
28
- export declare function mintSession<S extends SchemaRecord>(params: CreateSessionParams<S>, ctx: MintSessionContext): Promise<AbloSession>;
29
- //# sourceMappingURL=sessionMint.d.ts.map
28
+ export declare function createSession<S extends SchemaRecord>(params: CreateSessionParams<S>, ctx: CreateSessionContext): Promise<AbloSession>;
29
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/sessions/create.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGtE;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IAC9B;;;;;;;;OAQG;IACH,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC3D;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,CAAC,SAAS,YAAY,EACxD,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAC9B,GAAG,EAAE,oBAAoB,GACxB,OAAO,CAAC,WAAW,CAAC,CAkEtB"}
@@ -18,18 +18,19 @@
18
18
  * registered names.
19
19
  *
20
20
  * The caller supplies the already-resolved secret key and base URL in
21
- * {@link MintSessionContext}. Choosing which key to pass — the original secret
21
+ * {@link CreateSessionContext}. Choosing which key to pass — the original secret
22
22
  * key, not a derived key that an earlier exchange may have produced — is the
23
23
  * caller's responsibility.
24
24
  */
25
- import { exchangeApiKey, mintUserSessionKey, } from './runtime.js';
26
- import { capabilityCanSchemaFor, grantedOperations, } from './capability.js';
25
+ import { exchangeApiKey, mintUserSessionKey, } from '../auth/runtime.js';
26
+ import { capabilityCanSchemaFor, grantedOperations, } from '../auth/capability.js';
27
+ import { sessionScope } from './contract.js';
27
28
  /**
28
29
  * Mints a session token from an already-resolved secret key and base URL.
29
30
  * Routes the `{ user }` or `{ agent }` request to the matching mint endpoint
30
31
  * and reshapes the response into an {@link AbloSession}.
31
32
  */
32
- export async function mintSession(params, ctx) {
33
+ export async function createSession(params, ctx) {
33
34
  const { apiKey, baseUrl } = ctx;
34
35
  // Static typing and runtime validation consume the same schema-bound grant
35
36
  // contract. This catches JavaScript callers, decoded JSON, and unsafe casts
@@ -43,7 +44,7 @@ export async function mintSession(params, ctx) {
43
44
  userId: params.user.id,
44
45
  ...(params.organizationId ? { organizationId: params.organizationId } : {}),
45
46
  ...(params.schemaProject ? { schemaProject: params.schemaProject } : {}),
46
- ...(params.syncGroups ? { syncGroups: [...params.syncGroups] } : {}),
47
+ ...(params.groups ? { syncGroups: [...params.groups] } : {}),
47
48
  operations,
48
49
  ttlSeconds: params.ttlSeconds ?? 900,
49
50
  ...(ctx.fetch ? { fetch: ctx.fetch } : {}),
@@ -56,7 +57,7 @@ export async function mintSession(params, ctx) {
56
57
  organizationId: res.organizationId,
57
58
  // The ephemeral mint stores scope on the key row; reshape its flat
58
59
  // response into the session resource's scope block.
59
- scope: {
60
+ scope: sessionScope({
60
61
  organizationId: res.organizationId,
61
62
  projectId: res.projectId,
62
63
  branchId: res.branchId,
@@ -65,7 +66,7 @@ export async function mintSession(params, ctx) {
65
66
  participantKind: 'user',
66
67
  participantId: res.participantId,
67
68
  deliveryPartition: res.deliveryPartition,
68
- },
69
+ }),
69
70
  userMeta: params.userMeta ?? { id: res.participantId },
70
71
  };
71
72
  }
@@ -78,7 +79,7 @@ export async function mintSession(params, ctx) {
78
79
  participantKind: 'agent',
79
80
  participantId: params.agent.id,
80
81
  ...(params.onBehalfOf ? { onBehalfOf: params.onBehalfOf } : {}),
81
- ...(params.syncGroups ? { syncGroups: [...params.syncGroups] } : {}),
82
+ ...(params.groups ? { syncGroups: [...params.groups] } : {}),
82
83
  operations,
83
84
  ttlSeconds: params.ttlSeconds ?? 900,
84
85
  ...(params.userMeta ? { userMeta: params.userMeta } : {}),
@@ -90,8 +91,8 @@ export async function mintSession(params, ctx) {
90
91
  token: res.token,
91
92
  expiresAt: res.expiresAt,
92
93
  organizationId: res.organizationId,
93
- scope: res.scope,
94
+ scope: sessionScope(res.scope),
94
95
  userMeta: res.userMeta,
95
96
  };
96
97
  }
97
- //# sourceMappingURL=sessionMint.js.map
98
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/sessions/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Server-owned browser session exchange.
3
+ *
4
+ * Authentication providers prove who is calling; this boundary converts that
5
+ * proof into the one Ablo session resource consumed by browser clients. It
6
+ * owns the HTTP protocol so applications do not repeat origin, cache, status,
7
+ * or credential-envelope handling in every framework route.
8
+ */
9
+ import type { SchemaRecord } from '../schema/schema.js';
10
+ import type { AbloSession, CreateSessionParams } from './contract.js';
11
+ export interface SessionHandlerOptions<S extends SchemaRecord, Principal> {
12
+ /** Verify the application's cookie, bearer, or framework auth session. */
13
+ authenticate(request: Request): Principal | null | Promise<Principal | null>;
14
+ /** Derive Ablo identity, groups, and access exclusively on the server. */
15
+ grant(input: {
16
+ readonly principal: Principal;
17
+ readonly request: Request;
18
+ }): CreateSessionParams<S> | null | Promise<CreateSessionParams<S> | null>;
19
+ }
20
+ export type SessionHandler = (request: Request) => Promise<Response>;
21
+ /** Build a framework-neutral POST handler around one authenticated session grant. */
22
+ export declare function createSessionHandler<S extends SchemaRecord, Principal>(create: (params: CreateSessionParams<S>) => Promise<AbloSession>, options: SessionHandlerOptions<S, Principal>): SessionHandler;
23
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/sessions/handler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EACV,WAAW,EACX,mBAAmB,EACpB,MAAM,eAAe,CAAC;AAOvB,MAAM,WAAW,qBAAqB,CACpC,CAAC,SAAS,YAAY,EACtB,SAAS;IAET,0EAA0E;IAC1E,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAC7E,0EAA0E;IAC1E,KAAK,CAAC,KAAK,EAAE;QACX,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;QAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;KAC3B,GAAG,mBAAmB,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;CAC5E;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAyBrE,qFAAqF;AACrF,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,YAAY,EAAE,SAAS,EACpE,MAAM,EAAE,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,WAAW,CAAC,EAChE,OAAO,EAAE,qBAAqB,CAAC,CAAC,EAAE,SAAS,CAAC,GAC3C,cAAc,CAiChB"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Server-owned browser session exchange.
3
+ *
4
+ * Authentication providers prove who is calling; this boundary converts that
5
+ * proof into the one Ablo session resource consumed by browser clients. It
6
+ * owns the HTTP protocol so applications do not repeat origin, cache, status,
7
+ * or credential-envelope handling in every framework route.
8
+ */
9
+ import { credentialEndpointErrorSchema, credentialEndpointSuccessSchema, } from '../auth/credentialEndpointProtocol.js';
10
+ import { classifyCredentialKind } from '../auth/credentialKind.js';
11
+ const NO_STORE_HEADERS = { 'Cache-Control': 'no-store' };
12
+ function errorResponse(status, code, message) {
13
+ return Response.json(credentialEndpointErrorSchema.parse({ error: { code, message } }), { status, headers: NO_STORE_HEADERS });
14
+ }
15
+ function isSameOrigin(request) {
16
+ const origin = request.headers.get('origin');
17
+ if (!origin)
18
+ return request.headers.get('sec-fetch-site') !== 'cross-site';
19
+ try {
20
+ return new URL(origin).origin === new URL(request.url).origin;
21
+ }
22
+ catch {
23
+ return false;
24
+ }
25
+ }
26
+ /** Build a framework-neutral POST handler around one authenticated session grant. */
27
+ export function createSessionHandler(create, options) {
28
+ return async (request) => {
29
+ if (request.method !== 'POST') {
30
+ return errorResponse(405, 'method_not_allowed', 'Use POST to create a session.');
31
+ }
32
+ if (!isSameOrigin(request)) {
33
+ return errorResponse(403, 'origin_mismatch', 'Cross-origin session creation rejected.');
34
+ }
35
+ const principal = await options.authenticate(request);
36
+ if (principal === null) {
37
+ return errorResponse(401, 'session_expired', 'Sign in again.');
38
+ }
39
+ const grant = await options.grant({ principal, request });
40
+ if (grant === null) {
41
+ return errorResponse(403, 'policy_denied', 'This identity is not authorized.');
42
+ }
43
+ const session = await create(grant);
44
+ const credentialKind = classifyCredentialKind(session.token);
45
+ if (credentialKind !== 'ephemeral' && credentialKind !== 'restricted') {
46
+ throw new Error('sessions.create returned a credential that cannot authenticate a session.');
47
+ }
48
+ return Response.json(credentialEndpointSuccessSchema.parse({
49
+ token: session.token,
50
+ expiresAt: session.expiresAt,
51
+ credentialKind,
52
+ }), { headers: NO_STORE_HEADERS });
53
+ };
54
+ }
55
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/sessions/handler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,EACL,6BAA6B,EAC7B,+BAA+B,GAChC,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAiBnE,MAAM,gBAAgB,GAAG,EAAE,eAAe,EAAE,UAAU,EAAW,CAAC;AAElE,SAAS,aAAa,CACpB,MAAc,EACd,IAAY,EACZ,OAAe;IAEf,OAAO,QAAQ,CAAC,IAAI,CAClB,6BAA6B,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,EACjE,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,CACtC,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,OAAgB;IACpC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,YAAY,CAAC;IAC3E,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,oBAAoB,CAClC,MAAgE,EAChE,OAA4C;IAE5C,OAAO,KAAK,EAAE,OAAO,EAAE,EAAE;QACvB,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9B,OAAO,aAAa,CAAC,GAAG,EAAE,oBAAoB,EAAE,+BAA+B,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,OAAO,aAAa,CAAC,GAAG,EAAE,iBAAiB,EAAE,yCAAyC,CAAC,CAAC;QAC1F,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACtD,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,OAAO,aAAa,CAAC,GAAG,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1D,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,OAAO,aAAa,CAAC,GAAG,EAAE,eAAe,EAAE,kCAAkC,CAAC,CAAC;QACjF,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,cAAc,GAAG,sBAAsB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7D,IAAI,cAAc,KAAK,WAAW,IAAI,cAAc,KAAK,YAAY,EAAE,CAAC;YACtE,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;QAC/F,CAAC;QACD,OAAO,QAAQ,CAAC,IAAI,CAClB,+BAA+B,CAAC,KAAK,CAAC;YACpC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,cAAc;SACf,CAAC,EACF,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAC9B,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Session subsystem.
3
+ *
4
+ * Start here and descend into the public contract, issuance, server handler,
5
+ * source normalization, or credential lifecycle. Transports consume the
6
+ * normalized access contract and do not reconstruct session policy.
7
+ */
8
+ export * from './contract.js';
9
+ export * from './client.js';
10
+ export * from './create.js';
11
+ export * from './handler.js';
12
+ export * from './source.js';
13
+ export * from './lifecycle.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sessions/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Session subsystem.
3
+ *
4
+ * Start here and descend into the public contract, issuance, server handler,
5
+ * source normalization, or credential lifecycle. Transports consume the
6
+ * normalized access contract and do not reconstruct session policy.
7
+ */
8
+ export * from './contract.js';
9
+ export * from './client.js';
10
+ export * from './create.js';
11
+ export * from './handler.js';
12
+ export * from './source.js';
13
+ export * from './lifecycle.js';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sessions/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC"}
@@ -1,14 +1,14 @@
1
1
  /**
2
2
  * Keeps the short-lived access credential fresh. It owns the re-mint hook, a
3
3
  * single-flight guard that stops concurrent triggers from minting more than
4
- * once, and a browser-only proactive refresh — a timer plus an OS-wake listener
5
- * — that renews the credential ahead of expiry. It reaches the rest of the
4
+ * once, and proactive refresh — an expiry-aware timer plus a browser OS-wake
5
+ * listener — that renews the credential ahead of expiry. It reaches the rest of the
6
6
  * client only through the small {@link CredentialLifecycleContext} interface,
7
7
  * so the two can reference each other without an import cycle.
8
8
  */
9
- import type { RecoveryClass } from '../../errorCodes.js';
10
- import { type Logger } from '../../logger.js';
11
- import { type CredentialProvider, type CredentialProviderResult } from '../../auth/credentialResult.js';
9
+ import type { RecoveryClass } from '../errorCodes.js';
10
+ import { type Logger } from '../logger.js';
11
+ import { type CredentialProvider, type CredentialProviderResult } from '../auth/credentialResult.js';
12
12
  /**
13
13
  * Tri-state outcome of a credential re-mint, mirroring the `getToken`
14
14
  * contract (see {@link CredentialLifecycle.refresh}).
@@ -175,4 +175,4 @@ export declare class CredentialLifecycle {
175
175
  /** Tear down the proactive credential lifecycle (idempotent). */
176
176
  stop(): void;
177
177
  }
178
- //# sourceMappingURL=credentialLifecycle.d.ts.map
178
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/sessions/lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAc,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC9B,MAAM,6BAA6B,CAAC;AAErC;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAAG,WAAW,GAAG,eAAe,GAAG,eAAe,CAAC;AAEvF;;;;;;GAMG;AACH,MAAM,MAAM,yBAAyB,GAAG,OAAO,GAAG,MAAM,CAAC;AAEzD;;;;;;GAMG;AACH,MAAM,MAAM,uBAAuB,GAAG,wBAAwB,CAAC;AAE/D;0DAC0D;AAC1D,MAAM,MAAM,mBAAmB,GAAG,kBAAkB,CAAC;AAErD;;kDAEkD;AAClD,eAAO,MAAM,2BAA2B,QAAiB,CAAC;AAE1D,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB,QAAY,CAAC;AAE9C;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAQvF;AAUD;;;;;GAKG;AACH,MAAM,WAAW,0BAA0B;IACzC;kEAC8D;IAC9D,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,0EAA0E;IAC1E,cAAc,IAAI,IAAI,CAAC;IACvB;gCAC4B;IAC5B,oBAAoB,IAAI,IAAI,CAAC;CAC9B;AAED,qBAAa,mBAAmB;IAoC5B,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM;IApCzB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,mBAAmB,CAAoC;IAE/D;6EACyE;IACzE,OAAO,CAAC,yBAAyB,CAAkD;IAEnF;;wDAEoD;IACpD,OAAO,CAAC,2BAA2B,CAA6B;IAEhE;;;0BAGsB;IACtB,OAAO,CAAC,qBAAqB,CAAuB;IAEpD;;;mEAG+D;IAC/D,OAAO,CAAC,iBAAiB,CAA6B;gBAGnC,GAAG,EAAE,0BAA0B,EAC/B,MAAM,GAAE,MAAmB;IAG9C;;;;OAIG;IACH,YAAY,CAAC,SAAS,EAAE,mBAAmB,GAAG,IAAI,GAAG,IAAI;IAIzD,kFAAkF;IAClF,MAAM,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO;IAShD;;;;;;;;;;;;;;;OAeG;IACG,OAAO,IAAI,OAAO,CAAC,wBAAwB,CAAC;IAkDlD;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAmB3B;;;;;;;;;;;;;;;OAeG;IACG,wBAAwB,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAY3F;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,KAAK,CAAC,QAAQ,EAAE,mBAAmB,EAAE,IAAI,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAqFhF,iEAAiE;IACjE,IAAI,IAAI,IAAI;CAIb"}
@@ -1,13 +1,13 @@
1
1
  /**
2
2
  * Keeps the short-lived access credential fresh. It owns the re-mint hook, a
3
3
  * single-flight guard that stops concurrent triggers from minting more than
4
- * once, and a browser-only proactive refresh — a timer plus an OS-wake listener
5
- * — that renews the credential ahead of expiry. It reaches the rest of the
4
+ * once, and proactive refresh — an expiry-aware timer plus a browser OS-wake
5
+ * listener — that renews the credential ahead of expiry. It reaches the rest of the
6
6
  * client only through the small {@link CredentialLifecycleContext} interface,
7
7
  * so the two can reference each other without an import cycle.
8
8
  */
9
- import { noopLogger } from '../../logger.js';
10
- import { credentialExpiry, credentialToken, } from '../../auth/credentialResult.js';
9
+ import { noopLogger } from '../logger.js';
10
+ import { credentialExpiry, credentialToken, } from '../auth/credentialResult.js';
11
11
  /** The fallback pre-roll interval, and also its ceiling: 10 minutes, which sits
12
12
  * comfortably inside the server's 15-minute default credential lifetime. Used
13
13
  * as-is when the refresher reports no expiry. */
@@ -321,4 +321,4 @@ export class CredentialLifecycle {
321
321
  this.credentialLifecycleTeardown = null;
322
322
  }
323
323
  }
324
- //# sourceMappingURL=credentialLifecycle.js.map
324
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/sessions/lifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Runtime lifecycle for a renewable session supplied to `Ablo({ session })`.
3
+ *
4
+ * A session provider mints a credential, while this boundary decides when to
5
+ * reuse it. Keeping that policy here prevents HTTP requests and the WebSocket
6
+ * bootstrap from independently minting duplicate sessions for the same actor.
7
+ */
8
+ import type { CredentialProvider, CredentialProviderResult } from '../auth/credentialResult.js';
9
+ import type { SessionProvider, SessionSource } from './contract.js';
10
+ /** Cache one minted session until it approaches expiry; concurrent refreshes share one mint. */
11
+ export declare function cachedSessionProvider(provider: SessionProvider): CredentialProvider;
12
+ /** The one credential input a live transport consumes. */
13
+ export interface SessionAccess {
14
+ readonly renewable: boolean;
15
+ credential(): Promise<CredentialProviderResult>;
16
+ }
17
+ /** Normalize a static or renewable session before it reaches a transport. */
18
+ export declare function createSessionAccess(source: SessionSource | null | undefined, credential: () => Promise<CredentialProviderResult>): SessionAccess;
19
+ /** Resolve the public session forms into the credential shape auth consumes. */
20
+ export declare function resolveSessionCredential(source: SessionSource, options: {
21
+ readonly fetch?: typeof globalThis.fetch;
22
+ readonly dangerouslyAllowBrowser?: boolean;
23
+ }): string | CredentialProvider;
24
+ //# sourceMappingURL=source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/sessions/source.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAClB,wBAAwB,EACzB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EACV,eAAe,EAEf,aAAa,EACd,MAAM,eAAe,CAAC;AAevB,gGAAgG;AAChG,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,eAAe,GAAG,kBAAkB,CAcnF;AAED,0DAA0D;AAC1D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,UAAU,IAAI,OAAO,CAAC,wBAAwB,CAAC,CAAC;CACjD;AAED,6EAA6E;AAC7E,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,EACxC,UAAU,EAAE,MAAM,OAAO,CAAC,wBAAwB,CAAC,GAClD,aAAa,CAOf;AAED,gFAAgF;AAChF,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE;IACP,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IACzC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,OAAO,CAAC;CAC5C,GACA,MAAM,GAAG,kBAAkB,CAmB7B"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Runtime lifecycle for a renewable session supplied to `Ablo({ session })`.
3
+ *
4
+ * A session provider mints a credential, while this boundary decides when to
5
+ * reuse it. Keeping that policy here prevents HTTP requests and the WebSocket
6
+ * bootstrap from independently minting duplicate sessions for the same actor.
7
+ */
8
+ import { AbloValidationError } from '../errors.js';
9
+ import { createEndpointCredentialResolver, isCredentialEndpoint, } from '../auth/credentialEndpoint.js';
10
+ import { protectBrowserCredentialProvider } from '../auth/browserCredentialSafety.js';
11
+ const SESSION_REFRESH_SKEW_MS = 30_000;
12
+ function remainsUsable(session, now) {
13
+ const expiresAt = Date.parse(session.expiresAt);
14
+ return Number.isFinite(expiresAt) && expiresAt - now > SESSION_REFRESH_SKEW_MS;
15
+ }
16
+ /** Cache one minted session until it approaches expiry; concurrent refreshes share one mint. */
17
+ export function cachedSessionProvider(provider) {
18
+ let current = null;
19
+ let refreshing = null;
20
+ return async () => {
21
+ if (current && remainsUsable(current, Date.now()))
22
+ return current;
23
+ refreshing ??= provider().then((next) => {
24
+ current = next;
25
+ return next;
26
+ }).finally(() => {
27
+ refreshing = null;
28
+ });
29
+ return refreshing;
30
+ };
31
+ }
32
+ /** Normalize a static or renewable session before it reaches a transport. */
33
+ export function createSessionAccess(source, credential) {
34
+ return {
35
+ renewable: typeof source === 'function'
36
+ || (typeof source === 'object' && source !== null && 'endpoint' in source),
37
+ credential,
38
+ };
39
+ }
40
+ /** Resolve the public session forms into the credential shape auth consumes. */
41
+ export function resolveSessionCredential(source, options) {
42
+ if (typeof source === 'function') {
43
+ return protectBrowserCredentialProvider(cachedSessionProvider(source), options.dangerouslyAllowBrowser);
44
+ }
45
+ if (!('endpoint' in source))
46
+ return source.token;
47
+ if (!isCredentialEndpoint(source.endpoint)) {
48
+ throw new AbloValidationError('`session.endpoint` expects a URL or path such as \'/api/ablo-session\'.', { code: 'invalid_options', param: 'session.endpoint' });
49
+ }
50
+ return protectBrowserCredentialProvider(createEndpointCredentialResolver(source.endpoint, {
51
+ fetch: options.fetch,
52
+ timeoutMs: source.timeoutMs,
53
+ allowCrossOrigin: source.allowCrossOrigin,
54
+ }), options.dangerouslyAllowBrowser);
55
+ }
56
+ //# sourceMappingURL=source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/sessions/source.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EACL,gCAAgC,EAChC,oBAAoB,GACrB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,gCAAgC,EAAE,MAAM,oCAAoC,CAAC;AAEtF,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAEvC,SAAS,aAAa,CAAC,OAA6C,EAAE,GAAW;IAC/E,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChD,OAAO,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,GAAG,GAAG,uBAAuB,CAAC;AACjF,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,qBAAqB,CAAC,QAAyB;IAC7D,IAAI,OAAO,GAAgD,IAAI,CAAC;IAChE,IAAI,UAAU,GAA0C,IAAI,CAAC;IAE7D,OAAO,KAAK,IAAI,EAAE;QAChB,IAAI,OAAO,IAAI,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;YAAE,OAAO,OAAO,CAAC;QAClE,UAAU,KAAK,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YACtC,OAAO,GAAG,IAAI,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YACd,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC,CAAC,CAAC;QACH,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;AACJ,CAAC;AAQD,6EAA6E;AAC7E,MAAM,UAAU,mBAAmB,CACjC,MAAwC,EACxC,UAAmD;IAEnD,OAAO;QACL,SAAS,EACP,OAAO,MAAM,KAAK,UAAU;eACzB,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,UAAU,IAAI,MAAM,CAAC;QAC5E,UAAU;KACX,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,wBAAwB,CACtC,MAAqB,EACrB,OAGC;IAED,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;QACjC,OAAO,gCAAgC,CACrC,qBAAqB,CAAC,MAAM,CAAC,EAC7B,OAAO,CAAC,uBAAuB,CAChC,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,CAAC,UAAU,IAAI,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC;IACjD,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,mBAAmB,CAC3B,yEAAyE,EACzE,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,kBAAkB,EAAE,CACvD,CAAC;IACJ,CAAC;IACD,OAAO,gCAAgC,CAAC,gCAAgC,CAAC,MAAM,CAAC,QAAQ,EAAE;QACxF,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;KAC1C,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,CAAC;AACvC,CAAC"}