@oxy.so/core 1.0.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 (673) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +16 -0
  3. package/README.md +221 -0
  4. package/dist/cjs/.tsbuildinfo +1 -0
  5. package/dist/cjs/HttpService.js +1270 -0
  6. package/dist/cjs/OxyServices.base.js +390 -0
  7. package/dist/cjs/OxyServices.errors.js +95 -0
  8. package/dist/cjs/OxyServices.js +72 -0
  9. package/dist/cjs/boot/sessionColdBoot.js +395 -0
  10. package/dist/cjs/constants/version.js +16 -0
  11. package/dist/cjs/crypto/aead.js +79 -0
  12. package/dist/cjs/crypto/ecdh.js +35 -0
  13. package/dist/cjs/crypto/identityMarker.js +255 -0
  14. package/dist/cjs/crypto/kdf.js +39 -0
  15. package/dist/cjs/crypto/keyManager.js +2234 -0
  16. package/dist/cjs/crypto/polyfill.js +131 -0
  17. package/dist/cjs/crypto/recoveryPhrase.js +242 -0
  18. package/dist/cjs/crypto/signatureService.js +273 -0
  19. package/dist/cjs/i18n/accountCategoryLabels.js +44 -0
  20. package/dist/cjs/i18n/accountRoleLabels.js +27 -0
  21. package/dist/cjs/i18n/index.js +90 -0
  22. package/dist/cjs/i18n/locales/ar-SA.json +282 -0
  23. package/dist/cjs/i18n/locales/ca-ES.json +282 -0
  24. package/dist/cjs/i18n/locales/de-DE.json +282 -0
  25. package/dist/cjs/i18n/locales/en-US.json +2161 -0
  26. package/dist/cjs/i18n/locales/es-ES.json +2161 -0
  27. package/dist/cjs/i18n/locales/fr-FR.json +282 -0
  28. package/dist/cjs/i18n/locales/it-IT.json +282 -0
  29. package/dist/cjs/i18n/locales/ja-JP.json +282 -0
  30. package/dist/cjs/i18n/locales/ko-KR.json +282 -0
  31. package/dist/cjs/i18n/locales/locales/ar-SA.json +282 -0
  32. package/dist/cjs/i18n/locales/locales/ca-ES.json +282 -0
  33. package/dist/cjs/i18n/locales/locales/de-DE.json +282 -0
  34. package/dist/cjs/i18n/locales/locales/en-US.json +2161 -0
  35. package/dist/cjs/i18n/locales/locales/es-ES.json +2161 -0
  36. package/dist/cjs/i18n/locales/locales/fr-FR.json +282 -0
  37. package/dist/cjs/i18n/locales/locales/it-IT.json +282 -0
  38. package/dist/cjs/i18n/locales/locales/ja-JP.json +282 -0
  39. package/dist/cjs/i18n/locales/locales/ko-KR.json +282 -0
  40. package/dist/cjs/i18n/locales/locales/pt-PT.json +282 -0
  41. package/dist/cjs/i18n/locales/locales/zh-CN.json +282 -0
  42. package/dist/cjs/i18n/locales/pt-PT.json +282 -0
  43. package/dist/cjs/i18n/locales/zh-CN.json +282 -0
  44. package/dist/cjs/i18n/reputationCategoryLabels.js +20 -0
  45. package/dist/cjs/i18n/trustTierLabels.js +19 -0
  46. package/dist/cjs/index.js +498 -0
  47. package/dist/cjs/inference/OxyInferenceClient.js +544 -0
  48. package/dist/cjs/logger/index.js +149 -0
  49. package/dist/cjs/mixins/OxyServices.accounts.js +555 -0
  50. package/dist/cjs/mixins/OxyServices.analytics.js +49 -0
  51. package/dist/cjs/mixins/OxyServices.appData.js +108 -0
  52. package/dist/cjs/mixins/OxyServices.assets.js +764 -0
  53. package/dist/cjs/mixins/OxyServices.auth.js +1254 -0
  54. package/dist/cjs/mixins/OxyServices.chains.js +73 -0
  55. package/dist/cjs/mixins/OxyServices.civic.js +611 -0
  56. package/dist/cjs/mixins/OxyServices.connectedApps.js +78 -0
  57. package/dist/cjs/mixins/OxyServices.contacts.js +50 -0
  58. package/dist/cjs/mixins/OxyServices.deviceBoot.js +191 -0
  59. package/dist/cjs/mixins/OxyServices.deviceTransfer.js +314 -0
  60. package/dist/cjs/mixins/OxyServices.devices.js +116 -0
  61. package/dist/cjs/mixins/OxyServices.features.js +335 -0
  62. package/dist/cjs/mixins/OxyServices.followGraph.js +221 -0
  63. package/dist/cjs/mixins/OxyServices.identity.js +461 -0
  64. package/dist/cjs/mixins/OxyServices.identityBackup.js +172 -0
  65. package/dist/cjs/mixins/OxyServices.inference.js +59 -0
  66. package/dist/cjs/mixins/OxyServices.language.js +125 -0
  67. package/dist/cjs/mixins/OxyServices.links.js +72 -0
  68. package/dist/cjs/mixins/OxyServices.location.js +43 -0
  69. package/dist/cjs/mixins/OxyServices.nodes.js +175 -0
  70. package/dist/cjs/mixins/OxyServices.notifications.js +63 -0
  71. package/dist/cjs/mixins/OxyServices.payment.js +158 -0
  72. package/dist/cjs/mixins/OxyServices.privacy.js +199 -0
  73. package/dist/cjs/mixins/OxyServices.reputation.js +289 -0
  74. package/dist/cjs/mixins/OxyServices.security.js +89 -0
  75. package/dist/cjs/mixins/OxyServices.store.js +266 -0
  76. package/dist/cjs/mixins/OxyServices.topics.js +137 -0
  77. package/dist/cjs/mixins/OxyServices.user.js +902 -0
  78. package/dist/cjs/mixins/OxyServices.utility.js +1098 -0
  79. package/dist/cjs/mixins/index.js +135 -0
  80. package/dist/cjs/mixins/mixinHelpers.js +53 -0
  81. package/dist/cjs/models/Topic.js +16 -0
  82. package/dist/cjs/models/interfaces.js +20 -0
  83. package/dist/cjs/models/session.js +2 -0
  84. package/dist/cjs/server/auth.js +167 -0
  85. package/dist/cjs/server/capabilityTicket.js +192 -0
  86. package/dist/cjs/server/cors.js +225 -0
  87. package/dist/cjs/server/index.js +97 -0
  88. package/dist/cjs/server/rateLimit.js +207 -0
  89. package/dist/cjs/server/safeFetch.js +458 -0
  90. package/dist/cjs/server/securityHeaders.js +377 -0
  91. package/dist/cjs/server/userInvalidation.js +156 -0
  92. package/dist/cjs/server/verifySecret.js +50 -0
  93. package/dist/cjs/session/SessionClient.js +865 -0
  94. package/dist/cjs/session/accountDelegationAccess.js +48 -0
  95. package/dist/cjs/session/accountDialogController.js +1131 -0
  96. package/dist/cjs/session/accountSwitchTargets.js +81 -0
  97. package/dist/cjs/session/authStateStore.js +404 -0
  98. package/dist/cjs/session/createSessionClient.js +32 -0
  99. package/dist/cjs/session/deviceDirectory.js +143 -0
  100. package/dist/cjs/session/deviceSwitcherRows.js +76 -0
  101. package/dist/cjs/session/identityPin.js +256 -0
  102. package/dist/cjs/session/identitySession.js +135 -0
  103. package/dist/cjs/session/projectSessionState.js +121 -0
  104. package/dist/cjs/session/refresh.js +398 -0
  105. package/dist/cjs/session/sessionClientHost.js +34 -0
  106. package/dist/cjs/session/sharedDeviceCredential.js +247 -0
  107. package/dist/cjs/session/socketLoader.js +55 -0
  108. package/dist/cjs/shared/utils/colorUtils.js +153 -0
  109. package/dist/cjs/shared/utils/errorUtils.js +183 -0
  110. package/dist/cjs/shared/utils/index.js +49 -0
  111. package/dist/cjs/shared/utils/networkUtils.js +183 -0
  112. package/dist/cjs/shared/utils/themeUtils.js +106 -0
  113. package/dist/cjs/utils/accountCacheSweep.js +80 -0
  114. package/dist/cjs/utils/accountUtils.js +140 -0
  115. package/dist/cjs/utils/activityId.js +6 -0
  116. package/dist/cjs/utils/apiUtils.js +91 -0
  117. package/dist/cjs/utils/asyncUtils.js +222 -0
  118. package/dist/cjs/utils/authHelpers.js +120 -0
  119. package/dist/cjs/utils/authWebUrl.js +19 -0
  120. package/dist/cjs/utils/avatarUtils.js +29 -0
  121. package/dist/cjs/utils/cache.js +235 -0
  122. package/dist/cjs/utils/cacheKey.js +85 -0
  123. package/dist/cjs/utils/coldBoot.js +122 -0
  124. package/dist/cjs/utils/commonsApproval.js +31 -0
  125. package/dist/cjs/utils/commonsDelivery.js +59 -0
  126. package/dist/cjs/utils/deviceManager.js +174 -0
  127. package/dist/cjs/utils/displayNamePolicyRanges.generated.js +60 -0
  128. package/dist/cjs/utils/edgeRegion.js +6 -0
  129. package/dist/cjs/utils/errorUtils.js +243 -0
  130. package/dist/cjs/utils/identityCacheSweep.js +97 -0
  131. package/dist/cjs/utils/languageUtils.js +224 -0
  132. package/dist/cjs/utils/oauthPkce.js +311 -0
  133. package/dist/cjs/utils/officialOrigins.js +64 -0
  134. package/dist/cjs/utils/oxyServiceEnvironment.js +19 -0
  135. package/dist/cjs/utils/platform.js +119 -0
  136. package/dist/cjs/utils/profileLinks.js +63 -0
  137. package/dist/cjs/utils/redactUrl.js +29 -0
  138. package/dist/cjs/utils/registrableApex.js +45 -0
  139. package/dist/cjs/utils/requestUtils.js +209 -0
  140. package/dist/cjs/utils/sessionUtils.js +181 -0
  141. package/dist/cjs/utils/textNormalization.js +158 -0
  142. package/dist/cjs/utils/userHandle.js +37 -0
  143. package/dist/cjs/utils/userIdentity.js +50 -0
  144. package/dist/cjs/utils/validationUtils.js +370 -0
  145. package/dist/cjs/utils/webauthnOrigin.js +51 -0
  146. package/dist/esm/.tsbuildinfo +1 -0
  147. package/dist/esm/HttpService.js +1266 -0
  148. package/dist/esm/OxyServices.base.js +386 -0
  149. package/dist/esm/OxyServices.errors.js +88 -0
  150. package/dist/esm/OxyServices.js +66 -0
  151. package/dist/esm/boot/sessionColdBoot.js +392 -0
  152. package/dist/esm/constants/version.js +13 -0
  153. package/dist/esm/crypto/aead.js +74 -0
  154. package/dist/esm/crypto/ecdh.js +32 -0
  155. package/dist/esm/crypto/identityMarker.js +248 -0
  156. package/dist/esm/crypto/kdf.js +36 -0
  157. package/dist/esm/crypto/keyManager.js +2227 -0
  158. package/dist/esm/crypto/polyfill.js +129 -0
  159. package/dist/esm/crypto/recoveryPhrase.js +238 -0
  160. package/dist/esm/crypto/signatureService.js +269 -0
  161. package/dist/esm/i18n/accountCategoryLabels.js +37 -0
  162. package/dist/esm/i18n/accountRoleLabels.js +20 -0
  163. package/dist/esm/i18n/index.js +83 -0
  164. package/dist/esm/i18n/locales/ar-SA.json +282 -0
  165. package/dist/esm/i18n/locales/ca-ES.json +282 -0
  166. package/dist/esm/i18n/locales/de-DE.json +282 -0
  167. package/dist/esm/i18n/locales/en-US.json +2161 -0
  168. package/dist/esm/i18n/locales/es-ES.json +2161 -0
  169. package/dist/esm/i18n/locales/fr-FR.json +282 -0
  170. package/dist/esm/i18n/locales/it-IT.json +282 -0
  171. package/dist/esm/i18n/locales/ja-JP.json +282 -0
  172. package/dist/esm/i18n/locales/ko-KR.json +282 -0
  173. package/dist/esm/i18n/locales/locales/ar-SA.json +282 -0
  174. package/dist/esm/i18n/locales/locales/ca-ES.json +282 -0
  175. package/dist/esm/i18n/locales/locales/de-DE.json +282 -0
  176. package/dist/esm/i18n/locales/locales/en-US.json +2161 -0
  177. package/dist/esm/i18n/locales/locales/es-ES.json +2161 -0
  178. package/dist/esm/i18n/locales/locales/fr-FR.json +282 -0
  179. package/dist/esm/i18n/locales/locales/it-IT.json +282 -0
  180. package/dist/esm/i18n/locales/locales/ja-JP.json +282 -0
  181. package/dist/esm/i18n/locales/locales/ko-KR.json +282 -0
  182. package/dist/esm/i18n/locales/locales/pt-PT.json +282 -0
  183. package/dist/esm/i18n/locales/locales/zh-CN.json +282 -0
  184. package/dist/esm/i18n/locales/pt-PT.json +282 -0
  185. package/dist/esm/i18n/locales/zh-CN.json +282 -0
  186. package/dist/esm/i18n/reputationCategoryLabels.js +13 -0
  187. package/dist/esm/i18n/trustTierLabels.js +12 -0
  188. package/dist/esm/index.js +254 -0
  189. package/dist/esm/inference/OxyInferenceClient.js +538 -0
  190. package/dist/esm/logger/index.js +140 -0
  191. package/dist/esm/mixins/OxyServices.accounts.js +543 -0
  192. package/dist/esm/mixins/OxyServices.analytics.js +46 -0
  193. package/dist/esm/mixins/OxyServices.appData.js +103 -0
  194. package/dist/esm/mixins/OxyServices.assets.js +761 -0
  195. package/dist/esm/mixins/OxyServices.auth.js +1247 -0
  196. package/dist/esm/mixins/OxyServices.chains.js +70 -0
  197. package/dist/esm/mixins/OxyServices.civic.js +605 -0
  198. package/dist/esm/mixins/OxyServices.connectedApps.js +75 -0
  199. package/dist/esm/mixins/OxyServices.contacts.js +47 -0
  200. package/dist/esm/mixins/OxyServices.deviceBoot.js +186 -0
  201. package/dist/esm/mixins/OxyServices.deviceTransfer.js +311 -0
  202. package/dist/esm/mixins/OxyServices.devices.js +113 -0
  203. package/dist/esm/mixins/OxyServices.features.js +332 -0
  204. package/dist/esm/mixins/OxyServices.followGraph.js +218 -0
  205. package/dist/esm/mixins/OxyServices.identity.js +457 -0
  206. package/dist/esm/mixins/OxyServices.identityBackup.js +169 -0
  207. package/dist/esm/mixins/OxyServices.inference.js +56 -0
  208. package/dist/esm/mixins/OxyServices.language.js +122 -0
  209. package/dist/esm/mixins/OxyServices.links.js +69 -0
  210. package/dist/esm/mixins/OxyServices.location.js +40 -0
  211. package/dist/esm/mixins/OxyServices.nodes.js +172 -0
  212. package/dist/esm/mixins/OxyServices.notifications.js +60 -0
  213. package/dist/esm/mixins/OxyServices.payment.js +155 -0
  214. package/dist/esm/mixins/OxyServices.privacy.js +196 -0
  215. package/dist/esm/mixins/OxyServices.reputation.js +286 -0
  216. package/dist/esm/mixins/OxyServices.security.js +86 -0
  217. package/dist/esm/mixins/OxyServices.store.js +263 -0
  218. package/dist/esm/mixins/OxyServices.topics.js +134 -0
  219. package/dist/esm/mixins/OxyServices.user.js +899 -0
  220. package/dist/esm/mixins/OxyServices.utility.js +1095 -0
  221. package/dist/esm/mixins/index.js +132 -0
  222. package/dist/esm/mixins/mixinHelpers.js +48 -0
  223. package/dist/esm/models/Topic.js +13 -0
  224. package/dist/esm/models/interfaces.js +17 -0
  225. package/dist/esm/models/session.js +1 -0
  226. package/dist/esm/server/auth.js +154 -0
  227. package/dist/esm/server/capabilityTicket.js +183 -0
  228. package/dist/esm/server/cors.js +220 -0
  229. package/dist/esm/server/index.js +47 -0
  230. package/dist/esm/server/rateLimit.js +201 -0
  231. package/dist/esm/server/safeFetch.js +447 -0
  232. package/dist/esm/server/securityHeaders.js +364 -0
  233. package/dist/esm/server/userInvalidation.js +152 -0
  234. package/dist/esm/server/verifySecret.js +47 -0
  235. package/dist/esm/session/SessionClient.js +861 -0
  236. package/dist/esm/session/accountDelegationAccess.js +45 -0
  237. package/dist/esm/session/accountDialogController.js +1126 -0
  238. package/dist/esm/session/accountSwitchTargets.js +77 -0
  239. package/dist/esm/session/authStateStore.js +398 -0
  240. package/dist/esm/session/createSessionClient.js +29 -0
  241. package/dist/esm/session/deviceDirectory.js +135 -0
  242. package/dist/esm/session/deviceSwitcherRows.js +72 -0
  243. package/dist/esm/session/identityPin.js +249 -0
  244. package/dist/esm/session/identitySession.js +131 -0
  245. package/dist/esm/session/projectSessionState.js +114 -0
  246. package/dist/esm/session/refresh.js +390 -0
  247. package/dist/esm/session/sessionClientHost.js +31 -0
  248. package/dist/esm/session/sharedDeviceCredential.js +239 -0
  249. package/dist/esm/session/socketLoader.js +19 -0
  250. package/dist/esm/shared/utils/colorUtils.js +143 -0
  251. package/dist/esm/shared/utils/errorUtils.js +170 -0
  252. package/dist/esm/shared/utils/index.js +15 -0
  253. package/dist/esm/shared/utils/networkUtils.js +173 -0
  254. package/dist/esm/shared/utils/themeUtils.js +98 -0
  255. package/dist/esm/utils/accountCacheSweep.js +75 -0
  256. package/dist/esm/utils/accountUtils.js +131 -0
  257. package/dist/esm/utils/activityId.js +2 -0
  258. package/dist/esm/utils/apiUtils.js +84 -0
  259. package/dist/esm/utils/asyncUtils.js +207 -0
  260. package/dist/esm/utils/authHelpers.js +111 -0
  261. package/dist/esm/utils/authWebUrl.js +16 -0
  262. package/dist/esm/utils/avatarUtils.js +26 -0
  263. package/dist/esm/utils/cache.js +227 -0
  264. package/dist/esm/utils/cacheKey.js +80 -0
  265. package/dist/esm/utils/coldBoot.js +119 -0
  266. package/dist/esm/utils/commonsApproval.js +27 -0
  267. package/dist/esm/utils/commonsDelivery.js +54 -0
  268. package/dist/esm/utils/deviceManager.js +170 -0
  269. package/dist/esm/utils/displayNamePolicyRanges.generated.js +57 -0
  270. package/dist/esm/utils/edgeRegion.js +2 -0
  271. package/dist/esm/utils/errorUtils.js +232 -0
  272. package/dist/esm/utils/identityCacheSweep.js +92 -0
  273. package/dist/esm/utils/languageUtils.js +212 -0
  274. package/dist/esm/utils/oauthPkce.js +297 -0
  275. package/dist/esm/utils/officialOrigins.js +59 -0
  276. package/dist/esm/utils/oxyServiceEnvironment.js +16 -0
  277. package/dist/esm/utils/platform.js +110 -0
  278. package/dist/esm/utils/profileLinks.js +60 -0
  279. package/dist/esm/utils/redactUrl.js +26 -0
  280. package/dist/esm/utils/registrableApex.js +42 -0
  281. package/dist/esm/utils/requestUtils.js +203 -0
  282. package/dist/esm/utils/sessionUtils.js +171 -0
  283. package/dist/esm/utils/textNormalization.js +154 -0
  284. package/dist/esm/utils/userHandle.js +33 -0
  285. package/dist/esm/utils/userIdentity.js +45 -0
  286. package/dist/esm/utils/validationUtils.js +350 -0
  287. package/dist/esm/utils/webauthnOrigin.js +48 -0
  288. package/dist/types/.tsbuildinfo +1 -0
  289. package/dist/types/HttpService.d.ts +413 -0
  290. package/dist/types/OxyServices.base.d.ts +187 -0
  291. package/dist/types/OxyServices.d.ts +139 -0
  292. package/dist/types/OxyServices.errors.d.ts +84 -0
  293. package/dist/types/boot/sessionColdBoot.d.ts +140 -0
  294. package/dist/types/constants/version.d.ts +13 -0
  295. package/dist/types/crypto/aead.d.ts +56 -0
  296. package/dist/types/crypto/ecdh.d.ts +29 -0
  297. package/dist/types/crypto/identityMarker.d.ts +94 -0
  298. package/dist/types/crypto/kdf.d.ts +25 -0
  299. package/dist/types/crypto/keyManager.d.ts +582 -0
  300. package/dist/types/crypto/polyfill.d.ts +25 -0
  301. package/dist/types/crypto/recoveryPhrase.d.ts +173 -0
  302. package/dist/types/crypto/signatureService.d.ts +136 -0
  303. package/dist/types/i18n/accountCategoryLabels.d.ts +34 -0
  304. package/dist/types/i18n/accountRoleLabels.d.ts +10 -0
  305. package/dist/types/i18n/index.d.ts +3 -0
  306. package/dist/types/i18n/reputationCategoryLabels.d.ts +10 -0
  307. package/dist/types/i18n/trustTierLabels.d.ts +9 -0
  308. package/dist/types/index.d.ts +145 -0
  309. package/dist/types/inference/OxyInferenceClient.d.ts +342 -0
  310. package/dist/types/logger/index.d.ts +104 -0
  311. package/dist/types/mixins/OxyServices.accounts.d.ts +868 -0
  312. package/dist/types/mixins/OxyServices.analytics.d.ts +72 -0
  313. package/dist/types/mixins/OxyServices.appData.d.ts +108 -0
  314. package/dist/types/mixins/OxyServices.assets.d.ts +329 -0
  315. package/dist/types/mixins/OxyServices.auth.d.ts +908 -0
  316. package/dist/types/mixins/OxyServices.chains.d.ts +156 -0
  317. package/dist/types/mixins/OxyServices.civic.d.ts +510 -0
  318. package/dist/types/mixins/OxyServices.connectedApps.d.ts +169 -0
  319. package/dist/types/mixins/OxyServices.contacts.d.ts +100 -0
  320. package/dist/types/mixins/OxyServices.deviceBoot.d.ts +185 -0
  321. package/dist/types/mixins/OxyServices.deviceTransfer.d.ts +149 -0
  322. package/dist/types/mixins/OxyServices.devices.d.ts +103 -0
  323. package/dist/types/mixins/OxyServices.features.d.ts +250 -0
  324. package/dist/types/mixins/OxyServices.followGraph.d.ts +223 -0
  325. package/dist/types/mixins/OxyServices.identity.d.ts +351 -0
  326. package/dist/types/mixins/OxyServices.identityBackup.d.ts +129 -0
  327. package/dist/types/mixins/OxyServices.inference.d.ts +95 -0
  328. package/dist/types/mixins/OxyServices.language.d.ts +87 -0
  329. package/dist/types/mixins/OxyServices.links.d.ts +104 -0
  330. package/dist/types/mixins/OxyServices.location.d.ts +70 -0
  331. package/dist/types/mixins/OxyServices.nodes.d.ts +198 -0
  332. package/dist/types/mixins/OxyServices.notifications.d.ts +143 -0
  333. package/dist/types/mixins/OxyServices.payment.d.ts +117 -0
  334. package/dist/types/mixins/OxyServices.privacy.d.ts +146 -0
  335. package/dist/types/mixins/OxyServices.reputation.d.ts +202 -0
  336. package/dist/types/mixins/OxyServices.security.d.ts +84 -0
  337. package/dist/types/mixins/OxyServices.store.d.ts +334 -0
  338. package/dist/types/mixins/OxyServices.topics.d.ts +110 -0
  339. package/dist/types/mixins/OxyServices.user.d.ts +558 -0
  340. package/dist/types/mixins/OxyServices.utility.d.ts +393 -0
  341. package/dist/types/mixins/index.d.ts +87 -0
  342. package/dist/types/mixins/mixinHelpers.d.ts +31 -0
  343. package/dist/types/models/Topic.d.ts +42 -0
  344. package/dist/types/models/interfaces.d.ts +675 -0
  345. package/dist/types/models/session.d.ts +51 -0
  346. package/dist/types/server/auth.d.ts +130 -0
  347. package/dist/types/server/capabilityTicket.d.ts +41 -0
  348. package/dist/types/server/cors.d.ts +98 -0
  349. package/dist/types/server/index.d.ts +35 -0
  350. package/dist/types/server/rateLimit.d.ts +40 -0
  351. package/dist/types/server/safeFetch.d.ts +137 -0
  352. package/dist/types/server/securityHeaders.d.ts +221 -0
  353. package/dist/types/server/userInvalidation.d.ts +114 -0
  354. package/dist/types/server/verifySecret.d.ts +29 -0
  355. package/dist/types/session/SessionClient.d.ts +418 -0
  356. package/dist/types/session/accountDelegationAccess.d.ts +40 -0
  357. package/dist/types/session/accountDialogController.d.ts +648 -0
  358. package/dist/types/session/accountSwitchTargets.d.ts +70 -0
  359. package/dist/types/session/authStateStore.d.ts +153 -0
  360. package/dist/types/session/createSessionClient.d.ts +30 -0
  361. package/dist/types/session/deviceDirectory.d.ts +182 -0
  362. package/dist/types/session/deviceSwitcherRows.d.ts +92 -0
  363. package/dist/types/session/identityPin.d.ts +87 -0
  364. package/dist/types/session/identitySession.d.ts +105 -0
  365. package/dist/types/session/projectSessionState.d.ts +74 -0
  366. package/dist/types/session/refresh.d.ts +179 -0
  367. package/dist/types/session/sessionClientHost.d.ts +18 -0
  368. package/dist/types/session/sharedDeviceCredential.d.ts +202 -0
  369. package/dist/types/session/socketLoader.d.ts +11 -0
  370. package/dist/types/shared/utils/colorUtils.d.ts +104 -0
  371. package/dist/types/shared/utils/errorUtils.d.ts +97 -0
  372. package/dist/types/shared/utils/index.d.ts +13 -0
  373. package/dist/types/shared/utils/networkUtils.d.ts +139 -0
  374. package/dist/types/shared/utils/themeUtils.d.ts +90 -0
  375. package/dist/types/utils/accountCacheSweep.d.ts +75 -0
  376. package/dist/types/utils/accountUtils.d.ts +100 -0
  377. package/dist/types/utils/activityId.d.ts +2 -0
  378. package/dist/types/utils/apiUtils.d.ts +95 -0
  379. package/dist/types/utils/asyncUtils.d.ts +62 -0
  380. package/dist/types/utils/authHelpers.d.ts +58 -0
  381. package/dist/types/utils/authWebUrl.d.ts +16 -0
  382. package/dist/types/utils/avatarUtils.d.ts +16 -0
  383. package/dist/types/utils/cache.d.ts +130 -0
  384. package/dist/types/utils/cacheKey.d.ts +66 -0
  385. package/dist/types/utils/coldBoot.d.ts +131 -0
  386. package/dist/types/utils/commonsApproval.d.ts +13 -0
  387. package/dist/types/utils/commonsDelivery.d.ts +105 -0
  388. package/dist/types/utils/deviceManager.d.ts +65 -0
  389. package/dist/types/utils/displayNamePolicyRanges.generated.d.ts +57 -0
  390. package/dist/types/utils/edgeRegion.d.ts +2 -0
  391. package/dist/types/utils/errorUtils.d.ts +125 -0
  392. package/dist/types/utils/identityCacheSweep.d.ts +80 -0
  393. package/dist/types/utils/languageUtils.d.ts +100 -0
  394. package/dist/types/utils/oauthPkce.d.ts +157 -0
  395. package/dist/types/utils/officialOrigins.d.ts +13 -0
  396. package/dist/types/utils/oxyServiceEnvironment.d.ts +17 -0
  397. package/dist/types/utils/platform.d.ts +49 -0
  398. package/dist/types/utils/profileLinks.d.ts +44 -0
  399. package/dist/types/utils/redactUrl.d.ts +17 -0
  400. package/dist/types/utils/registrableApex.d.ts +27 -0
  401. package/dist/types/utils/requestUtils.d.ts +123 -0
  402. package/dist/types/utils/sessionUtils.d.ts +54 -0
  403. package/dist/types/utils/textNormalization.d.ts +103 -0
  404. package/dist/types/utils/userHandle.d.ts +26 -0
  405. package/dist/types/utils/userIdentity.d.ts +21 -0
  406. package/dist/types/utils/validationUtils.d.ts +268 -0
  407. package/dist/types/utils/webauthnOrigin.d.ts +32 -0
  408. package/package.json +168 -0
  409. package/src/HttpService.ts +1553 -0
  410. package/src/OxyServices.base.ts +478 -0
  411. package/src/OxyServices.errors.ts +122 -0
  412. package/src/OxyServices.ts +172 -0
  413. package/src/__tests__/authSocket.test.ts +96 -0
  414. package/src/__tests__/httpServiceActivityId.test.ts +49 -0
  415. package/src/__tests__/httpServiceAuthSelfAwait.test.ts +108 -0
  416. package/src/__tests__/httpServiceCache.test.ts +318 -0
  417. package/src/__tests__/httpServiceCsrf.test.ts +235 -0
  418. package/src/__tests__/httpServiceFormEncoded.test.ts +142 -0
  419. package/src/__tests__/httpServiceQueueDeadlock.test.ts +128 -0
  420. package/src/__tests__/httpServiceUnwrapEnvelope.test.ts +115 -0
  421. package/src/__tests__/inSessionRefresh.test.ts +260 -0
  422. package/src/__tests__/linkedClient.test.ts +370 -0
  423. package/src/__tests__/parseHttpErrorBody.test.ts +116 -0
  424. package/src/__tests__/serverValueImportsDeclared.test.ts +120 -0
  425. package/src/__tests__/userIdentity.test.ts +143 -0
  426. package/src/boot/__tests__/sessionColdBoot.identity.test.ts +393 -0
  427. package/src/boot/__tests__/sessionColdBoot.sharedDevice.test.ts +325 -0
  428. package/src/boot/__tests__/sessionColdBoot.test.ts +570 -0
  429. package/src/boot/sessionColdBoot.ts +529 -0
  430. package/src/constants/version.ts +15 -0
  431. package/src/crypto/__tests__/backupMaterial.test.ts +86 -0
  432. package/src/crypto/__tests__/cryptoPrimitives.test.ts +226 -0
  433. package/src/crypto/__tests__/identityMocks.ts +125 -0
  434. package/src/crypto/__tests__/keyManager.atomicity.test.ts +272 -0
  435. package/src/crypto/__tests__/keyManager.cacheSafety.test.ts +175 -0
  436. package/src/crypto/__tests__/keyManager.identityStatus.test.ts +217 -0
  437. package/src/crypto/__tests__/keyManager.recoveryLadder.test.ts +179 -0
  438. package/src/crypto/__tests__/keyManager.recoveryMnemonic.test.ts +138 -0
  439. package/src/crypto/__tests__/keyManager.storageMigration.test.ts +227 -0
  440. package/src/crypto/__tests__/keyManager.test.ts +329 -0
  441. package/src/crypto/__tests__/polyfill.test.ts +109 -0
  442. package/src/crypto/__tests__/recoveryPhrase.test.ts +61 -0
  443. package/src/crypto/__tests__/scopedSeed.test.ts +126 -0
  444. package/src/crypto/__tests__/signChallengeShared.test.ts +63 -0
  445. package/src/crypto/__tests__/signedRecord.test.ts +230 -0
  446. package/src/crypto/aead.ts +97 -0
  447. package/src/crypto/ecdh.ts +37 -0
  448. package/src/crypto/identityMarker.ts +291 -0
  449. package/src/crypto/kdf.ts +43 -0
  450. package/src/crypto/keyManager.ts +2607 -0
  451. package/src/crypto/polyfill.ts +143 -0
  452. package/src/crypto/recoveryPhrase.ts +337 -0
  453. package/src/crypto/signatureService.ts +350 -0
  454. package/src/i18n/__tests__/accountCategoryLabels.test.ts +62 -0
  455. package/src/i18n/__tests__/accountRoleLabels.test.ts +54 -0
  456. package/src/i18n/__tests__/reputationCategoryLabels.test.ts +56 -0
  457. package/src/i18n/__tests__/trustTierLabels.test.ts +47 -0
  458. package/src/i18n/accountCategoryLabels.ts +44 -0
  459. package/src/i18n/accountRoleLabels.ts +26 -0
  460. package/src/i18n/index.ts +88 -0
  461. package/src/i18n/locales/ar-SA.json +282 -0
  462. package/src/i18n/locales/ca-ES.json +282 -0
  463. package/src/i18n/locales/de-DE.json +282 -0
  464. package/src/i18n/locales/en-US.json +2161 -0
  465. package/src/i18n/locales/es-ES.json +2161 -0
  466. package/src/i18n/locales/fr-FR.json +282 -0
  467. package/src/i18n/locales/it-IT.json +282 -0
  468. package/src/i18n/locales/ja-JP.json +282 -0
  469. package/src/i18n/locales/ko-KR.json +282 -0
  470. package/src/i18n/locales/pt-PT.json +282 -0
  471. package/src/i18n/locales/zh-CN.json +282 -0
  472. package/src/i18n/reputationCategoryLabels.ts +20 -0
  473. package/src/i18n/trustTierLabels.ts +18 -0
  474. package/src/index.ts +881 -0
  475. package/src/inference/OxyInferenceClient.ts +888 -0
  476. package/src/inference/__tests__/OxyInferenceClient.test.ts +834 -0
  477. package/src/logger/__tests__/logger.test.ts +207 -0
  478. package/src/logger/index.ts +217 -0
  479. package/src/mixins/OxyServices.accounts.ts +1330 -0
  480. package/src/mixins/OxyServices.analytics.ts +53 -0
  481. package/src/mixins/OxyServices.appData.ts +158 -0
  482. package/src/mixins/OxyServices.assets.ts +861 -0
  483. package/src/mixins/OxyServices.auth.ts +1858 -0
  484. package/src/mixins/OxyServices.chains.ts +134 -0
  485. package/src/mixins/OxyServices.civic.ts +945 -0
  486. package/src/mixins/OxyServices.connectedApps.ts +174 -0
  487. package/src/mixins/OxyServices.contacts.ts +73 -0
  488. package/src/mixins/OxyServices.deviceBoot.ts +210 -0
  489. package/src/mixins/OxyServices.deviceTransfer.ts +393 -0
  490. package/src/mixins/OxyServices.devices.ts +120 -0
  491. package/src/mixins/OxyServices.features.ts +454 -0
  492. package/src/mixins/OxyServices.followGraph.ts +293 -0
  493. package/src/mixins/OxyServices.identity.ts +705 -0
  494. package/src/mixins/OxyServices.identityBackup.ts +250 -0
  495. package/src/mixins/OxyServices.inference.ts +57 -0
  496. package/src/mixins/OxyServices.language.ts +144 -0
  497. package/src/mixins/OxyServices.links.ts +107 -0
  498. package/src/mixins/OxyServices.location.ts +46 -0
  499. package/src/mixins/OxyServices.nodes.ts +337 -0
  500. package/src/mixins/OxyServices.notifications.ts +142 -0
  501. package/src/mixins/OxyServices.payment.ts +163 -0
  502. package/src/mixins/OxyServices.privacy.ts +219 -0
  503. package/src/mixins/OxyServices.reputation.ts +436 -0
  504. package/src/mixins/OxyServices.security.ts +110 -0
  505. package/src/mixins/OxyServices.store.ts +585 -0
  506. package/src/mixins/OxyServices.topics.ts +169 -0
  507. package/src/mixins/OxyServices.user.ts +1137 -0
  508. package/src/mixins/OxyServices.utility.ts +1370 -0
  509. package/src/mixins/__tests__/OxyServices.civic.test.ts +1095 -0
  510. package/src/mixins/__tests__/OxyServices.deviceBoot.test.ts +124 -0
  511. package/src/mixins/__tests__/OxyServices.deviceTransfer.test.ts +271 -0
  512. package/src/mixins/__tests__/OxyServices.identity.test.ts +376 -0
  513. package/src/mixins/__tests__/OxyServices.links.test.ts +154 -0
  514. package/src/mixins/__tests__/OxyServices.nodes.test.ts +341 -0
  515. package/src/mixins/__tests__/OxyServices.rotateKey.test.ts +276 -0
  516. package/src/mixins/__tests__/OxyServices.serviceAssetMetadata.test.ts +192 -0
  517. package/src/mixins/__tests__/OxyServices.serviceAssetMetadataBySha.test.ts +135 -0
  518. package/src/mixins/__tests__/accounts.test.ts +727 -0
  519. package/src/mixins/__tests__/appData.test.ts +203 -0
  520. package/src/mixins/__tests__/assetCredentials.test.ts +47 -0
  521. package/src/mixins/__tests__/assetUpload.test.ts +191 -0
  522. package/src/mixins/__tests__/backgroundCredential.httpIntegration.test.ts +135 -0
  523. package/src/mixins/__tests__/chains.test.ts +113 -0
  524. package/src/mixins/__tests__/commonsSignIn.test.ts +1144 -0
  525. package/src/mixins/__tests__/connectedApps.test.ts +123 -0
  526. package/src/mixins/__tests__/deviceTokenMintPinned.test.ts +113 -0
  527. package/src/mixins/__tests__/discoveryErrorHandling.test.ts +266 -0
  528. package/src/mixins/__tests__/followCacheInvalidation.test.ts +173 -0
  529. package/src/mixins/__tests__/followGraph.test.ts +147 -0
  530. package/src/mixins/__tests__/followGraphPagination.test.ts +271 -0
  531. package/src/mixins/__tests__/getFileDownloadUrl.test.ts +346 -0
  532. package/src/mixins/__tests__/getFollowStatuses.test.ts +95 -0
  533. package/src/mixins/__tests__/getUsersByIds.test.ts +149 -0
  534. package/src/mixins/__tests__/identityBackup.test.ts +315 -0
  535. package/src/mixins/__tests__/identityWriteCacheInvalidation.test.ts +407 -0
  536. package/src/mixins/__tests__/inferenceFactory.test.ts +58 -0
  537. package/src/mixins/__tests__/onTokensChanged.test.ts +129 -0
  538. package/src/mixins/__tests__/preSessionSkipAuth.test.ts +284 -0
  539. package/src/mixins/__tests__/privacyCacheInvalidation.test.ts +155 -0
  540. package/src/mixins/__tests__/reputation.test.ts +522 -0
  541. package/src/mixins/__tests__/serviceAuth.test.ts +832 -0
  542. package/src/mixins/__tests__/serviceTokenJwks.test.ts +208 -0
  543. package/src/mixins/__tests__/store.test.ts +304 -0
  544. package/src/mixins/__tests__/topics.test.ts +156 -0
  545. package/src/mixins/__tests__/userReadCacheBypass.test.ts +129 -0
  546. package/src/mixins/__tests__/userTokenAuth.test.ts +746 -0
  547. package/src/mixins/__tests__/verifyChallenge.test.ts +130 -0
  548. package/src/mixins/__tests__/verifyServiceActingAs.test.ts +167 -0
  549. package/src/mixins/__tests__/webauthnAuth.test.ts +205 -0
  550. package/src/mixins/index.ts +201 -0
  551. package/src/mixins/mixinHelpers.ts +69 -0
  552. package/src/models/Topic.ts +46 -0
  553. package/src/models/interfaces.ts +786 -0
  554. package/src/models/session.ts +55 -0
  555. package/src/server/__tests__/auth.test.ts +78 -0
  556. package/src/server/__tests__/capabilityTicket.test.ts +111 -0
  557. package/src/server/__tests__/cors.socket.test.ts +225 -0
  558. package/src/server/__tests__/cors.test.ts +158 -0
  559. package/src/server/__tests__/rateLimit.test.ts +257 -0
  560. package/src/server/__tests__/safeFetch.test.ts +232 -0
  561. package/src/server/__tests__/securityHeaders.test.ts +348 -0
  562. package/src/server/__tests__/serviceTokenAttribution.test.ts +396 -0
  563. package/src/server/__tests__/userInvalidation.test.ts +203 -0
  564. package/src/server/__tests__/verifySecret.test.ts +40 -0
  565. package/src/server/auth.ts +271 -0
  566. package/src/server/capabilityTicket.ts +258 -0
  567. package/src/server/cors.ts +277 -0
  568. package/src/server/index.ts +136 -0
  569. package/src/server/rateLimit.ts +313 -0
  570. package/src/server/safeFetch.ts +586 -0
  571. package/src/server/securityHeaders.ts +467 -0
  572. package/src/server/userInvalidation.ts +199 -0
  573. package/src/server/verifySecret.ts +52 -0
  574. package/src/session/SessionClient.ts +1001 -0
  575. package/src/session/__tests__/SessionClient.additive.test.ts +153 -0
  576. package/src/session/__tests__/SessionClient.broadcastChannel.test.ts +114 -0
  577. package/src/session/__tests__/SessionClient.diagnostics.test.ts +91 -0
  578. package/src/session/__tests__/SessionClient.directory.test.ts +688 -0
  579. package/src/session/__tests__/SessionClient.httpIntegration.test.ts +65 -0
  580. package/src/session/__tests__/SessionClient.identityPin.test.ts +175 -0
  581. package/src/session/__tests__/SessionClient.rest.test.ts +119 -0
  582. package/src/session/__tests__/SessionClient.serverEvents.test.ts +72 -0
  583. package/src/session/__tests__/SessionClient.socket.test.ts +202 -0
  584. package/src/session/__tests__/SessionClient.socketFactory.test.ts +81 -0
  585. package/src/session/__tests__/SessionClient.state.test.ts +78 -0
  586. package/src/session/__tests__/SessionClient.switchTokenOrder.test.ts +170 -0
  587. package/src/session/__tests__/accountDelegationAccess.test.ts +104 -0
  588. package/src/session/__tests__/accountDialogController.test.ts +1969 -0
  589. package/src/session/__tests__/accountDialogShape.test.ts +118 -0
  590. package/src/session/__tests__/accountSwitchTargets.test.ts +137 -0
  591. package/src/session/__tests__/authStateStore.test.ts +451 -0
  592. package/src/session/__tests__/deviceDirectory.test.ts +422 -0
  593. package/src/session/__tests__/deviceSwitcherRows.test.ts +223 -0
  594. package/src/session/__tests__/identityPin.test.ts +131 -0
  595. package/src/session/__tests__/identitySession.test.ts +194 -0
  596. package/src/session/__tests__/projectSessionState.test.ts +105 -0
  597. package/src/session/__tests__/refresh.identityPin.test.ts +307 -0
  598. package/src/session/__tests__/refresh.test.ts +443 -0
  599. package/src/session/__tests__/sessionIntegration.test.ts +209 -0
  600. package/src/session/__tests__/sharedDeviceCredential.test.ts +300 -0
  601. package/src/session/accountDelegationAccess.ts +72 -0
  602. package/src/session/accountDialogController.ts +1494 -0
  603. package/src/session/accountSwitchTargets.ts +93 -0
  604. package/src/session/authStateStore.ts +502 -0
  605. package/src/session/createSessionClient.ts +39 -0
  606. package/src/session/deviceDirectory.ts +269 -0
  607. package/src/session/deviceSwitcherRows.ts +145 -0
  608. package/src/session/identityPin.ts +310 -0
  609. package/src/session/identitySession.ts +206 -0
  610. package/src/session/projectSessionState.ts +137 -0
  611. package/src/session/refresh.ts +517 -0
  612. package/src/session/sessionClientHost.ts +39 -0
  613. package/src/session/sharedDeviceCredential.ts +349 -0
  614. package/src/session/socketLoader.ts +30 -0
  615. package/src/shared/utils/colorUtils.ts +155 -0
  616. package/src/shared/utils/errorUtils.ts +181 -0
  617. package/src/shared/utils/index.ts +59 -0
  618. package/src/shared/utils/networkUtils.ts +248 -0
  619. package/src/shared/utils/themeUtils.ts +115 -0
  620. package/src/types/buffer.d.ts +97 -0
  621. package/src/types/expo-crypto.d.ts +16 -0
  622. package/src/types/expo-secure-store.d.ts +17 -0
  623. package/src/utils/__tests__/accountUtils.test.ts +151 -0
  624. package/src/utils/__tests__/activityId.test.ts +45 -0
  625. package/src/utils/__tests__/asyncUtils.test.ts +187 -0
  626. package/src/utils/__tests__/authWebUrl.test.ts +15 -0
  627. package/src/utils/__tests__/cacheKey.test.ts +0 -0
  628. package/src/utils/__tests__/coldBoot.test.ts +496 -0
  629. package/src/utils/__tests__/commonsApproval.test.ts +60 -0
  630. package/src/utils/__tests__/identityCacheSweep.test.ts +151 -0
  631. package/src/utils/__tests__/languageUtils.test.ts +219 -0
  632. package/src/utils/__tests__/oauthPkce.test.ts +272 -0
  633. package/src/utils/__tests__/officialOrigins.test.ts +31 -0
  634. package/src/utils/__tests__/oxyServiceEnvironment.test.ts +7 -0
  635. package/src/utils/__tests__/profileLinks.test.ts +180 -0
  636. package/src/utils/__tests__/redactUrl.test.ts +33 -0
  637. package/src/utils/__tests__/registrableApex.test.ts +62 -0
  638. package/src/utils/__tests__/textNormalization.test.ts +205 -0
  639. package/src/utils/__tests__/validationUtils.test.ts +703 -0
  640. package/src/utils/__tests__/webauthnOrigin.test.ts +83 -0
  641. package/src/utils/accountCacheSweep.ts +93 -0
  642. package/src/utils/accountUtils.ts +194 -0
  643. package/src/utils/activityId.ts +2 -0
  644. package/src/utils/apiUtils.ts +137 -0
  645. package/src/utils/asyncUtils.ts +280 -0
  646. package/src/utils/authHelpers.ts +148 -0
  647. package/src/utils/authWebUrl.ts +17 -0
  648. package/src/utils/avatarUtils.ts +39 -0
  649. package/src/utils/cache.ts +273 -0
  650. package/src/utils/cacheKey.ts +93 -0
  651. package/src/utils/coldBoot.ts +218 -0
  652. package/src/utils/commonsApproval.ts +39 -0
  653. package/src/utils/commonsDelivery.ts +132 -0
  654. package/src/utils/deviceManager.ts +203 -0
  655. package/src/utils/displayNamePolicyRanges.generated.ts +69 -0
  656. package/src/utils/edgeRegion.ts +2 -0
  657. package/src/utils/errorUtils.ts +352 -0
  658. package/src/utils/identityCacheSweep.ts +104 -0
  659. package/src/utils/languageUtils.ts +256 -0
  660. package/src/utils/oauthPkce.ts +392 -0
  661. package/src/utils/officialOrigins.ts +62 -0
  662. package/src/utils/oxyServiceEnvironment.ts +17 -0
  663. package/src/utils/platform.ts +139 -0
  664. package/src/utils/profileLinks.ts +91 -0
  665. package/src/utils/redactUrl.ts +28 -0
  666. package/src/utils/registrableApex.ts +41 -0
  667. package/src/utils/requestUtils.ts +237 -0
  668. package/src/utils/sessionUtils.ts +206 -0
  669. package/src/utils/textNormalization.ts +162 -0
  670. package/src/utils/userHandle.ts +49 -0
  671. package/src/utils/userIdentity.ts +60 -0
  672. package/src/utils/validationUtils.ts +390 -0
  673. package/src/utils/webauthnOrigin.ts +52 -0
