@atlasauth/emulator-core 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (248) hide show
  1. package/LICENSE +21 -0
  2. package/dist/custom-html.d.ts +57 -0
  3. package/dist/custom-html.js +491 -0
  4. package/dist/custom-html.js.map +1 -0
  5. package/dist/engine.d.ts +1 -1
  6. package/dist/engine.js +5 -1
  7. package/dist/engine.js.map +1 -1
  8. package/dist/error-catalog.js +8 -0
  9. package/dist/error-catalog.js.map +1 -1
  10. package/dist/event-gate.js +60 -2
  11. package/dist/event-gate.js.map +1 -1
  12. package/dist/generic.js +5 -1
  13. package/dist/generic.js.map +1 -1
  14. package/dist/handlers/access-signals.d.ts +48 -0
  15. package/dist/handlers/access-signals.js +76 -0
  16. package/dist/handlers/access-signals.js.map +1 -0
  17. package/dist/handlers/approvals.js +54 -1
  18. package/dist/handlers/approvals.js.map +1 -1
  19. package/dist/handlers/authz-data.d.ts +2 -0
  20. package/dist/handlers/authz-data.js +627 -0
  21. package/dist/handlers/authz-data.js.map +1 -0
  22. package/dist/handlers/authz-layers.d.ts +229 -0
  23. package/dist/handlers/authz-layers.js +786 -0
  24. package/dist/handlers/authz-layers.js.map +1 -0
  25. package/dist/handlers/authz-state.d.ts +80 -0
  26. package/dist/handlers/authz-state.js +175 -0
  27. package/dist/handlers/authz-state.js.map +1 -0
  28. package/dist/handlers/authz.js +240 -177
  29. package/dist/handlers/authz.js.map +1 -1
  30. package/dist/handlers/billing.d.ts +99 -1
  31. package/dist/handlers/billing.js +556 -77
  32. package/dist/handlers/billing.js.map +1 -1
  33. package/dist/handlers/cedar-ext.d.ts +35 -0
  34. package/dist/handlers/cedar-ext.js +174 -0
  35. package/dist/handlers/cedar-ext.js.map +1 -0
  36. package/dist/handlers/cedar.d.ts +146 -0
  37. package/dist/handlers/cedar.js +689 -0
  38. package/dist/handlers/cedar.js.map +1 -0
  39. package/dist/handlers/connections.d.ts +4 -1
  40. package/dist/handlers/connections.js +267 -38
  41. package/dist/handlers/connections.js.map +1 -1
  42. package/dist/handlers/control.js +6 -1
  43. package/dist/handlers/control.js.map +1 -1
  44. package/dist/handlers/device.js +18 -1
  45. package/dist/handlers/device.js.map +1 -1
  46. package/dist/handlers/emu3-misc.d.ts +38 -0
  47. package/dist/handlers/emu3-misc.js +1056 -0
  48. package/dist/handlers/emu3-misc.js.map +1 -0
  49. package/dist/handlers/emu4-actions-access.d.ts +46 -0
  50. package/dist/handlers/emu4-actions-access.js +107 -0
  51. package/dist/handlers/emu4-actions-access.js.map +1 -0
  52. package/dist/handlers/emu4-actions-catalog-extra.d.ts +3 -0
  53. package/dist/handlers/emu4-actions-catalog-extra.js +204 -0
  54. package/dist/handlers/emu4-actions-catalog-extra.js.map +1 -0
  55. package/dist/handlers/emu4-actions-catalog.d.ts +3 -0
  56. package/dist/handlers/emu4-actions-catalog.js +143 -0
  57. package/dist/handlers/emu4-actions-catalog.js.map +1 -0
  58. package/dist/handlers/emu4-actions-def.d.ts +50 -0
  59. package/dist/handlers/emu4-actions-def.js +250 -0
  60. package/dist/handlers/emu4-actions-def.js.map +1 -0
  61. package/dist/handlers/emu4-actions-sandbox.d.ts +36 -0
  62. package/dist/handlers/emu4-actions-sandbox.js +318 -0
  63. package/dist/handlers/emu4-actions-sandbox.js.map +1 -0
  64. package/dist/handlers/emu4-actions-typegen.d.ts +5 -0
  65. package/dist/handlers/emu4-actions-typegen.js +73 -0
  66. package/dist/handlers/emu4-actions-typegen.js.map +1 -0
  67. package/dist/handlers/emu4-actions.d.ts +2 -0
  68. package/dist/handlers/emu4-actions.js +506 -0
  69. package/dist/handlers/emu4-actions.js.map +1 -0
  70. package/dist/handlers/emu4-authz-trust.d.ts +40 -0
  71. package/dist/handlers/emu4-authz-trust.js +488 -0
  72. package/dist/handlers/emu4-authz-trust.js.map +1 -0
  73. package/dist/handlers/emu4-authz.d.ts +2 -0
  74. package/dist/handlers/emu4-authz.js +752 -0
  75. package/dist/handlers/emu4-authz.js.map +1 -0
  76. package/dist/handlers/emu4-billing-core.d.ts +23 -0
  77. package/dist/handlers/emu4-billing-core.js +22 -0
  78. package/dist/handlers/emu4-billing-core.js.map +1 -0
  79. package/dist/handlers/emu4-billing-x.d.ts +2 -0
  80. package/dist/handlers/emu4-billing-x.js +489 -0
  81. package/dist/handlers/emu4-billing-x.js.map +1 -0
  82. package/dist/handlers/emu4-billing.d.ts +14 -0
  83. package/dist/handlers/emu4-billing.js +846 -0
  84. package/dist/handlers/emu4-billing.js.map +1 -0
  85. package/dist/handlers/emu4-clones.d.ts +2 -0
  86. package/dist/handlers/emu4-clones.js +322 -0
  87. package/dist/handlers/emu4-clones.js.map +1 -0
  88. package/dist/handlers/emu4-compliance.d.ts +8 -0
  89. package/dist/handlers/emu4-compliance.js +39 -0
  90. package/dist/handlers/emu4-compliance.js.map +1 -0
  91. package/dist/handlers/emu4-config.d.ts +14 -0
  92. package/dist/handlers/emu4-config.js +148 -0
  93. package/dist/handlers/emu4-config.js.map +1 -0
  94. package/dist/handlers/emu4-cookies.d.ts +8 -0
  95. package/dist/handlers/emu4-cookies.js +248 -0
  96. package/dist/handlers/emu4-cookies.js.map +1 -0
  97. package/dist/handlers/emu4-erasure.d.ts +2 -0
  98. package/dist/handlers/emu4-erasure.js +587 -0
  99. package/dist/handlers/emu4-erasure.js.map +1 -0
  100. package/dist/handlers/emu4-federation.d.ts +8 -0
  101. package/dist/handlers/emu4-federation.js +18 -0
  102. package/dist/handlers/emu4-federation.js.map +1 -0
  103. package/dist/handlers/emu4-journey-math.d.ts +42 -0
  104. package/dist/handlers/emu4-journey-math.js +99 -0
  105. package/dist/handlers/emu4-journey-math.js.map +1 -0
  106. package/dist/handlers/emu4-messaging.d.ts +21 -0
  107. package/dist/handlers/emu4-messaging.js +595 -0
  108. package/dist/handlers/emu4-messaging.js.map +1 -0
  109. package/dist/handlers/emu4-minors.d.ts +7 -0
  110. package/dist/handlers/emu4-minors.js +408 -0
  111. package/dist/handlers/emu4-minors.js.map +1 -0
  112. package/dist/handlers/emu4-oauth-audit.d.ts +5 -0
  113. package/dist/handlers/emu4-oauth-audit.js +17 -0
  114. package/dist/handlers/emu4-oauth-audit.js.map +1 -0
  115. package/dist/handlers/emu4-oauth-auth.d.ts +83 -0
  116. package/dist/handlers/emu4-oauth-auth.js +363 -0
  117. package/dist/handlers/emu4-oauth-auth.js.map +1 -0
  118. package/dist/handlers/emu4-oauth-delivery.d.ts +68 -0
  119. package/dist/handlers/emu4-oauth-delivery.js +207 -0
  120. package/dist/handlers/emu4-oauth-delivery.js.map +1 -0
  121. package/dist/handlers/emu4-oauth-keys.d.ts +11 -0
  122. package/dist/handlers/emu4-oauth-keys.js +268 -0
  123. package/dist/handlers/emu4-oauth-keys.js.map +1 -0
  124. package/dist/handlers/emu4-oauth-pub.d.ts +36 -0
  125. package/dist/handlers/emu4-oauth-pub.js +420 -0
  126. package/dist/handlers/emu4-oauth-pub.js.map +1 -0
  127. package/dist/handlers/emu4-oauth.d.ts +10 -0
  128. package/dist/handlers/emu4-oauth.js +23 -0
  129. package/dist/handlers/emu4-oauth.js.map +1 -0
  130. package/dist/handlers/emu4-policies.d.ts +2 -0
  131. package/dist/handlers/emu4-policies.js +408 -0
  132. package/dist/handlers/emu4-policies.js.map +1 -0
  133. package/dist/handlers/emu4-region.d.ts +2 -0
  134. package/dist/handlers/emu4-region.js +189 -0
  135. package/dist/handlers/emu4-region.js.map +1 -0
  136. package/dist/handlers/emu4-saml.d.ts +12 -0
  137. package/dist/handlers/emu4-saml.js +532 -0
  138. package/dist/handlers/emu4-saml.js.map +1 -0
  139. package/dist/handlers/emu4-shared.d.ts +44 -0
  140. package/dist/handlers/emu4-shared.js +90 -0
  141. package/dist/handlers/emu4-shared.js.map +1 -0
  142. package/dist/handlers/emu4-snapshots.d.ts +38 -0
  143. package/dist/handlers/emu4-snapshots.js +231 -0
  144. package/dist/handlers/emu4-snapshots.js.map +1 -0
  145. package/dist/handlers/emu4-sns.d.ts +9 -0
  146. package/dist/handlers/emu4-sns.js +21 -0
  147. package/dist/handlers/emu4-sns.js.map +1 -0
  148. package/dist/handlers/emu4-trust-binding.d.ts +27 -0
  149. package/dist/handlers/emu4-trust-binding.js +344 -0
  150. package/dist/handlers/emu4-trust-binding.js.map +1 -0
  151. package/dist/handlers/emu4-trust.d.ts +35 -0
  152. package/dist/handlers/emu4-trust.js +543 -0
  153. package/dist/handlers/emu4-trust.js.map +1 -0
  154. package/dist/handlers/fga-engine.d.ts +78 -0
  155. package/dist/handlers/fga-engine.js +663 -0
  156. package/dist/handlers/fga-engine.js.map +1 -0
  157. package/dist/handlers/governance.js +3 -2
  158. package/dist/handlers/governance.js.map +1 -1
  159. package/dist/handlers/hooks.js +13 -0
  160. package/dist/handlers/hooks.js.map +1 -1
  161. package/dist/handlers/index.js +14 -1
  162. package/dist/handlers/index.js.map +1 -1
  163. package/dist/handlers/machines.js +6 -0
  164. package/dist/handlers/machines.js.map +1 -1
  165. package/dist/handlers/messaging.d.ts +3 -1
  166. package/dist/handlers/messaging.js +455 -48
  167. package/dist/handlers/messaging.js.map +1 -1
  168. package/dist/handlers/oauth-adv.d.ts +191 -0
  169. package/dist/handlers/oauth-adv.js +1305 -0
  170. package/dist/handlers/oauth-adv.js.map +1 -0
  171. package/dist/handlers/oauth-flows.d.ts +25 -1
  172. package/dist/handlers/oauth-flows.js +111 -50
  173. package/dist/handlers/oauth-flows.js.map +1 -1
  174. package/dist/handlers/oauth.d.ts +24 -3
  175. package/dist/handlers/oauth.js +245 -60
  176. package/dist/handlers/oauth.js.map +1 -1
  177. package/dist/handlers/orgs.js +6 -0
  178. package/dist/handlers/orgs.js.map +1 -1
  179. package/dist/handlers/platform.d.ts +5 -0
  180. package/dist/handlers/platform.js +33 -15
  181. package/dist/handlers/platform.js.map +1 -1
  182. package/dist/handlers/scim.d.ts +2 -0
  183. package/dist/handlers/scim.js +198 -11
  184. package/dist/handlers/scim.js.map +1 -1
  185. package/dist/handlers/sessions.d.ts +2 -0
  186. package/dist/handlers/sessions.js +24 -16
  187. package/dist/handlers/sessions.js.map +1 -1
  188. package/dist/handlers/users.js +3 -0
  189. package/dist/handlers/users.js.map +1 -1
  190. package/dist/jwe.d.ts +18 -0
  191. package/dist/jwe.js +101 -0
  192. package/dist/jwe.js.map +1 -0
  193. package/dist/jws.js +2 -0
  194. package/dist/jws.js.map +1 -1
  195. package/dist/messaging-callbacks.d.ts +100 -0
  196. package/dist/messaging-callbacks.js +767 -0
  197. package/dist/messaging-callbacks.js.map +1 -0
  198. package/dist/openapi.d.ts +1 -0
  199. package/dist/openapi.js +44 -2
  200. package/dist/openapi.js.map +1 -1
  201. package/dist/parity-emu3-authz.d.ts +3 -0
  202. package/dist/parity-emu3-authz.js +61 -0
  203. package/dist/parity-emu3-authz.js.map +1 -0
  204. package/dist/parity-emu3-billing.d.ts +3 -0
  205. package/dist/parity-emu3-billing.js +25 -0
  206. package/dist/parity-emu3-billing.js.map +1 -0
  207. package/dist/parity-emu3-messaging.d.ts +3 -0
  208. package/dist/parity-emu3-messaging.js +27 -0
  209. package/dist/parity-emu3-messaging.js.map +1 -0
  210. package/dist/parity-emu3-misc.d.ts +2 -0
  211. package/dist/parity-emu3-misc.js +63 -0
  212. package/dist/parity-emu3-misc.js.map +1 -0
  213. package/dist/parity-emu3-oauth.d.ts +2 -0
  214. package/dist/parity-emu3-oauth.js +39 -0
  215. package/dist/parity-emu3-oauth.js.map +1 -0
  216. package/dist/parity-emu4-actions.d.ts +2 -0
  217. package/dist/parity-emu4-actions.js +38 -0
  218. package/dist/parity-emu4-actions.js.map +1 -0
  219. package/dist/parity-emu4-authz.d.ts +3 -0
  220. package/dist/parity-emu4-authz.js +68 -0
  221. package/dist/parity-emu4-authz.js.map +1 -0
  222. package/dist/parity-emu4-billing.d.ts +6 -0
  223. package/dist/parity-emu4-billing.js +44 -0
  224. package/dist/parity-emu4-billing.js.map +1 -0
  225. package/dist/parity-emu4-compliance.d.ts +2 -0
  226. package/dist/parity-emu4-compliance.js +92 -0
  227. package/dist/parity-emu4-compliance.js.map +1 -0
  228. package/dist/parity-emu4-federation.d.ts +2 -0
  229. package/dist/parity-emu4-federation.js +33 -0
  230. package/dist/parity-emu4-federation.js.map +1 -0
  231. package/dist/parity-emu4-messaging.d.ts +3 -0
  232. package/dist/parity-emu4-messaging.js +42 -0
  233. package/dist/parity-emu4-messaging.js.map +1 -0
  234. package/dist/parity-emu4-oauth.d.ts +2 -0
  235. package/dist/parity-emu4-oauth.js +55 -0
  236. package/dist/parity-emu4-oauth.js.map +1 -0
  237. package/dist/parity-emu4-trust.d.ts +2 -0
  238. package/dist/parity-emu4-trust.js +41 -0
  239. package/dist/parity-emu4-trust.js.map +1 -0
  240. package/dist/parity-routes.js +19 -1
  241. package/dist/parity-routes.js.map +1 -1
  242. package/dist/sns-cert.d.ts +9 -0
  243. package/dist/sns-cert.js +101 -0
  244. package/dist/sns-cert.js.map +1 -0
  245. package/dist/tokens.d.ts +69 -4
  246. package/dist/tokens.js +164 -38
  247. package/dist/tokens.js.map +1 -1
  248. package/package.json +2 -2
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.regionHandlers = regionHandlers;
4
+ const errors_1 = require("../errors");
5
+ const support_1 = require("./support");
6
+ const emu4_shared_1 = require("./emu4-shared");
7
+ /**
8
+ * Regional readiness. A single-region deployment (the default) has no regions: nothing is pinned, refused or rerouted. A
9
+ * deployment with a region table (`PUT /__emulator/region/config`) can pin the instance to the region of the stack answering, name
10
+ * a failover region and isolate the Frontend API origin. A pin is a statement about where the data is: it is only ever set to
11
+ * this stack's region and there is no unpin (moving between regions is an export and an import). The stack answering a pinned
12
+ * instance from another region refuses with 421 WRONG_REGION naming the region that serves it. shortcut: the guard sits on the
13
+ * region routes only; the rest of the emulator answers whatever stack it is told it is.
14
+ */
15
+ const REGION_ID = /^[a-z][a-z0-9-]{1,19}$/;
16
+ const STATUSES = ['active', 'standby', 'draining'];
17
+ const st = (0, support_1.engineState)(() => ({ self: null, regions: [], isolationDefault: 'off', frontendApiHost: 'emulator-fapi.atlas.invalid', region: null, failoverRegion: null, fapiIsolation: null }));
18
+ const isUrl = (v) => {
19
+ if (typeof v !== 'string')
20
+ return false;
21
+ try {
22
+ new URL(v);
23
+ return true;
24
+ }
25
+ catch {
26
+ return false;
27
+ }
28
+ };
29
+ /** Validate a region table like the deployment setting: readable issues, unique ids, failover pointing at another listed region. */
30
+ function parseTable(self, raw) {
31
+ if (self !== null && self !== undefined && (typeof self !== 'string' || !REGION_ID.test(self)))
32
+ throw (0, emu4_shared_1.bad)('self is a region id such as "eu" or null (one region).', 'self');
33
+ const list = raw === undefined ? [] : raw;
34
+ if (!Array.isArray(list))
35
+ throw (0, emu4_shared_1.bad)('regions must be an array.', 'regions');
36
+ if (list.length > 32)
37
+ throw (0, emu4_shared_1.bad)('At most 32 regions.', 'regions');
38
+ const regions = list.map((r, i) => {
39
+ const e = (0, emu4_shared_1.isObj)(r) ? r : {};
40
+ if (typeof e.id !== 'string' || !REGION_ID.test(e.id))
41
+ throw (0, emu4_shared_1.bad)(`regions.${i}.id is not a valid region id.`, 'regions');
42
+ if (e.label !== undefined && (typeof e.label !== 'string' || e.label.length < 1 || e.label.length > 80))
43
+ throw (0, emu4_shared_1.bad)(`regions.${i}.label must be 1-80 characters.`, 'regions');
44
+ for (const k of ['fapi_origin', 'bapi_origin'])
45
+ if (e[k] != null && !isUrl(e[k]))
46
+ throw (0, emu4_shared_1.bad)(`regions.${i}.${k} must be a URL.`, 'regions');
47
+ if (e.failover_to != null && (typeof e.failover_to !== 'string' || !REGION_ID.test(e.failover_to)))
48
+ throw (0, emu4_shared_1.bad)(`regions.${i}.failover_to is not a valid region id.`, 'regions');
49
+ const status = e.status ?? 'active';
50
+ if (!STATUSES.includes(status))
51
+ throw (0, emu4_shared_1.bad)(`regions.${i}.status must be one of ${STATUSES.join(', ')}.`, 'regions');
52
+ return { id: e.id, label: e.label ?? e.id, fapi_origin: typeof e.fapi_origin === 'string' ? e.fapi_origin.replace(/\/$/, '') : null, bapi_origin: typeof e.bapi_origin === 'string' ? e.bapi_origin.replace(/\/$/, '') : null, status: status, failover_to: e.failover_to ?? null };
53
+ });
54
+ const ids = new Set(regions.map((r) => r.id));
55
+ if (ids.size !== regions.length)
56
+ throw (0, emu4_shared_1.bad)('The region table lists a region id twice.', 'regions');
57
+ for (const r of regions)
58
+ if (r.failover_to && (!ids.has(r.failover_to) || r.failover_to === r.id))
59
+ throw (0, emu4_shared_1.bad)(`Region ${r.id} fails over to ${r.failover_to}, which is not another listed region.`, 'regions');
60
+ if (self && regions.length > 0 && !ids.has(self))
61
+ throw (0, emu4_shared_1.bad)(`The region table does not list this stack's own region (${self}).`, 'regions');
62
+ return { self: self ?? null, regions };
63
+ }
64
+ /** May this stack serve the instance? Yes with no region configured, no pin, a pin to this region, or this stack as its failover. */
65
+ function decision(s) {
66
+ if (!s.self || !s.region || s.region === s.self || s.failoverRegion === s.self)
67
+ return { ok: true };
68
+ const home = s.regions.find((r) => r.id === s.region);
69
+ return { ok: false, pinned: s.region, region: s.region, fapi_origin: home?.fapi_origin ?? null, bapi_origin: home?.bapi_origin ?? null };
70
+ }
71
+ const wrongRegion = (d) => ({ status: 421, body: (0, errors_1.errorBody)([{ code: 'WRONG_REGION', message: `This instance is served from the ${d.pinned} region. Send the request there.`, meta: { region: d.region, fapi_origin: d.fapi_origin, bapi_origin: d.bapi_origin } }]) });
72
+ const view = (s) => ({
73
+ object: 'region_status',
74
+ region: s.region,
75
+ pinned: !!s.region,
76
+ serving_region: s.self,
77
+ regions_enabled: !!s.self,
78
+ failover_region: s.failoverRegion,
79
+ fapi_isolation: s.fapiIsolation,
80
+ effective_fapi_isolation: s.fapiIsolation ?? s.isolationDefault,
81
+ regions: s.regions.map((r) => ({ id: r.id, label: r.label, status: r.status, fapi_origin: r.fapi_origin, bapi_origin: r.bapi_origin, failover_to: r.failover_to, self: r.id === s.self })),
82
+ });
83
+ const BASE_PATH = /^(\/[a-z0-9_~-][a-z0-9._~-]{0,63}){1,4}$/;
84
+ const HOST = /^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$/;
85
+ function regionHandlers() {
86
+ const guard = (e) => {
87
+ const d = decision(st(e));
88
+ return d.ok ? null : wrongRegion(d);
89
+ };
90
+ return [
91
+ { method: 'GET', pattern: '/v1/region', scope: 'instance:read', handler: (c) => guard(c.engine) ?? { body: view(st(c.engine)) } },
92
+ { method: 'PUT', pattern: '/v1/region', scope: 'instance:write', handler: (c) => {
93
+ const e = c.engine;
94
+ const refused = guard(e);
95
+ if (refused)
96
+ return refused;
97
+ const s = st(e);
98
+ const b = c.body;
99
+ const before = { region: s.region, failover_region: s.failoverRegion, fapi_isolation: s.fapiIsolation };
100
+ const set = {};
101
+ if (b.pin !== undefined) {
102
+ if (typeof b.pin !== 'boolean')
103
+ throw (0, emu4_shared_1.bad)('pin must be true or false.', 'pin');
104
+ if (!b.pin)
105
+ throw (0, emu4_shared_1.bad)("A pinned instance cannot be unpinned: its data lives in its region. Moving it is an export and an import.", 'pin');
106
+ if (!s.self)
107
+ throw (0, emu4_shared_1.bad)('This deployment has no region configured, so there is nothing to pin to.', 'pin');
108
+ set.region = s.self;
109
+ }
110
+ const regionAfter = set.region ?? s.region;
111
+ if (b.failover_region !== undefined) {
112
+ if (b.failover_region === null)
113
+ set.failoverRegion = null;
114
+ else {
115
+ if (typeof b.failover_region !== 'string' || !s.regions.some((r) => r.id === b.failover_region))
116
+ throw (0, emu4_shared_1.bad)(`failover_region must be null or one of: ${s.regions.map((r) => r.id).join(', ') || '(no regions configured)'}.`, 'failover_region');
117
+ if (!regionAfter)
118
+ throw (0, emu4_shared_1.bad)('Pin the instance to a region before naming its failover region.', 'failover_region');
119
+ if (b.failover_region === regionAfter)
120
+ throw (0, emu4_shared_1.bad)("The failover region must differ from the instance's own region.", 'failover_region');
121
+ set.failoverRegion = b.failover_region;
122
+ }
123
+ }
124
+ if (b.fapi_isolation !== undefined) {
125
+ if (b.fapi_isolation !== null && b.fapi_isolation !== 'off' && b.fapi_isolation !== 'enforce')
126
+ throw (0, emu4_shared_1.bad)('fapi_isolation must be null (the deployment default), "off" or "enforce".', 'fapi_isolation');
127
+ set.fapiIsolation = b.fapi_isolation;
128
+ }
129
+ if (Object.keys(set).length === 0)
130
+ throw (0, emu4_shared_1.bad)('Send at least one of pin, failover_region or fapi_isolation.');
131
+ Object.assign(s, set);
132
+ (0, emu4_shared_1.audit)(e, c, 'instance.region_updated', 'instance', e.instanceId, { before, after: set });
133
+ return { body: view(s) };
134
+ } },
135
+ { method: 'GET', pattern: '/v1/region/failover', scope: 'instance:read', handler: (c) => {
136
+ const e = c.engine;
137
+ const refused = guard(e);
138
+ if (refused)
139
+ return refused;
140
+ const s = st(e);
141
+ const mountHost = String(c.query.get('mount_host') ?? '').trim().toLowerCase().replace(/\.$/, '');
142
+ if (!HOST.test(mountHost) || mountHost.length > 253)
143
+ throw (0, emu4_shared_1.bad)('mount_host must be the host your reverse proxy serves, such as app.example.com.', 'mount_host');
144
+ const rawBase = c.query.get('base_path');
145
+ const basePath = rawBase === null || rawBase === '' ? '/__atlas' : rawBase;
146
+ if (!BASE_PATH.test(basePath))
147
+ throw (0, emu4_shared_1.bad)('base_path must start with "/", have 1 to 4 segments of lowercase letters, digits, "_", "-" or "~" (a "." is allowed after the first character), and no trailing slash. Example: "/__atlas".', 'base_path');
148
+ const fail = (message) => ({ status: 422, body: (0, errors_1.errorBody)([{ code: 'VALIDATION_FAILED', message }]) });
149
+ if (!s.failoverRegion)
150
+ return fail('This instance has no failover region. Set one with PUT /v1/region.');
151
+ const host = s.frontendApiHost.split('/')[0];
152
+ const standby = s.regions.find((r) => r.id === s.failoverRegion)?.fapi_origin;
153
+ if (!standby)
154
+ return fail("The failover region has no Frontend API origin in this deployment's region table.");
155
+ const upstreams = [
156
+ { role: 'primary', region: s.region ?? s.self, origin: `https://${host}`, host },
157
+ { role: 'failover', region: s.failoverRegion, origin: standby, host },
158
+ ];
159
+ const standbyHost = new URL(standby).host;
160
+ const nginx = ['upstream atlas_fapi {', ` server ${host}:443;`, ` server ${standbyHost} backup;`, '}', '', `location ${basePath}/ {`, ' proxy_pass https://atlas_fapi; # no URI part: the path is kept', ` proxy_set_header Host ${host};`, ' proxy_ssl_server_name on;', ` proxy_ssl_name ${host};`, ' # Fail over on a dead or erroring upstream, never on a 4xx (a 421 means "wrong region", not "down").', ' proxy_next_upstream error timeout http_502 http_503 http_504;', ' proxy_next_upstream_tries 2;', '}'].join('\n');
161
+ const caddy = [`handle ${basePath}/* {`, ` reverse_proxy ${upstreams[0].origin} ${standby} {`, ' lb_policy first', ' lb_try_duration 5s', ' fail_duration 30s', ` header_up Host ${host}`, ' transport http {', ` tls_server_name ${host}`, ' }', ' }', '}'].join('\n');
162
+ return { body: { object: 'region_failover', mount_host: mountHost, base_path: basePath, upstreams, nginx, caddy } };
163
+ } },
164
+ // ── emulator helpers ──
165
+ // PUT /__emulator/region/config { self, regions, fapi_isolation_default, frontend_api_host }: what the deployment is told (the region table and which stack this is).
166
+ { method: 'PUT', pattern: '/__emulator/region/config', public: true, handler: (c) => {
167
+ const s = st(c.engine);
168
+ const b = c.body;
169
+ const next = parseTable(b.self === undefined ? s.self : b.self, b.regions === undefined ? s.regions : b.regions);
170
+ if (b.fapi_isolation_default !== undefined && b.fapi_isolation_default !== 'off' && b.fapi_isolation_default !== 'enforce')
171
+ throw (0, emu4_shared_1.bad)('fapi_isolation_default is off or enforce.', 'fapi_isolation_default');
172
+ if (b.frontend_api_host !== undefined && (typeof b.frontend_api_host !== 'string' || !b.frontend_api_host))
173
+ throw (0, emu4_shared_1.bad)('frontend_api_host is a host name.', 'frontend_api_host');
174
+ s.self = next.self;
175
+ s.regions = next.regions;
176
+ if (b.fapi_isolation_default !== undefined)
177
+ s.isolationDefault = b.fapi_isolation_default;
178
+ if (b.frontend_api_host !== undefined)
179
+ s.frontendApiHost = b.frontend_api_host;
180
+ return { body: view(s) };
181
+ } },
182
+ // GET /__emulator/region/decision: would the stack answering serve this instance, or refuse it with 421?
183
+ { method: 'GET', pattern: '/__emulator/region/decision', public: true, handler: (c) => {
184
+ const d = decision(st(c.engine));
185
+ return { body: d.ok ? { object: 'region_decision', serves: true } : { object: 'region_decision', serves: false, pinned: d.pinned, serve_from: { region: d.region, fapi_origin: d.fapi_origin, bapi_origin: d.bapi_origin } } };
186
+ } },
187
+ ];
188
+ }
189
+ //# sourceMappingURL=emu4-region.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emu4-region.js","sourceRoot":"","sources":["../../src/handlers/emu4-region.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { Engine, RouteDef } from '../engine';
2
+ interface XNode {
3
+ name: string;
4
+ attrs: Record<string, string>;
5
+ kids: XNode[];
6
+ text: string;
7
+ }
8
+ export declare function parseXml(src: string): XNode | null;
9
+ /** Called once by the engine: hands the SOAP route its raw XML body (the engine itself only reads JSON and form bodies). */
10
+ export declare function installSaml(e: Engine): void;
11
+ export declare function samlHandlers(): RouteDef[];
12
+ export {};