@tern-secure/auth 1.1.0-canary.v20251030165007 → 1.1.0-canary.v20251125170702

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 (276) hide show
  1. package/dist/492_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
  2. package/dist/687_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
  3. package/dist/68_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
  4. package/dist/framework_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
  5. package/dist/signin_ternsecure_f36de9_1.1.0-canary.v20251125170702.css +2 -0
  6. package/dist/signin_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
  7. package/dist/signup_ternsecure_f36de9_1.1.0-canary.v20251125170702.css +2 -0
  8. package/dist/signup_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
  9. package/dist/ternsecure.browser.js +30 -0
  10. package/dist/ternsecure.css +2 -0
  11. package/dist/ternsecure.js +17 -0
  12. package/dist/ternsecure.mjs +17 -0
  13. package/dist/types/auth/AuthCookieManager.d.ts +17 -6
  14. package/dist/types/auth/cookies/authTime_cookie.d.ts +6 -0
  15. package/dist/types/index.browser.d.ts +1 -0
  16. package/dist/types/index.d.ts +3 -10
  17. package/dist/types/instance/c_coreApiClient.d.ts +2 -2
  18. package/dist/types/instance/constants.d.ts +3 -0
  19. package/dist/types/instance/coreApiClient.d.ts +0 -1
  20. package/dist/types/instance/events.d.ts +0 -1
  21. package/dist/types/instance/{TernAuth.d.ts → ternsecure.d.ts} +31 -19
  22. package/dist/types/lib/utils.d.ts +2 -0
  23. package/dist/types/resources/Base.d.ts +16 -3
  24. package/dist/types/resources/Error.d.ts +0 -1
  25. package/dist/types/resources/Session.d.ts +2 -2
  26. package/dist/types/resources/SignIn.d.ts +27 -10
  27. package/dist/types/resources/SignUp.d.ts +12 -10
  28. package/dist/types/resources/internal.d.ts +1 -2
  29. package/dist/types/ui/Renderer.d.ts +26 -0
  30. package/dist/types/ui/common/ProviderInitialIcon.d.ts +6 -0
  31. package/dist/types/ui/common/VerificationCodeCard.d.ts +12 -0
  32. package/dist/types/ui/common/VerificationLinkCard.d.ts +7 -0
  33. package/dist/types/ui/common/constants.d.ts +8 -0
  34. package/dist/types/ui/common/index.d.ts +3 -0
  35. package/dist/types/ui/components/sign-in/ResetPassword.d.ts +1 -0
  36. package/dist/types/ui/components/sign-in/ResetPasswordSuccess.d.ts +1 -0
  37. package/dist/types/ui/components/sign-in/SignIn.d.ts +4 -0
  38. package/dist/types/ui/components/sign-in/SignInEmailLinkCard.d.ts +2 -0
  39. package/dist/types/ui/components/sign-in/SignInFactorOne.d.ts +1 -0
  40. package/dist/types/ui/components/sign-in/SignInFactorOneCodeForm.d.ts +7 -0
  41. package/dist/types/ui/components/sign-in/SignInFactorOnePasswordCard.d.ts +6 -0
  42. package/dist/types/ui/components/sign-in/SignInFactorOnePhoneCodeCard.d.ts +7 -0
  43. package/dist/types/ui/components/sign-in/SignInPassword.d.ts +8 -0
  44. package/dist/types/ui/components/sign-in/SignInSocialButtons.d.ts +1 -0
  45. package/dist/types/ui/components/sign-in/SignInStart.d.ts +7 -0
  46. package/dist/types/ui/components/sign-in/SignInVerifyEmail.d.ts +1 -0
  47. package/dist/types/ui/components/sign-in/index.d.ts +4 -0
  48. package/dist/types/ui/components/sign-up/SignUp.d.ts +8 -0
  49. package/dist/types/ui/components/sign-up/SignUpEmailLinkCard.d.ts +2 -0
  50. package/dist/types/ui/components/sign-up/SignUpSocialButtons.d.ts +1 -0
  51. package/dist/types/ui/components/sign-up/SignUpStart.d.ts +1 -0
  52. package/dist/types/ui/components/sign-up/SignUpVerifyEmail.d.ts +1 -0
  53. package/dist/types/ui/components/sign-up/index.d.ts +2 -0
  54. package/dist/types/ui/components/sign-up/util.d.ts +14 -0
  55. package/dist/types/ui/components/user-button/index.d.ts +1 -0
  56. package/dist/types/ui/components/user-button/userButton.d.ts +1 -0
  57. package/dist/types/ui/ctx/TernAuthContext.d.ts +4 -0
  58. package/dist/types/ui/ctx/TernAuthUIComponentCtx.d.ts +8 -0
  59. package/dist/types/ui/ctx/TernSecureContextWrapper.d.ts +8 -0
  60. package/dist/types/ui/ctx/TernSecureOptions.d.ts +10 -0
  61. package/dist/types/ui/ctx/components/SignIn.d.ts +21 -0
  62. package/dist/types/ui/ctx/components/SignUp.d.ts +14 -0
  63. package/dist/types/ui/ctx/components/UserButton.d.ts +10 -0
  64. package/dist/types/ui/ctx/components/index.d.ts +3 -0
  65. package/dist/types/ui/ctx/index.d.ts +4 -0
  66. package/dist/types/ui/ctx/utils.d.ts +3 -0
  67. package/dist/types/ui/customize/FieldControl.d.ts +15 -0
  68. package/dist/types/ui/customize/FieldLabelControl.d.ts +11 -0
  69. package/dist/types/ui/customize/Form.d.ts +36 -0
  70. package/dist/types/ui/elements/CodeControl.d.ts +47 -0
  71. package/dist/types/ui/elements/ErrorCard.d.ts +10 -0
  72. package/dist/types/ui/elements/LoadingCard.d.ts +1 -0
  73. package/dist/types/ui/elements/RouterLink.d.ts +42 -0
  74. package/dist/types/ui/elements/SocialButtons.d.ts +6 -0
  75. package/dist/types/ui/elements/TimerButton.d.ts +9 -0
  76. package/dist/types/ui/elements/alert.d.ts +8 -0
  77. package/dist/types/ui/elements/avatar.d.ts +6 -0
  78. package/dist/types/ui/elements/button.d.ts +10 -0
  79. package/dist/types/ui/elements/card.d.ts +9 -0
  80. package/dist/types/ui/elements/ctx/CardStateCtx.d.ts +26 -0
  81. package/dist/types/ui/elements/ctx/index.d.ts +1 -0
  82. package/dist/types/ui/elements/field.d.ts +24 -0
  83. package/dist/types/ui/elements/index.d.ts +16 -0
  84. package/dist/types/ui/elements/input.d.ts +3 -0
  85. package/dist/types/ui/elements/label.d.ts +4 -0
  86. package/dist/types/ui/elements/separator.d.ts +4 -0
  87. package/dist/types/ui/hooks/index.d.ts +6 -0
  88. package/dist/types/ui/hooks/useEmailLink.d.ts +11 -0
  89. package/dist/types/ui/hooks/useFetch.d.ts +44 -0
  90. package/dist/types/ui/hooks/useLoadingStatus.d.ts +14 -0
  91. package/dist/types/ui/hooks/useNavigateToFlowStart.d.ts +3 -0
  92. package/dist/types/ui/hooks/useSafeState.d.ts +9 -0
  93. package/dist/types/ui/hooks/useWindowEventListener.d.ts +3 -0
  94. package/dist/types/ui/icons/index.d.ts +13 -0
  95. package/dist/types/ui/lazyLoading/common.d.ts +2 -0
  96. package/dist/types/ui/lazyLoading/components.d.ts +11 -0
  97. package/dist/types/ui/lazyLoading/providersCtx.d.ts +26 -0
  98. package/dist/types/ui/portal/index.d.ts +12 -0
  99. package/dist/types/ui/router/BaseRouter.d.ts +21 -0
  100. package/dist/types/ui/router/HashRouter.d.ts +8 -0
  101. package/dist/types/ui/router/PathRouter.d.ts +8 -0
  102. package/dist/types/ui/router/Route.d.ts +19 -0
  103. package/dist/types/ui/router/RouterCtx.d.ts +32 -0
  104. package/dist/types/ui/router/Switch.d.ts +4 -0
  105. package/dist/types/ui/router/index.d.ts +7 -0
  106. package/dist/types/ui/router/newPaths.d.ts +1 -0
  107. package/dist/types/ui/router/pathToRegexp.d.ts +127 -0
  108. package/dist/types/ui/types.d.ts +18 -0
  109. package/dist/types/ui/utils/form.d.ts +19 -0
  110. package/dist/types/ui/utils/index.d.ts +1 -0
  111. package/dist/types/ui/utils/sleep.d.ts +1 -0
  112. package/dist/types/utils/construct.d.ts +3 -1
  113. package/dist/types/utils/index.d.ts +1 -1
  114. package/dist/types/utils/normalizeRoutingOptions.d.ts +6 -0
  115. package/dist/types/utils/path.d.ts +0 -1
  116. package/dist/types/utils/querystring.d.ts +0 -1
  117. package/dist/types/utils/redirectUrls.d.ts +4 -9
  118. package/dist/types/utils/windowNavigate.d.ts +0 -1
  119. package/dist/ui-common_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
  120. package/dist/userbutton_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
  121. package/dist/vendors_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
  122. package/package.json +64 -25
  123. package/dist/cjs/auth/AuthCookieManager.js +0 -100
  124. package/dist/cjs/auth/AuthCookieManager.js.map +0 -1
  125. package/dist/cjs/auth/cookies/session.js +0 -83
  126. package/dist/cjs/auth/cookies/session.js.map +0 -1
  127. package/dist/cjs/auth/request.js +0 -159
  128. package/dist/cjs/auth/request.js.map +0 -1
  129. package/dist/cjs/global.d.js +0 -2
  130. package/dist/cjs/global.d.js.map +0 -1
  131. package/dist/cjs/index.js +0 -47
  132. package/dist/cjs/index.js.map +0 -1
  133. package/dist/cjs/instance/TernAuth.js +0 -562
  134. package/dist/cjs/instance/TernAuth.js.map +0 -1
  135. package/dist/cjs/instance/TernAuthServer.js +0 -95
  136. package/dist/cjs/instance/TernAuthServer.js.map +0 -1
  137. package/dist/cjs/instance/c_coreApiClient.js +0 -264
  138. package/dist/cjs/instance/c_coreApiClient.js.map +0 -1
  139. package/dist/cjs/instance/coreApiClient.js +0 -255
  140. package/dist/cjs/instance/coreApiClient.js.map +0 -1
  141. package/dist/cjs/instance/events.js +0 -39
  142. package/dist/cjs/instance/events.js.map +0 -1
  143. package/dist/cjs/instance/jwtClient.js +0 -72
  144. package/dist/cjs/instance/jwtClient.js.map +0 -1
  145. package/dist/cjs/resources/Base.js +0 -137
  146. package/dist/cjs/resources/Base.js.map +0 -1
  147. package/dist/cjs/resources/Error.js +0 -31
  148. package/dist/cjs/resources/Error.js.map +0 -1
  149. package/dist/cjs/resources/Session.js +0 -105
  150. package/dist/cjs/resources/Session.js.map +0 -1
  151. package/dist/cjs/resources/SignIn.js +0 -256
  152. package/dist/cjs/resources/SignIn.js.map +0 -1
  153. package/dist/cjs/resources/SignUp.js +0 -72
  154. package/dist/cjs/resources/SignUp.js.map +0 -1
  155. package/dist/cjs/resources/Token.js +0 -32
  156. package/dist/cjs/resources/Token.js.map +0 -1
  157. package/dist/cjs/resources/UserData.js +0 -43
  158. package/dist/cjs/resources/UserData.js.map +0 -1
  159. package/dist/cjs/resources/cookie.js +0 -154
  160. package/dist/cjs/resources/cookie.js.map +0 -1
  161. package/dist/cjs/resources/index.js +0 -23
  162. package/dist/cjs/resources/index.js.map +0 -1
  163. package/dist/cjs/resources/internal.js +0 -35
  164. package/dist/cjs/resources/internal.js.map +0 -1
  165. package/dist/cjs/utils/construct.js +0 -253
  166. package/dist/cjs/utils/construct.js.map +0 -1
  167. package/dist/cjs/utils/index.js +0 -29
  168. package/dist/cjs/utils/index.js.map +0 -1
  169. package/dist/cjs/utils/jwt.js +0 -46
  170. package/dist/cjs/utils/jwt.js.map +0 -1
  171. package/dist/cjs/utils/mapDecode.js +0 -33
  172. package/dist/cjs/utils/mapDecode.js.map +0 -1
  173. package/dist/cjs/utils/path.js +0 -33
  174. package/dist/cjs/utils/path.js.map +0 -1
  175. package/dist/cjs/utils/querystring.js +0 -70
  176. package/dist/cjs/utils/querystring.js.map +0 -1
  177. package/dist/cjs/utils/redirectUrls.js +0 -156
  178. package/dist/cjs/utils/redirectUrls.js.map +0 -1
  179. package/dist/cjs/utils/windowNavigate.js +0 -45
  180. package/dist/cjs/utils/windowNavigate.js.map +0 -1
  181. package/dist/esm/auth/AuthCookieManager.js +0 -76
  182. package/dist/esm/auth/AuthCookieManager.js.map +0 -1
  183. package/dist/esm/auth/cookies/session.js +0 -58
  184. package/dist/esm/auth/cookies/session.js.map +0 -1
  185. package/dist/esm/auth/request.js +0 -134
  186. package/dist/esm/auth/request.js.map +0 -1
  187. package/dist/esm/global.d.js +0 -1
  188. package/dist/esm/global.d.js.map +0 -1
  189. package/dist/esm/index.js +0 -16
  190. package/dist/esm/index.js.map +0 -1
  191. package/dist/esm/instance/TernAuth.js +0 -548
  192. package/dist/esm/instance/TernAuth.js.map +0 -1
  193. package/dist/esm/instance/TernAuthServer.js +0 -73
  194. package/dist/esm/instance/TernAuthServer.js.map +0 -1
  195. package/dist/esm/instance/c_coreApiClient.js +0 -236
  196. package/dist/esm/instance/c_coreApiClient.js.map +0 -1
  197. package/dist/esm/instance/coreApiClient.js +0 -226
  198. package/dist/esm/instance/coreApiClient.js.map +0 -1
  199. package/dist/esm/instance/events.js +0 -14
  200. package/dist/esm/instance/events.js.map +0 -1
  201. package/dist/esm/instance/jwtClient.js +0 -47
  202. package/dist/esm/instance/jwtClient.js.map +0 -1
  203. package/dist/esm/resources/Base.js +0 -113
  204. package/dist/esm/resources/Base.js.map +0 -1
  205. package/dist/esm/resources/Error.js +0 -9
  206. package/dist/esm/resources/Error.js.map +0 -1
  207. package/dist/esm/resources/Session.js +0 -81
  208. package/dist/esm/resources/Session.js.map +0 -1
  209. package/dist/esm/resources/SignIn.js +0 -240
  210. package/dist/esm/resources/SignIn.js.map +0 -1
  211. package/dist/esm/resources/SignUp.js +0 -48
  212. package/dist/esm/resources/SignUp.js.map +0 -1
  213. package/dist/esm/resources/Token.js +0 -8
  214. package/dist/esm/resources/Token.js.map +0 -1
  215. package/dist/esm/resources/UserData.js +0 -19
  216. package/dist/esm/resources/UserData.js.map +0 -1
  217. package/dist/esm/resources/cookie.js +0 -130
  218. package/dist/esm/resources/cookie.js.map +0 -1
  219. package/dist/esm/resources/index.js +0 -2
  220. package/dist/esm/resources/index.js.map +0 -1
  221. package/dist/esm/resources/internal.js +0 -8
  222. package/dist/esm/resources/internal.js.map +0 -1
  223. package/dist/esm/utils/construct.js +0 -215
  224. package/dist/esm/utils/construct.js.map +0 -1
  225. package/dist/esm/utils/index.js +0 -5
  226. package/dist/esm/utils/index.js.map +0 -1
  227. package/dist/esm/utils/jwt.js +0 -22
  228. package/dist/esm/utils/jwt.js.map +0 -1
  229. package/dist/esm/utils/mapDecode.js +0 -9
  230. package/dist/esm/utils/mapDecode.js.map +0 -1
  231. package/dist/esm/utils/path.js +0 -9
  232. package/dist/esm/utils/path.js.map +0 -1
  233. package/dist/esm/utils/querystring.js +0 -45
  234. package/dist/esm/utils/querystring.js.map +0 -1
  235. package/dist/esm/utils/redirectUrls.js +0 -132
  236. package/dist/esm/utils/redirectUrls.js.map +0 -1
  237. package/dist/esm/utils/windowNavigate.js +0 -19
  238. package/dist/esm/utils/windowNavigate.js.map +0 -1
  239. package/dist/types/auth/AuthCookieManager.d.ts.map +0 -1
  240. package/dist/types/auth/cookies/session.d.ts +0 -8
  241. package/dist/types/auth/cookies/session.d.ts.map +0 -1
  242. package/dist/types/auth/request.d.ts +0 -49
  243. package/dist/types/auth/request.d.ts.map +0 -1
  244. package/dist/types/index.d.ts.map +0 -1
  245. package/dist/types/instance/TernAuth.d.ts.map +0 -1
  246. package/dist/types/instance/TernAuthServer.d.ts +0 -32
  247. package/dist/types/instance/TernAuthServer.d.ts.map +0 -1
  248. package/dist/types/instance/c_coreApiClient.d.ts.map +0 -1
  249. package/dist/types/instance/coreApiClient.d.ts.map +0 -1
  250. package/dist/types/instance/events.d.ts.map +0 -1
  251. package/dist/types/instance/jwtClient.d.ts +0 -22
  252. package/dist/types/instance/jwtClient.d.ts.map +0 -1
  253. package/dist/types/resources/Base.d.ts.map +0 -1
  254. package/dist/types/resources/Error.d.ts.map +0 -1
  255. package/dist/types/resources/Session.d.ts.map +0 -1
  256. package/dist/types/resources/SignIn.d.ts.map +0 -1
  257. package/dist/types/resources/SignUp.d.ts.map +0 -1
  258. package/dist/types/resources/Token.d.ts +0 -5
  259. package/dist/types/resources/Token.d.ts.map +0 -1
  260. package/dist/types/resources/UserData.d.ts +0 -8
  261. package/dist/types/resources/UserData.d.ts.map +0 -1
  262. package/dist/types/resources/cookie.d.ts +0 -24
  263. package/dist/types/resources/cookie.d.ts.map +0 -1
  264. package/dist/types/resources/index.d.ts +0 -2
  265. package/dist/types/resources/index.d.ts.map +0 -1
  266. package/dist/types/resources/internal.d.ts.map +0 -1
  267. package/dist/types/utils/construct.d.ts.map +0 -1
  268. package/dist/types/utils/index.d.ts.map +0 -1
  269. package/dist/types/utils/jwt.d.ts +0 -12
  270. package/dist/types/utils/jwt.d.ts.map +0 -1
  271. package/dist/types/utils/mapDecode.d.ts +0 -4
  272. package/dist/types/utils/mapDecode.d.ts.map +0 -1
  273. package/dist/types/utils/path.d.ts.map +0 -1
  274. package/dist/types/utils/querystring.d.ts.map +0 -1
  275. package/dist/types/utils/redirectUrls.d.ts.map +0 -1
  276. package/dist/types/utils/windowNavigate.d.ts.map +0 -1
