@undefineds.co/xpod 0.4.3 → 0.4.5

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 (223) hide show
  1. package/config/cloud.json +1 -1
  2. package/config/main.json +36 -2
  3. package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.d.ts +3 -0
  4. package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.js +1 -1
  5. package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.d.ts +2 -1
  6. package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.js +101 -32
  7. package/dist/api/ai-gateway/connect/DeviceCodeProtocol.d.ts +80 -0
  8. package/dist/api/ai-gateway/connect/DeviceCodeProtocol.js +3 -0
  9. package/dist/api/ai-gateway/connect/FileSessionImportAdapter.d.ts +38 -0
  10. package/dist/api/ai-gateway/connect/FileSessionImportAdapter.js +63 -0
  11. package/dist/api/ai-gateway/connect/LoopbackAuthorizationCallbackReceiver.d.ts +24 -0
  12. package/dist/api/ai-gateway/connect/LoopbackAuthorizationCallbackReceiver.js +136 -0
  13. package/dist/api/ai-gateway/connect/OAuthConnectAdapter.d.ts +2 -0
  14. package/dist/api/ai-gateway/connect/OAuthConnectAdapter.js +2 -1
  15. package/dist/api/ai-gateway/connect/OAuthIntegrationRegistry.d.ts +17 -13
  16. package/dist/api/ai-gateway/connect/OAuthIntegrationRegistry.js +52 -19
  17. package/dist/api/ai-gateway/connect/OpenAiSubscriptionSessionImportAdapter.d.ts +4 -28
  18. package/dist/api/ai-gateway/connect/OpenAiSubscriptionSessionImportAdapter.js +7 -58
  19. package/dist/api/ai-gateway/connect/ProviderAuthorizationProfiles.d.ts +4 -0
  20. package/dist/api/ai-gateway/connect/ProviderAuthorizationProfiles.js +116 -0
  21. package/dist/api/ai-gateway/connect/SessionImportProfiles.d.ts +10 -0
  22. package/dist/api/ai-gateway/connect/SessionImportProfiles.js +112 -0
  23. package/dist/api/ai-gateway/connect/index.d.ts +125 -23
  24. package/dist/api/ai-gateway/connect/index.js +1277 -260
  25. package/dist/api/ai-gateway/models/PodModelSelectionRepository.d.ts +4 -1
  26. package/dist/api/ai-gateway/models/PodModelSelectionRepository.js +154 -19
  27. package/dist/api/ai-gateway/providers/DeepSeekRuntimeAdapter.js +10 -6
  28. package/dist/api/ai-gateway/providers/ModelsDevCatalog.d.ts +7 -0
  29. package/dist/api/ai-gateway/providers/ModelsDevCatalog.js +25 -1
  30. package/dist/api/ai-gateway/providers/OfferingAuthorization.d.ts +24 -0
  31. package/dist/api/ai-gateway/providers/OfferingAuthorization.js +37 -0
  32. package/dist/api/ai-gateway/providers/OpenAiRuntimeAdapter.d.ts +1 -1
  33. package/dist/api/ai-gateway/providers/OpenAiRuntimeAdapter.js +5 -3
  34. package/dist/api/ai-gateway/providers/ProviderRegistry.d.ts +6 -3
  35. package/dist/api/ai-gateway/providers/ProviderRegistry.js +55 -16
  36. package/dist/api/ai-gateway/providers/ProviderRuntimeAdapter.d.ts +2 -0
  37. package/dist/api/ai-gateway/providers/ProviderRuntimeAdapter.js +37 -4
  38. package/dist/api/ai-gateway/providers/ProviderRuntimeRegistry.js +7 -0
  39. package/dist/api/ai-gateway/quota/SubscriptionQuotaAdapters.js +2 -1
  40. package/dist/api/ai-gateway/routing/ModelRouter.js +3 -1
  41. package/dist/api/container/common.js +30 -40
  42. package/dist/api/container/index.js +6 -2
  43. package/dist/api/container/routes.js +5 -22
  44. package/dist/api/handlers/AiClientConfigurationHandler.js +39 -1
  45. package/dist/api/handlers/AiGatewayManagementHandler.d.ts +3 -0
  46. package/dist/api/handlers/AiGatewayManagementHandler.js +173 -58
  47. package/dist/api/service/AiClientConfigurationService.d.ts +4 -15
  48. package/dist/api/service/AiClientConfigurationService.js +17 -64
  49. package/dist/cli/commands/start.js +2 -0
  50. package/dist/components/components.jsonld +1 -0
  51. package/dist/components/context.jsonld +80 -0
  52. package/dist/http/InternalPodDataHttpHandler.d.ts +3 -0
  53. package/dist/http/InternalPodDataHttpHandler.js +13 -2
  54. package/dist/http/InternalPodDataHttpHandler.jsonld +12 -0
  55. package/dist/identity/oidc/RememberedClientPromptFactory.d.ts +1 -1
  56. package/dist/identity/oidc/RememberedClientPromptFactory.js +5 -2
  57. package/dist/identity/oidc/RememberedConsentHandler.js +1 -1
  58. package/dist/identity/oidc/ScopedPickWebIdHandler.d.ts +1 -0
  59. package/dist/identity/oidc/ScopedPickWebIdHandler.js +26 -0
  60. package/dist/identity/oidc/ScopedPickWebIdHandler.jsonld +4 -0
  61. package/dist/identity/oidc/SessionBoundIdentityProviderFactory.d.ts +10 -0
  62. package/dist/identity/oidc/SessionBoundIdentityProviderFactory.js +21 -0
  63. package/dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld +172 -0
  64. package/dist/index.d.ts +2 -1
  65. package/dist/index.js +4 -2
  66. package/dist/runtime/component-parameter-keys.js +18 -2
  67. package/dist/storage/accessors/MixDataAccessor.js +6 -2
  68. package/dist/storage/rdf/PostgresRdfEngine.js +10 -2
  69. package/dist/storage/rdf/RdfContentTypes.js +4 -0
  70. package/node_modules/@undefineds.co/ai-connections/dist/AiClientConfigurationSection.d.ts +3 -0
  71. package/node_modules/@undefineds.co/ai-connections/dist/AiClientConfigurationSection.js +13 -16
  72. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsList.js +1 -3
  73. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsMain.d.ts +2 -1
  74. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsMain.js +2 -2
  75. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsPanel.d.ts +4 -1
  76. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsPanel.js +127 -57
  77. package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialPoolSection.d.ts +6 -4
  78. package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialPoolSection.js +436 -83
  79. package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeysSection.d.ts +3 -2
  80. package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeysSection.js +212 -76
  81. package/node_modules/@undefineds.co/ai-connections/dist/AiProviderCard.d.ts +6 -4
  82. package/node_modules/@undefineds.co/ai-connections/dist/AiProviderCard.js +58 -41
  83. package/node_modules/@undefineds.co/ai-connections/dist/AiQuotaCard.d.ts +4 -1
  84. package/node_modules/@undefineds.co/ai-connections/dist/AiQuotaCard.js +63 -4
  85. package/node_modules/@undefineds.co/ai-connections/dist/ai-connections-client.d.ts +46 -6
  86. package/node_modules/@undefineds.co/ai-connections/dist/ai-connections-client.js +143 -14
  87. package/node_modules/@undefineds.co/ai-connections/dist/client-config/base-adapter.d.ts +19 -3
  88. package/node_modules/@undefineds.co/ai-connections/dist/client-config/base-adapter.js +45 -7
  89. package/node_modules/@undefineds.co/ai-connections/dist/client-config/codex.d.ts +7 -1
  90. package/node_modules/@undefineds.co/ai-connections/dist/client-config/codex.js +305 -40
  91. package/node_modules/@undefineds.co/ai-connections/dist/client-config/index.cjs +383 -50
  92. package/node_modules/@undefineds.co/ai-connections/dist/client-config/json-env-adapter.js +3 -2
  93. package/node_modules/@undefineds.co/ai-connections/dist/client-config/pi.js +12 -3
  94. package/node_modules/@undefineds.co/ai-connections/dist/client-config/transaction.d.ts +2 -0
  95. package/node_modules/@undefineds.co/ai-connections/dist/client-config/transaction.js +39 -4
  96. package/node_modules/@undefineds.co/ai-connections/dist/client-config/types.d.ts +8 -1
  97. package/node_modules/@undefineds.co/ai-connections/dist/client-visuals.d.ts +2 -0
  98. package/node_modules/@undefineds.co/ai-connections/dist/client-visuals.js +14 -0
  99. package/node_modules/@undefineds.co/ai-connections/dist/controller.d.ts +2 -2
  100. package/node_modules/@undefineds.co/ai-connections/dist/controller.js +216 -57
  101. package/node_modules/@undefineds.co/ai-connections/dist/index.d.ts +3 -1
  102. package/node_modules/@undefineds.co/ai-connections/dist/index.js +16 -2
  103. package/node_modules/@undefineds.co/ai-connections/dist/provider-visuals.js +6 -1
  104. package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-executor.js +27 -6
  105. package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.js +1 -1
  106. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.js +2 -2
  107. package/node_modules/@undefineds.co/drizzle-solid/dist/core/sparql/builder/update-builder.js +12 -1
  108. package/node_modules/@undefineds.co/drizzle-solid/dist/core/triple/builder.js +1 -1
  109. package/node_modules/@undefineds.co/drizzle-solid/dist/core/triple/handlers/array.js +8 -0
  110. package/node_modules/@undefineds.co/drizzle-solid/dist/core/triple/handlers/default.js +9 -1
  111. package/node_modules/@undefineds.co/drizzle-solid/dist/core/triple/handlers/inline.js +3 -3
  112. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-executor.js +27 -6
  113. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.js +1 -1
  114. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.js +2 -2
  115. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/sparql/builder/update-builder.js +12 -1
  116. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/builder.js +1 -1
  117. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/array.js +8 -0
  118. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/default.js +9 -1
  119. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/inline.js +3 -3
  120. package/node_modules/@undefineds.co/extension-sdk/dist/web.d.ts +31 -0
  121. package/package.json +2 -2
  122. package/static/app/assets/{index-BikOyGPu.js → index-BCZVzMpj.js} +44 -44
  123. package/static/app/assets/inrupt-smoke.js +2 -2
  124. package/static/app/assets/main.css +1 -1
  125. package/static/app/assets/main.js +10 -10
  126. package/static/auth-callback/assets/{AiConfigContext-DrCH6ckh.js → AiConfigContext-DVkh8Kg2.js} +1 -1
  127. package/static/auth-callback/assets/{AiConfigPage-DVrlSSdA.js → AiConfigPage-HWVWpe-P.js} +1 -1
  128. package/static/auth-callback/assets/{DocumentProcessingPanel-_Md-v2R2.js → DocumentProcessingPanel-DDq-mH17.js} +1 -1
  129. package/static/auth-callback/assets/{IndexLifecyclePanel-BbWwe23H.js → IndexLifecyclePanel-Cx4cjrdP.js} +1 -1
  130. package/static/auth-callback/assets/{IndexSubjectPanel-upH9MjU-.js → IndexSubjectPanel-DzSw8M9j.js} +1 -1
  131. package/static/auth-callback/assets/{ModelAssignmentsPanel-CVGH4t4g.js → ModelAssignmentsPanel-BsRxGc2p.js} +1 -1
  132. package/static/auth-callback/assets/ModelsPage-DEe1lo6Q.js +10 -0
  133. package/static/auth-callback/assets/{NetworkPage-Dcbrb1fd.js → NetworkPage-DBiEh1Oz.js} +1 -1
  134. package/static/auth-callback/assets/{PaneListHeader-DrY-1wBq.js → PaneListHeader-lEEgjyN9.js} +1 -1
  135. package/static/auth-callback/assets/{SearchIndexingPanel-Dw25y53v.js → SearchIndexingPanel-CZCUUGt6.js} +1 -1
  136. package/static/auth-callback/assets/{StatusSubjectPanel-BHlz9rNF.js → StatusSubjectPanel-21qdueMr.js} +1 -1
  137. package/static/auth-callback/assets/{StatusWorkspace-BH7exQP5.js → StatusWorkspace-R8RKsqVz.js} +1 -1
  138. package/static/auth-callback/assets/{SystemSettingsPage-BYLKnM9f.js → SystemSettingsPage-BQ4e-4Wy.js} +1 -1
  139. package/static/auth-callback/assets/{SystemSettingsSubjectPanel-DT34LKku.js → SystemSettingsSubjectPanel-BopXD7SE.js} +1 -1
  140. package/static/auth-callback/assets/{activity-DdULRcSI.js → activity-DSfmTGfY.js} +1 -1
  141. package/static/auth-callback/assets/ai-connections-C03UWyPh.js +1 -0
  142. package/static/auth-callback/assets/{auth-callback-D7l2P25I.js → auth-callback-DleaitAS.js} +91 -91
  143. package/static/auth-callback/assets/auth-callback-vPSC2d2F.css +1 -0
  144. package/static/auth-callback/assets/{badge-j4zjFnmg.js → badge-B0aLu1sl.js} +1 -1
  145. package/static/auth-callback/assets/{download-DGXoks01.js → download-D_bFwdYJ.js} +1 -1
  146. package/static/auth-callback/assets/{external-link-CvbgXXaI.js → external-link-DRfjTaQu.js} +1 -1
  147. package/static/auth-callback/assets/{index-LRWvKJ2i.js → index-CG23cLYQ.js} +1 -1
  148. package/static/auth-callback/assets/{index-BOK3j1dz.js → index-CyV9ejwx.js} +1 -1
  149. package/static/auth-callback/assets/{index-browser-C1Qpe0g4.js → index-browser-D70paxIg.js} +1 -1
  150. package/static/auth-callback/assets/{key-round-CmgS5UdQ.js → key-round-BjV_mVYH.js} +1 -1
  151. package/static/auth-callback/assets/{rotate-ccw-c4CSG6Rq.js → rotate-ccw-CKoOAfse.js} +1 -1
  152. package/static/auth-callback/assets/{skeleton-ZPMTiRSM.js → skeleton-BZNjZaHx.js} +1 -1
  153. package/static/auth-callback/assets/{waypoints-xjyBflU5.js → waypoints-DoaJVzZv.js} +1 -1
  154. package/static/auth-callback/assets/{workspace-layout-B9nj6F5J.js → workspace-layout-CaP46_ZR.js} +1 -1
  155. package/static/auth-callback/auth-callback.html +2 -2
  156. package/static/dashboard/assets/{AiConfigContext-BWOOSYNr.js → AiConfigContext-BSrR27yD.js} +1 -1
  157. package/static/dashboard/assets/{AiConfigPage-CG2kQ9Wy.js → AiConfigPage-D65Z2LET.js} +1 -1
  158. package/static/dashboard/assets/{DocumentProcessingPanel-B4VXajfj.js → DocumentProcessingPanel-DyTe7Nei.js} +1 -1
  159. package/static/dashboard/assets/{IndexLifecyclePanel-CWCy0CC8.js → IndexLifecyclePanel-fK8ZGlrL.js} +1 -1
  160. package/static/dashboard/assets/{IndexSubjectPanel-CSgyQnG_.js → IndexSubjectPanel-CZPGor7v.js} +1 -1
  161. package/static/dashboard/assets/{ModelAssignmentsPanel-CdGIGidT.js → ModelAssignmentsPanel-CfYn5LMQ.js} +1 -1
  162. package/static/dashboard/assets/ModelsPage-djlJsghe.js +25 -0
  163. package/static/dashboard/assets/{NetworkPage-COia9NCH.js → NetworkPage-Coj6GnPl.js} +1 -1
  164. package/static/dashboard/assets/{PaneListHeader-SZWyr602.js → PaneListHeader-CUuFNSsZ.js} +1 -1
  165. package/static/dashboard/assets/{SearchIndexingPanel-D6PZtG6k.js → SearchIndexingPanel-CyJLioXS.js} +1 -1
  166. package/static/dashboard/assets/{StatusSubjectPanel-CxRD4kv0.js → StatusSubjectPanel-Cv26GSVC.js} +1 -1
  167. package/static/dashboard/assets/{StatusWorkspace-D3PfmY9-.js → StatusWorkspace-CDjFrsmB.js} +1 -1
  168. package/static/dashboard/assets/{SystemSettingsPage-COg1MmMj.js → SystemSettingsPage-BuNOyNoa.js} +1 -1
  169. package/static/dashboard/assets/{SystemSettingsSubjectPanel-BSVVB9Ol.js → SystemSettingsSubjectPanel-B2dasdez.js} +1 -1
  170. package/static/dashboard/assets/{activity-BJJx5cN-.js → activity-D1d2j_4Z.js} +1 -1
  171. package/static/dashboard/assets/ai-connections-C03UWyPh.js +1 -0
  172. package/static/dashboard/assets/{badge-elmrFSCj.js → badge-BeAAv6sp.js} +1 -1
  173. package/static/dashboard/assets/{dashboard-IvQrNmru.js → dashboard-BnGrUGv8.js} +68 -68
  174. package/static/dashboard/assets/dashboard-vPSC2d2F.css +1 -0
  175. package/static/dashboard/assets/{download-C3FH2KzG.js → download-DfFGiZRn.js} +1 -1
  176. package/static/dashboard/assets/{external-link-Bx7F0uKb.js → external-link-IsjU_LC9.js} +1 -1
  177. package/static/dashboard/assets/{index-liRoRIP1.js → index-BWQTucPe.js} +1 -1
  178. package/static/dashboard/assets/{index-M4-kWiGz.js → index-Dj75OjnW.js} +1 -1
  179. package/static/dashboard/assets/{key-round-CXg0bKAj.js → key-round-BJ_9wmQ_.js} +1 -1
  180. package/static/dashboard/assets/{rotate-ccw-yxJKOBrX.js → rotate-ccw-D3JGiFbR.js} +1 -1
  181. package/static/dashboard/assets/{skeleton-x9jNGrQT.js → skeleton-CC4nc-z-.js} +1 -1
  182. package/static/dashboard/assets/{waypoints-CTKeRsGp.js → waypoints-h7sqFqiG.js} +1 -1
  183. package/static/dashboard/assets/{workspace-layout--YkgkS38.js → workspace-layout-ZAPTOHhs.js} +1 -1
  184. package/static/dashboard/dashboard.html +2 -2
  185. package/static/settings/assets/{AiConfigContext-CelxXFcQ.js → AiConfigContext-lGkWpvKP.js} +1 -1
  186. package/static/settings/assets/{AiConfigPage-BaP-EovM.js → AiConfigPage-BbZWIBZq.js} +1 -1
  187. package/static/settings/assets/{DocumentProcessingPanel-DzLZluFv.js → DocumentProcessingPanel-DvYdjT-V.js} +1 -1
  188. package/static/settings/assets/{IndexLifecyclePanel-Bzj1-_oI.js → IndexLifecyclePanel-W5OGQZj7.js} +1 -1
  189. package/static/settings/assets/{IndexSubjectPanel-B263QLUh.js → IndexSubjectPanel-g_Aa5soq.js} +1 -1
  190. package/static/settings/assets/{ModelAssignmentsPanel-BAdT4UR0.js → ModelAssignmentsPanel-COlMBKXj.js} +1 -1
  191. package/static/settings/assets/ModelsPage-mApKi-aw.js +10 -0
  192. package/static/settings/assets/{NetworkPage-BK6a7l4g.js → NetworkPage-BDT05JUq.js} +1 -1
  193. package/static/settings/assets/{PaneListHeader-BAS2ICPq.js → PaneListHeader-CByhNpMG.js} +1 -1
  194. package/static/settings/assets/{SearchIndexingPanel-Cb_p-NgW.js → SearchIndexingPanel-BFAyzXls.js} +1 -1
  195. package/static/settings/assets/{StatusSubjectPanel-CcjqUua6.js → StatusSubjectPanel-Bz_XZ3VU.js} +1 -1
  196. package/static/settings/assets/{StatusWorkspace-7Ibty3_k.js → StatusWorkspace-CeVypHcW.js} +1 -1
  197. package/static/settings/assets/{SystemSettingsPage-DPSz4dg4.js → SystemSettingsPage-Dh7cQIfx.js} +1 -1
  198. package/static/settings/assets/{SystemSettingsSubjectPanel-Cb4HkKT5.js → SystemSettingsSubjectPanel-CSnpciO0.js} +1 -1
  199. package/static/settings/assets/{activity-Qhsr5Pxu.js → activity-DXz3EfFN.js} +1 -1
  200. package/static/settings/assets/ai-connections-C03UWyPh.js +1 -0
  201. package/static/settings/assets/{badge-B1vf2qCl.js → badge-1ZA144i4.js} +1 -1
  202. package/static/settings/assets/{download-CYNt0aZ-.js → download-CUHimlYa.js} +1 -1
  203. package/static/settings/assets/{external-link-ClKb39NT.js → external-link-BYHSVj2Z.js} +1 -1
  204. package/static/settings/assets/{index-y8ew3MLM.js → index-DKPDMdW5.js} +1 -1
  205. package/static/settings/assets/{index-browser-DJhvgpNI.js → index-browser-BaEFz0e0.js} +1 -1
  206. package/static/settings/assets/{index-BgiIDSch.js → index-viSgSvbO.js} +1 -1
  207. package/static/settings/assets/{key-round-5d-DrJz-.js → key-round-COByPOg8.js} +1 -1
  208. package/static/settings/assets/{rotate-ccw-CHZY7kS5.js → rotate-ccw-BC2EN6cE.js} +1 -1
  209. package/static/settings/assets/{settings-D5VRWyx6.js → settings-DLH9XUoT.js} +86 -86
  210. package/static/settings/assets/settings-vPSC2d2F.css +1 -0
  211. package/static/settings/assets/{skeleton-FNabNxNE.js → skeleton-B0-FOhKL.js} +1 -1
  212. package/static/settings/assets/{waypoints-BnL_8ljo.js → waypoints-DGMsvqWo.js} +1 -1
  213. package/static/settings/assets/{workspace-layout-D5q3F59S.js → workspace-layout-B0SVrJIu.js} +1 -1
  214. package/static/settings/settings.html +2 -2
  215. package/static/auth-callback/assets/ModelsPage-BpkVFKbf.js +0 -10
  216. package/static/auth-callback/assets/ai-connections-Bm52UO7Y.js +0 -1
  217. package/static/auth-callback/assets/auth-callback-01yz-UDU.css +0 -1
  218. package/static/dashboard/assets/ModelsPage-Chd5UK0D.js +0 -25
  219. package/static/dashboard/assets/ai-connections-Bm52UO7Y.js +0 -1
  220. package/static/dashboard/assets/dashboard-01yz-UDU.css +0 -1
  221. package/static/settings/assets/ModelsPage-C0NFa1zq.js +0 -10
  222. package/static/settings/assets/ai-connections-Bm52UO7Y.js +0 -1
  223. package/static/settings/assets/settings-01yz-UDU.css +0 -1