@@ -0,0 +1,297 @@
1
+ /**
2
+ * OAuth 2.0 Authorization Code + PKCE helpers for "Sign in with Oxy" third-party
3
+ * sign-in.
4
+ *
5
+ * Third-party Relying Parties (SPAs, static sites, and native apps that are NOT
6
+ * Oxy first-party) authenticate through the standard OAuth flow against
7
+ * `auth.oxy.so/authorize` — never FedCM, SSO bounces, or Oxy session cookies.
8
+ * Public clients (no secret) prove possession of the authorization code with
9
+ * PKCE (RFC 7636, S256): the RP generates a random `code_verifier`, sends its
10
+ * `code_challenge = BASE64URL(SHA-256(code_verifier))` on the authorize
11
+ * redirect, and later replays the raw verifier on the token exchange.
12
+ *
13
+ * All cross-platform crypto (random bytes, SHA-256) is delegated to the shared
14
+ * `@oxy.so/protocol` platform loaders — the exact primitives the rest of core's
15
+ * crypto already uses — so these helpers run identically on web, Node, and
16
+ * React Native. No `require()`, so the ESM build stays bundler-clean.
17
+ */
18
+ import { isNodeJS, isReactNative, loadExpoCrypto, loadNodeCrypto, sha256 } from '@oxy.so/protocol';
19
+ import { logger } from '../logger/index.js';
20
+ /** The central Oxy IdP authorization endpoint used by default. */
21
+ export const OXY_AUTHORIZE_URL = 'https://auth.oxy.so/authorize';
22
+ /** Default OAuth scope requested for a "Sign in with Oxy" third-party flow. */
23
+ export const DEFAULT_OAUTH_SCOPE = 'openid profile';
24
+ /**
25
+ * Number of random bytes behind a PKCE `code_verifier`. 64 bytes → 86 base64url
26
+ * characters, comfortably inside RFC 7636 §4.1's required 43–128 range.
27
+ */
28
+ const PKCE_VERIFIER_BYTES = 64;
29
+ /** Number of random bytes behind an OAuth `state` (CSRF) token. */
30
+ const OAUTH_STATE_BYTES = 32;
31
+ /** RFC 4648 §5 base64url alphabet (URL- and filename-safe, no padding). */
32
+ const BASE64URL_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
33
+ /**
34
+ * Cryptographically-secure random bytes, cross-platform.
35
+ *
36
+ * Mirrors the platform gating the rest of core's crypto already uses:
37
+ * `expo-crypto` on React Native, Node's built-in `crypto` on the server, and
38
+ * the Web Crypto API in the browser (also the fallback if Node's `crypto`
39
+ * fails to load in an unusual bundled-Node environment).
40
+ */
41
+ async function getSecureRandomBytes(byteLength) {
42
+ if (isReactNative()) {
43
+ const crypto = await loadExpoCrypto();
44
+ return Uint8Array.from(await crypto.getRandomBytesAsync(byteLength));
45
+ }
46
+ if (isNodeJS()) {
47
+ try {
48
+ const nodeCrypto = await loadNodeCrypto();
49
+ return Uint8Array.from(nodeCrypto.randomBytes(byteLength));
50
+ }
51
+ catch (error) {
52
+ logger.warn('[oxy.oauth] Node crypto unavailable for PKCE random bytes, falling back to Web Crypto', { component: 'oauthPkce' }, error);
53
+ }
54
+ }
55
+ const bytes = new Uint8Array(byteLength);
56
+ globalThis.crypto.getRandomValues(bytes);
57
+ return bytes;
58
+ }
59
+ /** Encode raw bytes as unpadded base64url (RFC 4648 §5). */
60
+ function bytesToBase64Url(bytes) {
61
+ let output = '';
62
+ for (let i = 0; i < bytes.length; i += 3) {
63
+ const byte0 = bytes[i];
64
+ const hasByte1 = i + 1 < bytes.length;
65
+ const hasByte2 = i + 2 < bytes.length;
66
+ const byte1 = hasByte1 ? bytes[i + 1] : 0;
67
+ const byte2 = hasByte2 ? bytes[i + 2] : 0;
68
+ output += BASE64URL_ALPHABET[byte0 >> 2];
69
+ output += BASE64URL_ALPHABET[((byte0 & 0x03) << 4) | (byte1 >> 4)];
70
+ if (hasByte1) {
71
+ output += BASE64URL_ALPHABET[((byte1 & 0x0f) << 2) | (byte2 >> 6)];
72
+ }
73
+ if (hasByte2) {
74
+ output += BASE64URL_ALPHABET[byte2 & 0x3f];
75
+ }
76
+ }
77
+ return output;
78
+ }
79
+ /** Decode a lowercase-hex string into its raw bytes. */
80
+ function hexToBytes(hex) {
81
+ const bytes = new Uint8Array(hex.length / 2);
82
+ for (let i = 0; i < bytes.length; i += 1) {
83
+ bytes[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);
84
+ }
85
+ return bytes;
86
+ }
87
+ /**
88
+ * Compute the PKCE S256 `code_challenge` for a given verifier:
89
+ * `BASE64URL(SHA-256(ASCII(codeVerifier)))` (RFC 7636 §4.2). The verifier is
90
+ * base64url (ASCII), so its UTF-8 and ASCII byte encodings are identical.
91
+ *
92
+ * Reuses `@oxy.so/protocol`'s cross-platform {@link sha256} (which returns
93
+ * lowercase hex); the digest bytes are recovered and re-encoded as base64url.
94
+ */
95
+ export async function computeCodeChallenge(codeVerifier) {
96
+ const digestHex = await sha256(codeVerifier);
97
+ return bytesToBase64Url(hexToBytes(digestHex));
98
+ }
99
+ /**
100
+ * Generate a fresh PKCE verifier/challenge pair for an OAuth authorization-code
101
+ * flow. The verifier is 64 random bytes as base64url (86 chars, within RFC 7636
102
+ * §4.1's 43–128 range and drawn only from the unreserved set); the challenge is
103
+ * its S256 transform.
104
+ */
105
+ export async function generatePkcePair() {
106
+ const codeVerifier = bytesToBase64Url(await getSecureRandomBytes(PKCE_VERIFIER_BYTES));
107
+ const codeChallenge = await computeCodeChallenge(codeVerifier);
108
+ return { codeVerifier, codeChallenge, method: 'S256' };
109
+ }
110
+ /**
111
+ * Generate an opaque, single-use OAuth `state` token (32 random bytes as
112
+ * base64url) for CSRF protection across the authorize redirect.
113
+ */
114
+ export async function generateOAuthState() {
115
+ return bytesToBase64Url(await getSecureRandomBytes(OAUTH_STATE_BYTES));
116
+ }
117
+ /**
118
+ * Build the `auth.oxy.so/authorize` redirect URL for an OAuth authorization-code
119
+ * + PKCE (S256) flow. Built via the WHATWG `URL` API so a custom
120
+ * `authorizeBaseUrl` that already carries a query string keeps its existing
121
+ * params (the OAuth params are merged in, not clobbered by a naive `?` concat).
122
+ * All values are percent-encoded by `URL.searchParams`.
123
+ */
124
+ export function buildOAuthAuthorizeUrl(params) {
125
+ const { authorizeBaseUrl = OXY_AUTHORIZE_URL, clientId, redirectUri, scope = DEFAULT_OAUTH_SCOPE, state, codeChallenge, } = params;
126
+ const url = new URL(authorizeBaseUrl);
127
+ url.searchParams.set('client_id', clientId);
128
+ url.searchParams.set('redirect_uri', redirectUri);
129
+ url.searchParams.set('response_type', 'code');
130
+ url.searchParams.set('state', state);
131
+ url.searchParams.set('scope', scope);
132
+ url.searchParams.set('code_challenge', codeChallenge);
133
+ url.searchParams.set('code_challenge_method', 'S256');
134
+ if (params.prompt) {
135
+ url.searchParams.set('prompt', params.prompt);
136
+ }
137
+ if (params.responseMode) {
138
+ url.searchParams.set('response_mode', params.responseMode);
139
+ }
140
+ return url.toString();
141
+ }
142
+ /** `sessionStorage` key for the OAuth CSRF `state` across an authorize redirect. */
143
+ export const OXY_OAUTH_STATE_STORAGE_KEY = 'oxy_oauth_state';
144
+ /** `sessionStorage` key for the PKCE `code_verifier` across an authorize redirect. */
145
+ export const OXY_OAUTH_CODE_VERIFIER_STORAGE_KEY = 'oxy_oauth_code_verifier';
146
+ /** `sessionStorage` key — the exact `redirect_uri` sent on the authorize request. */
147
+ export const OXY_OAUTH_REDIRECT_URI_STORAGE_KEY = 'oxy.oauth_redirect_uri';
148
+ /**
149
+ * `sessionStorage` key for the in-app path to return to after an authorize
150
+ * round trip. See {@link persistOAuthReturnPath}.
151
+ */
152
+ export const OXY_OAUTH_RETURN_PATH_STORAGE_KEY = 'oxy.oauth_return_path';
153
+ /**
154
+ * Normalize a redirect URI to its origin. Official Oxy apps register apex
155
+ * origins (`https://inbox.oxy.so`) — never path-qualified URLs.
156
+ *
157
+ * This is why the path cannot ride along in `redirect_uri`, and why
158
+ * {@link persistOAuthReturnPath} exists: the authorize round trip always lands
159
+ * back on the bare origin, so the page the user was on has to be carried
160
+ * out-of-band and restored on return.
161
+ */
162
+ export function normalizeOAuthRedirectUri(input) {
163
+ try {
164
+ return new URL(input).origin;
165
+ }
166
+ catch {
167
+ return input;
168
+ }
169
+ }
170
+ /**
171
+ * Collapse `https://app.example/` → `https://app.example` for OAuth binding.
172
+ * Path-qualified redirect URIs are preserved — matches the API token exchange.
173
+ */
174
+ export function canonicalizeOAuthRedirectUri(redirectUri) {
175
+ try {
176
+ const parsed = new URL(redirectUri);
177
+ if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') {
178
+ return redirectUri;
179
+ }
180
+ if (parsed.pathname === '/' && !parsed.search && !parsed.hash) {
181
+ return parsed.origin;
182
+ }
183
+ return redirectUri;
184
+ }
185
+ catch {
186
+ return redirectUri;
187
+ }
188
+ }
189
+ /**
190
+ * Is this a safe same-origin path to restore into the address bar?
191
+ *
192
+ * Only site-relative paths are accepted. `//evil.com` and `/\evil.com` are
193
+ * rejected because browsers resolve both as protocol-relative *absolute* URLs —
194
+ * without this check, anything able to write one key of `sessionStorage` could
195
+ * turn the post-authorize restore into an open redirect.
196
+ */
197
+ function isSafeReturnPath(value) {
198
+ if (!value.startsWith('/'))
199
+ return false;
200
+ if (value.startsWith('//') || value.startsWith('/\\'))
201
+ return false;
202
+ if (value.length > 2048)
203
+ return false;
204
+ return true;
205
+ }
206
+ /**
207
+ * Remember the page the user was on before a full-page authorize redirect.
208
+ *
209
+ * Silent cross-origin restore navigates the whole tab to the IdP and back, and
210
+ * `redirect_uri` must be a registered apex origin, so the browser returns to
211
+ * `/` no matter which page the visit started on. Without this, every deep link
212
+ * — a shared URL, a search result, an ad landing page — silently became the
213
+ * home page for signed-out visitors on their first navigation in a tab.
214
+ *
215
+ * Stored next to the PKCE handshake it belongs to, and cleared by
216
+ * {@link clearOAuthHandshake} so a stale entry can never be applied to an
217
+ * unrelated later navigation.
218
+ */
219
+ export function persistOAuthReturnPath(path) {
220
+ const store = globalThis.sessionStorage;
221
+ if (!store || !isSafeReturnPath(path))
222
+ return;
223
+ try {
224
+ store.setItem(OXY_OAUTH_RETURN_PATH_STORAGE_KEY, path);
225
+ }
226
+ catch (error) {
227
+ // Non-fatal: the round trip still completes, it just lands on the origin.
228
+ logger.warn('Could not persist OAuth return path to sessionStorage', { component: 'oauthPkce' }, error);
229
+ }
230
+ }
231
+ /**
232
+ * Read and remove the persisted return path, or `null` when there is none or
233
+ * it failed validation.
234
+ *
235
+ * Single-use by design: it is consumed on the first return so a leftover value
236
+ * cannot redirect a later navigation in the same tab.
237
+ */
238
+ export function consumeOAuthReturnPath() {
239
+ const store = globalThis.sessionStorage;
240
+ if (!store)
241
+ return null;
242
+ try {
243
+ const value = store.getItem(OXY_OAUTH_RETURN_PATH_STORAGE_KEY);
244
+ store.removeItem(OXY_OAUTH_RETURN_PATH_STORAGE_KEY);
245
+ if (!value || !isSafeReturnPath(value))
246
+ return null;
247
+ return value;
248
+ }
249
+ catch {
250
+ return null;
251
+ }
252
+ }
253
+ /** Persist the OAuth handshake for a full-page redirect return (web only). */
254
+ export function persistOAuthHandshake(state, codeVerifier, redirectUri) {
255
+ const store = globalThis.sessionStorage;
256
+ try {
257
+ if (!store)
258
+ throw new Error('sessionStorage is unavailable');
259
+ store.setItem(OXY_OAUTH_STATE_STORAGE_KEY, state);
260
+ store.setItem(OXY_OAUTH_CODE_VERIFIER_STORAGE_KEY, codeVerifier);
261
+ if (redirectUri) {
262
+ store.setItem(OXY_OAUTH_REDIRECT_URI_STORAGE_KEY, canonicalizeOAuthRedirectUri(redirectUri));
263
+ }
264
+ return true;
265
+ }
266
+ catch (error) {
267
+ logger.warn('Could not persist OAuth handshake to sessionStorage', { component: 'oauthPkce' }, error);
268
+ return false;
269
+ }
270
+ }
271
+ /** Read the persisted OAuth handshake, or `null` when absent. */
272
+ export function readOAuthHandshake() {
273
+ const store = globalThis.sessionStorage;
274
+ if (!store)
275
+ return null;
276
+ const state = store.getItem(OXY_OAUTH_STATE_STORAGE_KEY);
277
+ const codeVerifier = store.getItem(OXY_OAUTH_CODE_VERIFIER_STORAGE_KEY);
278
+ if (!state || !codeVerifier)
279
+ return null;
280
+ const redirectUri = store.getItem(OXY_OAUTH_REDIRECT_URI_STORAGE_KEY) ?? undefined;
281
+ return redirectUri ? { state, codeVerifier, redirectUri } : { state, codeVerifier };
282
+ }
283
+ /** Drop persisted OAuth handshake keys after a successful or aborted return. */
284
+ export function clearOAuthHandshake() {
285
+ const store = globalThis.sessionStorage;
286
+ try {
287
+ store?.removeItem(OXY_OAUTH_STATE_STORAGE_KEY);
288
+ store?.removeItem(OXY_OAUTH_CODE_VERIFIER_STORAGE_KEY);
289
+ store?.removeItem(OXY_OAUTH_REDIRECT_URI_STORAGE_KEY);
290
+ // The return path belongs to this handshake. Leaving it behind would let a
291
+ // later, unrelated navigation in the same tab be redirected by it.
292
+ store?.removeItem(OXY_OAUTH_RETURN_PATH_STORAGE_KEY);
293
+ }
294
+ catch {
295
+ // Best-effort cleanup only.
296
+ }
297
+ }
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Official first-party web origin allowlist — shared by OAuth redirect
3
+ * validation and the server-side trusted-origin checks.
4
+ */
5
+ import { CENTRAL_IDP_APEX } from './authWebUrl.js';
6
+ import { registrableApex } from './registrableApex.js';
7
+ /** Official first-party registrable apexes (mirrors API trusted origins). */
8
+ const OFFICIAL_APEXES = new Set([
9
+ 'oxy.so',
10
+ 'fairco.in',
11
+ 'mention.earth',
12
+ 'homiio.com',
13
+ 'alia.onl',
14
+ 'syra.fm',
15
+ 'allo.you',
16
+ 'tnp.network',
17
+ 'moovo.now',
18
+ 'mercaria.co',
19
+ ]);
20
+ /**
21
+ * Whether an origin is a loopback / local-dev origin (`localhost`, `127.0.0.1`,
22
+ * or `[::1]` on any port, http or https).
23
+ */
24
+ export function isLoopbackOrigin(origin) {
25
+ try {
26
+ const parsed = new URL(origin);
27
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
28
+ return false;
29
+ }
30
+ const host = parsed.hostname.toLowerCase();
31
+ return host === 'localhost' || host === '127.0.0.1' || host === '[::1]';
32
+ }
33
+ catch {
34
+ return false;
35
+ }
36
+ }
37
+ /** Whether an origin belongs to the official Oxy web ecosystem. */
38
+ export function isOfficialWebOrigin(origin) {
39
+ if (isLoopbackOrigin(origin)) {
40
+ return true;
41
+ }
42
+ try {
43
+ const parsed = new URL(origin);
44
+ if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') {
45
+ return false;
46
+ }
47
+ const host = parsed.hostname.toLowerCase();
48
+ if (host === CENTRAL_IDP_APEX || host.endsWith(`.${CENTRAL_IDP_APEX}`)) {
49
+ return true;
50
+ }
51
+ const apex = registrableApex(host);
52
+ return apex != null && OFFICIAL_APEXES.has(apex);
53
+ }
54
+ catch {
55
+ return false;
56
+ }
57
+ }
58
+ /** @deprecated Use {@link isOfficialWebOrigin}. */
59
+ export const isAllowedDeviceJoinOrigin = isOfficialWebOrigin;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Environment segregation for Oxy service-token JWTs (test/live isolation).
3
+ * Mirrors `ApplicationCredentialEnvironment` on the API's `ApplicationCredential`
4
+ * model (`packages/api/src/models/ApplicationCredential.ts`) as an INDEPENDENT
5
+ * literal union — `@oxy.so/core` has zero dependency on `@oxy.so/api`, so this is
6
+ * kept in sync by hand, not by import.
7
+ *
8
+ * Defined here (not in `server/auth.ts` or `mixins/OxyServices.utility.ts`
9
+ * directly) because BOTH of those files need it and neither may import from
10
+ * the other: `server/` types import `express` (Node-only, a peer dependency
11
+ * `mixins/` deliberately avoids so it stays safe to bundle into RN/browser
12
+ * consumers — see the "Local request/response/socket typing" comment in
13
+ * `OxyServices.utility.ts`). This file has zero imports, so both sides can
14
+ * depend on it without crossing that boundary.
15
+ */
16
+ export const OXY_SERVICE_ENVIRONMENTS = ['development', 'staging', 'production'];
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Platform Detection Utility
3
+ *
4
+ * Provides platform detection WITHOUT importing from 'react-native'.
5
+ * This allows core modules to be used in web/Node.js environments
6
+ * without bundlers failing on react-native imports.
7
+ */
8
+ /**
9
+ * Typed view over `globalThis` for the RN-platform marker, avoiding an `any`
10
+ * cast at each access site.
11
+ */
12
+ function rnPlatformGlobal() {
13
+ return globalThis;
14
+ }
15
+ /**
16
+ * Detect the current platform without importing react-native
17
+ *
18
+ * Detection order:
19
+ * 1. Check for React Native's Platform object on globalThis (set by RN runtime)
20
+ * 2. Check for Node.js environment
21
+ * 3. Check for browser environment
22
+ * 4. Fall back to 'unknown'
23
+ */
24
+ function detectPlatform() {
25
+ // Check if React Native Platform is available globally (set by RN runtime)
26
+ // This avoids static imports while still detecting RN environment
27
+ const rnPlatform = rnPlatformGlobal().__REACT_NATIVE_PLATFORM__;
28
+ if (rnPlatform) {
29
+ return rnPlatform;
30
+ }
31
+ // Check navigator.product for React Native
32
+ if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {
33
+ // We're in React Native but Platform wasn't set globally
34
+ // Try to get OS from userAgent or default to 'unknown'
35
+ return 'unknown';
36
+ }
37
+ // Check for Node.js environment
38
+ if (typeof process !== 'undefined' && process.versions?.node) {
39
+ return 'web'; // Treat Node.js as 'web' for compatibility (no native features)
40
+ }
41
+ // Check for browser/web environment
42
+ if (typeof window !== 'undefined' && typeof document !== 'undefined') {
43
+ return 'web';
44
+ }
45
+ return 'unknown';
46
+ }
47
+ // Cache the platform detection result
48
+ let cachedPlatform = null;
49
+ /**
50
+ * Get the current platform OS
51
+ * Safe to call from any environment (web, Node.js, React Native)
52
+ */
53
+ export function getPlatformOS() {
54
+ if (cachedPlatform === null) {
55
+ cachedPlatform = detectPlatform();
56
+ }
57
+ return cachedPlatform;
58
+ }
59
+ /**
60
+ * Check if running on web platform (browser or Node.js)
61
+ */
62
+ export function isWeb() {
63
+ return getPlatformOS() === 'web';
64
+ }
65
+ /**
66
+ * Check if running in a native app (iOS or Android)
67
+ */
68
+ export function isNative() {
69
+ const os = getPlatformOS();
70
+ return os === 'ios' || os === 'android';
71
+ }
72
+ /**
73
+ * Check if running on iOS
74
+ */
75
+ export function isIOS() {
76
+ return getPlatformOS() === 'ios';
77
+ }
78
+ /**
79
+ * Check if running on Android
80
+ */
81
+ export function isAndroid() {
82
+ return getPlatformOS() === 'android';
83
+ }
84
+ /**
85
+ * Set the platform OS explicitly
86
+ * Called by React Native entry point to register the platform
87
+ * This allows lazy detection in environments where react-native is available
88
+ */
89
+ export function setPlatformOS(os) {
90
+ cachedPlatform = os;
91
+ rnPlatformGlobal().__REACT_NATIVE_PLATFORM__ = os;
92
+ }
93
+ /**
94
+ * True only in a real web browser (a DOM is present), false on React Native
95
+ * and Node/SSR.
96
+ *
97
+ * Native defines a global `window` but no `document`, so the DOM probe — not a
98
+ * bare `window` check — is the reliable discriminator. This is the single
99
+ * source of truth consumed by `@oxy.so/services` (which dropped
100
+ * their local copies), so every consumer shares the exact same predicate.
101
+ *
102
+ * NOTE: this is a live runtime probe (not the cached `getPlatformOS()` verdict)
103
+ * because it must reflect the actual DOM availability at call time in the
104
+ * consumer's bundle.
105
+ */
106
+ export function isWebBrowser() {
107
+ return (typeof window !== 'undefined' &&
108
+ typeof document !== 'undefined' &&
109
+ typeof document.documentElement !== 'undefined');
110
+ }
@@ -0,0 +1,60 @@
1
+ function cleanUrl(value) {
2
+ if (typeof value !== 'string')
3
+ return null;
4
+ const trimmed = value.trim();
5
+ return trimmed.length > 0 ? trimmed : null;
6
+ }
7
+ /**
8
+ * Normalizes a user's profile links into a clean display shape.
9
+ *
10
+ * Pure, no side effects, no I/O.
11
+ *
12
+ * - Prefers `linksMetadata` when it is a non-empty array: maps each entry to
13
+ * `{ id, title, url, description, image }`, using `entry.id` when present and
14
+ * falling back to the entry index. `title`, `description`, and `image` are
15
+ * carried through only when they are present strings. Entries without a
16
+ * non-empty string `url` are dropped.
17
+ * - Otherwise falls back to the legacy `links` string array: maps each string to
18
+ * `{ id: <index>, url }` (no title/description/image). Empty/non-string values
19
+ * are dropped.
20
+ * - Returns `[]` when both are absent or empty (including when `linksMetadata`
21
+ * is present but every entry is dropped — it does NOT fall back to `links`).
22
+ *
23
+ * URLs are trimmed and blanks are filtered out. This does NOT add a scheme such
24
+ * as `https://`; prefixing is a display concern left to the caller.
25
+ */
26
+ export function normalizeProfileLinks(linksMetadata, links) {
27
+ if (Array.isArray(linksMetadata) && linksMetadata.length > 0) {
28
+ const result = [];
29
+ linksMetadata.forEach((entry, index) => {
30
+ const url = cleanUrl(entry?.url);
31
+ if (!url)
32
+ return;
33
+ const id = typeof entry?.id === 'string' && entry.id.trim().length > 0
34
+ ? entry.id
35
+ : String(index);
36
+ const title = typeof entry?.title === 'string' ? entry.title : undefined;
37
+ const description = typeof entry?.description === 'string' ? entry.description : undefined;
38
+ const image = typeof entry?.image === 'string' ? entry.image : undefined;
39
+ result.push({
40
+ id,
41
+ url,
42
+ ...(title !== undefined ? { title } : {}),
43
+ ...(description !== undefined ? { description } : {}),
44
+ ...(image !== undefined ? { image } : {}),
45
+ });
46
+ });
47
+ return result;
48
+ }
49
+ if (Array.isArray(links) && links.length > 0) {
50
+ const result = [];
51
+ links.forEach((value, index) => {
52
+ const url = cleanUrl(value);
53
+ if (!url)
54
+ return;
55
+ result.push({ id: String(index), url });
56
+ });
57
+ return result;
58
+ }
59
+ return [];
60
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * URL redaction for logging.
3
+ *
4
+ * Asset URLs the API hands back for private assets carry a scoped, short-lived
5
+ * media token (`mt=…`) in their query string. That token is a bearer credential
6
+ * for the underlying object, so it must never land in a log line, breadcrumb,
7
+ * or metric — a captured log would otherwise grant read access until the token
8
+ * expires. Query strings on API URLs can also carry other sensitive params, so
9
+ * we redact the whole query rather than allow-listing one key.
10
+ *
11
+ * `redactUrlQuery` returns the URL's path portion with a `?<redacted>` marker
12
+ * when a query string is present, and the input unchanged otherwise. It is
13
+ * defensive: any input that does not parse as a URL is passed through as-is,
14
+ * except that a bare `?query` tail is still stripped so a relative path with a
15
+ * query never leaks.
16
+ */
17
+ export function redactUrlQuery(url) {
18
+ if (typeof url !== 'string' || url.length === 0) {
19
+ return url;
20
+ }
21
+ const queryIndex = url.indexOf('?');
22
+ if (queryIndex === -1) {
23
+ return url;
24
+ }
25
+ return `${url.slice(0, queryIndex)}?<redacted>`;
26
+ }
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Registrable-apex (eTLD+1) host kernel.
3
+ *
4
+ * The client FAPI auto-detection helper was removed in the device-first cutover
5
+ * (which is why this file is now named for what it actually is, not the old
6
+ * `fapiAutoDetect`). What survives is the pure registrable-domain kernel, still
7
+ * used by the `@oxy.so/core/server` CORS layer (the `*.oxy.so` same-apex trust
8
+ * check) and its re-export surface.
9
+ */
10
+ import { getDomain } from 'tldts';
11
+ /**
12
+ * Compute the bare registrable apex (eTLD+1) of a hostname using the Public
13
+ * Suffix List, including private hosted suffixes.
14
+ *
15
+ * Performs NO protocol handling and builds NO URL — it only answers "what is
16
+ * the registrable domain of this host, or is that undefinable?".
17
+ *
18
+ * Returns `null` (apex undefinable) for:
19
+ * - empty input;
20
+ * - IPv4 literals (`192.168.1.10`);
21
+ * - IPv6 literals or any host carrying a port (`[::1]`, anything with `:`);
22
+ * - single-label hosts (`intranet`, `localhost`);
23
+ * - public suffixes without a registrable label (e.g. `co.uk`, `github.io`).
24
+ *
25
+ * @param hostname - A bare hostname (no scheme), e.g. `www.mention.earth`.
26
+ * @returns The eTLD+1 (`mention.earth`), or `null` when undefinable.
27
+ */
28
+ export function registrableApex(hostname) {
29
+ if (!hostname)
30
+ return null;
31
+ const host = hostname.toLowerCase();
32
+ if (/^\d+\.\d+\.\d+\.\d+$/.test(host))
33
+ return null;
34
+ // IPv6 literals are bracketed; any remaining ':' implies a port — neither
35
+ // yields a registrable apex.
36
+ if (host.startsWith('[') || host.includes(':'))
37
+ return null;
38
+ // The Public Suffix List (private suffixes included) is the source of truth
39
+ // for what an attacker can register. A multi-part public suffix like `co.uk`
40
+ // or a hosted suffix like `github.io` returns no registrable domain.
41
+ return getDomain(host, { allowPrivateDomains: true });
42
+ }