@@ -1,95 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var TernAuthServer_exports = {};
20
- __export(TernAuthServer_exports, {
21
- TernServerAuth: () => TernServerAuth
22
- });
23
- module.exports = __toCommonJS(TernAuthServer_exports);
24
- var import_app = require("firebase/app");
25
- var import_auth = require("firebase/auth");
26
- class TernServerAuth {
27
- static instance = null;
28
- auth;
29
- #options = {};
30
- constructor() {
31
- }
32
- static getInstance() {
33
- if (!this.instance) {
34
- this.instance = new TernServerAuth();
35
- }
36
- return this.instance;
37
- }
38
- static initialize(options) {
39
- const instance = this.getInstance();
40
- instance.#initialize(options);
41
- return instance;
42
- }
43
- #initialize(options) {
44
- this.#options = this.#initOptions(options);
45
- }
46
- static clearInstance() {
47
- this.instance = null;
48
- }
49
- getAuthIdToken = async () => {
50
- await this.auth.authStateReady();
51
- if (!this.auth.currentUser) return;
52
- return await (0, import_auth.getIdToken)(this.auth.currentUser);
53
- };
54
- getAuthenticatedAppFromHeaders = async (headers) => {
55
- const authHeader = headers.get("Authorization");
56
- const idToken = authHeader == null ? void 0 : authHeader.split("Bearer ")[1];
57
- let appSettings = {};
58
- appSettings = {
59
- releaseOnDeref: headers
60
- };
61
- if (idToken && idToken.trim()) {
62
- appSettings.authIdToken = idToken;
63
- }
64
- return this.getServerApp(appSettings);
65
- };
66
- getServerApp = async (appSettings) => {
67
- const firebaseServerConfig = this.#options.firebaseServerConfig;
68
- if (!firebaseServerConfig) {
69
- throw new Error(
70
- "Firebase server configuration is required to initialize the server app"
71
- );
72
- }
73
- const firebaseServerApp = (0, import_app.initializeServerApp)(
74
- firebaseServerConfig,
75
- appSettings || {}
76
- );
77
- this.auth = (0, import_auth.getAuth)(firebaseServerApp);
78
- await this.auth.authStateReady();
79
- return {
80
- firebaseServerApp,
81
- currentUser: this.auth.currentUser,
82
- auth: this.auth
83
- };
84
- };
85
- #initOptions = (options) => {
86
- return {
87
- ...options
88
- };
89
- };
90
- }
91
- // Annotate the CommonJS export names for ESM import in node:
92
- 0 && (module.exports = {
93
- TernServerAuth
94
- });
95
- //# sourceMappingURL=TernAuthServer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/instance/TernAuthServer.ts"],"sourcesContent":["import type { TernSecureConfig, TernSecureUser } from \"@tern-secure/types\";\nimport type {\n FirebaseServerApp,\n FirebaseServerAppSettings} from \"firebase/app\";\nimport {\n initializeServerApp\n} from \"firebase/app\";\nimport type { Auth} from \"firebase/auth\";\nimport { getAuth, getIdToken } from \"firebase/auth\";\n\ntype TernSecureServerConfig = {\n apiKey: string;\n};\nexport interface TernServerAuthOptions {\n firebaseConfig?: TernSecureConfig;\n firebaseServerConfig?: TernSecureServerConfig;\n authIdToken?: string;\n}\n\nexport interface AuthenticatedApp {\n firebaseServerApp: FirebaseServerApp;\n auth: Auth;\n currentUser?: TernSecureUser | null;\n}\n\nexport class TernServerAuth {\n private static instance: TernServerAuth | null = null;\n private auth!: Auth;\n #options: TernServerAuthOptions = {};\n\n public constructor() {}\n\n static getInstance(): TernServerAuth {\n if (!this.instance) {\n this.instance = new TernServerAuth();\n }\n return this.instance;\n }\n\n public static initialize(options: TernServerAuthOptions): TernServerAuth {\n const instance = this.getInstance();\n instance.#initialize(options);\n return instance;\n }\n\n #initialize(options: TernServerAuthOptions): void {\n this.#options = this.#initOptions(options);\n }\n\n static clearInstance(): void {\n this.instance = null;\n }\n\n getAuthIdToken = async (): Promise<string | undefined> => {\n await this.auth.authStateReady();\n if (!this.auth.currentUser) return;\n return await getIdToken(this.auth.currentUser);\n };\n\n getAuthenticatedAppFromHeaders = async (headers: {\n get: (key: string) => string | null;\n }): Promise<AuthenticatedApp> => {\n const authHeader = headers.get(\"Authorization\");\n const idToken = authHeader?.split(\"Bearer \")[1];\n\n let appSettings: FirebaseServerAppSettings = {};\n\n appSettings = {\n releaseOnDeref: headers,\n };\n\n if (idToken && idToken.trim()) {\n appSettings.authIdToken = idToken;\n }\n\n return this.getServerApp(appSettings);\n };\n\n getServerApp = async (\n appSettings?: FirebaseServerAppSettings\n ): Promise<AuthenticatedApp> => {\n const firebaseServerConfig = this.#options.firebaseServerConfig;\n if (!firebaseServerConfig) {\n throw new Error(\n \"Firebase server configuration is required to initialize the server app\"\n );\n }\n\n const firebaseServerApp = initializeServerApp(\n firebaseServerConfig,\n appSettings || {}\n );\n\n this.auth = getAuth(firebaseServerApp);\n await this.auth.authStateReady();\n\n return {\n firebaseServerApp,\n currentUser: this.auth.currentUser,\n auth: this.auth,\n };\n };\n\n #initOptions = (options?: TernServerAuthOptions): TernServerAuthOptions => {\n return {\n ...options,\n };\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,iBAEO;AAEP,kBAAoC;AAiB7B,MAAM,eAAe;AAAA,EAC1B,OAAe,WAAkC;AAAA,EACzC;AAAA,EACR,WAAkC,CAAC;AAAA,EAE5B,cAAc;AAAA,EAAC;AAAA,EAEtB,OAAO,cAA8B;AACnC,QAAI,CAAC,KAAK,UAAU;AAClB,WAAK,WAAW,IAAI,eAAe;AAAA,IACrC;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,OAAc,WAAW,SAAgD;AACvE,UAAM,WAAW,KAAK,YAAY;AAClC,aAAS,YAAY,OAAO;AAC5B,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,SAAsC;AAChD,SAAK,WAAW,KAAK,aAAa,OAAO;AAAA,EAC3C;AAAA,EAEA,OAAO,gBAAsB;AAC3B,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,iBAAiB,YAAyC;AACxD,UAAM,KAAK,KAAK,eAAe;AAC/B,QAAI,CAAC,KAAK,KAAK,YAAa;AAC5B,WAAO,UAAM,wBAAW,KAAK,KAAK,WAAW;AAAA,EAC/C;AAAA,EAEA,iCAAiC,OAAO,YAEP;AAC/B,UAAM,aAAa,QAAQ,IAAI,eAAe;AAC9C,UAAM,UAAU,yCAAY,MAAM,WAAW;AAE7C,QAAI,cAAyC,CAAC;AAE9C,kBAAc;AAAA,MACZ,gBAAgB;AAAA,IAClB;AAEA,QAAI,WAAW,QAAQ,KAAK,GAAG;AAC7B,kBAAY,cAAc;AAAA,IAC5B;AAEA,WAAO,KAAK,aAAa,WAAW;AAAA,EACtC;AAAA,EAEA,eAAe,OACb,gBAC8B;AAC9B,UAAM,uBAAuB,KAAK,SAAS;AAC3C,QAAI,CAAC,sBAAsB;AACzB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,wBAAoB;AAAA,MACxB;AAAA,MACA,eAAe,CAAC;AAAA,IAClB;AAEA,SAAK,WAAO,qBAAQ,iBAAiB;AACrC,UAAM,KAAK,KAAK,eAAe;AAE/B,WAAO;AAAA,MACL;AAAA,MACA,aAAa,KAAK,KAAK;AAAA,MACvB,MAAM,KAAK;AAAA,IACb;AAAA,EACF;AAAA,EAEA,eAAe,CAAC,YAA2D;AACzE,WAAO;AAAA,MACL,GAAG;AAAA,IACL;AAAA,EACF;AACF;","names":[]}
@@ -1,264 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var c_coreApiClient_exports = {};
20
- __export(c_coreApiClient_exports, {
21
- CircuitOpenError: () => CircuitOpenError,
22
- HTTPError: () => HTTPError,
23
- NetworkError: () => NetworkError,
24
- TimeoutError: () => TimeoutError,
25
- createCoreApiClient: () => createCoreApiClient
26
- });
27
- module.exports = __toCommonJS(c_coreApiClient_exports);
28
- var import_caseUtils = require("@tern-secure/shared/caseUtils");
29
- var import_utils = require("../utils");
30
- class NetworkError extends Error {
31
- constructor(url, original) {
32
- super(`Network error for ${url}: ${original.message}`);
33
- this.url = url;
34
- this.original = original;
35
- this.name = "NetworkError";
36
- }
37
- }
38
- class TimeoutError extends Error {
39
- constructor() {
40
- super("Request timed out");
41
- this.name = "TimeoutError";
42
- }
43
- }
44
- class CircuitOpenError extends Error {
45
- constructor() {
46
- super("Circuit breaker is open");
47
- this.name = "CircuitOpenError";
48
- }
49
- }
50
- class HTTPError extends Error {
51
- constructor(status, url, body) {
52
- super(`HTTP ${status} error for ${url}`);
53
- this.status = status;
54
- this.url = url;
55
- this.body = body;
56
- this.name = "HTTPError";
57
- }
58
- }
59
- function createInitialState(clientOptions = {}) {
60
- return {
61
- circuitBreaker: {
62
- failures: 0,
63
- lastFailureTime: 0,
64
- state: "closed"
65
- },
66
- beforeRequestHooks: [],
67
- afterResponseHooks: [],
68
- clientOptions
69
- };
70
- }
71
- function addBeforeRequestHook(state, hook) {
72
- state.beforeRequestHooks.push(hook);
73
- }
74
- function addAfterResponseHook(state, hook) {
75
- state.afterResponseHooks.push(hook);
76
- }
77
- async function runBeforeRequestHooks(state) {
78
- for (const hook of state.beforeRequestHooks) {
79
- const result = await hook();
80
- if (result === false) return false;
81
- }
82
- return true;
83
- }
84
- async function runAfterResponseHooks(state, response) {
85
- for (const hook of state.afterResponseHooks) {
86
- await hook(response);
87
- }
88
- }
89
- function checkCircuitBreaker(state, requestOptions) {
90
- const { recoveryTimeoutMs = 6e4 } = requestOptions;
91
- const now = Date.now();
92
- if (state.circuitBreaker.state === "open") {
93
- if (now - state.circuitBreaker.lastFailureTime >= recoveryTimeoutMs) {
94
- state.circuitBreaker.state = "half-open";
95
- } else {
96
- throw new CircuitOpenError();
97
- }
98
- }
99
- }
100
- function recordSuccess(state) {
101
- state.circuitBreaker.failures = 0;
102
- state.circuitBreaker.state = "closed";
103
- }
104
- function recordFailure(state, requestOptions) {
105
- const { failureThreshold = 5 } = requestOptions;
106
- state.circuitBreaker.failures++;
107
- state.circuitBreaker.lastFailureTime = Date.now();
108
- if (state.circuitBreaker.failures >= failureThreshold) {
109
- state.circuitBreaker.state = "open";
110
- }
111
- }
112
- function shouldRetry(state, requestOptions, error, method, attempt, maxTries) {
113
- const isRetryable = error instanceof NetworkError && method.toUpperCase() === "GET" && attempt < maxTries;
114
- if (!isRetryable) {
115
- recordFailure(state, requestOptions);
116
- }
117
- return isRetryable;
118
- }
119
- async function retryWithBackoff(state, requestOptions, attemptFn, shouldRetryFn) {
120
- const {
121
- initialDelay = 700,
122
- factor = 2,
123
- maxDelay = 5e3,
124
- maxTries = typeof navigator !== "undefined" && navigator.onLine ? 4 : 11
125
- } = requestOptions;
126
- let lastError;
127
- for (let attempt = 1; attempt <= maxTries; attempt++) {
128
- try {
129
- const result = await attemptFn();
130
- recordSuccess(state);
131
- return result;
132
- } catch (error) {
133
- lastError = error;
134
- if (!shouldRetryFn(error, attempt)) {
135
- throw error;
136
- }
137
- recordFailure(state, requestOptions);
138
- if (attempt < maxTries) {
139
- const delay = Math.min(initialDelay * Math.pow(factor, attempt - 1), maxDelay);
140
- await new Promise((resolve) => setTimeout(resolve, (0, import_caseUtils.jitteredDelay)(delay)));
141
- }
142
- }
143
- }
144
- throw lastError;
145
- }
146
- function createCoreApiClient(clientOptions) {
147
- function buildUrl(requestInit) {
148
- var _a, _b;
149
- const isLocalhost = ((_a = clientOptions.apiUrl) == null ? void 0 : _a.includes("localhost")) || ((_b = clientOptions.apiUrl) == null ? void 0 : _b.includes("127.0.0.1"));
150
- const { path } = requestInit;
151
- const { instanceType, domain, apiUrl, apiBasePath = "/api/auth" } = clientOptions;
152
- const domainInProd = instanceType === "production" ? domain : "";
153
- let baseUrl;
154
- if (isLocalhost) {
155
- baseUrl = (apiUrl == null ? void 0 : apiUrl.startsWith("http")) ? apiUrl : `http://${apiUrl}`;
156
- } else {
157
- baseUrl = `https://${domainInProd || apiUrl}`;
158
- }
159
- const fullPath = `${apiBasePath}/${path}`.replace(/\/+/g, "/");
160
- return (0, import_utils.buildURL)(
161
- {
162
- base: baseUrl,
163
- pathname: fullPath,
164
- searchParams: requestInit.search ? new URLSearchParams(requestInit.search) : void 0
165
- },
166
- { stringify: false }
167
- );
168
- }
169
- async function makeRequest(state2, init, opts = {}) {
170
- const requestInit = { ...init };
171
- const { method = "GET", body } = requestInit;
172
- const requestOptions = { ...opts };
173
- requestInit.url = buildUrl({ ...requestInit });
174
- checkCircuitBreaker(state2, requestOptions);
175
- const shouldContinue = await runBeforeRequestHooks(state2);
176
- if (!shouldContinue) {
177
- const mockResponse = new Response("{}", {
178
- status: 200
179
- });
180
- mockResponse.payload = { response: {} };
181
- await runAfterResponseHooks(state2, mockResponse);
182
- return mockResponse;
183
- }
184
- const { timeoutMs } = requestOptions;
185
- const overwrittenRequestMethod = method === "GET" ? "GET" : "POST";
186
- const url = requestInit.url.toString();
187
- requestInit.headers = new Headers(requestInit.headers);
188
- if (method !== "GET" && !(body instanceof FormData) && !requestInit.headers.has("content-type")) {
189
- requestInit.headers.set("content-type", "application/json");
190
- }
191
- if (requestInit.headers.get("content-type") === "application/x-www-form-urlencoded") {
192
- requestInit.body = body ? (0, import_utils.stringifyQueryParams)(body, {
193
- keyEncoder: import_caseUtils.camelToSnake
194
- }) : body;
195
- } else if (requestInit.headers.get("content-type") === "application/json" && body) {
196
- requestInit.body = typeof body === "string" ? body : JSON.stringify(body);
197
- }
198
- const attemptRequest = async () => {
199
- const controller = new AbortController();
200
- const timeoutId = timeoutMs ? setTimeout(() => {
201
- controller.abort();
202
- }, timeoutMs) : null;
203
- let response;
204
- const fetchOpts = {
205
- ...requestInit,
206
- credentials: "include",
207
- method: overwrittenRequestMethod
208
- };
209
- try {
210
- response = await fetch(url, fetchOpts);
211
- if (timeoutId) clearTimeout(timeoutId);
212
- let payload = null;
213
- if (response.status === 204) {
214
- payload = null;
215
- } else {
216
- try {
217
- const json = await response.json();
218
- payload = json;
219
- } catch {
220
- payload = { response: {} };
221
- }
222
- }
223
- const apiResponse = response;
224
- apiResponse.payload = payload;
225
- await runAfterResponseHooks(state2, apiResponse);
226
- return apiResponse;
227
- } catch (error) {
228
- if (timeoutId) clearTimeout(timeoutId);
229
- if (error.name === "AbortError") {
230
- throw new TimeoutError();
231
- }
232
- throw new NetworkError(url, error);
233
- }
234
- };
235
- return retryWithBackoff(
236
- state2,
237
- requestOptions,
238
- attemptRequest,
239
- (error, attempt) => shouldRetry(
240
- state2,
241
- requestOptions,
242
- error,
243
- overwrittenRequestMethod,
244
- attempt,
245
- requestOptions.maxTries || (typeof navigator !== "undefined" && navigator.onLine ? 4 : 11)
246
- )
247
- );
248
- }
249
- const state = createInitialState(clientOptions);
250
- return {
251
- onBeforeRequest: (hook) => addBeforeRequestHook(state, hook),
252
- onAfterResponse: (hook) => addAfterResponseHook(state, hook),
253
- request: (init, opts = {}) => makeRequest(state, init, opts)
254
- };
255
- }
256
- // Annotate the CommonJS export names for ESM import in node:
257
- 0 && (module.exports = {
258
- CircuitOpenError,
259
- HTTPError,
260
- NetworkError,
261
- TimeoutError,
262
- createCoreApiClient
263
- });
264
- //# sourceMappingURL=c_coreApiClient.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/instance/c_coreApiClient.ts"],"sourcesContent":["import { camelToSnake, jitteredDelay } from '@tern-secure/shared/caseUtils'\nimport type { InstanceType, TernSecureApiErrorJSON } from '@tern-secure/types';\n\nimport { buildURL as buildUrlUtil, stringifyQueryParams } from '../utils';\n\nexport type HTTPMethod =\n | 'CONNECT'\n | 'DELETE'\n | 'GET'\n | 'HEAD'\n | 'OPTIONS'\n | 'PATCH'\n | 'POST'\n | 'PUT'\n | 'TRACE';\n\nexport type ApiRequestInit = RequestInit & {\n path?: string;\n search?: ConstructorParameters<typeof URLSearchParams>[0];\n sessionId?: string;\n url?: URL;\n};\n\nexport interface ApiResponseJSON<T> {\n response: T;\n errors?: TernSecureApiErrorJSON[];\n}\n\nexport type ApiResponse<T> = Response & { payload: ApiResponseJSON<T> | null };\n\nexport type ApiRequestCallback<T> = (request: ApiRequestInit, response?: ApiResponse<T>) => unknown;\n\nexport interface ApiRequestOptions {\n timeoutMs?: number;\n maxTries?: number;\n initialDelay?: number;\n factor?: number;\n maxDelay?: number;\n failureThreshold?: number;\n recoveryTimeoutMs?: number;\n}\n\nexport interface ApiClientOptions {\n domain?: string;\n apiUrl?: string;\n frontendApi?: string;\n instanceType?: InstanceType;\n apiBasePath?: string;\n}\n\nexport interface ApiClient {\n onBeforeRequest: (hook: BeforeRequestHook) => void;\n onAfterResponse: (hook: AfterResponseHook) => void;\n request: <T>(init: ApiRequestInit, opts?: ApiRequestOptions) => Promise<ApiResponse<T>>;\n}\n\nexport type BeforeRequestHook = () => boolean | Promise<boolean>;\nexport type AfterResponseHook = (response: ApiResponse<any>) => boolean | Promise<boolean>;\n\n// Error classes\nexport class NetworkError extends Error {\n constructor(\n public url: string,\n public original: Error,\n ) {\n super(`Network error for ${url}: ${original.message}`);\n this.name = 'NetworkError';\n }\n}\n\nexport class TimeoutError extends Error {\n constructor() {\n super('Request timed out');\n this.name = 'TimeoutError';\n }\n}\n\nexport class CircuitOpenError extends Error {\n constructor() {\n super('Circuit breaker is open');\n this.name = 'CircuitOpenError';\n }\n}\n\nexport class HTTPError extends Error {\n constructor(\n public status: number,\n public url: string,\n public body?: any,\n ) {\n super(`HTTP ${status} error for ${url}`);\n this.name = 'HTTPError';\n }\n}\n\n// Circuit breaker state interface\ninterface CircuitBreakerState {\n failures: number;\n lastFailureTime: number;\n state: 'closed' | 'open' | 'half-open';\n}\n\n// Client state interface\ninterface ClientState {\n circuitBreaker: CircuitBreakerState;\n beforeRequestHooks: BeforeRequestHook[];\n afterResponseHooks: AfterResponseHook[];\n clientOptions: ApiClientOptions;\n}\n\nfunction createInitialState(clientOptions: ApiClientOptions = {}): ClientState {\n return {\n circuitBreaker: {\n failures: 0,\n lastFailureTime: 0,\n state: 'closed',\n },\n beforeRequestHooks: [],\n afterResponseHooks: [],\n clientOptions,\n };\n}\n\nfunction addBeforeRequestHook(state: ClientState, hook: BeforeRequestHook): void {\n state.beforeRequestHooks.push(hook);\n}\n\nfunction addAfterResponseHook(state: ClientState, hook: AfterResponseHook): void {\n state.afterResponseHooks.push(hook);\n}\n\nasync function runBeforeRequestHooks(state: ClientState): Promise<boolean> {\n for (const hook of state.beforeRequestHooks) {\n const result = await hook();\n if (result === false) return false;\n }\n return true;\n}\n\nasync function runAfterResponseHooks(\n state: ClientState,\n response: ApiResponse<any>,\n): Promise<void> {\n for (const hook of state.afterResponseHooks) {\n await hook(response);\n }\n}\n\nfunction checkCircuitBreaker(state: ClientState, requestOptions: ApiRequestOptions): void {\n const { recoveryTimeoutMs = 60000 } = requestOptions;\n const now = Date.now();\n\n if (state.circuitBreaker.state === 'open') {\n if (now - state.circuitBreaker.lastFailureTime >= recoveryTimeoutMs) {\n state.circuitBreaker.state = 'half-open';\n } else {\n throw new CircuitOpenError();\n }\n }\n}\n\nfunction recordSuccess(state: ClientState): void {\n state.circuitBreaker.failures = 0;\n state.circuitBreaker.state = 'closed';\n}\n\nfunction recordFailure(state: ClientState, requestOptions: ApiRequestOptions): void {\n const { failureThreshold = 5 } = requestOptions;\n state.circuitBreaker.failures++;\n state.circuitBreaker.lastFailureTime = Date.now();\n\n if (state.circuitBreaker.failures >= failureThreshold) {\n state.circuitBreaker.state = 'open';\n }\n}\n\nfunction shouldRetry(\n state: ClientState,\n requestOptions: ApiRequestOptions,\n error: any,\n method: string,\n attempt: number,\n maxTries: number,\n): boolean {\n const isRetryable =\n error instanceof NetworkError && method.toUpperCase() === 'GET' && attempt < maxTries;\n\n if (!isRetryable) {\n recordFailure(state, requestOptions);\n }\n\n return isRetryable;\n}\n\nasync function retryWithBackoff<T>(\n state: ClientState,\n requestOptions: ApiRequestOptions,\n attemptFn: () => Promise<T>,\n shouldRetryFn: (error: any, attempt: number) => boolean,\n): Promise<T> {\n const {\n initialDelay = 700,\n factor = 2,\n maxDelay = 5000,\n maxTries = typeof navigator !== 'undefined' && navigator.onLine ? 4 : 11,\n } = requestOptions;\n\n let lastError: any;\n\n for (let attempt = 1; attempt <= maxTries; attempt++) {\n try {\n const result = await attemptFn();\n recordSuccess(state);\n return result;\n } catch (error) {\n lastError = error;\n\n if (!shouldRetryFn(error, attempt)) {\n throw error;\n }\n\n recordFailure(state, requestOptions);\n\n if (attempt < maxTries) {\n const delay = Math.min(initialDelay * Math.pow(factor, attempt - 1), maxDelay);\n await new Promise(resolve => setTimeout(resolve, jitteredDelay(delay)));\n }\n }\n }\n\n throw lastError;\n}\n\nexport function createCoreApiClient(clientOptions: ApiClientOptions): ApiClient {\n function buildUrl(requestInit: ApiRequestInit): URL {\n const isLocalhost = clientOptions.apiUrl?.includes('localhost') || clientOptions.apiUrl?.includes('127.0.0.1');\n const { path } = requestInit;\n const { instanceType, domain, apiUrl, apiBasePath = '/api/auth' } = clientOptions;\n const domainInProd = instanceType === 'production' ? domain : '';\n\n let baseUrl: string;\n if (isLocalhost) {\n // For localhost, use http and the apiUrl directly\n baseUrl = apiUrl?.startsWith('http') ? apiUrl : `http://${apiUrl}`;\n } else {\n //const domainInProd = instanceType === 'production' ? domain : '';\n baseUrl = `https://${domainInProd || apiUrl}`;\n }\n\n const fullPath = `${apiBasePath}/${path}`.replace(/\\/+/g, '/'); \n return buildUrlUtil(\n {\n base: baseUrl,\n pathname: fullPath,\n searchParams: requestInit.search ? new URLSearchParams(requestInit.search) : undefined,\n },\n { stringify: false },\n );\n }\n\n async function makeRequest<T>(\n state: ClientState,\n init: ApiRequestInit,\n opts: ApiRequestOptions = {},\n ): Promise<ApiResponse<T>> {\n const requestInit = { ...init };\n const { method = 'GET', body } = requestInit;\n const requestOptions = { ...opts };\n\n requestInit.url = buildUrl({ ...requestInit });\n checkCircuitBreaker(state, requestOptions);\n\n const shouldContinue = await runBeforeRequestHooks(state);\n if (!shouldContinue) {\n const mockResponse = new Response('{}', {\n status: 200,\n }) as ApiResponse<T>;\n mockResponse.payload = { response: {} as T };\n await runAfterResponseHooks(state, mockResponse);\n return mockResponse;\n }\n\n const { timeoutMs } = requestOptions;\n\n const overwrittenRequestMethod = method === 'GET' ? 'GET' : 'POST';\n const url = requestInit.url.toString();\n\n requestInit.headers = new Headers(requestInit.headers);\n\n if (\n method !== 'GET' &&\n !(body instanceof FormData) &&\n !requestInit.headers.has('content-type')\n ) {\n requestInit.headers.set('content-type', 'application/json');\n }\n\n if (requestInit.headers.get('content-type') === 'application/x-www-form-urlencoded') {\n requestInit.body = body\n ? stringifyQueryParams(body as any as Record<string, string>, {\n keyEncoder: camelToSnake,\n })\n : body;\n } else if (requestInit.headers.get('content-type') === 'application/json' && body) {\n requestInit.body = typeof body === 'string' ? body : JSON.stringify(body);\n }\n\n const attemptRequest = async (): Promise<ApiResponse<T>> => {\n const controller = new AbortController();\n const timeoutId = timeoutMs\n ? setTimeout(() => {\n controller.abort();\n }, timeoutMs)\n : null;\n\n let response: Response;\n const fetchOpts: ApiRequestInit = {\n ...requestInit,\n credentials: 'include',\n method: overwrittenRequestMethod,\n };\n\n try {\n response = await fetch(url, fetchOpts);\n\n if (timeoutId) clearTimeout(timeoutId);\n\n let payload: ApiResponseJSON<T> | null = null;\n\n if (response.status === 204) {\n payload = null;\n } else {\n try {\n const json = await response.json();\n payload = json;\n } catch {\n payload = { response: {} as T };\n }\n }\n\n const apiResponse = response as ApiResponse<T>;\n apiResponse.payload = payload;\n\n await runAfterResponseHooks(state, apiResponse);\n\n return apiResponse;\n } catch (error: any) {\n if (timeoutId) clearTimeout(timeoutId);\n\n if (error.name === 'AbortError') {\n throw new TimeoutError();\n }\n\n throw new NetworkError(url, error);\n }\n };\n\n return retryWithBackoff(state, requestOptions, attemptRequest, (error, attempt) =>\n shouldRetry(\n state,\n requestOptions,\n error,\n overwrittenRequestMethod,\n attempt,\n requestOptions.maxTries || (typeof navigator !== 'undefined' && navigator.onLine ? 4 : 11),\n ),\n );\n }\n const state = createInitialState(clientOptions);\n\n return {\n onBeforeRequest: (hook: BeforeRequestHook) => addBeforeRequestHook(state, hook),\n onAfterResponse: (hook: AfterResponseHook) => addAfterResponseHook(state, hook),\n request: <T>(init: ApiRequestInit, opts: ApiRequestOptions = {}) =>\n makeRequest<T>(state, init, opts),\n };\n}\n"],"mappings":"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","names":["buildUrlUtil","state"]}
@@ -1,255 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var coreApiClient_exports = {};
20
- __export(coreApiClient_exports, {
21
- CircuitOpenError: () => CircuitOpenError,
22
- CoreApiClient: () => CoreApiClient,
23
- HTTPError: () => HTTPError,
24
- NetworkError: () => NetworkError,
25
- TimeoutError: () => TimeoutError,
26
- coreApiClient: () => coreApiClient
27
- });
28
- module.exports = __toCommonJS(coreApiClient_exports);
29
- var import_utils = require("../utils");
30
- class NetworkError extends Error {
31
- constructor(url, original) {
32
- super(`Network error for ${url}: ${original.message}`);
33
- this.url = url;
34
- this.original = original;
35
- this.name = "NetworkError";
36
- }
37
- }
38
- class TimeoutError extends Error {
39
- constructor() {
40
- super("Request timed out");
41
- this.name = "TimeoutError";
42
- }
43
- }
44
- class CircuitOpenError extends Error {
45
- constructor() {
46
- super("Circuit breaker is open");
47
- this.name = "CircuitOpenError";
48
- }
49
- }
50
- class HTTPError extends Error {
51
- constructor(status, url, body) {
52
- super(`HTTP ${status} error for ${url}`);
53
- this.status = status;
54
- this.url = url;
55
- this.body = body;
56
- this.name = "HTTPError";
57
- }
58
- }
59
- function camelToSnake(str) {
60
- return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
61
- }
62
- function jitteredDelay(delay) {
63
- return delay * Math.random();
64
- }
65
- function buildUrl(requestInit, options) {
66
- const { path } = requestInit;
67
- const baseUrl = options.apiUrl;
68
- if (!baseUrl) {
69
- throw new Error("API URL is required");
70
- }
71
- const fullPath = path ? path.startsWith("/") ? path : `/${path}` : "";
72
- const fullUrl = baseUrl.replace(/\/$/, "") + fullPath;
73
- return (0, import_utils.buildURL)(
74
- {
75
- base: fullUrl,
76
- searchParams: requestInit.search ? new URLSearchParams(requestInit.search) : void 0
77
- },
78
- { stringify: false }
79
- );
80
- }
81
- class CoreApiClient {
82
- constructor(options = {}) {
83
- this.options = options;
84
- }
85
- circuitBreaker = {
86
- failures: 0,
87
- lastFailureTime: 0,
88
- state: "closed"
89
- };
90
- beforeRequestHooks = [];
91
- afterResponseHooks = [];
92
- onBeforeRequest(hook) {
93
- this.beforeRequestHooks.push(hook);
94
- }
95
- onAfterResponse(hook) {
96
- this.afterResponseHooks.push(hook);
97
- }
98
- async runBeforeRequestHooks() {
99
- for (const hook of this.beforeRequestHooks) {
100
- const result = await hook();
101
- if (result === false) return false;
102
- }
103
- return true;
104
- }
105
- async runAfterResponseHooks(response) {
106
- for (const hook of this.afterResponseHooks) {
107
- await hook(response);
108
- }
109
- }
110
- checkCircuitBreaker() {
111
- const { recoveryTimeoutMs = 6e4 } = this.options;
112
- const now = Date.now();
113
- if (this.circuitBreaker.state === "open") {
114
- if (now - this.circuitBreaker.lastFailureTime >= recoveryTimeoutMs) {
115
- this.circuitBreaker.state = "half-open";
116
- } else {
117
- throw new CircuitOpenError();
118
- }
119
- }
120
- }
121
- recordSuccess() {
122
- this.circuitBreaker.failures = 0;
123
- this.circuitBreaker.state = "closed";
124
- }
125
- recordFailure() {
126
- const { failureThreshold = 5 } = this.options;
127
- this.circuitBreaker.failures++;
128
- this.circuitBreaker.lastFailureTime = Date.now();
129
- if (this.circuitBreaker.failures >= failureThreshold) {
130
- this.circuitBreaker.state = "open";
131
- }
132
- }
133
- shouldRetry(error, method, attempt, maxTries) {
134
- const isRetryable = error instanceof NetworkError && method.toUpperCase() === "GET" && attempt < maxTries;
135
- if (!isRetryable) {
136
- this.recordFailure();
137
- }
138
- return isRetryable;
139
- }
140
- async retryWithBackoff(attemptFn, shouldRetry) {
141
- const {
142
- initialDelay = 700,
143
- factor = 2,
144
- maxDelay = 5e3,
145
- maxTries = typeof navigator !== "undefined" && navigator.onLine ? 4 : 11
146
- } = this.options;
147
- let lastError;
148
- for (let attempt = 1; attempt <= maxTries; attempt++) {
149
- try {
150
- const result = await attemptFn();
151
- this.recordSuccess();
152
- return result;
153
- } catch (error) {
154
- lastError = error;
155
- if (!shouldRetry(error, attempt)) {
156
- throw error;
157
- }
158
- this.recordFailure();
159
- if (attempt < maxTries) {
160
- const delay = Math.min(initialDelay * Math.pow(factor, attempt - 1), maxDelay);
161
- await new Promise((resolve) => setTimeout(resolve, jitteredDelay(delay)));
162
- }
163
- }
164
- }
165
- throw lastError;
166
- }
167
- async request(init, opts = {}) {
168
- const requestInit = { ...init };
169
- const { method = "GET", body } = requestInit;
170
- requestInit.url = buildUrl({ ...init }, { ...opts });
171
- this.checkCircuitBreaker();
172
- const shouldContinue = await this.runBeforeRequestHooks();
173
- if (!shouldContinue) {
174
- const mockResponse = new Response("{}", {
175
- status: 200
176
- });
177
- mockResponse.payload = { response: {} };
178
- await this.runAfterResponseHooks(mockResponse);
179
- return mockResponse;
180
- }
181
- const mergedOptions = { ...opts };
182
- const { timeoutMs } = mergedOptions;
183
- const overwrittenRequestMethod = method === "GET" ? "GET" : "POST";
184
- const url = requestInit.url.toString();
185
- console.log("Request URL:", url);
186
- requestInit.headers = new Headers(requestInit.headers);
187
- if (method !== "GET" && !(body instanceof FormData) && !requestInit.headers.has("content-type")) {
188
- requestInit.headers.set("content-type", "application/json");
189
- }
190
- if (requestInit.headers.get("content-type") === "application/x-www-form-urlencoded") {
191
- requestInit.body = body ? (0, import_utils.stringifyQueryParams)(body, {
192
- keyEncoder: camelToSnake
193
- }) : body;
194
- } else if (requestInit.headers.get("content-type") === "application/json" && body) {
195
- requestInit.body = typeof body === "string" ? body : JSON.stringify(body);
196
- }
197
- const attemptRequest = async () => {
198
- const controller = new AbortController();
199
- const timeoutId = timeoutMs ? setTimeout(() => {
200
- controller.abort();
201
- }, timeoutMs) : null;
202
- let response;
203
- const fetchOpts = {
204
- ...requestInit,
205
- credentials: "include",
206
- method: overwrittenRequestMethod
207
- };
208
- try {
209
- response = await fetch(url, fetchOpts);
210
- if (timeoutId) clearTimeout(timeoutId);
211
- let payload = null;
212
- if (response.status === 204) {
213
- payload = null;
214
- } else {
215
- try {
216
- const json = await response.json();
217
- payload = json;
218
- } catch {
219
- payload = { response: {} };
220
- }
221
- }
222
- const apiResponse = response;
223
- apiResponse.payload = payload;
224
- await this.runAfterResponseHooks(apiResponse);
225
- return apiResponse;
226
- } catch (error) {
227
- if (timeoutId) clearTimeout(timeoutId);
228
- if (error.name === "AbortError") {
229
- throw new TimeoutError();
230
- }
231
- throw new NetworkError(url, error);
232
- }
233
- };
234
- return this.retryWithBackoff(
235
- attemptRequest,
236
- (error, attempt) => this.shouldRetry(
237
- error,
238
- overwrittenRequestMethod,
239
- attempt,
240
- mergedOptions.maxTries || (typeof navigator !== "undefined" && navigator.onLine ? 4 : 11)
241
- )
242
- );
243
- }
244
- }
245
- const coreApiClient = new CoreApiClient();
246
- // Annotate the CommonJS export names for ESM import in node:
247
- 0 && (module.exports = {
248
- CircuitOpenError,
249
- CoreApiClient,
250
- HTTPError,
251
- NetworkError,
252
- TimeoutError,
253
- coreApiClient
254
- });
255
- //# sourceMappingURL=coreApiClient.js.map