@@ -3141,6 +3141,86 @@
3141
3141
  }
3142
3142
  }
3143
3143
  },
3144
+ "SessionBoundIdentityProviderFactory": {
3145
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory",
3146
+ "@prefix": true,
3147
+ "@context": {
3148
+ "config": {
3149
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_config",
3150
+ "@type": "@json"
3151
+ },
3152
+ "args_promptFactory": {
3153
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_promptFactory"
3154
+ },
3155
+ "args_adapterFactory": {
3156
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_adapterFactory"
3157
+ },
3158
+ "args_baseUrl": {
3159
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_baseUrl"
3160
+ },
3161
+ "args_oidcPath": {
3162
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_oidcPath"
3163
+ },
3164
+ "args_interactionRoute": {
3165
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_interactionRoute"
3166
+ },
3167
+ "args_clientCredentialsStore": {
3168
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_clientCredentialsStore"
3169
+ },
3170
+ "args_storage": {
3171
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_storage"
3172
+ },
3173
+ "args_jwkGenerator": {
3174
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_jwkGenerator"
3175
+ },
3176
+ "args_showStackTrace": {
3177
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_showStackTrace"
3178
+ },
3179
+ "args_errorHandler": {
3180
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_errorHandler"
3181
+ },
3182
+ "args_responseWriter": {
3183
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_responseWriter"
3184
+ },
3185
+ "g": {
3186
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_config",
3187
+ "@type": "@json"
3188
+ },
3189
+ "promptFactory": {
3190
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_promptFactory"
3191
+ },
3192
+ "adapterFactory": {
3193
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_adapterFactory"
3194
+ },
3195
+ "baseUrl": {
3196
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_baseUrl"
3197
+ },
3198
+ "oidcPath": {
3199
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_oidcPath"
3200
+ },
3201
+ "interactionRoute": {
3202
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_interactionRoute"
3203
+ },
3204
+ "clientCredentialsStore": {
3205
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_clientCredentialsStore"
3206
+ },
3207
+ "storage": {
3208
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_storage"
3209
+ },
3210
+ "jwkGenerator": {
3211
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_jwkGenerator"
3212
+ },
3213
+ "showStackTrace": {
3214
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_showStackTrace"
3215
+ },
3216
+ "errorHandler": {
3217
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_errorHandler"
3218
+ },
3219
+ "responseWriter": {
3220
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_responseWriter"
3221
+ }
3222
+ }
3223
+ },
3144
3224
  "ScopedPickWebIdHandler": {
3145
3225
  "@id": "undefineds:dist/identity/oidc/ScopedPickWebIdHandler.jsonld#ScopedPickWebIdHandler",
3146
3226
  "@prefix": true,
@@ -34,6 +34,8 @@ export declare class InternalPodDataHttpHandler extends HttpHandler {
34
34
  private readonly deploymentBaseUrl?;
35
35
  private readonly basePath;
36
36
  private readonly seenNonces;
37
+ private readonly eTagHandler;
38
+ private readonly conditionsParser;
37
39
  constructor(options: InternalPodDataHttpHandlerOptions);
38
40
  canHandle({ request }: HttpHandlerInput): Promise<void>;
39
41
  handle({ request, response }: HttpHandlerInput): Promise<void>;
@@ -44,6 +46,7 @@ export declare class InternalPodDataHttpHandler extends HttpHandler {
44
46
  private isAllowedAiConnectionResource;
45
47
  private delegate;
46
48
  private createRepresentation;
49
+ private writeETag;
47
50
  private createPatch;
48
51
  private pipeRepresentation;
49
52
  private writeNotFound;
@@ -18,6 +18,8 @@ class InternalPodDataHttpHandler extends community_server_1.HttpHandler {
18
18
  constructor(options) {
19
19
  super();
20
20
  this.logger = (0, global_logger_factory_1.getLoggerFor)(this);
21
+ this.eTagHandler = new community_server_1.BasicETagHandler();
22
+ this.conditionsParser = new community_server_1.BasicConditionsParser(this.eTagHandler);
21
23
  this.resourceStore = options.resourceStore;
22
24
  this.gatewayAdminProxyAuthSecret = options.gatewayAdminProxyAuthSecret ?? process.env.XPOD_GATEWAY_ADMIN_PROXY_AUTH_SECRET;
23
25
  this.patchBodyParser = options.patchBodyParser;
@@ -50,7 +52,7 @@ class InternalPodDataHttpHandler extends community_server_1.HttpHandler {
50
52
  }
51
53
  catch (error) {
52
54
  if (isHttpNotFound(error)) {
53
- if (intent.method === 'GET') {
55
+ if (intent.method === 'GET' && !isGatewayAccessKeySecretResource(intent)) {
54
56
  this.writeEmptyGraph(response);
55
57
  }
56
58
  else {
@@ -217,6 +219,7 @@ class InternalPodDataHttpHandler extends community_server_1.HttpHandler {
217
219
  const representation = await this.resourceStore.getRepresentation(identifier, resourceReadPreferences(intent));
218
220
  response.statusCode = 200;
219
221
  response.setHeader('Content-Type', representation.metadata.contentType ?? 'text/turtle');
222
+ this.writeETag(representation, response);
220
223
  await this.pipeRepresentation(representation, response);
221
224
  return;
222
225
  }
@@ -224,12 +227,14 @@ class InternalPodDataHttpHandler extends community_server_1.HttpHandler {
224
227
  const representation = await this.resourceStore.getRepresentation(identifier, resourceReadPreferences(intent));
225
228
  response.statusCode = 200;
226
229
  response.setHeader('Content-Type', representation.metadata.contentType ?? 'text/turtle');
230
+ this.writeETag(representation, response);
227
231
  representation.data.destroy();
228
232
  response.end();
229
233
  return;
230
234
  }
231
235
  case 'PUT': {
232
- await this.resourceStore.setRepresentation(identifier, this.createRepresentation(request, intent.resourceUrl));
236
+ const conditions = await this.conditionsParser.handleSafe(request);
237
+ await this.resourceStore.setRepresentation(identifier, this.createRepresentation(request, intent.resourceUrl), conditions);
233
238
  response.statusCode = 204;
234
239
  response.end();
235
240
  return;
@@ -251,6 +256,12 @@ class InternalPodDataHttpHandler extends community_server_1.HttpHandler {
251
256
  const contentType = firstHeader(request.headers['content-type']) ?? 'text/turtle';
252
257
  return new community_server_1.BasicRepresentation(request, new community_server_1.RepresentationMetadata({ path: resourceUrl }, contentType));
253
258
  }
259
+ writeETag(representation, response) {
260
+ const eTag = this.eTagHandler.getETag(representation.metadata);
261
+ if (eTag) {
262
+ response.setHeader('ETag', eTag);
263
+ }
264
+ }
254
265
  async createPatch(request, resourceUrl) {
255
266
  if (!this.patchBodyParser) {
256
267
  throw new community_server_1.NotImplementedHttpError('Internal Pod data PATCH requires a PatchBodyParser.');
@@ -114,6 +114,14 @@
114
114
  "@id": "undefineds:dist/http/InternalPodDataHttpHandler.jsonld#InternalPodDataHttpHandler__member_seenNonces",
115
115
  "memberFieldName": "seenNonces"
116
116
  },
117
+ {
118
+ "@id": "undefineds:dist/http/InternalPodDataHttpHandler.jsonld#InternalPodDataHttpHandler__member_eTagHandler",
119
+ "memberFieldName": "eTagHandler"
120
+ },
121
+ {
122
+ "@id": "undefineds:dist/http/InternalPodDataHttpHandler.jsonld#InternalPodDataHttpHandler__member_conditionsParser",
123
+ "memberFieldName": "conditionsParser"
124
+ },
117
125
  {
118
126
  "@id": "undefineds:dist/http/InternalPodDataHttpHandler.jsonld#InternalPodDataHttpHandler__member_constructor",
119
127
  "memberFieldName": "constructor"
@@ -154,6 +162,10 @@
154
162
  "@id": "undefineds:dist/http/InternalPodDataHttpHandler.jsonld#InternalPodDataHttpHandler__member_createRepresentation",
155
163
  "memberFieldName": "createRepresentation"
156
164
  },
165
+ {
166
+ "@id": "undefineds:dist/http/InternalPodDataHttpHandler.jsonld#InternalPodDataHttpHandler__member_writeETag",
167
+ "memberFieldName": "writeETag"
168
+ },
157
169
  {
158
170
  "@id": "undefineds:dist/http/InternalPodDataHttpHandler.jsonld#InternalPodDataHttpHandler__member_createPatch",
159
171
  "memberFieldName": "createPatch"
@@ -1,5 +1,5 @@
1
1
  import { PromptFactory } from '@solid/community-server';
2
- import { interactionPolicy } from 'oidc-provider';
2
+ import type { interactionPolicy } from 'oidc-provider';
3
3
  import { RememberedClientGrantStore } from './RememberedClientGrantStore';
4
4
  /** Runs after the existing account and WebID checks, before any consent checks. */
5
5
  export declare class RememberedClientPromptFactory extends PromptFactory {
@@ -2,7 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RememberedClientPromptFactory = void 0;
4
4
  const community_server_1 = require("@solid/community-server");
5
- const oidc_provider_1 = require("oidc-provider");
6
5
  const RememberedClientGrantStore_1 = require("./RememberedClientGrantStore");
7
6
  /** Runs after the existing account and WebID checks, before any consent checks. */
8
7
  class RememberedClientPromptFactory extends community_server_1.PromptFactory {
@@ -21,7 +20,11 @@ class RememberedClientPromptFactory extends community_server_1.PromptFactory {
21
20
  throw new community_server_1.InternalServerError('Missing ordered default login and consent policies.');
22
21
  }
23
22
  const remembered = new WeakSet();
24
- policy.add(new oidc_provider_1.interactionPolicy.Prompt({ name: 'restore_remembered_client', requestable: false }, new oidc_provider_1.interactionPolicy.Check('restore_remembered_client', 'Restore previously remembered consent.', async (ctx) => {
23
+ // Bundled and external providers can have different class identities. Use
24
+ // the incoming policy's constructors so its instanceof checks accept both.
25
+ const PolicyPrompt = consent.constructor;
26
+ const PolicyCheck = native.constructor;
27
+ policy.add(new PolicyPrompt({ name: 'restore_remembered_client', requestable: false }, new PolicyCheck('restore_remembered_client', 'Restore previously remembered consent.', async (ctx) => {
25
28
  const { oidc } = ctx;
26
29
  const accountId = oidc.session?.accountId;
27
30
  const clientId = oidc.client?.clientId;
@@ -23,7 +23,7 @@ class RememberedConsentHandler extends community_server_1.JsonInteractionHandler
23
23
  return await this.source.handleSafe(input);
24
24
  }
25
25
  catch (error) {
26
- if (!(error instanceof community_server_1.FoundHttpError) || !interaction?.result?.consent ||
26
+ if (!community_server_1.FoundHttpError.isInstance(error) || !interaction?.result?.consent ||
27
27
  interaction.result === previousResult) {
28
28
  throw error;
29
29
  }
@@ -26,6 +26,7 @@ export declare class ScopedPickWebIdHandler extends JsonInteractionHandler imple
26
26
  private readonly rememberedClientGrantStore?;
27
27
  constructor(options: ScopedPickWebIdHandlerOptions);
28
28
  getView({ accountId, oidcInteraction }: JsonInteractionHandlerInput): Promise<JsonRepresentation>;
29
+ private findResumeWebId;
29
30
  handle({ oidcInteraction, accountId, json }: JsonInteractionHandlerInput): Promise<never>;
30
31
  private clearSelectedWebId;
31
32
  private resolveScopedEntries;
@@ -34,14 +34,40 @@ class ScopedPickWebIdHandler extends community_server_1.JsonInteractionHandler {
34
34
  const description = (0, community_server_1.parseSchema)(inSchema);
35
35
  const target = await this.resolveTargetStorage(provider, oidcInteraction);
36
36
  const entries = await this.resolveScopedEntries(accountId, target);
37
+ const resumeWebId = await this.findResumeWebId(provider, oidcInteraction, entries);
37
38
  return {
38
39
  json: {
39
40
  ...description,
40
41
  webIds: entries.map((entry) => entry.webId),
41
42
  entries,
43
+ ...(resumeWebId ? { resumeWebId } : {}),
42
44
  },
43
45
  };
44
46
  }
47
+ async findResumeWebId(provider, interaction, entries) {
48
+ if (interaction?.params.client_id !== RememberedClientGrantStore_1.XPOD_DESKTOP_CLIENT_ID || interaction.prompt?.name !== 'login' ||
49
+ interaction.params.max_age !== undefined) {
50
+ return undefined;
51
+ }
52
+ const reasons = interaction.prompt.reasons;
53
+ // Other login checks require user input; resubmitting the same WebID cannot
54
+ // satisfy them and would repeatedly return to the same login interaction.
55
+ if (!Array.isArray(reasons) || reasons.length !== 1 || reasons[0] !== 'no_session') {
56
+ return undefined;
57
+ }
58
+ const prompt = interaction.params.prompt;
59
+ if (prompt !== undefined && (typeof prompt !== 'string' || /(?:^|\s)(?:login|select_account)(?:\s|$)/u.test(prompt))) {
60
+ return undefined;
61
+ }
62
+ const webIds = [...new Set(entries.map((entry) => entry.webId))];
63
+ if (webIds.length !== 1) {
64
+ return undefined;
65
+ }
66
+ // This only offers a login choice. OIDC still evaluates consent prompts and
67
+ // missing scopes after the client submits that choice and resumes the flow.
68
+ const grant = await this.rememberedClientGrantStore?.find(provider, webIds[0], RememberedClientGrantStore_1.XPOD_DESKTOP_CLIENT_ID);
69
+ return grant ? webIds[0] : undefined;
70
+ }
45
71
  async handle({ oidcInteraction, accountId, json }) {
46
72
  (0, community_server_1.assertOidcInteraction)(oidcInteraction);
47
73
  (0, community_server_1.assertAccountId)(accountId);
@@ -93,6 +93,10 @@
93
93
  "@id": "undefineds:dist/identity/oidc/ScopedPickWebIdHandler.jsonld#ScopedPickWebIdHandler__member_getView",
94
94
  "memberFieldName": "getView"
95
95
  },
96
+ {
97
+ "@id": "undefineds:dist/identity/oidc/ScopedPickWebIdHandler.jsonld#ScopedPickWebIdHandler__member_findResumeWebId",
98
+ "memberFieldName": "findResumeWebId"
99
+ },
96
100
  {
97
101
  "@id": "undefineds:dist/identity/oidc/ScopedPickWebIdHandler.jsonld#ScopedPickWebIdHandler__member_handle",
98
102
  "memberFieldName": "handle"
@@ -0,0 +1,10 @@
1
+ import { IdentityProviderFactory, type IdentityProviderFactoryArgs } from '@solid/community-server';
2
+ import type { Configuration } from 'oidc-provider';
3
+ /** Retain the IdP session boundary while allowing Desktop to renew online access. */
4
+ export declare class SessionBoundIdentityProviderFactory extends IdentityProviderFactory {
5
+ /**
6
+ * @param config - JSON config for the OIDC library @range {json}
7
+ * @param args - Remaining parameters required for the factory.
8
+ */
9
+ constructor(config: Configuration, args: IdentityProviderFactoryArgs);
10
+ }
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SessionBoundIdentityProviderFactory = void 0;
4
+ const community_server_1 = require("@solid/community-server");
5
+ const RememberedClientGrantStore_1 = require("./RememberedClientGrantStore");
6
+ /** Retain the IdP session boundary while allowing Desktop to renew online access. */
7
+ class SessionBoundIdentityProviderFactory extends community_server_1.IdentityProviderFactory {
8
+ /**
9
+ * @param config - JSON config for the OIDC library @range {json}
10
+ * @param args - Remaining parameters required for the factory.
11
+ */
12
+ constructor(config, args) {
13
+ super({
14
+ ...config,
15
+ issueRefreshToken: config.issueRefreshToken ?? (async (_ctx, client, code) => client.grantTypeAllowed('refresh_token') && (code.scopes.has('offline_access') ||
16
+ (client.clientId === RememberedClientGrantStore_1.XPOD_DESKTOP_CLIENT_ID && 'expiresWithSession' in code && code.expiresWithSession === true))),
17
+ }, args);
18
+ }
19
+ }
20
+ exports.SessionBoundIdentityProviderFactory = SessionBoundIdentityProviderFactory;
21
+ //# sourceMappingURL=SessionBoundIdentityProviderFactory.js.map
@@ -0,0 +1,172 @@
1
+ {
2
+ "@context": [
3
+ "https://linkedsoftwaredependencies.org/bundles/npm/@undefineds.co/xpod/^0.0.0/components/context.jsonld",
4
+ "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^8.0.0/components/context.jsonld"
5
+ ],
6
+ "@id": "npmd:@undefineds.co/xpod",
7
+ "components": [
8
+ {
9
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory",
10
+ "@type": "Class",
11
+ "requireElement": "SessionBoundIdentityProviderFactory",
12
+ "extends": [
13
+ "css:dist/identity/configuration/IdentityProviderFactory.jsonld#IdentityProviderFactory"
14
+ ],
15
+ "comment": "Retain the IdP session boundary while allowing Desktop to renew online access.",
16
+ "parameters": [
17
+ {
18
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_config",
19
+ "range": "rdf:JSON",
20
+ "comment": "JSON config for the OIDC library"
21
+ },
22
+ {
23
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_promptFactory",
24
+ "range": "css:dist/identity/configuration/PromptFactory.jsonld#PromptFactory",
25
+ "comment": "Used to generate new prompt that are needed in addition to the defaults prompts."
26
+ },
27
+ {
28
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_adapterFactory",
29
+ "range": "css:dist/identity/storage/AdapterFactory.jsonld#AdapterFactory",
30
+ "comment": "Factory that creates the adapter used for OIDC data storage."
31
+ },
32
+ {
33
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_baseUrl",
34
+ "range": "xsd:string",
35
+ "comment": "Base URL of the server."
36
+ },
37
+ {
38
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_oidcPath",
39
+ "range": "xsd:string",
40
+ "comment": "Path for all requests targeting the OIDC library."
41
+ },
42
+ {
43
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_interactionRoute",
44
+ "range": "css:dist/identity/interaction/routing/InteractionRoute.jsonld#InteractionRoute",
45
+ "comment": "The route where requests should be redirected to in case of an OIDC interaction."
46
+ },
47
+ {
48
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_clientCredentialsStore",
49
+ "range": "ClientCredentials:Store",
50
+ "comment": "Store containing the generated client credentials with their associated WebID."
51
+ },
52
+ {
53
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_storage",
54
+ "range": {
55
+ "@type": "ParameterRangeGenericComponent",
56
+ "component": "css:dist/storage/keyvalue/KeyValueStorage.jsonld#KeyValueStorage",
57
+ "genericTypeInstances": [
58
+ "xsd:string",
59
+ {
60
+ "@type": "ParameterRangeArray",
61
+ "parameterRangeValue": "xsd:string"
62
+ }
63
+ ]
64
+ },
65
+ "comment": "Storage used to store cookie keys, so they can be re-used in case of multithreading."
66
+ },
67
+ {
68
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_jwkGenerator",
69
+ "range": "css:dist/identity/configuration/JwkGenerator.jsonld#JwkGenerator",
70
+ "comment": "Generates the JWK used for signing and decryption."
71
+ },
72
+ {
73
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_showStackTrace",
74
+ "range": "xsd:boolean",
75
+ "comment": "Extra information will be added to the error output if this is true."
76
+ },
77
+ {
78
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_errorHandler",
79
+ "range": "css:dist/http/output/error/ErrorHandler.jsonld#ErrorHandler",
80
+ "comment": "Used to convert errors thrown by the OIDC library."
81
+ },
82
+ {
83
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_responseWriter",
84
+ "range": "css:dist/http/output/ResponseWriter.jsonld#ResponseWriter",
85
+ "comment": "Used to write out errors thrown by the OIDC library."
86
+ }
87
+ ],
88
+ "memberFields": [
89
+ {
90
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory__member_constructor",
91
+ "memberFieldName": "constructor"
92
+ }
93
+ ],
94
+ "constructorArguments": [
95
+ {
96
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_config"
97
+ },
98
+ {
99
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args__constructorArgument",
100
+ "fields": [
101
+ {
102
+ "keyRaw": "promptFactory",
103
+ "value": {
104
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_promptFactory"
105
+ }
106
+ },
107
+ {
108
+ "keyRaw": "adapterFactory",
109
+ "value": {
110
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_adapterFactory"
111
+ }
112
+ },
113
+ {
114
+ "keyRaw": "baseUrl",
115
+ "value": {
116
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_baseUrl"
117
+ }
118
+ },
119
+ {
120
+ "keyRaw": "oidcPath",
121
+ "value": {
122
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_oidcPath"
123
+ }
124
+ },
125
+ {
126
+ "keyRaw": "interactionRoute",
127
+ "value": {
128
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_interactionRoute"
129
+ }
130
+ },
131
+ {
132
+ "keyRaw": "clientCredentialsStore",
133
+ "value": {
134
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_clientCredentialsStore"
135
+ }
136
+ },
137
+ {
138
+ "keyRaw": "storage",
139
+ "value": {
140
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_storage"
141
+ }
142
+ },
143
+ {
144
+ "keyRaw": "jwkGenerator",
145
+ "value": {
146
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_jwkGenerator"
147
+ }
148
+ },
149
+ {
150
+ "keyRaw": "showStackTrace",
151
+ "value": {
152
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_showStackTrace"
153
+ }
154
+ },
155
+ {
156
+ "keyRaw": "errorHandler",
157
+ "value": {
158
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_errorHandler"
159
+ }
160
+ },
161
+ {
162
+ "keyRaw": "responseWriter",
163
+ "value": {
164
+ "@id": "undefineds:dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld#SessionBoundIdentityProviderFactory_args_responseWriter"
165
+ }
166
+ }
167
+ ]
168
+ }
169
+ ]
170
+ }
171
+ ]
172
+ }
package/dist/index.d.ts CHANGED
@@ -96,6 +96,7 @@ import { AutoDetectIdentityProviderHandler } from './identity/oidc/AutoDetectIde
96
96
  import { LoopbackClientIdAdapterFactory } from './identity/oidc/LoopbackClientIdAdapterFactory';
97
97
  import { RememberedClientGrantStore } from './identity/oidc/RememberedClientGrantStore';
98
98
  import { RememberedConsentHandler } from './identity/oidc/RememberedConsentHandler';
99
+ import { SessionBoundIdentityProviderFactory } from './identity/oidc/SessionBoundIdentityProviderFactory';
99
100
  import { RememberedClientPromptFactory } from './identity/oidc/RememberedClientPromptFactory';
100
101
  import { ScopedPickWebIdHandler } from './identity/oidc/ScopedPickWebIdHandler';
101
102
  import { ConfiguredLoopbackDPoPWebIdExtractor } from './authentication/ConfiguredLoopbackDPoPWebIdExtractor';
@@ -122,5 +123,5 @@ export type { OwnedWebIdEntry, PodOwnershipResolver, PodOwnershipTarget, CssPodO
122
123
  export type { TunnelProvider, TunnelConfig, TunnelSetupOptions, TunnelStatus, } from './tunnel/TunnelProvider';
123
124
  export type { SubdomainRegistration, ConnectivityResult, SubdomainServiceOptions, } from './subdomain/SubdomainService';
124
125
  export { AppStaticAssetHandler } from './http/AppStaticAssetHandler';
125
- export { RepresentationPartialConvertingStore, MinioDataAccessor, SolidRdfDataAccessor, MixDataAccessor, ConfigurableLoggerFactory, SparqlUpdateResourceStore, SubgraphQueryEngine, SubgraphSparqlHttpHandler, InternalPodDataHttpHandler, QuotaAdminHttpHandler, ClusterIngressRouter, ClusterWebSocketConfigurator, EdgeNodeDirectDebugHttpHandler, EdgeNodeProxyHttpHandler, RouterHttpHandler, RouterHttpRoute, TracingHandler, EdgeNodeCertificateHttpHandler, TerminalHttpHandler, DeviceNotificationHub, DeviceNotificationResourceListener, DeviceNotificationWebSocketServer, DeviceNotificationTicketHandler, registerDeviceNotificationRuntime, ReservedSuffixIdentifierGenerator, DrizzleIndexedStorage, ValidatingIdentityProviderHttpHandler, PostgresKeyValueStorage, RedisKeyValueStorage, SqliteKeyValueStorage, BaseKeyValueStorage, DrizzleQuotaService, NoopQuotaService, HttpEntitlementProvider, NoopEntitlementProvider, PerAccountQuotaStrategy, TencentDnsProvider, EdgeNodeDnsCoordinator, Dns01CertificateProvisioner, SimpleEdgeNodeTunnelManager, NoopEdgeNodeTunnelManager, FrpTunnelManager, EdgeNodeHealthProbeService, EdgeNodeAgent, EdgeNodeAgentInitializer, EdgeNodeCertificateService, AcmeCertificateManager, EdgeNodeModeDetector, ClusterIdentifierStrategy, UsageTrackingStore, CenterNodeRegistrationService, PodRoutingHttpHandler, ReactAppViewHandler, QuintStore, SqliteQuintStore, PgQuintStore, RdfTermDictionary, RdfQuadIndex, Rdf3xIndex, RdfTextIndex, RdfVectorIndex, PostgresRdfTextIndex, PostgresRdfVectorIndex, SolidRdfEngine, LocalQleverNativeSparqlClient, QleverSparqlEngine, RdfQuerySparqlEngine, PostgresRdfEngine, VectorStore, SqliteVectorStore, PostgresVectorStore, VectorHttpHandler, ProviderRegistry, ProviderRegistryImpl, EmbeddingService, EmbeddingServiceImpl, CredentialReader, CredentialReaderImpl, CloudflareTunnelProvider, LocalTunnelProvider, NgrokTunnelProvider, SubdomainService, MultiDomainIdentifierStrategy, SubdomainPodIdentifierStrategy, DisabledOidcHandler, DisabledIdentityProviderHandler, AutoDetectOidcHandler, AutoDetectIdentityProviderHandler, LoopbackClientIdAdapterFactory, RememberedClientGrantStore, RememberedConsentHandler, RememberedClientPromptFactory, ScopedPickWebIdHandler, ConfiguredLoopbackDPoPWebIdExtractor, AccountStorageBindingsHandler, CssPodOwnershipResolver, UrlAwareRedisLocker, ProvisionPodCreator, ProvisionPodStore, ProvisionCodeCodec, LocalPodProvisioningService, SqliteSolidFsSyncJournal, RootedSolidFsSyncJournal, LocalRdfAuthorityRecoveryInitializer, ObservableResourceStore, RdfSearchReconciliationIntentSink, };
126
+ export { RepresentationPartialConvertingStore, MinioDataAccessor, SolidRdfDataAccessor, MixDataAccessor, ConfigurableLoggerFactory, SparqlUpdateResourceStore, SubgraphQueryEngine, SubgraphSparqlHttpHandler, InternalPodDataHttpHandler, QuotaAdminHttpHandler, ClusterIngressRouter, ClusterWebSocketConfigurator, EdgeNodeDirectDebugHttpHandler, EdgeNodeProxyHttpHandler, RouterHttpHandler, RouterHttpRoute, TracingHandler, EdgeNodeCertificateHttpHandler, TerminalHttpHandler, DeviceNotificationHub, DeviceNotificationResourceListener, DeviceNotificationWebSocketServer, DeviceNotificationTicketHandler, registerDeviceNotificationRuntime, ReservedSuffixIdentifierGenerator, DrizzleIndexedStorage, ValidatingIdentityProviderHttpHandler, PostgresKeyValueStorage, RedisKeyValueStorage, SqliteKeyValueStorage, BaseKeyValueStorage, DrizzleQuotaService, NoopQuotaService, HttpEntitlementProvider, NoopEntitlementProvider, PerAccountQuotaStrategy, TencentDnsProvider, EdgeNodeDnsCoordinator, Dns01CertificateProvisioner, SimpleEdgeNodeTunnelManager, NoopEdgeNodeTunnelManager, FrpTunnelManager, EdgeNodeHealthProbeService, EdgeNodeAgent, EdgeNodeAgentInitializer, EdgeNodeCertificateService, AcmeCertificateManager, EdgeNodeModeDetector, ClusterIdentifierStrategy, UsageTrackingStore, CenterNodeRegistrationService, PodRoutingHttpHandler, ReactAppViewHandler, QuintStore, SqliteQuintStore, PgQuintStore, RdfTermDictionary, RdfQuadIndex, Rdf3xIndex, RdfTextIndex, RdfVectorIndex, PostgresRdfTextIndex, PostgresRdfVectorIndex, SolidRdfEngine, LocalQleverNativeSparqlClient, QleverSparqlEngine, RdfQuerySparqlEngine, PostgresRdfEngine, VectorStore, SqliteVectorStore, PostgresVectorStore, VectorHttpHandler, ProviderRegistry, ProviderRegistryImpl, EmbeddingService, EmbeddingServiceImpl, CredentialReader, CredentialReaderImpl, CloudflareTunnelProvider, LocalTunnelProvider, NgrokTunnelProvider, SubdomainService, MultiDomainIdentifierStrategy, SubdomainPodIdentifierStrategy, DisabledOidcHandler, DisabledIdentityProviderHandler, AutoDetectOidcHandler, AutoDetectIdentityProviderHandler, LoopbackClientIdAdapterFactory, RememberedClientGrantStore, RememberedConsentHandler, RememberedClientPromptFactory, SessionBoundIdentityProviderFactory, ScopedPickWebIdHandler, ConfiguredLoopbackDPoPWebIdExtractor, AccountStorageBindingsHandler, CssPodOwnershipResolver, UrlAwareRedisLocker, ProvisionPodCreator, ProvisionPodStore, ProvisionCodeCodec, LocalPodProvisioningService, SqliteSolidFsSyncJournal, RootedSolidFsSyncJournal, LocalRdfAuthorityRecoveryInitializer, ObservableResourceStore, RdfSearchReconciliationIntentSink, };
126
127
  export type { ResourceChangeEvent, ResourceChangeListener, ResourceChangeRecorder, } from './storage/ObservableResourceStore';
package/dist/index.js CHANGED
@@ -15,8 +15,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  exports.ClusterIdentifierStrategy = exports.EdgeNodeModeDetector = exports.AcmeCertificateManager = exports.EdgeNodeCertificateService = exports.EdgeNodeAgentInitializer = exports.EdgeNodeAgent = exports.EdgeNodeHealthProbeService = exports.FrpTunnelManager = exports.NoopEdgeNodeTunnelManager = exports.SimpleEdgeNodeTunnelManager = exports.Dns01CertificateProvisioner = exports.EdgeNodeDnsCoordinator = exports.TencentDnsProvider = exports.PerAccountQuotaStrategy = exports.NoopEntitlementProvider = exports.HttpEntitlementProvider = exports.NoopQuotaService = exports.DrizzleQuotaService = exports.BaseKeyValueStorage = exports.SqliteKeyValueStorage = exports.RedisKeyValueStorage = exports.PostgresKeyValueStorage = exports.ValidatingIdentityProviderHttpHandler = exports.DrizzleIndexedStorage = exports.ReservedSuffixIdentifierGenerator = exports.registerDeviceNotificationRuntime = exports.DeviceNotificationTicketHandler = exports.DeviceNotificationWebSocketServer = exports.DeviceNotificationResourceListener = exports.DeviceNotificationHub = exports.TerminalHttpHandler = exports.EdgeNodeCertificateHttpHandler = exports.TracingHandler = exports.RouterHttpRoute = exports.RouterHttpHandler = exports.EdgeNodeProxyHttpHandler = exports.EdgeNodeDirectDebugHttpHandler = exports.ClusterWebSocketConfigurator = exports.ClusterIngressRouter = exports.QuotaAdminHttpHandler = exports.InternalPodDataHttpHandler = exports.SubgraphSparqlHttpHandler = exports.SubgraphQueryEngine = exports.SparqlUpdateResourceStore = exports.ConfigurableLoggerFactory = exports.MixDataAccessor = exports.SolidRdfDataAccessor = exports.MinioDataAccessor = exports.RepresentationPartialConvertingStore = exports.AppStaticAssetHandler = void 0;
18
- exports.ProvisionPodStore = exports.ProvisionPodCreator = exports.UrlAwareRedisLocker = exports.CssPodOwnershipResolver = exports.AccountStorageBindingsHandler = exports.ConfiguredLoopbackDPoPWebIdExtractor = exports.ScopedPickWebIdHandler = exports.RememberedClientPromptFactory = exports.RememberedConsentHandler = exports.RememberedClientGrantStore = exports.LoopbackClientIdAdapterFactory = exports.AutoDetectIdentityProviderHandler = exports.AutoDetectOidcHandler = exports.DisabledIdentityProviderHandler = exports.DisabledOidcHandler = exports.SubdomainPodIdentifierStrategy = exports.MultiDomainIdentifierStrategy = exports.SubdomainService = exports.NgrokTunnelProvider = exports.LocalTunnelProvider = exports.CloudflareTunnelProvider = exports.CredentialReaderImpl = exports.CredentialReader = exports.EmbeddingServiceImpl = exports.EmbeddingService = exports.ProviderRegistryImpl = exports.ProviderRegistry = exports.VectorHttpHandler = exports.PostgresVectorStore = exports.SqliteVectorStore = exports.VectorStore = exports.PostgresRdfEngine = exports.RdfQuerySparqlEngine = exports.QleverSparqlEngine = exports.LocalQleverNativeSparqlClient = exports.SolidRdfEngine = exports.PostgresRdfVectorIndex = exports.PostgresRdfTextIndex = exports.RdfVectorIndex = exports.RdfTextIndex = exports.Rdf3xIndex = exports.RdfQuadIndex = exports.RdfTermDictionary = exports.PgQuintStore = exports.SqliteQuintStore = exports.QuintStore = exports.ReactAppViewHandler = exports.PodRoutingHttpHandler = exports.CenterNodeRegistrationService = exports.UsageTrackingStore = void 0;
19
- exports.RdfSearchReconciliationIntentSink = exports.ObservableResourceStore = exports.LocalRdfAuthorityRecoveryInitializer = exports.RootedSolidFsSyncJournal = exports.SqliteSolidFsSyncJournal = exports.LocalPodProvisioningService = exports.ProvisionCodeCodec = void 0;
18
+ exports.ProvisionPodCreator = exports.UrlAwareRedisLocker = exports.CssPodOwnershipResolver = exports.AccountStorageBindingsHandler = exports.ConfiguredLoopbackDPoPWebIdExtractor = exports.ScopedPickWebIdHandler = exports.SessionBoundIdentityProviderFactory = exports.RememberedClientPromptFactory = exports.RememberedConsentHandler = exports.RememberedClientGrantStore = exports.LoopbackClientIdAdapterFactory = exports.AutoDetectIdentityProviderHandler = exports.AutoDetectOidcHandler = exports.DisabledIdentityProviderHandler = exports.DisabledOidcHandler = exports.SubdomainPodIdentifierStrategy = exports.MultiDomainIdentifierStrategy = exports.SubdomainService = exports.NgrokTunnelProvider = exports.LocalTunnelProvider = exports.CloudflareTunnelProvider = exports.CredentialReaderImpl = exports.CredentialReader = exports.EmbeddingServiceImpl = exports.EmbeddingService = exports.ProviderRegistryImpl = exports.ProviderRegistry = exports.VectorHttpHandler = exports.PostgresVectorStore = exports.SqliteVectorStore = exports.VectorStore = exports.PostgresRdfEngine = exports.RdfQuerySparqlEngine = exports.QleverSparqlEngine = exports.LocalQleverNativeSparqlClient = exports.SolidRdfEngine = exports.PostgresRdfVectorIndex = exports.PostgresRdfTextIndex = exports.RdfVectorIndex = exports.RdfTextIndex = exports.Rdf3xIndex = exports.RdfQuadIndex = exports.RdfTermDictionary = exports.PgQuintStore = exports.SqliteQuintStore = exports.QuintStore = exports.ReactAppViewHandler = exports.PodRoutingHttpHandler = exports.CenterNodeRegistrationService = exports.UsageTrackingStore = void 0;
19
+ exports.RdfSearchReconciliationIntentSink = exports.ObservableResourceStore = exports.LocalRdfAuthorityRecoveryInitializer = exports.RootedSolidFsSyncJournal = exports.SqliteSolidFsSyncJournal = exports.LocalPodProvisioningService = exports.ProvisionCodeCodec = exports.ProvisionPodStore = void 0;
20
20
  require("./runtime/configure-drizzle-solid");
21
21
  const RepresentationPartialConvertingStore_1 = require("./storage/RepresentationPartialConvertingStore");
22
22
  Object.defineProperty(exports, "RepresentationPartialConvertingStore", { enumerable: true, get: function () { return RepresentationPartialConvertingStore_1.RepresentationPartialConvertingStore; } });
@@ -203,6 +203,8 @@ const RememberedClientGrantStore_1 = require("./identity/oidc/RememberedClientGr
203
203
  Object.defineProperty(exports, "RememberedClientGrantStore", { enumerable: true, get: function () { return RememberedClientGrantStore_1.RememberedClientGrantStore; } });
204
204
  const RememberedConsentHandler_1 = require("./identity/oidc/RememberedConsentHandler");
205
205
  Object.defineProperty(exports, "RememberedConsentHandler", { enumerable: true, get: function () { return RememberedConsentHandler_1.RememberedConsentHandler; } });
206
+ const SessionBoundIdentityProviderFactory_1 = require("./identity/oidc/SessionBoundIdentityProviderFactory");
207
+ Object.defineProperty(exports, "SessionBoundIdentityProviderFactory", { enumerable: true, get: function () { return SessionBoundIdentityProviderFactory_1.SessionBoundIdentityProviderFactory; } });
206
208
  const RememberedClientPromptFactory_1 = require("./identity/oidc/RememberedClientPromptFactory");
207
209
  Object.defineProperty(exports, "RememberedClientPromptFactory", { enumerable: true, get: function () { return RememberedClientPromptFactory_1.RememberedClientPromptFactory; } });
208
210
  const ScopedPickWebIdHandler_1 = require("./identity/oidc/ScopedPickWebIdHandler");
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.extractComponentParameterContext = extractComponentParameterContext;
4
4
  exports.normalizeComponentParameterKeys = normalizeComponentParameterKeys;
5
+ const RDF_JSON = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#JSON';
5
6
  function isObject(value) {
6
7
  return typeof value === 'object' && value !== null && !Array.isArray(value);
7
8
  }
@@ -39,6 +40,10 @@ function normalizeComponentParameterKeys(document, componentContext) {
39
40
  if (!isObject(value)) {
40
41
  return;
41
42
  }
43
+ // JSON literals are opaque data, even if their payload resembles a component.
44
+ if ((value['@type'] === '@json' || value['@type'] === RDF_JSON) && '@value' in value) {
45
+ return;
46
+ }
42
47
  const type = value['@type'];
43
48
  if (typeof type === 'string') {
44
49
  const typeDefinition = componentContext[type];
@@ -61,7 +66,7 @@ function normalizeComponentParameterKeys(document, componentContext) {
61
66
  continue;
62
67
  }
63
68
  if (!(normalized.key in value)) {
64
- value[normalized.key] = normalizeComponentValue(value[key], normalized.container);
69
+ value[normalized.key] = normalizeComponentValue(value[key], normalized.container, normalized.type);
65
70
  }
66
71
  delete value[key];
67
72
  }
@@ -87,9 +92,20 @@ function normalizedComponentKey(type, typeDefinition, typeContext, key) {
87
92
  return localName ? {
88
93
  key: `${type}:${localName}`,
89
94
  container: termDefinition['@container'],
95
+ type: termDefinition['@type'],
90
96
  } : undefined;
91
97
  }
92
- function normalizeComponentValue(value, container) {
98
+ function normalizeComponentValue(value, container, type) {
99
+ if (type === '@json') {
100
+ if (isObject(value) && value['@type'] === RDF_JSON && '@value' in value) {
101
+ return value;
102
+ }
103
+ const literal = isObject(value) && value['@type'] === '@json' && '@value' in value
104
+ ? value['@value']
105
+ : value;
106
+ // The streaming RDF parser needs the lexical RDF JSON form for explicit literals.
107
+ return { '@type': RDF_JSON, '@value': JSON.stringify(literal) };
108
+ }
93
109
  if (container === '@list' &&
94
110
  Array.isArray(value) &&
95
111
  !(value.length === 1 && isObject(value[0]) && '@list' in value[0])) {
@@ -457,7 +457,9 @@ class MixDataAccessor {
457
457
  * refreshed as query/index state.
458
458
  */
459
459
  async syncLocalRdfDocument(identifier, data, contentType, options) {
460
- if (!this.isRdfDocumentIdentifier(identifier)) {
460
+ // CSS maps Turtle files such as profile/card$.ttl to extensionless URLs.
461
+ // Recovery already supplies the authority file's RDF content type.
462
+ if (!(0, RdfContentTypes_1.isRdfDocumentContentType)(contentType) && !this.isRdfDocumentIdentifier(identifier)) {
461
463
  throw new Error(`Cannot sync non RDF document into RDF index: ${identifier.path}`);
462
464
  }
463
465
  const source = data ?? await this.rdfFileDataAccessor.getData(identifier);
@@ -465,7 +467,9 @@ class MixDataAccessor {
465
467
  const text = await this.readStreamText(source);
466
468
  if (data) {
467
469
  await this.ensureRdfFileParentContainers(identifier);
468
- await this.rdfFileDataAccessor.writeDocument(identifier, (0, community_server_1.guardStream)(stream_1.Readable.from([text])), this.createLocalRdfMetadata(identifier, new community_server_1.RepresentationMetadata(identifier)));
470
+ const localMetadata = this.createLocalRdfMetadata(identifier, new community_server_1.RepresentationMetadata(identifier));
471
+ localMetadata.contentType = localContentType;
472
+ await this.rdfFileDataAccessor.writeDocument(identifier, (0, community_server_1.guardStream)(stream_1.Readable.from([text])), localMetadata);
469
473
  }
470
474
  const quads = await this.parseLocalRdf(identifier, text, localContentType);
471
475
  await this.writeStructuredRdfIndex(identifier, quads, new community_server_1.RepresentationMetadata(identifier), {