@linkedrecords/browser 0.1.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.
- package/LICENSE +661 -0
- package/Readme.md +154 -0
- package/dist/browser_sdk.js +3 -0
- package/dist/browser_sdk.js.LICENSE.txt +254 -0
- package/dist/browser_sdk.js.map +1 -0
- package/dist/docs/app/[[...slug]]/page.d.ts +13 -0
- package/dist/docs/app/[[...slug]]/page.d.ts.map +1 -0
- package/dist/docs/app/layout.d.ts +10 -0
- package/dist/docs/app/layout.d.ts.map +1 -0
- package/dist/docs/lib/source.d.ts +2 -0
- package/dist/docs/lib/source.d.ts.map +1 -0
- package/dist/docs/mdx-components.d.ts +3 -0
- package/dist/docs/mdx-components.d.ts.map +1 -0
- package/dist/docs/source.config.d.ts +4 -0
- package/dist/docs/source.config.d.ts.map +1 -0
- package/dist/instrumentation.js +283 -0
- package/dist/instrumentation.js.map +1 -0
- package/dist/lib/cache/index.d.ts +4 -0
- package/dist/lib/cache/index.d.ts.map +1 -0
- package/dist/lib/client-server-bus/client/index.d.ts +3 -0
- package/dist/lib/client-server-bus/client/index.d.ts.map +1 -0
- package/dist/lib/client-server-bus/drivers/ws/client/index.d.ts +23 -0
- package/dist/lib/client-server-bus/drivers/ws/client/index.d.ts.map +1 -0
- package/dist/lib/client-server-bus/drivers/ws/server/index.d.ts +14 -0
- package/dist/lib/client-server-bus/drivers/ws/server/index.d.ts.map +1 -0
- package/dist/lib/client-server-bus/server/index.d.ts +4 -0
- package/dist/lib/client-server-bus/server/index.d.ts.map +1 -0
- package/dist/lib/cookie-settings-from-env/index.d.ts +8 -0
- package/dist/lib/cookie-settings-from-env/index.d.ts.map +1 -0
- package/dist/lib/is_logger.d.ts +6 -0
- package/dist/lib/is_logger.d.ts.map +1 -0
- package/dist/lib/pg-log/index.d.ts +9 -0
- package/dist/lib/pg-log/index.d.ts.map +1 -0
- package/dist/lib/queued-tasks/In_memory_queued_tasks.d.ts +9 -0
- package/dist/lib/queued-tasks/In_memory_queued_tasks.d.ts.map +1 -0
- package/dist/lib/queued-tasks/index.d.ts +7 -0
- package/dist/lib/queued-tasks/index.d.ts.map +1 -0
- package/dist/lib/queued-tasks/redis_queued_tasks.d.ts +7 -0
- package/dist/lib/queued-tasks/redis_queued_tasks.d.ts.map +1 -0
- package/dist/lib/quota/index.d.ts +16 -0
- package/dist/lib/quota/index.d.ts.map +1 -0
- package/dist/lib/stream-to-string/index.d.ts +4 -0
- package/dist/lib/stream-to-string/index.d.ts.map +1 -0
- package/dist/lib/utils/all_prefixes.d.ts +2 -0
- package/dist/lib/utils/all_prefixes.d.ts.map +1 -0
- package/dist/lib/utils/chunk_array.d.ts +2 -0
- package/dist/lib/utils/chunk_array.d.ts.map +1 -0
- package/dist/lib/utils/read_body.d.ts +3 -0
- package/dist/lib/utils/read_body.d.ts.map +1 -0
- package/dist/lib/utils/safe_compare.d.ts +2 -0
- package/dist/lib/utils/safe_compare.d.ts.map +1 -0
- package/dist/lib/utils/save_compare.d.ts +2 -0
- package/dist/lib/utils/save_compare.d.ts.map +1 -0
- package/dist/lib/utils/sql_values.d.ts +11 -0
- package/dist/lib/utils/sql_values.d.ts.map +1 -0
- package/dist/lib/utils/unset.d.ts +2 -0
- package/dist/lib/utils/unset.d.ts.map +1 -0
- package/dist/node_modules/redis-semaphore/src/errors/LostLockError.d.ts +3 -0
- package/dist/node_modules/redis-semaphore/src/errors/LostLockError.d.ts.map +1 -0
- package/dist/report.html +57 -0
- package/dist/server.js +6737 -0
- package/dist/server.js.map +1 -0
- package/dist/specs/browser_sdk/attribute.spec.d.ts +2 -0
- package/dist/specs/browser_sdk/attribute.spec.d.ts.map +1 -0
- package/dist/specs/browser_sdk/blob_attribute.spec.d.ts +2 -0
- package/dist/specs/browser_sdk/blob_attribute.spec.d.ts.map +1 -0
- package/dist/specs/browser_sdk/fact.spec.d.ts +2 -0
- package/dist/specs/browser_sdk/fact.spec.d.ts.map +1 -0
- package/dist/specs/browser_sdk/key_value_attribute.spec.d.ts +2 -0
- package/dist/specs/browser_sdk/key_value_attribute.spec.d.ts.map +1 -0
- package/dist/specs/browser_sdk/long_text_attribute.spec.d.ts +2 -0
- package/dist/specs/browser_sdk/long_text_attribute.spec.d.ts.map +1 -0
- package/dist/specs/browser_sdk/oidc-auth.spec.d.ts +2 -0
- package/dist/specs/browser_sdk/oidc-auth.spec.d.ts.map +1 -0
- package/dist/specs/browser_sdk/userinfo.spec.d.ts +2 -0
- package/dist/specs/browser_sdk/userinfo.spec.d.ts.map +1 -0
- package/dist/specs/helpers/dummy-oidc-server.d.ts +3 -0
- package/dist/specs/helpers/dummy-oidc-server.d.ts.map +1 -0
- package/dist/specs/helpers/index.d.ts +9 -0
- package/dist/specs/helpers/index.d.ts.map +1 -0
- package/dist/specs/helpers/karma-setup.d.ts +2 -0
- package/dist/specs/helpers/karma-setup.d.ts.map +1 -0
- package/dist/specs/helpers/mock-oidc-server.d.ts +28 -0
- package/dist/specs/helpers/mock-oidc-server.d.ts.map +1 -0
- package/dist/specs/helpers/test-oidc-manager.d.ts +24 -0
- package/dist/specs/helpers/test-oidc-manager.d.ts.map +1 -0
- package/dist/specs.wdio/browser_sdk/auth.spec.d.ts +2 -0
- package/dist/specs.wdio/browser_sdk/auth.spec.d.ts.map +1 -0
- package/dist/specs.wdio/browser_sdk/query_subscription.spec.d.ts +2 -0
- package/dist/specs.wdio/browser_sdk/query_subscription.spec.d.ts.map +1 -0
- package/dist/specs.wdio/browser_sdk/quota.spec.d.ts +2 -0
- package/dist/specs.wdio/browser_sdk/quota.spec.d.ts.map +1 -0
- package/dist/specs.wdio/browser_sdk/userinfo.spec.d.ts +2 -0
- package/dist/specs.wdio/browser_sdk/userinfo.spec.d.ts.map +1 -0
- package/dist/specs.wdio/helpers/lr_expects.d.ts +7 -0
- package/dist/specs.wdio/helpers/lr_expects.d.ts.map +1 -0
- package/dist/specs.wdio/helpers/session.d.ts +42 -0
- package/dist/specs.wdio/helpers/session.d.ts.map +1 -0
- package/dist/specs.wdio/helpers/timer.d.ts +21 -0
- package/dist/specs.wdio/helpers/timer.d.ts.map +1 -0
- package/dist/specs.wdio/helpers/wdio_remote.d.ts +7 -0
- package/dist/specs.wdio/helpers/wdio_remote.d.ts.map +1 -0
- package/dist/specs.wdio/load/documents/documents.spec.d.ts +2 -0
- package/dist/specs.wdio/load/documents/documents.spec.d.ts.map +1 -0
- package/dist/specs.wdio/load/documents.spec.d.ts +2 -0
- package/dist/specs.wdio/load/documents.spec.d.ts.map +1 -0
- package/dist/specs.wdio/quota_upgrade/paddle.spec.d.ts +2 -0
- package/dist/specs.wdio/quota_upgrade/paddle.spec.d.ts.map +1 -0
- package/dist/specs.wdio/testapp/client.d.ts +2 -0
- package/dist/specs.wdio/testapp/client.d.ts.map +1 -0
- package/dist/specs.wdio/testapp/server.d.ts +2 -0
- package/dist/specs.wdio/testapp/server.d.ts.map +1 -0
- package/dist/specs.wdio/tinytodo/tinytodo.d.ts +25 -0
- package/dist/specs.wdio/tinytodo/tinytodo.d.ts.map +1 -0
- package/dist/specs.wdio/tinytodo/tinytodo.spec.d.ts +2 -0
- package/dist/specs.wdio/tinytodo/tinytodo.spec.d.ts.map +1 -0
- package/dist/specs.wdio/tinytodo/tinytodo_expects.d.ts +8 -0
- package/dist/specs.wdio/tinytodo/tinytodo_expects.d.ts.map +1 -0
- package/dist/src/attributes/abstract/abstract_attribute_change.d.ts +7 -0
- package/dist/src/attributes/abstract/abstract_attribute_change.d.ts.map +1 -0
- package/dist/src/attributes/abstract/abstract_attribute_client.d.ts +58 -0
- package/dist/src/attributes/abstract/abstract_attribute_client.d.ts.map +1 -0
- package/dist/src/attributes/abstract/abstract_attribute_server.d.ts +39 -0
- package/dist/src/attributes/abstract/abstract_attribute_server.d.ts.map +1 -0
- package/dist/src/attributes/abstract/is_attribute_change.d.ts +7 -0
- package/dist/src/attributes/abstract/is_attribute_change.d.ts.map +1 -0
- package/dist/src/attributes/abstract/is_attribute_storage.d.ts +52 -0
- package/dist/src/attributes/abstract/is_attribute_storage.d.ts.map +1 -0
- package/dist/src/attributes/abstract/is_serializable.d.ts +4 -0
- package/dist/src/attributes/abstract/is_serializable.d.ts.map +1 -0
- package/dist/src/attributes/abstract/serialized_change_with_metadata.d.ts +11 -0
- package/dist/src/attributes/abstract/serialized_change_with_metadata.d.ts.map +1 -0
- package/dist/src/attributes/attribute_query.d.ts +55 -0
- package/dist/src/attributes/attribute_query.d.ts.map +1 -0
- package/dist/src/attributes/attribute_storage/blob/index.d.ts +38 -0
- package/dist/src/attributes/attribute_storage/blob/index.d.ts.map +1 -0
- package/dist/src/attributes/attribute_storage/index.d.ts +33 -0
- package/dist/src/attributes/attribute_storage/index.d.ts.map +1 -0
- package/dist/src/attributes/attribute_storage/psql/index.d.ts +39 -0
- package/dist/src/attributes/attribute_storage/psql/index.d.ts.map +1 -0
- package/dist/src/attributes/attribute_storage/psql_with_history/index.d.ts +35 -0
- package/dist/src/attributes/attribute_storage/psql_with_history/index.d.ts.map +1 -0
- package/dist/src/attributes/attribute_storage/s3/index.d.ts +38 -0
- package/dist/src/attributes/attribute_storage/s3/index.d.ts.map +1 -0
- package/dist/src/attributes/attribute_storage/types.d.ts +27 -0
- package/dist/src/attributes/attribute_storage/types.d.ts.map +1 -0
- package/dist/src/attributes/blob/blob_change.d.ts +7 -0
- package/dist/src/attributes/blob/blob_change.d.ts.map +1 -0
- package/dist/src/attributes/blob/client/index.d.ts +18 -0
- package/dist/src/attributes/blob/client/index.d.ts.map +1 -0
- package/dist/src/attributes/blob/server/index.d.ts +27 -0
- package/dist/src/attributes/blob/server/index.d.ts.map +1 -0
- package/dist/src/attributes/errors/authorization_error.d.ts +6 -0
- package/dist/src/attributes/errors/authorization_error.d.ts.map +1 -0
- package/dist/src/attributes/key_value/client/index.d.ts +19 -0
- package/dist/src/attributes/key_value/client/index.d.ts.map +1 -0
- package/dist/src/attributes/key_value/key_value_change.d.ts +16 -0
- package/dist/src/attributes/key_value/key_value_change.d.ts.map +1 -0
- package/dist/src/attributes/key_value/server/index.d.ts +28 -0
- package/dist/src/attributes/key_value/server/index.d.ts.map +1 -0
- package/dist/src/attributes/long_text/client/buffer.d.ts +12 -0
- package/dist/src/attributes/long_text/client/buffer.d.ts.map +1 -0
- package/dist/src/attributes/long_text/client/index.d.ts +25 -0
- package/dist/src/attributes/long_text/client/index.d.ts.map +1 -0
- package/dist/src/attributes/long_text/long_text_change.d.ts +16 -0
- package/dist/src/attributes/long_text/long_text_change.d.ts.map +1 -0
- package/dist/src/attributes/long_text/server/index.d.ts +27 -0
- package/dist/src/attributes/long_text/server/index.d.ts.map +1 -0
- package/dist/src/browser_sdk/attributes_repository.d.ts +46 -0
- package/dist/src/browser_sdk/attributes_repository.d.ts.map +1 -0
- package/dist/src/browser_sdk/facts_repository.d.ts +11 -0
- package/dist/src/browser_sdk/facts_repository.d.ts.map +1 -0
- package/dist/src/browser_sdk/index.d.ts +69 -0
- package/dist/src/browser_sdk/index.d.ts.map +1 -0
- package/dist/src/browser_sdk/oidc.d.ts +29 -0
- package/dist/src/browser_sdk/oidc.d.ts.map +1 -0
- package/dist/src/dev-oidc/config.d.ts +13 -0
- package/dist/src/dev-oidc/config.d.ts.map +1 -0
- package/dist/src/dev-oidc/endpoints.d.ts +8 -0
- package/dist/src/dev-oidc/endpoints.d.ts.map +1 -0
- package/dist/src/dev-oidc/index.d.ts +5 -0
- package/dist/src/dev-oidc/index.d.ts.map +1 -0
- package/dist/src/dev-oidc/keys.d.ts +9 -0
- package/dist/src/dev-oidc/keys.d.ts.map +1 -0
- package/dist/src/dev-oidc/login-page.d.ts +3 -0
- package/dist/src/dev-oidc/login-page.d.ts.map +1 -0
- package/dist/src/facts/client/index.d.ts +15 -0
- package/dist/src/facts/client/index.d.ts.map +1 -0
- package/dist/src/facts/fact_query.d.ts +8 -0
- package/dist/src/facts/fact_query.d.ts.map +1 -0
- package/dist/src/facts/server/auth_cache.d.ts +12 -0
- package/dist/src/facts/server/auth_cache.d.ts.map +1 -0
- package/dist/src/facts/server/authorization_sql_builder.d.ts +22 -0
- package/dist/src/facts/server/authorization_sql_builder.d.ts.map +1 -0
- package/dist/src/facts/server/fact_box.d.ts +20 -0
- package/dist/src/facts/server/fact_box.d.ts.map +1 -0
- package/dist/src/facts/server/index.d.ts +64 -0
- package/dist/src/facts/server/index.d.ts.map +1 -0
- package/dist/src/facts/server/predicate_extractor.d.ts +8 -0
- package/dist/src/facts/server/predicate_extractor.d.ts.map +1 -0
- package/dist/src/facts/server/query_subscription_service.d.ts +14 -0
- package/dist/src/facts/server/query_subscription_service.d.ts.map +1 -0
- package/dist/src/facts/server/subscription_service.d.ts +1 -0
- package/dist/src/facts/server/subscription_service.d.ts.map +1 -0
- package/dist/src/quota/index.d.ts +38 -0
- package/dist/src/quota/index.d.ts.map +1 -0
- package/dist/src/server/cache.d.ts +7 -0
- package/dist/src/server/cache.d.ts.map +1 -0
- package/dist/src/server/controllers/attributes_controller.d.ts +16 -0
- package/dist/src/server/controllers/attributes_controller.d.ts.map +1 -0
- package/dist/src/server/controllers/facts_controller.d.ts +7 -0
- package/dist/src/server/controllers/facts_controller.d.ts.map +1 -0
- package/dist/src/server/controllers/oidc_controller.d.ts +5 -0
- package/dist/src/server/controllers/oidc_controller.d.ts.map +1 -0
- package/dist/src/server/controllers/quota_controller.d.ts +5 -0
- package/dist/src/server/controllers/quota_controller.d.ts.map +1 -0
- package/dist/src/server/controllers/subscription_controller.d.ts +9 -0
- package/dist/src/server/controllers/subscription_controller.d.ts.map +1 -0
- package/dist/src/server/controllers/userinfo_controller.d.ts +7 -0
- package/dist/src/server/controllers/userinfo_controller.d.ts.map +1 -0
- package/dist/src/server/index.d.ts +2 -0
- package/dist/src/server/index.d.ts.map +1 -0
- package/dist/src/server/instrumentation/config.d.ts +14 -0
- package/dist/src/server/instrumentation/config.d.ts.map +1 -0
- package/dist/src/server/instrumentation/index.d.ts +11 -0
- package/dist/src/server/instrumentation/index.d.ts.map +1 -0
- package/dist/src/server/instrumentation/manual/minio.d.ts +8 -0
- package/dist/src/server/instrumentation/manual/minio.d.ts.map +1 -0
- package/dist/src/server/instrumentation/manual/socketio.d.ts +9 -0
- package/dist/src/server/instrumentation/manual/socketio.d.ts.map +1 -0
- package/dist/src/server/instrumentation.d.ts +10 -0
- package/dist/src/server/instrumentation.d.ts.map +1 -0
- package/dist/src/server/middleware/attribute.d.ts +5 -0
- package/dist/src/server/middleware/attribute.d.ts.map +1 -0
- package/dist/src/server/middleware/authentication.d.ts +2 -0
- package/dist/src/server/middleware/authentication.d.ts.map +1 -0
- package/dist/src/server/middleware/clear_cookies.d.ts +2 -0
- package/dist/src/server/middleware/clear_cookies.d.ts.map +1 -0
- package/dist/src/server/middleware/error_handler.d.ts +2 -0
- package/dist/src/server/middleware/error_handler.d.ts.map +1 -0
- package/dist/src/server/middleware/fact.d.ts +2 -0
- package/dist/src/server/middleware/fact.d.ts.map +1 -0
- package/dist/src/server/middleware/quota_upgrade.d.ts +3 -0
- package/dist/src/server/middleware/quota_upgrade.d.ts.map +1 -0
- package/dist/src/server/payment_provider/abstract_provider.d.ts +8 -0
- package/dist/src/server/payment_provider/abstract_provider.d.ts.map +1 -0
- package/dist/src/server/payment_provider/index.d.ts +5 -0
- package/dist/src/server/payment_provider/index.d.ts.map +1 -0
- package/dist/src/server/payment_provider/paddle.d.ts +16 -0
- package/dist/src/server/payment_provider/paddle.d.ts.map +1 -0
- package/dist/src/server/quota/index.d.ts +43 -0
- package/dist/src/server/quota/index.d.ts.map +1 -0
- package/dist/src/server/routes.d.ts +3 -0
- package/dist/src/server/routes.d.ts.map +1 -0
- package/dist/src/server/service_bus_mount.d.ts +10 -0
- package/dist/src/server/service_bus_mount.d.ts.map +1 -0
- package/dist/src/server/services/predicate_extractor.d.ts +24 -0
- package/dist/src/server/services/predicate_extractor.d.ts.map +1 -0
- package/dist/src/server/services/query_subscription_service.d.ts +42 -0
- package/dist/src/server/services/query_subscription_service.d.ts.map +1 -0
- package/dist/src/server/services/subscription_hooks.d.ts +18 -0
- package/dist/src/server/services/subscription_hooks.d.ts.map +1 -0
- package/dist/wdio.conf.d.ts +3 -0
- package/dist/wdio.conf.d.ts.map +1 -0
- package/package.json +121 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///../../lib/client-server-bus/drivers/ws/server/index.ts","webpack:///../../lib/client-server-bus/server/index.ts","webpack:///../../lib/cookie-settings-from-env/index.ts","webpack:///../../lib/pg-log/index.ts","webpack:///../../lib/queued-tasks/In_memory_queued_tasks.ts","webpack:///../../lib/queued-tasks/index.ts","webpack:///../../lib/queued-tasks/redis_queued_tasks.ts","webpack:///../../lib/utils/chunk_array.ts","webpack:///../../lib/utils/read_body.ts","webpack:///../../lib/utils/safe_compare.ts","webpack:///../../lib/utils/sql_values.ts","webpack:///../../lib/utils/unset.ts","webpack:///../attributes/abstract/abstract_attribute_client.ts","webpack:///../attributes/abstract/abstract_attribute_server.ts","webpack:///../attributes/abstract/serialized_change_with_metadata.ts","webpack:///../attributes/attribute_query.ts","webpack:///../attributes/attribute_storage/psql/index.ts","webpack:///../attributes/attribute_storage/psql_with_history/index.ts","webpack:///../attributes/attribute_storage/s3/index.ts","webpack:///../attributes/blob/blob_change.ts","webpack:///../attributes/blob/server/index.ts","webpack:///../attributes/errors/authorization_error.ts","webpack:///../attributes/key_value/key_value_change.ts","webpack:///../attributes/key_value/server/index.ts","webpack:///../attributes/long_text/long_text_change.ts","webpack:///../attributes/long_text/server/index.ts","webpack:///../dev-oidc/config.ts","webpack:///../dev-oidc/endpoints.ts","webpack:///../dev-oidc/index.ts","webpack:///../dev-oidc/keys.ts","webpack:///../dev-oidc/login-page.ts","webpack:///../facts/server/auth_cache.ts","webpack:///../facts/server/authorization_sql_builder.ts","webpack:///../facts/server/fact_box.ts","webpack:///../facts/server/index.ts","webpack:///../facts/server/query_subscription_service.ts","webpack:///./cache.ts","webpack:///./controllers/attributes_controller.ts","webpack:///./controllers/facts_controller.ts","webpack:///./controllers/oidc_controller.ts","webpack:///./controllers/quota_controller.ts","webpack:///./controllers/userinfo_controller.ts","webpack:///./index.ts","webpack:///./middleware/attribute.ts","webpack:///./middleware/authentication.ts","webpack:///./middleware/error_handler.ts","webpack:///./middleware/fact.ts","webpack:///./middleware/quota_upgrade.ts","webpack:///./payment_provider/abstract_provider.ts","webpack:///./payment_provider/index.ts","webpack:///./payment_provider/paddle.ts","webpack:///./quota/index.ts","webpack:///./routes.ts","webpack:///./service_bus_mount.ts","webpack:///external commonjs \"@socket.io/redis-streams-adapter\"","webpack:///external commonjs \"changesets\"","webpack:///external commonjs \"cors\"","webpack:///external commonjs \"diff_match_patch\"","webpack:///external commonjs \"dotenv/config\"","webpack:///external commonjs \"email-validator\"","webpack:///external commonjs \"express\"","webpack:///external commonjs \"express-oauth2-jwt-bearer\"","webpack:///external commonjs \"express-openid-connect\"","webpack:///external commonjs \"express-rate-limit\"","webpack:///external commonjs \"file-type\"","webpack:///external commonjs \"he\"","webpack:///external commonjs \"ioredis\"","webpack:///external commonjs \"jose\"","webpack:///external commonjs \"md5\"","webpack:///external commonjs \"minio\"","webpack:///external commonjs \"multer\"","webpack:///external commonjs \"pg\"","webpack:///external commonjs \"pg-format\"","webpack:///external commonjs \"pino-http\"","webpack:///external commonjs \"queue\"","webpack:///external commonjs \"raw-body\"","webpack:///external commonjs \"redis\"","webpack:///external commonjs \"redis-semaphore\"","webpack:///external commonjs \"set-value\"","webpack:///external commonjs \"socket.io\"","webpack:///external commonjs \"stream-to-blob\"","webpack:///external commonjs \"uuidv7\"","webpack:///external node-commonjs \"assert\"","webpack:///external node-commonjs \"crypto\"","webpack:///external node-commonjs \"http\"","webpack:///external node-commonjs \"https\"","webpack:///external node-commonjs \"stream\"","webpack:///external node-commonjs \"stream/consumers\"","webpack:///webpack/bootstrap","webpack:///webpack/before-startup","webpack:///webpack/startup","webpack:///webpack/after-startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(global, () => {\nreturn ","/* eslint-disable no-param-reassign */\nimport https from 'https';\nimport http from 'http';\nimport { Server } from 'socket.io';\nimport { createClient } from 'redis';\nimport { createAdapter } from '@socket.io/redis-streams-adapter';\nimport SerializedChangeWithMetadata from '../../../../../src/attributes/abstract/serialized_change_with_metadata';\nimport IsSerializable from '../../../../../src/attributes/abstract/is_serializable';\n\nconst connections = {};\nconst channels = new Set<string>();\n\nconst channelsResolver = Promise.withResolvers();\n\ntype MessageHandler<ChangeType extends IsSerializable> = (\n channel: string,\n message: SerializedChangeWithMetadata<ChangeType>,\n request: http.IncomingMessage,\n userId: string\n) => void;\n\nexport interface AccessControl {\n verifyAuthenticated(\n request: http.IncomingMessage\n ): Promise<string>;\n\n verifyAuthorizedChannelJoin(\n userId: string,\n channel: string,\n request: http.IncomingMessage,\n readToken?: string,\n ): Promise<boolean>;\n\n verifyAuthorizedSend(\n userId: string,\n channel: string,\n request: http.IncomingMessage,\n ): Promise<boolean>;\n}\n\nexport async function getAllChannels(): Promise<Set<string>> {\n await channelsResolver.promise;\n return channels;\n}\n\nexport default async function clientServerBus(\n httpServer: https.Server,\n app: any,\n accessControl: AccessControl,\n onMessage: MessageHandler<any>,\n) {\n const wsOptions: any = {\n path: '/ws',\n cookie: true,\n };\n\n if (process.env['REDIS_HOST']) {\n const redisClient = createClient({\n username: process.env['REDIS_USERNAME'],\n password: process.env['REDIS_PASSWORD'],\n socket: {\n host: process.env['REDIS_HOST'],\n port: 6379,\n },\n });\n await redisClient.connect();\n wsOptions.adapter = createAdapter(redisClient);\n }\n\n const io = new Server(httpServer, wsOptions);\n\n const sendClientServerMessage = (channel: string, body: any) => {\n io.to(channel).emit('data', {\n ...body,\n sseChannel: channel,\n });\n };\n\n io.fetchSockets().then((sockets) => {\n sockets.forEach((socket) => {\n socket.rooms.forEach((room) => channels.add(room));\n });\n\n console.log(`found ${channels.size} socket.io channels`);\n channelsResolver.resolve(undefined);\n }).catch((ex) => {\n channelsResolver.reject(ex);\n });\n\n io.of('/').adapter.on('create-room', (room) => channels.add(room));\n io.of('/').adapter.on('delete-room', (room) => channels.delete(room));\n\n io.on('connection', async (socket) => {\n const request = socket?.request;\n let userId;\n\n if (socket.handshake.auth?.['token']) {\n const { token } = socket.handshake.auth;\n\n if (typeof token === 'string' && token.trim()) {\n request.headers.authorization = token.startsWith('Bearer ') ? token : `Bearer ${token}`;\n }\n }\n\n try {\n userId = await accessControl.verifyAuthenticated(request);\n } catch (ex) {\n request.log.info(`User not authenticated: ${(ex as Error).message}`);\n throw ex;\n }\n\n if (!userId) {\n socket.write('HTTP/1.1 401 Unauthorized\\r\\n\\r\\n');\n socket.disconnect(true);\n return;\n }\n\n if (!connections[socket.id]) {\n connections[socket.id] = { socket, userId };\n\n socket.on('subscribe', async ({ channel, readToken }, callback) => {\n const isAuthorizedToJoin = await accessControl.verifyAuthorizedChannelJoin(\n userId,\n channel,\n request,\n readToken,\n );\n\n if (!channel) {\n callback({ status: 'invalid channel' });\n } else if (isAuthorizedToJoin) {\n socket.join(channel);\n callback({ status: 'subscribed' });\n } else {\n callback({ status: 'unauthorized' });\n }\n });\n\n socket.on('message', async ({ channel, message }, callback) => {\n if (!channel) {\n callback({ status: 'invalid channel' });\n } else if (!message) {\n callback({ status: 'invalid message' });\n } else if (await accessControl.verifyAuthorizedSend(userId, channel, request)) {\n onMessage(channel, message, request, userId);\n callback({ status: 'delivered' });\n } else {\n callback({ status: 'unauthorized' });\n }\n });\n }\n });\n\n io.engine.on('connection_error', (err) => {\n console.log('websocket connection error', err);\n });\n\n app.use((request, response, next) => {\n response.sendClientServerMessage = sendClientServerMessage;\n next();\n });\n\n return sendClientServerMessage;\n}\n","import clientServerBus, { getAllChannels } from '../drivers/ws/server';\n\nexport { getAllChannels };\nexport default clientServerBus;\n","/* eslint-disable no-new */\nfunction biggestCommonSuffix(str1, str2) {\n let i = str1.length - 1;\n let j = str2.length - 1;\n\n while (i >= 0 && j >= 0 && str1[i] === str2[j]) {\n i -= 1;\n j -= 1;\n }\n\n return str1.substring(i + 1);\n}\n\nfunction getCookieSettings(frontendURL: string, backendURL: string) {\n const frontend = new URL(frontendURL);\n const backend = new URL(backendURL);\n const backendHost = backend.host.replace(/:\\d*$/, '');\n const frontendHost = frontend.host.replace(/:\\d*$/, '');\n\n let commonHostSuffix = biggestCommonSuffix(\n backendHost,\n frontendHost,\n );\n\n if (backendHost === 'localhost' && frontendHost === 'localhost') {\n return {\n domain: backendHost,\n };\n }\n\n if (commonHostSuffix) {\n commonHostSuffix = commonHostSuffix.replace(/^\\./, '');\n }\n\n if (!commonHostSuffix || !commonHostSuffix.match(/\\./)) {\n return {\n domain: backendHost,\n sameSite: 'None',\n };\n }\n\n return {\n domain: commonHostSuffix,\n };\n}\n\nexport default function getCookieSettingsFromEnv() {\n if (!process.env['FRONTEND_BASE_URL']) {\n throw new Error('FRONTEND_BASE_URL environment variable must be provided');\n }\n\n if (!process.env['SERVER_BASE_URL']) {\n throw new Error('SERVER_BASE_URL environment variable must be provided');\n }\n\n try {\n new URL(process.env['FRONTEND_BASE_URL']);\n } catch {\n throw new Error('Invalid URL format in FRONTEND_BASE_URL environment variable');\n }\n\n try {\n new URL(process.env['SERVER_BASE_URL']);\n } catch {\n throw new Error('Invalid URL format in SERVER_BASE_URL environment variable');\n }\n\n return getCookieSettings(process.env['FRONTEND_BASE_URL'], process.env['SERVER_BASE_URL']);\n}\n","import { Pool } from 'pg';\nimport IsLogger from '../is_logger';\n\nconst pool: Pool = new Pool({\n max: 3,\n connectionTimeoutMillis: 2000,\n});\n\nexport default class PgPoolWithLog {\n logger?: IsLogger;\n\n constructor(logger: IsLogger) {\n this.logger = logger;\n }\n\n logResolvedQuery(args) {\n if (!this.logger) {\n console.log('\\n\\n');\n console.log('\\x1b[33m RUN SQL: Logger is Not available!!! \\x1b[0m', args);\n console.log('\\n\\n');\n\n return;\n }\n\n let interpolated = args[0];\n\n if (args[1]) {\n args[1].forEach((arg, i) => {\n interpolated = interpolated.replaceAll(`$${i + 1}`, `'${arg}'`);\n });\n }\n\n console.log('\\n\\n');\n console.log(`\\x1b[33m RUN SQL: ${interpolated} \\x1b[0m`);\n console.log('\\n\\n');\n }\n\n async query(...args: [string, any[]?]) {\n let pgresult;\n\n const startTime = Date.now();\n\n try {\n pgresult = await pool.query(...args);\n } catch (ex) {\n console.error('\\x1b[33m Error Executing query: \\x1b[0m', args[0]);\n this.logger?.warn(`\\x1b[33m Error Executing query: \\x1b[0m ${args[0]}`);\n throw ex;\n }\n\n const endTime = Date.now();\n\n if (this.logger) {\n const log = {\n queryTemplate: args[0],\n queryType: pgresult.command,\n timeInMS: endTime - startTime,\n results: pgresult.rowCount,\n };\n\n this.logger.info(log);\n }\n\n return pgresult;\n }\n\n async findAny(query, ...rest) {\n const result = await this.query(`SELECT EXISTS(${await query})`, ...rest);\n\n if (result.rows.length !== 1) {\n throw new Error('SELECT EXISTS does not return the expected result. Make sure the underlying database supports it.');\n }\n\n return result.rows[0].exists === true;\n }\n}\n","import Queue from 'queue';\n\nexport default class InMemoryQueuedTasks {\n queues: { [key: string]: Queue } = {};\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function, class-methods-use-this\n async ensureReady() {\n }\n\n do(queueName, fn) {\n if (!this.queues[queueName]) {\n this.queues[queueName] = new Queue({ concurrency: 1, autostart: true });\n }\n\n const queue = this.queues[queueName];\n\n return new Promise((resolve, reject) => {\n queue.push(async (cb) => {\n try {\n const r = await fn();\n resolve(r);\n } catch (ex) {\n reject(ex);\n } finally {\n cb();\n }\n });\n });\n }\n}\n","import RedisQueuedTasks from './redis_queued_tasks';\nimport InMemoryQueuedTasks from './In_memory_queued_tasks';\n\nlet queue;\n\nexport interface IsQueue {\n do: (queueName: string, fn: () => Promise<any>) => Promise<any>,\n}\n\nexport default class QueuedTasks {\n static create(): IsQueue {\n if (queue) {\n return queue;\n }\n\n if (process.env['REDIS_HOST']) {\n queue = new RedisQueuedTasks();\n } else {\n queue = new InMemoryQueuedTasks();\n }\n\n return queue;\n }\n}\n","import { Mutex } from 'redis-semaphore';\nimport Redis from 'ioredis';\n\nexport default class RedisQueuedTasks {\n redisClient: any;\n\n constructor() {\n if (!process.env['REDIS_HOST']) {\n throw new Error('REDIS_HOST environment variable is not set');\n }\n\n const redisOptions: any = {\n host: process.env['REDIS_HOST'],\n port: 6379,\n };\n\n if (process.env['REDIS_USERNAME']) {\n redisOptions.username = process.env['REDIS_USERNAME'];\n redisOptions.password = process.env['REDIS_PASSWORD'];\n }\n\n this.redisClient = new Redis(redisOptions);\n }\n\n // eslint-disable-next-line class-methods-use-this, @typescript-eslint/no-empty-function\n async ensureReady() {\n }\n\n async do(queueName: string, fn: () => Promise<any>) {\n let result;\n let error;\n\n await this.ensureReady();\n const mutex = new Mutex(this.redisClient, queueName);\n\n await mutex.acquire();\n\n try {\n result = await fn();\n } catch (err) {\n error = err;\n }\n\n await mutex.release();\n\n if (error) {\n throw error;\n }\n\n return result;\n }\n}\n","export default function chunk<T>(array: T[], n: number): T[][] {\n if (!array.length) {\n return [];\n }\n\n return [array.slice(0, n)].concat(chunk(array.slice(n), n));\n}\n","import { Request } from 'express';\nimport getRawBody from 'raw-body';\n\nexport default function readBody(req: Request): Promise<string> {\n return getRawBody(req).then((buf) => buf.toString());\n}\n","import crypto from 'crypto';\n\n// A direct === comparison may expose the application to timing attacks on HMAC checks\nexport default function safeCompare(str1: string, str2: string): boolean {\n try {\n return crypto.timingSafeEqual(new Uint8Array(Buffer.from(str1, 'utf-8')), new Uint8Array(Buffer.from(str2, 'utf-8')));\n } catch (ex: any) {\n if (ex?.code === 'ERR_CRYPTO_TIMING_SAFE_EQUAL_LENGTH') {\n return false;\n }\n\n throw ex;\n }\n}\n","import format = require('pg-format');\n\nexport default class EnsureIsValid {\n static tableName(tableName: string): string {\n if (typeof tableName !== 'string') {\n throw new Error(`Invalid tableName. must be string: ${tableName}`);\n }\n\n // PostgreSQL table names must start with a letter or underscore,\n // followed by letters, numbers, or underscores\n const validTableNameRegex = /^[a-zA-Z_][a-zA-Z0-9_]*$/;\n\n if (!tableName) {\n throw new Error('Table name cannot be empty');\n }\n\n if (tableName.length > 63) {\n throw new Error(`Table name exceeds the maximum allowed length of 63 characters: ${tableName}`);\n }\n\n if (!validTableNameRegex.test(tableName)) {\n throw new Error('Invalid table name. Must start with a letter or underscore and contain only letters, numbers, or underscores');\n }\n\n return format('%I', tableName);\n }\n\n static userId(userId: string): string {\n if (typeof userId !== 'string') {\n throw new Error(`Invalid userId. must be string: ${userId}`);\n }\n\n // User ID must start with 'us-' followed by a valid MD5 hash (32 hexadecimal characters)\n const validUserIdRegex = /^us-[a-fA-F0-9]{32}$/;\n\n if (!userId) {\n throw new Error('User ID cannot be empty');\n }\n\n if (!validUserIdRegex.test(userId)) {\n throw new Error(\"Invalid User ID. Must start with 'us-' followed by a 32-character MD5 hash\");\n }\n\n return format('%s', userId);\n }\n\n static subject(subject: string): string {\n if (typeof subject !== 'string') {\n throw new Error(`Invalid subject. must be string: ${subject}`);\n }\n\n if (subject.match(/^[a-zA-Z0-9-]{1,40}$/)) {\n return format('%s', subject);\n }\n\n throw new Error(`Invalid subject. Must contain only letters, digits and '-' and be 40 or less chars long: ${subject}`);\n }\n\n static predicate(predicate: string): string {\n if (typeof predicate !== 'string') {\n throw new Error(`Invalid predicate. must be string: ${predicate}`);\n }\n\n if (predicate.match(/^\\$?[a-zA-Z]{1,32}$/) || predicate.match(/^[a-zA-Z]{1,32}\\*?$/)) {\n return format('%s', predicate);\n }\n\n throw new Error(`Invalid predicate. Must contain only letters and be 32 or less chars long (can start with $ or end with *): ${predicate}`);\n }\n\n static object(object: string): string {\n if (typeof object !== 'string') {\n throw new Error(`Invalid object. must be string: ${object}`);\n }\n\n if (object.match(/^[a-zA-Z0-9-]{1,40}$/)) {\n return object;\n }\n\n throw new Error(`Invalid object. Must contain only letters, digits or '-' and be 40 or less chars long: ${object}`);\n }\n\n static nodeId(nodeId: string): string {\n if (EnsureIsValid.subject(nodeId) || EnsureIsValid.object(nodeId)) {\n return format('%s', nodeId);\n }\n\n throw new Error('Invalid node-id.');\n }\n\n static term(term: string): string {\n if (typeof term !== 'string') {\n throw new Error(`Invalid term. must be string: ${term}`);\n }\n\n if (term.match(/^[a-zA-Z]{1,32}$/)) {\n return format('%s', term);\n }\n\n throw new Error('Invalid term. Must contain only letters and be 32 or less chars long.');\n }\n\n static factBoxId(id: string | number): string | number {\n if (typeof id === 'number' || id.match(/^\\d+$/)) {\n return id;\n }\n\n throw new Error('Invalid fact box Id. Must be a number');\n }\n}\n","export default function unset(obj, path) {\n const keys = path.split('.');\n let currentObj = obj;\n\n for (let i = 0; i < keys.length - 1; i += 1) {\n const key = keys[i];\n // eslint-disable-next-line no-prototype-builtins\n if (!currentObj.hasOwnProperty(key) || typeof currentObj[key] !== 'object') {\n // If the key doesn't exist or isn't an object, stop here.\n return;\n }\n currentObj = currentObj[key];\n }\n\n const lastKey = keys[keys.length - 1];\n // eslint-disable-next-line no-prototype-builtins\n if (currentObj.hasOwnProperty(lastKey)) {\n delete currentObj[lastKey];\n }\n}\n","/* eslint-disable import/no-cycle */\n/* eslint-disable class-methods-use-this */\n\nimport LinkedRecords from '../../browser_sdk/index';\nimport SerializedChangeWithMetadata from './serialized_change_with_metadata';\nimport IsSerializable from './is_serializable';\nimport ClientServerBus from '../../../lib/client-server-bus/client';\n\nexport default abstract class AbstractAttributeClient <Type, TypedChange extends IsSerializable > {\n linkedRecords: LinkedRecords;\n\n clientServerBus: ClientServerBus;\n\n id?: string;\n\n actorId: string | undefined;\n\n clientId: string;\n\n createdAt: Date | undefined;\n\n updatedAt: Date | undefined;\n\n serverURL: URL;\n\n observers: Function[];\n\n isInitialized: boolean;\n\n version: string; // TODO: should be number\n\n value: Type;\n\n attrSubscription?: [string, (data: any) => any] = undefined;\n\n readToken?: string;\n\n constructor(linkedRecords: LinkedRecords, clientServerBus: ClientServerBus, id?: string) {\n this.id = id;\n this.linkedRecords = linkedRecords;\n this.clientServerBus = clientServerBus;\n this.serverURL = linkedRecords.serverURL;\n this.createdAt = undefined;\n this.updatedAt = undefined;\n this.observers = [];\n\n // because the same user can be logged on two browsers/laptops, we need\n // a clientId and an actorId. Every attribute needs to have its own clientId.\n this.clientId = linkedRecords.getAttributeClientId();\n\n if (linkedRecords.actorId) {\n this.actorId = linkedRecords.actorId;\n } else {\n linkedRecords.ensureUserIdIsKnown().then((aId) => { this.actorId = aId; });\n }\n\n this.version = '0';\n this.value = this.getDefaultValue();\n this.isInitialized = false;\n }\n\n public static getDataTypeName() {\n throw new Error('getDataTypeName needs to be implemented in child class');\n }\n\n public static isAttributeId(id: string) {\n return id.split('-')[0] === this.prototype.getDataTypePrefix();\n }\n\n public abstract getDataTypePrefix();\n public abstract getDefaultValue() : Type;\n public abstract deserializeValue(serializedValue: string) : Promise<Type>;\n\n protected abstract rawSet(newValue: Type): void;\n protected abstract rawChange(delta: TypedChange): Promise<boolean>;\n protected abstract onServerMessage(payload: SerializedChangeWithMetadata<TypedChange>);\n protected abstract onLoad();\n\n public async create(value: Type, facts?: [ string?, string?, string? ][]) {\n if (this.id) {\n throw new Error(`Cannot create attribute because it has an id assigned (${this.id})`);\n }\n\n const requestConfig: any = {\n method: 'POST',\n body: await this.getCreatePayload(value, facts),\n };\n\n if (typeof requestConfig.body !== 'string') {\n requestConfig.isJSON = false;\n }\n\n const url = `/attributes?dtp=${this.getDataTypePrefix()}&clientId=${this.clientId}`;\n const response = await this.linkedRecords.fetch(url, requestConfig);\n\n if (!response) {\n return;\n }\n\n if (response.status !== 200) {\n throw new Error(`Error creating attribute: ${await response.text()}`);\n }\n\n const responseBody = await response.json();\n\n this.id = responseBody.id;\n\n if (!this.id || !this.id.trim()) {\n throw new Error('Unknown error occurred: The attribute was not assigned an ID by the server');\n }\n\n await this.load(responseBody);\n }\n\n public getId(): string {\n if (!this.id) {\n throw new Error('getId can not return the attribute id as id is undefined');\n }\n\n return this.id;\n }\n\n public getClientId(): string {\n if (!this.clientId) {\n throw new Error('clientId can not return the attribute id as id is undefined');\n }\n\n return this.clientId;\n }\n\n public getServerURL(): string {\n if (!this.serverURL) {\n throw new Error('serverURL can not return the attribute id as id is undefined');\n }\n\n return this.serverURL.toString();\n }\n\n public getDataURL() {\n const url = new URL(`/attributes/${this.id}?clientId=${this.clientId}&valueOnly=true`, this.linkedRecords.serverURL);\n return url.toString();\n }\n\n protected async getCreatePayload(\n value: Type,\n facts: [ string?, string?, string? ][] = [],\n ): Promise<string | FormData> {\n const actorId = await this.linkedRecords.ensureUserIdIsKnown();\n\n if (!actorId) {\n throw new Error('actorId is unknown, can not create payload!');\n }\n\n return JSON.stringify({\n clientId: this.clientId,\n actorId,\n facts,\n value,\n });\n }\n\n public async get() : Promise<{ value: Type, changeId: string, actorId: string } | undefined> {\n const isOk = await this.load();\n\n if (!isOk) {\n return undefined;\n }\n\n if (!this.actorId) {\n throw new Error('actorId is unknown, can not get attribute value!');\n }\n\n return {\n value: this.value,\n changeId: this.version,\n actorId: this.actorId,\n };\n }\n\n public async getValue() : Promise<Type | undefined> {\n const isOk = await this.load();\n\n if (!isOk) {\n return undefined;\n }\n\n return this.value;\n }\n\n public async set(newValue: Type) : Promise<void> {\n await this.load();\n\n if (newValue === this.value) {\n return;\n }\n\n await this.rawSet(newValue);\n }\n\n public async change(change: TypedChange) : Promise<boolean> {\n await this.load();\n return this.rawChange(change);\n }\n\n public async subscribe(observer: Function) {\n await this.load();\n this.observers.push(observer);\n }\n\n // TODO: when an attribute is unloaded it should be removed from the attribute cache\n public unload() {\n if (this.attrSubscription) {\n this.clientServerBus.unsubscribe(this.attrSubscription);\n }\n }\n\n public async load(serverState?: {\n changeId: string,\n value: string,\n createdAt: Date,\n updatedAt: Date,\n readToken?: string,\n }, forceReload: boolean = false): Promise<boolean> {\n let result = serverState;\n\n if (this.isInitialized && !forceReload) {\n return true;\n }\n\n if (!this.id) {\n throw new Error('cannot load an attribute without id');\n }\n\n if (!result) {\n const url = `/attributes/${this.id}?clientId=${this.clientId}`;\n const response = await this.linkedRecords.fetch(url);\n\n if (!response) {\n return false;\n }\n\n const jsonBody = await response.json();\n\n result = {\n changeId: jsonBody.changeId,\n value: jsonBody.value,\n createdAt: new Date(jsonBody.createdAt),\n updatedAt: new Date(jsonBody.updatedAt),\n };\n }\n\n const serializedValue = typeof result.value === 'string' ? result.value : JSON.stringify(result.value);\n\n if (!serializedValue && serializedValue !== '') {\n throw new Error('invalid server state');\n }\n\n this.version = result.changeId;\n this.value = await this.deserializeValue(serializedValue);\n this.createdAt = new Date(result.createdAt);\n this.updatedAt = new Date(result.updatedAt);\n this.readToken = result.readToken;\n this.isInitialized = true;\n this.onLoad();\n this.notifySubscribers(undefined, undefined);\n\n if (!this.attrSubscription) {\n const url = new URL(`/attributes/${this.id}/changes?clientId=${this.clientId}`, this.serverURL);\n const callback = (parsedData) => {\n if (parsedData.error === 'quota_violation') {\n this.linkedRecords.handleQuotaViolationError(parsedData);\n return;\n }\n\n if (parsedData.attributeId !== this.id) {\n return;\n }\n\n this.updatedAt = new Date(parsedData.updatedAt);\n\n this.onServerMessage(parsedData);\n };\n\n this.attrSubscription = await this.clientServerBus.subscribe(\n url.toString(),\n this.id,\n this.readToken,\n callback,\n );\n }\n\n return true;\n }\n\n protected async sendToServer(\n change: SerializedChangeWithMetadata<TypedChange>,\n ): Promise<boolean> {\n if (!this.id) {\n throw Error('cannot send message to server as attribute does not has an id');\n }\n\n try {\n await this.clientServerBus.send(this.serverURL.toString(), this.id, change);\n return true;\n } catch (ex: any) {\n if (ex.message && ex.message.match && ex.message.match(/unauthorized/)) {\n if (this.linkedRecords.authorizationErrorHandler) {\n this.linkedRecords.authorizationErrorHandler();\n } else {\n throw new Error('User is not allowed to perform operation');\n }\n } else {\n this.linkedRecords.handleConnectionError(ex);\n }\n\n return false;\n }\n }\n\n protected notifySubscribers(change?: TypedChange, fullChangeInfo?: { actorId: string }) {\n this.observers.forEach((callback) => {\n callback(change, fullChangeInfo);\n });\n }\n}\n","/* eslint-disable import/no-cycle */\nimport * as jose from 'jose';\nimport SerializedChangeWithMetadata from './serialized_change_with_metadata';\nimport IsSerializable from './is_serializable';\nimport IsLogger from '../../../lib/is_logger';\nimport Fact from '../../facts/server';\nimport QueryExecutor from '../attribute_query';\n\nexport type LoadResult<T> = {\n id: string,\n value: T,\n changeId: string,\n actorId: string,\n createdAt: number,\n updatedAt: number\n};\n\nexport default abstract class AbstractAttributeServer <\n Type,\n TypedChange extends IsSerializable,\n> {\n readonly id: string;\n\n readonly actorId: string;\n\n readonly clientId: string;\n\n readonly logger: IsLogger;\n\n public static async loadAll(\n attributeIDs: string[],\n clientId: string,\n actorId: string,\n logger: IsLogger,\n args?: { inAuthorizedContext?: boolean },\n ): Promise<LoadResult<object>[]> {\n const attributes: LoadResult<any>[] = [];\n\n await Promise.all(attributeIDs.map(async (id) => {\n const AttributeClass = QueryExecutor.getAttributeClassByAttributeId(id);\n\n if (AttributeClass) {\n const attrInstance = new AttributeClass(id, clientId, actorId, logger);\n const attrValue = await attrInstance.get(args);\n attributes.push(attrValue);\n }\n }));\n\n return attributes;\n }\n\n constructor(\n id: string,\n clientId: string,\n actorId: string,\n logger: IsLogger,\n ) {\n this.id = id;\n this.clientId = clientId;\n this.actorId = actorId;\n this.logger = logger;\n }\n\n public static async getReadToken(\n attr: { id?: string | undefined },\n userId,\n ): Promise<string | undefined> {\n if (!process.env['SHORT_LIVED_ACCESS_TOKEN_SIGNING'] || !attr.id) {\n return undefined;\n }\n\n const alg = 'HS256';\n const secret = new TextEncoder().encode(process.env['SHORT_LIVED_ACCESS_TOKEN_SIGNING']);\n\n return new jose.SignJWT({ attrId: attr.id, sub: userId })\n .setProtectedHeader({ alg })\n .setIssuedAt()\n .setIssuer('urn:example:issuer')\n .setAudience('urn:example:audience')\n .setExpirationTime('1m')\n .sign(secret);\n }\n\n public static isValidChange(\n value: any,\n ): boolean {\n return value\n && value.attributeId\n && value.change\n && value.actorId\n && value.clientId;\n }\n\n abstract getStorageRequiredForValue(value: Type): Promise<number>;\n abstract getStorageRequiredForChange(change: SerializedChangeWithMetadata<any>): Promise<number>;\n\n public static getDataTypePrefix(): string {\n throw new Error('getDataTypePrefix needs to be implemented in child class');\n }\n\n public static async createAll(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n attr: [AbstractAttributeServer<any, any>, any][],\n ): Promise<string[]> {\n const result = await Promise.all(attr.map(([a, v]) => a.create(v)));\n\n return result.map((r) => r.id);\n }\n\n async createAccountableFact() : Promise<void> {\n const createdByFact = new Fact(this.actorId, '$isAccountableFor', this.id, this.logger);\n await createdByFact.save(this.actorId);\n }\n\n abstract create(\n value: Type\n ) : Promise<{ id: string }>;\n\n abstract get() : Promise<LoadResult<Type>>;\n\n abstract set(value: Type) : Promise<{ id: string }>;\n\n abstract change(\n change: SerializedChangeWithMetadata<TypedChange>\n ) : Promise<SerializedChangeWithMetadata<TypedChange>>;\n}\n","import IsSerializable from './is_serializable';\n\nexport default class SerializedChangeWithMetadata<Change extends IsSerializable> {\n public attributeId: string;\n\n public actorId: string;\n\n public clientId: string;\n\n public change: Change;\n\n public updatedAt: Date | undefined;\n\n constructor(\n attributeId: string,\n actorId: string,\n clientId: string,\n change: Change,\n updatedAt: Date | undefined = undefined,\n ) {\n this.attributeId = attributeId;\n this.actorId = actorId;\n this.clientId = clientId;\n this.change = change;\n this.updatedAt = updatedAt;\n }\n\n toJSON(): any {\n return {\n attributeId: this.attributeId,\n change: this.change.toJSON(),\n actorId: this.actorId,\n clientId: this.clientId,\n updatedAt: this.updatedAt,\n };\n }\n}\n","/* eslint-disable import/no-cycle */\nimport Fact from '../facts/server';\nimport { SubjectQuery } from '../facts/fact_query';\nimport LongTextAttribute from './long_text/server';\nimport KeyValueAttribute from './key_value/server';\nimport BlobAttribute from './blob/server';\nimport IsLogger from '../../lib/is_logger';\nimport AbstractAttributeClient from './abstract/abstract_attribute_client';\n\nexport type FactQueryWithOptionalSubjectPlaceholder =\n [string, string, string?] |\n [string, string, typeof AbstractAttributeClient<any, any>] |\n [string, typeof AbstractAttributeClient<any, any>];\n\nexport type AttributeQuery = string | FactQueryWithOptionalSubjectPlaceholder[];\n\nexport type CompoundAttributeQuery = {\n [key: string]: AttributeQuery\n};\n\n/**\n * Checks if a value is an AbstractAttributeClient subclass.\n */\nfunction isAttributeClientClass(value: unknown): boolean {\n if (typeof value !== 'function') {\n return false;\n }\n\n // Check if it's one of the known attribute client classes or extends AbstractAttributeClient\n let proto = value;\n while (proto && proto !== Function.prototype) {\n if (proto === AbstractAttributeClient || proto.name === AbstractAttributeClient.name) {\n return true;\n }\n proto = Object.getPrototypeOf(proto);\n }\n\n return false;\n}\n\n/**\n * Validates if a value is a valid FactQueryWithOptionalSubjectPlaceholder tuple.\n * Accepts:\n * - [string, string, string?]\n * - [string, string, AbstractAttributeClient subclass]\n * - [string, AbstractAttributeClient subclass]\n */\nfunction isValidFactQueryTuple(value: unknown): boolean {\n if (!Array.isArray(value)) {\n return false;\n }\n\n if (value.length < 2 || value.length > 3) {\n return false;\n }\n\n // First element must be a string\n if (typeof value[0] !== 'string') {\n return false;\n }\n\n // Handle [string, AbstractAttributeClient] case (2 elements)\n if (value.length === 2) {\n return typeof value[1] === 'string' || isAttributeClientClass(value[1]);\n }\n\n // Handle 3-element tuples\n // Second element must be a string\n if (typeof value[1] !== 'string') {\n return false;\n }\n\n // Third element can be string, undefined, or AbstractAttributeClient subclass\n if (value[2] !== undefined\n && typeof value[2] !== 'string'\n && !isAttributeClientClass(value[2])) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Validates if a value is a valid AttributeQuery.\n * An AttributeQuery is either a string or an array of\n * FactQueryWithOptionalSubjectPlaceholder tuples.\n */\nexport function isValidAttributeQuery(value: unknown): value is AttributeQuery {\n if (typeof value === 'string') {\n return true;\n }\n\n if (Array.isArray(value)) {\n return value.every(isValidFactQueryTuple);\n }\n\n return false;\n}\n\n/**\n * Validates if a JSON object is a valid CompoundAttributeQuery.\n * A CompoundAttributeQuery is an object where each value is a valid AttributeQuery.\n */\nexport function isValidCompoundAttributeQuery(value: unknown): value is CompoundAttributeQuery {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n return false;\n }\n\n const entries = Object.entries(value as Record<string, unknown>);\n\n if (entries.length === 0) {\n return false;\n }\n\n return entries.every(([key, val]) => {\n if (typeof key !== 'string') {\n return false;\n }\n return isValidAttributeQuery(val);\n });\n}\n\ntype ResolveToIdsResult = undefined | string | string[] | { [key: string]: string | string[] };\nexport type ResolveToAttributesResult =\n undefined |\n AbstractAttributeClient<any, any> |\n AbstractAttributeClient<any, any>[] |\n { [key: string]: AbstractAttributeClient<any, any> | AbstractAttributeClient<any, any>[] };\n\ntype Attribute = typeof LongTextAttribute | typeof KeyValueAttribute | typeof BlobAttribute;\n\nfunction factQueryWithOptionalSubjectPlaceholderToFactQuery(\n x: [string, string, string?],\n): SubjectQuery {\n if (x.length === 3 && x[0] === '$it' && x[2]) {\n return [x[1], x[2]];\n }\n\n if (x.length === 3 && x[2] === '$it') {\n return [x[0], x[1], x[2]];\n }\n\n if (x.length === 2 && x[0] && x[1]) {\n return [x[0], x[1]];\n }\n\n throw new Error(`factQueryWithOptionalSubjectPlaceholderToFactQuery received invalid input: ${JSON.stringify(x)}`);\n}\n\nfunction resolvedIdsToFlatArray(resultWithIds: ResolveToIdsResult): string[] {\n if (!resultWithIds) {\n throw new Error('expected ResolveToIdsResult to not be undefined');\n }\n\n let flatIds;\n\n if (Array.isArray(resultWithIds)) {\n flatIds = resultWithIds;\n } else if (typeof resultWithIds === 'string') {\n flatIds = [resultWithIds];\n } else {\n flatIds = Object.values(resultWithIds).flat();\n }\n\n return flatIds\n .filter((id) => id !== undefined)\n .filter((value, index, array) => array.indexOf(value) === index);\n}\n\nexport default class QueryExecutor {\n logger: IsLogger;\n\n constructor(logger: IsLogger) {\n this.logger = logger;\n }\n\n async resolveToAttributes(\n query: AttributeQuery | CompoundAttributeQuery,\n clientId,\n actorId,\n ): Promise<ResolveToAttributesResult> {\n // undefined | string | string[] | { [key: string]: string | string[] };\n let resultWithIds = await this.resolveToIds(query, actorId);\n\n if (!resultWithIds) {\n return [];\n }\n\n const flatIds = resolvedIdsToFlatArray(resultWithIds);\n\n if (Array.isArray(resultWithIds)) {\n resultWithIds = resultWithIds.filter((id) => flatIds.includes(id));\n } else if (typeof resultWithIds === 'string' && flatIds.includes(resultWithIds)) {\n return undefined;\n } else {\n Object.keys(resultWithIds).forEach((group) => {\n if (!resultWithIds) {\n throw new Error('resultWithIds is expected to be defined');\n }\n\n if (typeof resultWithIds[group] === 'string') {\n if (!flatIds.includes(resultWithIds[group])) {\n resultWithIds[group] = undefined;\n }\n } else {\n resultWithIds[group] = resultWithIds[group]\n ? resultWithIds[group].filter((id) => flatIds.includes(id))\n : undefined;\n }\n });\n }\n\n const attributes = await this.loadAttributes(\n flatIds,\n clientId,\n actorId,\n { inAuthorizedContext: true },\n );\n\n if (typeof resultWithIds === 'string') {\n return attributes[resultWithIds];\n }\n\n if (Array.isArray(resultWithIds)) {\n return resultWithIds\n .map((id) => attributes[id])\n .filter((x) => x);\n }\n\n const resultWithAttr: ResolveToAttributesResult = {};\n Object.keys(resultWithIds).forEach((group) => {\n if (!resultWithIds) {\n return;\n }\n\n if (typeof resultWithIds[group] === 'string') {\n resultWithAttr[group] = attributes[resultWithIds[group]];\n } else if (Array.isArray(resultWithIds[group])) {\n resultWithAttr[group] = resultWithIds[group]\n .map((id) => attributes[id])\n .filter((x) => x);\n }\n });\n\n return resultWithAttr;\n }\n\n async resolveToIds(\n query: AttributeQuery | CompoundAttributeQuery,\n userid: string,\n ): Promise<ResolveToIdsResult> {\n if (!userid) {\n throw new Error('resolveToIds needs to receive a valid userid!');\n }\n\n if (query === undefined) {\n throw new Error('query is undefined');\n }\n\n if (typeof query === 'string') {\n if (await Fact.isAuthorizedToReadPayload(query, userid, this.logger)) {\n return query;\n }\n\n return undefined;\n }\n\n if (!isValidCompoundAttributeQuery(query) && !isValidAttributeQuery(query)) {\n throw new Error(`invalid query: ${JSON.stringify(query)}`);\n }\n\n if (!Array.isArray(query)) {\n return this.resolveCompoundQueryToIds(query, userid);\n }\n\n if (query.find((q) => (!q[0] && !q[1] && !q[2]))) {\n return [];\n }\n\n let dataTypeFilter;\n const factQuery = query as FactQueryWithOptionalSubjectPlaceholder[];\n\n const queryWithoutDataTypeFilter = factQuery.filter((q) => {\n if (q[2] && typeof q[2] !== 'string') {\n return false;\n }\n\n if (q[1] === '$hasDataType') {\n [, , dataTypeFilter] = q;\n return false;\n }\n\n if (q[0] === '$hasDataType') {\n [, dataTypeFilter] = q;\n return false;\n }\n\n return true;\n }) as [string, string, string?][];\n\n const subjectQuery = queryWithoutDataTypeFilter\n .filter((q) => q.length < 3 || q[2] !== '$not($it)')\n .map(factQueryWithOptionalSubjectPlaceholderToFactQuery)\n .filter((x) => x && x.length === 2);\n\n const objectQuery = queryWithoutDataTypeFilter\n .filter((q) => q.length === 3 && q[2] === '$it')\n .map(([subject, predicate]) => ([subject, predicate])) as [string, string][];\n\n const nodeBlacklist: [string, string][] = queryWithoutDataTypeFilter\n .filter((q) => q.length === 3 && q[2] === '$not($it)')\n .map(([subject, predicate]) => [subject, predicate]);\n\n let matchedIds = await Fact.findNodes(\n subjectQuery,\n objectQuery,\n nodeBlacklist,\n userid,\n this.logger,\n );\n\n if (dataTypeFilter === 'KeyValueAttribute') {\n matchedIds = matchedIds.filter((id) => id.startsWith('kv-'));\n } else if (dataTypeFilter === 'LongTextAttribute') {\n matchedIds = matchedIds.filter((id) => id.startsWith('l-'));\n } else if (dataTypeFilter === 'BlobAttribute') {\n matchedIds = matchedIds.filter((id) => id.startsWith('bl-'));\n }\n\n return matchedIds;\n }\n\n async loadAttributes(\n attributeIDs: string[],\n clientId: string,\n actorId: string,\n args?: { inAuthorizedContext: boolean },\n ): Promise<Record<string, any>> {\n const attributesByType = QueryExecutor.groupAttributeIDsByClass(attributeIDs);\n const attributes = {};\n const promises: Promise<any>[] = [];\n\n attributesByType.forEach((ids, c) => {\n const promise = c.loadAll(\n ids,\n clientId,\n actorId,\n this.logger,\n args,\n ).then((attrs) => {\n attrs.forEach((attr) => {\n attributes[attr.id] = attr;\n });\n });\n\n promises.push(promise);\n });\n\n await Promise.all(promises);\n\n return attributes;\n }\n\n async resolveCompoundQueryToIds(query: CompoundAttributeQuery, userid: string): Promise<({\n [key: string]: string | string[]\n })> {\n if (!userid) {\n throw new Error('resolveCompoundQueryToIds needs to receive a valid userid!');\n }\n\n if (!isValidCompoundAttributeQuery(query)) {\n throw new Error(`invalid query: ${JSON.stringify(query)}`);\n }\n\n const result = {};\n const promises: Promise<any>[] = [];\n const qEntries = Object.entries(query);\n\n for (let j = 0; j < qEntries.length; j += 1) {\n const qEntry = qEntries[j];\n\n if (qEntry) {\n const n = qEntry[0];\n const q = qEntry[1];\n\n result[n] = this.resolveToIds(q, userid);\n promises.push(result[n]);\n }\n }\n\n await Promise.all(promises);\n\n Object.keys(result).forEach(async (key) => {\n result[key] = await result[key];\n });\n\n return result;\n }\n\n static getAttributeClassByAttributeId(\n id: string,\n ) : Attribute | undefined {\n const attributeTypes = [LongTextAttribute, KeyValueAttribute, BlobAttribute];\n const [attributeTypePrefix] = id.split('-');\n return attributeTypes.find((c) => c.getDataTypePrefix() === attributeTypePrefix);\n }\n\n static groupAttributeIDsByClass(attributeIDs: string[]): Map<Attribute, string[]> {\n const attributesByType = new Map<Attribute, string[]>();\n\n attributeIDs.forEach((id) => {\n const AttributeClass = QueryExecutor.getAttributeClassByAttributeId(id);\n if (!AttributeClass) {\n return;\n }\n\n if (!attributesByType.get(AttributeClass)) {\n attributesByType.set(AttributeClass, []);\n }\n\n const ids = attributesByType.get(AttributeClass);\n\n if (ids) {\n ids.push(id);\n }\n });\n\n return attributesByType;\n }\n}\n","/* eslint-disable import/no-cycle */\n/* eslint-disable class-methods-use-this */\n\nimport assert from 'assert';\nimport IsAttributeStorage from '../../abstract/is_attribute_storage';\nimport PgPoolWithLog from '../../../../lib/pg-log';\nimport IsLogger from '../../../../lib/is_logger';\nimport Fact from '../../../facts/server';\nimport AuthorizationError from '../../errors/authorization_error';\nimport EnsureIsValid from '../../../../lib/utils/sql_values';\nimport { AttributeSnapshot, AttributeChangeCriteria, AttributeValue } from '../types';\nimport chunk from '../../../../lib/utils/chunk_array';\n\nfunction getUuidByAttributeId(attributeId: string) {\n const parts = attributeId.split('-');\n\n parts.shift();\n\n return EnsureIsValid.nodeId(parts.join('-'));\n}\n\nfunction calculateSize(value: AttributeValue) {\n if (typeof value === 'string') {\n return Buffer.byteLength(value, 'utf8');\n }\n\n return value.length;\n}\n\nexport default class AttributeStorage implements IsAttributeStorage {\n logger: IsLogger;\n\n pgPool: PgPoolWithLog;\n\n tablePrefix: string;\n\n constructor(logger: IsLogger, tablePrefix: string) {\n this.logger = logger;\n this.pgPool = new PgPoolWithLog(this.logger);\n this.tablePrefix = tablePrefix;\n }\n\n async getSizeInBytesForAllAttributes(nodes: string[]): Promise<number> {\n const attrTables = [`${this.tablePrefix}_attributes`];\n\n const sizes = await Promise.all(attrTables.map(async (tableName) => {\n const [prefix] = tableName.split('_');\n const filteredNodes = nodes.filter((n) => n.startsWith(`${prefix}-`));\n\n if (!filteredNodes.length) {\n return 0;\n }\n\n const result = await this.pgPool.query(`SELECT SUM(\n CASE\n WHEN size IS NOT NULL THEN size\n ELSE LENGTH(value)\n END\n )\n FROM ${tableName}\n WHERE ('${prefix}' || '-' || id)\n IN (${filteredNodes.filter((n) => n.startsWith(`${prefix}-`)).map((n) => `'${n}'`).join(',')});`);\n\n if (!result?.rows[0]) {\n throw new Error('There was a problem getting the size of all accountable attributes');\n }\n\n let size: number;\n\n try {\n if (result.rows[0].sum === null) {\n size = 0;\n } else {\n size = parseInt(result.rows[0].sum, 10);\n }\n } catch (e) {\n throw new Error('There was a problem getting the size of all accountable attributes');\n }\n\n return size;\n }));\n\n return sizes.reduce((acc, curr) => acc + curr, 0);\n }\n\n async createAllAttributes(\n attr: { attributeId: string, actorId: string, value: AttributeValue, size?: number }[],\n ) : Promise<{ id: string }[]> {\n if (!attr.length) {\n return [];\n }\n\n if (await Fact.areKnownSubjects(attr.map((a) => a.attributeId), this.logger)) {\n throw new Error('attribute list contains invalid attributeId');\n }\n\n const tableNames = await Promise.all(\n attr.map((a) => this.getAttributeTableName(a.attributeId)),\n );\n\n if (!tableNames[0]) {\n return [];\n }\n\n if (!tableNames.every((n) => n === tableNames[0])) {\n throw new Error('createAllAttributes can only be used with attributes of the same type');\n }\n\n const values = attr\n .map((_, i) => `($${i * 6 + 1}, $${i * 6 + 2}, $${i * 6 + 3}, $${i * 6 + 4}, $${i * 6 + 5}, $${i * 6 + 6})`)\n .join(', ');\n\n const flatParams = attr.flatMap((a) => [\n a.actorId,\n new Date(),\n new Date(),\n getUuidByAttributeId(a.attributeId),\n a.value,\n a.size || null,\n ]);\n\n const createQuery = `INSERT INTO ${EnsureIsValid.tableName(tableNames[0])} (actor_id, updated_at, created_at, id, value, size) VALUES ${values}`;\n await this.pgPool.query(createQuery, flatParams);\n\n return attr.map((a) => ({ id: a.attributeId }));\n }\n\n async createAttribute(\n attributeId: string,\n actorId: string,\n value: AttributeValue,\n size?: number,\n ) : Promise<{ id: string }> {\n if (await Fact.areKnownSubjects([attributeId], this.logger)) {\n throw new Error('attributeId is invalid');\n }\n\n return this.createAttributeWithoutFactsCheck(\n attributeId,\n actorId,\n value,\n size,\n );\n }\n\n async createAttributeWithoutFactsCheck(\n attributeId: string,\n actorId: string,\n value: AttributeValue,\n size?: number,\n ) : Promise<{ id: string }> {\n const pgTableName = await this.getAttributeTableName(attributeId);\n const createQuery = `INSERT INTO ${EnsureIsValid.tableName(pgTableName)} (id, actor_id, updated_at, created_at, value, size) VALUES ($1, $2, $3, $4, $5, $6)`;\n await this.pgPool.query(createQuery, [\n getUuidByAttributeId(attributeId),\n actorId,\n new Date(),\n new Date(),\n value,\n size || calculateSize(value),\n ]);\n\n return { id: attributeId };\n }\n\n async getAttributeLatestSnapshots(\n attributeIds: string[],\n actorId: string,\n arg: AttributeChangeCriteria = {},\n ) : Promise<AttributeSnapshot[]> {\n if (!attributeIds.length) {\n return [];\n }\n\n const chunks = chunk<string>(attributeIds, 1000);\n const chunkedResult = await Promise.all(\n chunks.map((c) => this.getAttributeLatestSnapshotsUnchunked(c, actorId, arg)),\n );\n\n return chunkedResult.flat();\n }\n\n private async getAttributeLatestSnapshotsUnchunked(\n attributeIds: string[],\n actorId: string,\n { inAuthorizedContext = false }: AttributeChangeCriteria = {},\n ) : Promise<AttributeSnapshot[]> {\n if (!attributeIds.length) {\n return [];\n }\n\n assert(inAuthorizedContext, 'getAttributeLatestSnapshots is not implemented in unauthorized context');\n assert(attributeIds[0]);\n assert(!attributeIds.find((id) => !id || typeof id !== 'string'));\n\n const idPrefix = attributeIds[0].split('-')[0];\n\n assert(idPrefix, 'getAttributeLatestSnapshots: at least one ID is invalid!');\n assert(!attributeIds.find((id) => !id.startsWith(idPrefix)), 'getAttributeLatestSnapshots: all attribute IDs need to have the same prefix!');\n\n const pgTableName = await this.getAttributeTableName(attributeIds[0]);\n const idsAsString = attributeIds.map((id) => `'${getUuidByAttributeId(id)}'`);\n const snapshots = await this.pgPool.query(`SELECT id, value, actor_id, created_at, updated_at from ${EnsureIsValid.tableName(pgTableName)} WHERE id IN (${idsAsString.join(',')})`);\n\n return snapshots.rows.map((snapshot) => ({\n id: `${idPrefix}-${snapshot.id}`,\n value: snapshot.value,\n changeId: snapshot.change_id,\n actorId: snapshot.actor_id,\n createdAt: Date.parse(snapshot.created_at),\n updatedAt: Date.parse(snapshot.updated_at),\n }));\n }\n\n async getAttributeLatestSnapshot(\n attributeId: string,\n actorId: string,\n { maxChangeId = '2147483647', inAuthorizedContext = false }: AttributeChangeCriteria = {},\n ) : Promise<AttributeSnapshot> {\n if (!inAuthorizedContext) {\n if (!(await Fact.isAuthorizedToReadPayload(attributeId, actorId, this.logger))) {\n // TODO: when this is thrown, it is not visible in the logs probably??\n // And the status code is 500\n throw new AuthorizationError(actorId, 'attribute', attributeId, this.logger);\n }\n }\n\n const pgTableName = await this.getAttributeTableName(attributeId);\n const snapshots = await this.pgPool.query(`SELECT value, actor_id, created_at, updated_at from ${EnsureIsValid.tableName(pgTableName)} WHERE id=$1 LIMIT 1`, [\n getUuidByAttributeId(attributeId),\n ]);\n\n if (!snapshots.rows.length) {\n throw new Error(`Attribute not found (id: ${attributeId})`);\n }\n\n const snapshot = snapshots.rows[0];\n\n if (!snapshot) {\n throw new Error(`No Snapshot found for attribute ${attributeId} with maxChangeId=${maxChangeId}!`);\n }\n\n return {\n id: attributeId,\n value: snapshot.value,\n changeId: snapshot.change_id,\n actorId: snapshot.actor_id,\n createdAt: Date.parse(snapshot.created_at),\n updatedAt: Date.parse(snapshot.updated_at),\n };\n }\n\n async getAttributeChanges() : Promise<Array<any>> {\n return [];\n }\n\n async insertAttributeChange() : Promise<{ id: string, updatedAt: Date }> {\n throw new Error('insertAttributeChange is not implemented for psql storage, use psql_with_history instead');\n }\n\n async insertAttributeSnapshot(\n attributeId: string,\n actorId: string,\n value: AttributeValue,\n changeId?: string,\n size?: number,\n ) : Promise<{ id: string, updatedAt: Date }> {\n if (!(await Fact.isAuthorizedToModifyPayload(attributeId, actorId, this.logger))) {\n throw new AuthorizationError(actorId, 'attribute', attributeId, this.logger);\n }\n\n const pgTableName = await this.getAttributeTableName(attributeId);\n const result = await this.pgPool.query(`UPDATE ${EnsureIsValid.tableName(pgTableName)} SET actor_id=$1, updated_at=$2, value=$3, size=$4 WHERE id=$5 RETURNING updated_at`, [\n actorId,\n new Date(),\n value,\n size || calculateSize(value),\n getUuidByAttributeId(attributeId),\n ]);\n\n if (!result.rows.length) {\n throw new Error(`Attribute not found (id: ${attributeId})`);\n }\n\n return { id: '2147483647', updatedAt: new Date(result.rows[0].updated_at) };\n }\n\n private async getAttributeTableName(attributeId: string) {\n const [prefix] = attributeId.split('-');\n\n if (!prefix) {\n throw new Error(`invalid attribute Id: ${attributeId}`);\n }\n\n return `${prefix}_attributes`;\n }\n}\n","/* eslint-disable class-methods-use-this */\n\nimport IsAttributeStorage from '../../abstract/is_attribute_storage';\nimport PgPoolWithLog from '../../../../lib/pg-log';\nimport IsLogger from '../../../../lib/is_logger';\nimport Fact from '../../../facts/server';\nimport AuthorizationError from '../../errors/authorization_error';\nimport { AttributeSnapshot, AttributeChangeCriteria, AttributeValue } from '../types';\nimport EnsureIsValid from '../../../../lib/utils/sql_values';\n\nexport default class AttributeStorage implements IsAttributeStorage {\n logger: IsLogger;\n\n pgPool: PgPoolWithLog;\n\n constructor(logger: IsLogger) {\n this.logger = logger;\n this.pgPool = new PgPoolWithLog(this.logger);\n }\n\n async getSizeInBytesForAllAttributes(nodes: string[]): Promise<number> {\n const filteredNodes = nodes.filter((n) => n.startsWith('l-'));\n\n if (!filteredNodes.length) {\n return 0;\n }\n\n const createQuery = `SELECT SUM(pg_total_relation_size(quote_ident(table_name)))\n FROM information_schema.tables\n WHERE replace(replace(table_name, '_', '-'), 'var-', '') IN (${filteredNodes.map((n) => `'${n}'`).join(',')});`;\n\n const result = await this.pgPool.query(createQuery);\n\n if (!result?.rows[0]) {\n throw new Error('There was a problem getting the size of all accountable attributes');\n }\n\n let size: number;\n\n try {\n if (result.rows[0].sum === null) {\n size = 0;\n } else {\n size = parseInt(result.rows[0].sum, 10);\n }\n } catch (e) {\n throw new Error('There was a problem getting the size of all accountable attributes');\n }\n\n return size;\n }\n\n async createAllAttributes(\n attr: { attributeId: string, actorId: string, value: AttributeValue }[],\n ) : Promise<{ id: string }[]> {\n return Promise.all(attr.map((a) => this.createAttribute(a.attributeId, a.actorId, a.value)));\n }\n\n async createAttribute(\n attributeId: string,\n actorId: string,\n value: AttributeValue,\n ) : Promise<{ id: string }> {\n if (await Fact.areKnownSubjects([attributeId], this.logger)) {\n throw new Error('attributeId is invalid');\n }\n\n return this.createAttributeWithoutFactsCheck(attributeId, actorId, value);\n }\n\n async createAttributeWithoutFactsCheck(\n attributeId: string,\n actorId: string,\n value: AttributeValue,\n ) : Promise<{ id: string }> {\n const pgTableName = AttributeStorage.getAttributeTableName(attributeId);\n\n const createQuery = `CREATE TABLE ${EnsureIsValid.tableName(pgTableName)} (actor_id varchar(36), time timestamp, change_id SERIAL, value TEXT, delta boolean, meta_info boolean);`;\n await this.pgPool.query(createQuery);\n await this.insertAttributeSnapshot(attributeId, actorId, value);\n\n return { id: attributeId };\n }\n\n async getAttributeLatestSnapshot(\n attributeId: string,\n actorId: string,\n { maxChangeId = '2147483647', inAuthorizedContext = false }: AttributeChangeCriteria = {},\n ) : Promise<AttributeSnapshot> {\n if (!inAuthorizedContext) {\n if (!(await Fact.isAuthorizedToReadPayload(attributeId, actorId, this.logger))) {\n // TODO: when this is thrown, it is not visible in the logs probably??\n // And the status code is 500\n throw new AuthorizationError(actorId, 'attribute', attributeId, this.logger);\n }\n }\n\n const pgTableName = AttributeStorage.getAttributeTableName(attributeId);\n const snapshots = await this.pgPool.query(`SELECT value, change_id, actor_id, time as updated_at, (SELECT MIN(time) FROM ${EnsureIsValid.tableName(pgTableName)} LIMIT 1) as created_at FROM ${EnsureIsValid.tableName(pgTableName)} WHERE delta=false AND change_id <= $1 ORDER BY change_id DESC LIMIT 1`, [maxChangeId]);\n\n const snapshot = snapshots.rows[0];\n\n if (!snapshot) {\n throw new Error(`No Snapshot found for attribute ${attributeId} with maxChangeId=${maxChangeId}!`);\n }\n\n return {\n id: attributeId,\n value: snapshot.value,\n changeId: snapshot.change_id,\n actorId: snapshot.actor_id,\n createdAt: Date.parse(snapshot.created_at),\n updatedAt: Date.parse(snapshot.updated_at),\n };\n }\n\n async getAttributeChanges(\n attributeId: string,\n actorId: string,\n { inAuthorizedContext = false, minChangeId = '0', maxChangeId = '2147483647' }: AttributeChangeCriteria = {},\n ) : Promise<Array<any>> {\n if (!inAuthorizedContext) {\n if (!(await Fact.isAuthorizedToReadPayload(attributeId, actorId, this.logger))) {\n throw new AuthorizationError(actorId, 'attribute', attributeId, this.logger);\n }\n }\n\n const pgTableName = AttributeStorage.getAttributeTableName(attributeId);\n const changes = await this.pgPool.query(`SELECT value, change_id, actor_id, time FROM ${EnsureIsValid.tableName(pgTableName)} WHERE change_id > $1 AND change_id <= $2 AND delta = true ORDER BY change_id ASC`, [minChangeId, maxChangeId]);\n\n return changes.rows.filter((row) => row.value !== null).map((row) => ({\n value: row.value,\n changeId: row.change_id,\n actorId: row.actor_id,\n time: row.time,\n }));\n }\n\n async insertAttributeChange(\n attributeId: string,\n actorId: string,\n change: string,\n ) : Promise<{ id: string, updatedAt: Date }> {\n if (!(await Fact.isAuthorizedToModifyPayload(attributeId, actorId, this.logger))) {\n throw new AuthorizationError(actorId, 'attribute', attributeId, this.logger);\n }\n\n const pgTableName = AttributeStorage.getAttributeTableName(attributeId);\n const result = await this.pgPool.query(`INSERT INTO ${EnsureIsValid.tableName(pgTableName)} (actor_id, time, value, delta) VALUES ($1, $2, $3, true) RETURNING change_id, time`, [actorId, new Date(), change]);\n\n return { id: result.rows[0].change_id, updatedAt: new Date(result.rows[0].time) };\n }\n\n async insertAttributeSnapshot(\n attributeId: string,\n actorId: string,\n value: AttributeValue,\n changeId?: string,\n ) : Promise<{ id: string, updatedAt: Date }> {\n if (!(await Fact.isAuthorizedToModifyPayload(attributeId, actorId, this.logger))) {\n throw new AuthorizationError(actorId, 'attribute', attributeId, this.logger);\n }\n\n const pgTableName = AttributeStorage.getAttributeTableName(attributeId);\n\n const result = changeId\n ? await this.pgPool.query(`INSERT INTO ${EnsureIsValid.tableName(pgTableName)} (actor_id, time, value, delta, change_id) VALUES ($1, $2, $3, false, $4) RETURNING change_id, time`, [actorId, new Date(), value, changeId])\n : await this.pgPool.query(`INSERT INTO ${EnsureIsValid.tableName(pgTableName)} (actor_id, time, value, delta) VALUES ($1, $2, $3, false) RETURNING change_id, time`, [actorId, new Date(), value]);\n\n return { id: result.rows[0].change_id, updatedAt: new Date(result.rows[0].time) };\n }\n\n private static getAttributeTableName(attributeId: string): string {\n if (!(typeof attributeId === 'string' && attributeId.length >= 3)) {\n throw new Error(`invalid attributeId: ${attributeId}`);\n }\n\n return `var_${attributeId.replace(/-/g, '_').toLowerCase()}`;\n }\n}\n","/* eslint-disable class-methods-use-this */\n\nimport { Client } from 'minio';\nimport { text } from 'stream/consumers';\nimport assert from 'assert';\nimport IsAttributeStorage from '../../abstract/is_attribute_storage';\nimport IsLogger from '../../../../lib/is_logger';\nimport Fact from '../../../facts/server';\nimport AuthorizationError from '../../errors/authorization_error';\nimport { AttributeSnapshot, AttributeChangeCriteria, AttributeSnapshotReadable } from '../types';\n\nexport default class AttributeStorage implements IsAttributeStorage {\n logger: IsLogger;\n\n minioClient: Client;\n\n bucketName: string;\n\n static isConfigurationAvailable() {\n return !!process.env['S3_ENDPOINT'];\n }\n\n constructor(logger: IsLogger) {\n this.logger = logger;\n\n ['S3_ENDPOINT', 'S3_BUCKET', 'S3_ACCESS_KEY', 'S3_SECRET_KEY', 'S3_USE_SSL'].forEach((envVar) => {\n if (!process.env[envVar]) {\n throw new Error(`Missing ${envVar} environment variable`);\n }\n });\n\n this.bucketName = process.env['S3_BUCKET']!;\n\n this.minioClient = new Client({\n endPoint: process.env['S3_ENDPOINT']!,\n port: parseInt(process.env['S3_PORT'] || '9000', 10),\n useSSL: process.env['S3_USE_SSL'] === 'true',\n accessKey: process.env['S3_ACCESS_KEY']!,\n secretKey: process.env['S3_SECRET_KEY']!,\n });\n }\n\n async getSizeInBytesForAllAttributes(nodes: string[]): Promise<number> {\n const sizes = await Promise.all(nodes.map((node) => this.getObjectSize(node)));\n return sizes.reduce((acc, x) => acc + x, 0);\n }\n\n async createAllAttributes(\n attrs: { attributeId: string, actorId: string, value: string | Buffer }[],\n ) : Promise<{ id: string }[]> {\n if (!attrs.length) {\n return [];\n }\n\n return Promise.all(\n attrs.map((attr) => this.createAttribute(attr.attributeId, attr.actorId, attr.value)),\n );\n }\n\n async createAttribute(\n attributeId: string,\n actorId: string,\n value: string | Buffer,\n ) : Promise<{ id: string }> {\n if (await Fact.areKnownSubjects([attributeId], this.logger)) {\n throw new Error('attributeId is invalid');\n }\n\n return this.createAttributeWithoutFactsCheck(\n attributeId,\n actorId,\n value,\n );\n }\n\n async createAttributeWithoutFactsCheck(\n attributeId: string,\n actorId: string,\n value: string | Buffer,\n ) : Promise<{ id: string }> {\n const now = new Date();\n\n await this.minioClient.putObject(\n this.bucketName,\n attributeId,\n value,\n undefined,\n {\n actorId, createdAt: now, updatedAt: now,\n },\n );\n\n return { id: attributeId };\n }\n\n async getAttributeLatestSnapshot(\n attributeId: string,\n actorId: string,\n { inAuthorizedContext = false }: AttributeChangeCriteria = {},\n ) : Promise<AttributeSnapshot> {\n if (!inAuthorizedContext) {\n if (!(await Fact.isAuthorizedToReadPayload(attributeId, actorId, this.logger))) {\n // TODO: when this is thrown, it is not visible in the logs probably??\n // And the status code is 500\n throw new AuthorizationError(actorId, 'attribute', attributeId, this.logger);\n }\n }\n\n const [dataStream, stats] = await Promise.all([\n this.minioClient.getObject(this.bucketName, attributeId),\n this.minioClient.statObject(this.bucketName, attributeId),\n ]);\n\n return {\n id: attributeId,\n value: await text(dataStream),\n changeId: '2147483647',\n actorId: stats.metaData['actorId'] || stats.metaData['actorid'],\n createdAt: new Date(stats.metaData['createdAt'] || stats.metaData['createdat']).getTime(),\n updatedAt: new Date(stats.metaData['updatedAt'] || stats.metaData['updatedat']).getTime(),\n };\n }\n\n async getAttributeLatestSnapshotAsReadable(\n attributeId: string,\n actorId: string,\n { inAuthorizedContext = false }: AttributeChangeCriteria = {},\n ) : Promise<AttributeSnapshotReadable> {\n if (!inAuthorizedContext) {\n if (!(await Fact.isAuthorizedToReadPayload(attributeId, actorId, this.logger))) {\n // TODO: when this is thrown, it is not visible in the logs probably??\n // And the status code is 500\n throw new AuthorizationError(actorId, 'attribute', attributeId, this.logger);\n }\n }\n\n const [dataStream, stats] = await Promise.all([\n this.minioClient.getObject(this.bucketName, attributeId),\n this.minioClient.statObject(this.bucketName, attributeId),\n ]);\n\n return {\n value: dataStream,\n changeId: '2147483647',\n actorId: stats.metaData['actorId'] || stats.metaData['actorid'],\n createdAt: new Date(stats.metaData['createdAt'] || stats.metaData['createdat']).getTime(),\n updatedAt: new Date(stats.metaData['updatedAt'] || stats.metaData['updatedat']).getTime(),\n };\n }\n\n async getAttributeChanges() : Promise<Array<any>> {\n return [];\n }\n\n async insertAttributeChange() : Promise<{ id: string, updatedAt: Date }> {\n throw new Error('insertAttributeChange is not implemented for psql storage, use psql_with_history instead');\n }\n\n async insertAttributeSnapshot(\n attributeId: string,\n actorId: string,\n value: string | Buffer,\n ) : Promise<{ id: string, updatedAt: Date }> {\n if (!(await Fact.isAuthorizedToModifyPayload(attributeId, actorId, this.logger))) {\n throw new AuthorizationError(actorId, 'attribute', attributeId, this.logger);\n }\n\n const updatedAt = new Date();\n\n assert(this.minioClient, 'S3 configuration was not found in the environment variables!');\n assert(this.bucketName, 'S3 configuration was not found in the environment variables!');\n\n await this.minioClient.putObject(\n this.bucketName,\n attributeId,\n value,\n undefined,\n {\n actorId, createdAt: new Date(), updatedAt,\n },\n );\n\n return {\n id: attributeId,\n updatedAt,\n };\n }\n\n private async getObjectSize(nodeId: string): Promise<number> {\n // const cacheKey = `node-size-${nodeId}`;\n // const cached = cache.get(cacheKey);\n\n // if (cached) {\n // return cached;\n // }\n\n try {\n const stats = await this.minioClient.statObject(this.bucketName, nodeId);\n const { size } = stats;\n\n // cache.set(cacheKey, size);\n return size || 0;\n } catch (ex: any) {\n if (ex.code === 'NotFound') {\n return 0;\n }\n\n throw ex;\n }\n }\n}\n","export default class BlobChange {\n value: Blob;\n\n changeId: string;\n\n constructor(newValue: Blob, changeId?: string) {\n this.changeId = changeId ?? 'uncommitted';\n this.value = newValue;\n }\n\n // eslint-disable-next-line class-methods-use-this\n toJSON(): object {\n return { updated: true };\n }\n}\n","/* eslint-disable import/no-cycle */\n/* eslint-disable class-methods-use-this */\nimport FileType from 'file-type';\nimport assert from 'assert';\nimport { Readable } from 'stream';\nimport streamToBlob from 'stream-to-blob';\nimport AbstractAttributeServer, { LoadResult } from '../../abstract/abstract_attribute_server';\nimport SerializedChangeWithMetadata from '../../abstract/serialized_change_with_metadata';\nimport BlobChange from '../blob_change';\nimport IsLogger from '../../../../lib/is_logger';\nimport PsqlStorage from '../../attribute_storage/psql';\nimport S3Storage from '../../attribute_storage/s3';\nimport PgPoolWithLog from '../../../../lib/pg-log';\nimport IsAttributeStorage from '../../abstract/is_attribute_storage';\n\nexport default class BlobAttribute extends AbstractAttributeServer<\nBlob,\nBlobChange\n> {\n storage: IsAttributeStorage;\n\n isS3Configured: boolean = S3Storage.isConfigurationAvailable();\n\n public static getDataTypePrefix(): string {\n return 'bl';\n }\n\n public static async copyFromPSQLToS3(logger: IsLogger) {\n if (process.env['S3_COPY_FROM_BL_ATTRIBUTE_TABLE'] !== 'true' || !S3Storage.isConfigurationAvailable()) {\n return;\n }\n\n const s3storage = new S3Storage(logger);\n const pgPool = new PgPoolWithLog(logger);\n const prefix = this.getDataTypePrefix();\n\n const data = await pgPool.query('SELECT id, actor_id, value FROM bl_attributes');\n\n logger.info(`copy ${data.rows.length} files to S3`);\n\n await Promise.all(\n data.rows.map(async ({ id, value, actor_id }) => {\n const interVal = await BlobAttribute.unmarshal(value, id, logger);\n const buffer = await BlobAttribute.marshal(interVal, S3Storage.isConfigurationAvailable());\n await s3storage.createAttributeWithoutFactsCheck(`${prefix}-${id}`, actor_id, buffer);\n }),\n );\n\n logger.info('copy to S3 done!');\n }\n\n constructor(\n id: string,\n clientId: string,\n actorId: string,\n logger: IsLogger,\n ) {\n super(id, clientId, actorId, logger);\n\n this.storage = this.isS3Configured\n ? new S3Storage(logger)\n : new PsqlStorage(logger, 'bl');\n }\n\n async create(value: Blob) : Promise<{ id: string }> {\n await this.createAccountableFact();\n\n return this.storage.createAttribute(this.id, this.actorId, await this.marshal(value));\n }\n\n async getStorageRequiredForValue(value: Blob): Promise<number> {\n return value.size;\n }\n\n async getStorageRequiredForChange(\n change: SerializedChangeWithMetadata<BlobChange>,\n ): Promise<number> {\n return this.getStorageRequiredForValue(change.change.value);\n }\n\n async get() : Promise<LoadResult<Blob>> {\n const content = this.storage.getAttributeLatestSnapshotAsReadable\n ? await this.storage.getAttributeLatestSnapshotAsReadable(this.id, this.actorId, { maxChangeId: '2147483647' })\n : await this.storage.getAttributeLatestSnapshot(this.id, this.actorId, { maxChangeId: '2147483647' });\n\n return {\n ...content,\n id: this.id,\n value: await this.unmarshal(content.value),\n };\n }\n\n async set(value: Blob) : Promise<{ id: string }> {\n const content = await this.marshal(value);\n return this.storage.insertAttributeSnapshot(this.id, this.actorId, content);\n }\n\n async change(\n changeWithMetadata: SerializedChangeWithMetadata<BlobChange>,\n ) : Promise<SerializedChangeWithMetadata<BlobChange>> {\n const newValue = changeWithMetadata.change.value;\n const insertResult = await this.storage.insertAttributeSnapshot(\n this.id,\n this.actorId,\n await this.marshal(newValue),\n );\n\n return new SerializedChangeWithMetadata(\n changeWithMetadata.attributeId,\n changeWithMetadata.actorId,\n changeWithMetadata.clientId,\n new BlobChange(new Blob(), insertResult.id),\n );\n }\n\n private async marshal(value: Blob): Promise<string | Buffer> {\n return BlobAttribute.marshal(value, this.isS3Configured);\n }\n\n private static async marshal(value: Blob, isS3Configured: boolean): Promise<string | Buffer> {\n return isS3Configured\n ? Buffer.from(await value.arrayBuffer())\n : `data:${value.type};base64,${Buffer.from(await value.arrayBuffer()).toString('base64')}`;\n }\n\n private async unmarshal(value: string | Readable): Promise<Blob> {\n return BlobAttribute.unmarshal(value, this.id, this.logger);\n }\n\n private static async unmarshal(\n value: string | Readable,\n attributeId: string,\n logger: IsLogger,\n ): Promise<Blob> {\n if (value instanceof Readable) {\n const blob = await streamToBlob(value);\n\n if (blob.type) {\n return blob;\n }\n\n const typeFromBinary = await FileType.fromBuffer(await blob.arrayBuffer());\n\n if (!typeFromBinary || !typeFromBinary.mime) {\n return blob;\n }\n\n return new Blob([blob], { type: typeFromBinary?.mime });\n }\n\n const match = value.match(/^data:(.*?);(.*?),/);\n let rawContent = value;\n let data;\n let mimetype;\n let encoding;\n\n if (match) {\n [, mimetype, encoding] = match;\n\n rawContent = value.replace(new RegExp(`^data:(.*?);${encoding},`), '');\n\n assert(mimetype, 'No mimetype detected for the given blob attribute');\n assert(encoding === 'base64' || encoding === 'utf8', 'No valid encoding detected for the given blob attribute');\n\n data = Buffer.from(rawContent, encoding);\n }\n\n if (!mimetype || mimetype === 'application/octet-stream') {\n try {\n const typeFromBinary = await FileType.fromBuffer(data);\n if (typeFromBinary && typeFromBinary.mime) {\n mimetype = typeFromBinary.mime;\n }\n } catch (ex) {\n logger.warn(`failed to determine mimetype for blob attribute with id: ${attributeId}`);\n }\n }\n\n if (!data) {\n data = Buffer.from(value, 'utf8');\n }\n\n return new Blob([data], { type: mimetype });\n }\n}\n","import IsLogger from '../../../lib/is_logger';\nimport type Fact from '../../facts/server';\n\nexport default class AuthorizationError extends Error {\n constructor(userId: string, entityType: string, entity: string | Fact, logger: IsLogger) {\n super(`User ${userId} is not authorized to access ${entityType}`);\n\n let record = '';\n\n try {\n record = JSON.stringify(entity);\n } catch {\n logger.warn('error logging an error, something could not be serialized');\n }\n\n logger.warn(`User ${userId} is not authorized to access ${entityType} ${record}`);\n }\n}\n","import set from 'set-value';\nimport unset from '../../../lib/utils/unset';\n\nexport type AtomicChange = {\n key: string,\n value: object | string | boolean | number | null,\n};\n\nexport default class KeyValueChange {\n public changeId: string;\n\n public change: AtomicChange[];\n\n public static fromJSON(input: any, changeId?: string) {\n return new KeyValueChange(input as AtomicChange[], changeId);\n }\n\n public static fromString(input: string) : KeyValueChange {\n return new KeyValueChange(JSON.parse(input));\n }\n\n constructor(changeset: AtomicChange[], changeId?: string) {\n this.changeId = changeId ?? 'uncommitted';\n this.change = changeset;\n }\n\n public toString(): string {\n return JSON.stringify(this.change);\n }\n\n public toJSON(): object {\n return this.change;\n }\n\n public apply(input: object): object {\n const result = JSON.parse(JSON.stringify(input));\n\n if (!this.change.forEach) {\n return result;\n }\n\n this.change.forEach((aChange) => {\n if (aChange.value === null) {\n unset(result, aChange.key);\n } else {\n set(result, aChange.key, aChange.value);\n }\n });\n\n return result;\n }\n\n public merge(other: KeyValueChange): KeyValueChange {\n let mergedChanges: AtomicChange[] = [];\n\n this.change.forEach((ch) => {\n mergedChanges = mergedChanges.filter((x) => x.key !== ch.key);\n mergedChanges.push(ch);\n });\n\n other.change.forEach((ch) => {\n mergedChanges = mergedChanges.filter((x) => x.key !== ch.key);\n mergedChanges.push(ch);\n });\n\n return new KeyValueChange(mergedChanges);\n }\n}\n","/* eslint-disable import/no-cycle */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\n/* eslint-disable class-methods-use-this */\n/* eslint-disable @typescript-eslint/no-unused-vars */\nimport AbstractAttributeServer, { LoadResult } from '../../abstract/abstract_attribute_server';\nimport SerializedChangeWithMetadata from '../../abstract/serialized_change_with_metadata';\nimport KeyValueChange from '../key_value_change';\nimport QueuedTasks, { IsQueue } from '../../../../lib/queued-tasks';\nimport Fact from '../../../facts/server';\nimport IsLogger from '../../../../lib/is_logger';\nimport AttributeStorage from '../../attribute_storage/psql';\n\nconst queue: IsQueue = QueuedTasks.create();\n\nexport default class KeyValueAttribute extends AbstractAttributeServer<\nobject,\nKeyValueChange\n> {\n storage: AttributeStorage;\n\n public static getDataTypePrefix(): string {\n return 'kv';\n }\n\n public static async createAll(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n attr: [AbstractAttributeServer<any, any>, any][],\n ): Promise<string[]> {\n if (!attr[0]) {\n throw new Error('invalid attribute data found when creating all attributes');\n }\n\n await Fact.saveAllWithoutAuthCheckAndSpecialTreatment(\n attr.map(([a]) => new Fact(a.actorId, '$isAccountableFor', a.id, a.logger)),\n attr[0][0].actorId,\n undefined,\n attr[0][0].logger,\n );\n\n const storage = new AttributeStorage(attr[0][0].logger, 'kv');\n\n const result = await storage.createAllAttributes(attr.map((a) => ({\n attributeId: a[0].id,\n actorId: a[0].actorId,\n value: a[1],\n })));\n\n return result.map((r) => r.id);\n }\n\n public static async loadAll(\n attributeIDs: string[],\n clientId: string,\n actorId: string,\n logger: IsLogger,\n args?: { inAuthorizedContext?: boolean },\n ): Promise<LoadResult<object>[]> {\n if (!args?.inAuthorizedContext) {\n return super.loadAll(attributeIDs, clientId, actorId, logger, args);\n }\n\n const storage = new AttributeStorage(logger, 'kv');\n const snapshots = await storage.getAttributeLatestSnapshots(attributeIDs, actorId, args);\n\n return snapshots.map((snapshot) => ({\n id: snapshot.id,\n value: JSON.parse(snapshot.value),\n changeId: snapshot.changeId,\n actorId: snapshot.actorId,\n createdAt: snapshot.createdAt,\n updatedAt: snapshot.updatedAt,\n }));\n }\n\n constructor(\n id: string,\n clientId: string,\n actorId: string,\n logger: IsLogger,\n ) {\n super(id, clientId, actorId, logger);\n\n this.storage = new AttributeStorage(logger, 'kv');\n }\n\n async getStorageRequiredForValue(value: object): Promise<number> {\n return Buffer.byteLength(JSON.stringify(value), 'utf8');\n }\n\n async getStorageRequiredForChange(\n change: SerializedChangeWithMetadata<KeyValueChange>,\n ): Promise<number> {\n return this.getStorageRequiredForValue(change.change);\n }\n\n async create(value: object) : Promise<{ id: string }> {\n await this.createAccountableFact();\n return this.storage.createAttribute(this.id, this.actorId, JSON.stringify(value));\n }\n\n async get(args?: { inAuthorizedContext?: boolean }) : Promise<LoadResult<object>> {\n const queryOptions = { maxChangeId: '2147483647', inAuthorizedContext: args?.inAuthorizedContext };\n\n const result = await this.storage.getAttributeLatestSnapshot(\n this.id,\n this.actorId,\n queryOptions,\n );\n\n return {\n id: this.id,\n value: JSON.parse(result.value),\n changeId: result.changeId,\n actorId: result.actorId,\n createdAt: result.createdAt,\n updatedAt: result.updatedAt,\n };\n }\n\n async set(value: object) : Promise<{ id: string, updatedAt: Date }> {\n return this.storage.insertAttributeSnapshot(this.id, this.actorId, JSON.stringify(value));\n }\n\n async change(\n changeWithMetadata: SerializedChangeWithMetadata<KeyValueChange>,\n ) : Promise<SerializedChangeWithMetadata<KeyValueChange>> {\n return queue\n .do(this.id, async () => {\n const currentValue = await this.get();\n const change = KeyValueChange.fromJSON(changeWithMetadata.change);\n const newValue = change.apply(currentValue.value);\n const updateResult = await this.set(newValue);\n\n return new SerializedChangeWithMetadata(\n changeWithMetadata.attributeId,\n changeWithMetadata.actorId,\n changeWithMetadata.clientId,\n KeyValueChange.fromJSON(changeWithMetadata.change, '2147483647'),\n updateResult.updatedAt,\n );\n });\n }\n}\n","import { Changeset } from 'changesets';\nimport { diff_match_patch as DiffMatchPatch } from 'diff_match_patch';\n\nconst diffEngine = new DiffMatchPatch();\n\nexport default class LongTextChange {\n public changeset;\n\n public changeId: string;\n\n constructor(changeset, changeId?: string) {\n this.changeset = changeset;\n this.changeId = changeId ?? 'uncommitted';\n }\n\n public static fromString(change: string): LongTextChange {\n return new LongTextChange(Changeset.unpack(change));\n }\n\n public static fromDiff(a: string, b: string): LongTextChange {\n return new LongTextChange(Changeset.fromDiff(diffEngine.diff_main(a, b)));\n }\n\n public apply(value: string): string {\n return this.changeset.apply(value);\n }\n\n public toString(): string {\n return typeof this.changeset === 'string'\n ? this.changeset\n : this.changeset.pack();\n }\n\n public transformAgainst(change: LongTextChange | null, side?) : LongTextChange {\n if (!change) {\n return this;\n }\n\n return new LongTextChange(this.changeset.transformAgainst(change.changeset, side));\n }\n\n public merge(otherChange: LongTextChange) : LongTextChange {\n return new LongTextChange(this.changeset.merge(otherChange.changeset));\n }\n\n public toJSON() {\n return {\n changeset: this.toString(),\n changeId: this.changeId,\n };\n }\n}\n","/* eslint-disable import/no-cycle */\n/* eslint-disable no-console */\n// eslint-disable-next-line max-classes-per-file\nimport AbstractAttributeServer, { LoadResult } from '../../abstract/abstract_attribute_server';\nimport SerializedChangeWithMetadata from '../../abstract/serialized_change_with_metadata';\nimport LongTextChange from '../long_text_change';\nimport QueuedTasks, { IsQueue } from '../../../../lib/queued-tasks';\nimport IsLogger from '../../../../lib/is_logger';\nimport AttributeStorage from '../../attribute_storage/psql_with_history';\n\nconst queue: IsQueue = QueuedTasks.create();\n\nexport default class LongTextAttribute extends AbstractAttributeServer<\nstring,\nLongTextChange\n> {\n storage: AttributeStorage;\n\n public static getDataTypePrefix(): string {\n return 'l';\n }\n\n constructor(\n id: string,\n clientId: string,\n actorId: string,\n logger: IsLogger,\n ) {\n super(id, clientId, actorId, logger);\n\n this.storage = new AttributeStorage(logger);\n }\n\n // eslint-disable-next-line class-methods-use-this\n async getStorageRequiredForValue(value: string): Promise<number> {\n return Buffer.byteLength(value, 'utf8');\n }\n\n async getStorageRequiredForChange(\n change: SerializedChangeWithMetadata<LongTextChange>,\n ): Promise<number> {\n return this.getStorageRequiredForValue(change.change.changeset);\n }\n\n async create(value: string) : Promise<{ id: string }> {\n await this.createAccountableFact();\n\n return this.storage.createAttribute(this.id, this.actorId, value);\n }\n\n async get(args?: { inAuthorizedContext?: boolean }) : Promise<LoadResult<string>> {\n return this.getByChangeId('2147483647', args);\n }\n\n async set(value: string) : Promise<{ id: string }> {\n return queue\n .do(this.id, () => this.storage.insertAttributeSnapshot(this.id, this.actorId, value));\n }\n\n async change(\n changeWithMetadata: SerializedChangeWithMetadata<LongTextChange>,\n ) : Promise<SerializedChangeWithMetadata<LongTextChange>> {\n const serializedChangeset = changeWithMetadata.change.changeset;\n const parentVersion = changeWithMetadata.change.changeId;\n\n try {\n LongTextChange.fromString(serializedChangeset);\n } catch (err) {\n throw new Error('the specified changeset is invalid (must be a string that has been serialized with changeset.pack(); see: https://github.com/marcelklehr/changesets/blob/master/lib/Changeset.js#L320-L337)');\n }\n\n if (!parentVersion) {\n throw new Error('the changeset must also contain a parent version');\n }\n\n return queue\n .do(this.id, async () => {\n const result = await this.changeByChangeset(\n LongTextChange.fromString(serializedChangeset),\n parentVersion,\n );\n\n return new SerializedChangeWithMetadata(\n this.id,\n result.actorId,\n result.clientId,\n new LongTextChange(result.transformedClientChange, result.changeId),\n result.updatedAt,\n );\n });\n }\n\n private async getByChangeId(\n changeId: string,\n args?: { inAuthorizedContext?: boolean },\n ) : Promise<LoadResult<string>> {\n const queryOptions = { maxChangeId: changeId, inAuthorizedContext: args?.inAuthorizedContext };\n const result = await this.storage.getAttributeLatestSnapshot(\n this.id,\n this.actorId,\n queryOptions,\n );\n\n if (result.changeId === changeId) {\n return result;\n }\n\n // TODO: query options should be something\n // like { minChangeId: result.changeId, maxChangeId: changeId }\n const changes = await this.storage.getAttributeChanges(\n this.id,\n this.actorId,\n {\n ...queryOptions,\n minChangeId: result.changeId,\n },\n );\n\n if (changes.length && changes[0].changeId === result.changeId) {\n changes.shift();\n }\n\n changes.forEach((change) => {\n result.value = LongTextChange.fromString(change.value).apply(result.value);\n result.changeId = change.changeId;\n result.actorId = change.actorId;\n result.updatedAt = change.time;\n });\n\n if (changes.length >= 100) {\n await this.storage.insertAttributeSnapshot(\n this.id,\n this.actorId,\n result.value,\n result.changeId,\n );\n }\n\n return result;\n }\n\n private async getChangeSince(changeId: string) : Promise<LongTextChange | null> {\n const changes = await this.storage.getAttributeChanges(\n this.id,\n this.actorId,\n { minChangeId: changeId },\n );\n\n if (!changes.length) {\n return null;\n }\n\n let merged: LongTextChange | null = null;\n\n changes.forEach((change) => {\n const tmp = LongTextChange.fromString(change.value);\n\n if (merged) {\n merged = merged.merge(tmp);\n } else {\n merged = tmp;\n }\n });\n\n return merged;\n }\n\n // Applies the changeset which can be based on\n // an older version of the variable value.\n // This is because the client which constructed\n // the changeset might not have the latest changes from the server\n // This is the \"one-step diamond problem\" in operational transformation\n // see: http://www.codecommit.com/blog/java/understanding-and-applying-operational-transformation\n private async changeByChangeset(\n changeset: LongTextChange,\n parentVersion: string,\n ) : Promise<{\n changeId: string,\n clientId: string,\n actorId: string,\n updatedAt: Date,\n transformedClientChange: string\n }> {\n // the a in the simple one-step diamond problem\n // the changeset coming from the client, probably\n // made on an older version of the attribute (the server version might be newer)\n const clientChange = changeset;\n\n // the b in the simple one-step diamond problem\n // the compound changes on the server side which\n // are missing on the client site (the changeset\n // from the client site does not consider this changes)\n const serverChange = await this.getChangeSince(parentVersion);\n\n // the a' in the simple one-step diamond problem\n // this changeset will be applied to the current server sate and send to all clients\n // This works because of the TP1 property of the transformAgainst function\n // see: https://en.wikipedia.org/wiki/Operational_transformation#Convergence_properties\n const transformedClientChange = clientChange.transformAgainst(serverChange, false).toString();\n\n await this.ensureChangeCanBeApplied(transformedClientChange, clientChange);\n\n // TODO: we do not know yet for sure if this changeset will be applicable\n // to the already inserted changesets.\n const insertResult = await this.storage.insertAttributeChange(\n this.id,\n this.actorId,\n transformedClientChange,\n );\n\n return {\n changeId: insertResult.id,\n updatedAt: insertResult.updatedAt,\n clientId: this.clientId,\n actorId: this.actorId,\n transformedClientChange,\n };\n }\n\n async ensureChangeCanBeApplied(\n transformedClientChange: string,\n clientChange: LongTextChange,\n ) {\n const latestStateInDb = await this.getByChangeId('2147483647');\n\n try {\n const tcc = LongTextChange.fromString(transformedClientChange);\n tcc.apply(latestStateInDb.value);\n } catch (ex) {\n console.log('Error: New change could not be applied to the database state');\n console.log(' server state: ', latestStateInDb.value);\n console.log(' server version: ', latestStateInDb.changeId);\n console.log(' clientChange: ', clientChange?.changeset?.inspect());\n console.log(' transformedClientChange: ', LongTextChange.fromString(transformedClientChange)?.changeset?.inspect());\n\n throw new Error('The new change could not be merged into the server state');\n }\n }\n}\n","export interface DevUser {\n sub: string;\n email: string;\n name: string;\n picture?: string;\n}\n\nexport const DEV_USERS: DevUser[] = [\n { sub: 'alice-user-id-001', email: 'alice@example.com', name: 'Alice' },\n { sub: 'bob-user-id-002', email: 'bob@example.com', name: 'Bob' },\n { sub: 'charlie-user-id-003', email: 'charlie@example.com', name: 'Charlie' },\n];\n\nexport function getIssuerUrl(): string {\n const baseUrl = process.env['SERVER_BASE_URL'] || 'http://localhost:6543';\n return `${baseUrl}/dev-oidc`;\n}\n\nexport function getClientId(): string {\n return process.env['AUTH_CLIENT_ID'] || 'linkedrecords-dev';\n}\n\nexport function getAudience(): string {\n return process.env['AUTH_TOKEN_AUDIENCE'] || 'linkedrecords-dev';\n}\n\nexport const TOKEN_EXPIRY = 24 * 60 * 60; // 24 hours in seconds\nexport const CODE_EXPIRY = 60 * 1000; // 60 seconds in milliseconds\n","import { Request, Response } from 'express';\nimport * as jose from 'jose';\nimport * as crypto from 'crypto';\nimport {\n DEV_USERS, getIssuerUrl, getAudience, TOKEN_EXPIRY, CODE_EXPIRY,\n} from './config';\nimport { getPrivateKey, getJWKS, getKeyId } from './keys';\nimport { generateLoginPage } from './login-page';\n\ninterface CustomUser {\n sub: string;\n email: string;\n name: string;\n}\n\ninterface PendingAuthorization {\n userId: string;\n redirectUri: string;\n state: string;\n nonce: string;\n codeChallenge: string;\n codeChallengeMethod: string;\n expiresAt: number;\n customUser?: CustomUser;\n}\n\nconst pendingAuthorizations = new Map<string, PendingAuthorization>();\n\n// Cleanup expired codes periodically\nsetInterval(() => {\n const now = Date.now();\n Array.from(pendingAuthorizations.entries()).forEach(([code, auth]) => {\n if (auth.expiresAt < now) {\n pendingAuthorizations.delete(code);\n }\n });\n}, 60 * 1000);\n\nexport function discoveryHandler(_req: Request, res: Response): void {\n const issuer = getIssuerUrl();\n\n res.json({\n issuer,\n authorization_endpoint: `${issuer}/authorize`,\n token_endpoint: `${issuer}/token`,\n userinfo_endpoint: `${issuer}/userinfo`,\n jwks_uri: `${issuer}/jwks`,\n response_types_supported: ['code'],\n subject_types_supported: ['public'],\n id_token_signing_alg_values_supported: ['RS256'],\n scopes_supported: ['openid', 'email', 'profile'],\n token_endpoint_auth_methods_supported: ['none'],\n claims_supported: ['sub', 'email', 'email_verified', 'name', 'picture'],\n code_challenge_methods_supported: ['S256', 'plain'],\n });\n}\n\nexport function jwksHandler(_req: Request, res: Response): void {\n res.json(getJWKS());\n}\n\nexport function authorizeGetHandler(req: Request, res: Response): void {\n const {\n redirect_uri: redirectUri = '',\n state = '',\n nonce = '',\n code_challenge: codeChallenge = '',\n code_challenge_method: codeChallengeMethod = 'plain',\n } = req.query as Record<string, string>;\n\n const html = generateLoginPage(\n DEV_USERS,\n redirectUri,\n state,\n nonce,\n codeChallenge,\n codeChallengeMethod,\n );\n\n res.type('html').send(html);\n}\n\nexport function authorizePostHandler(req: Request, res: Response): void {\n const {\n user_id: userId,\n custom_email: customEmail,\n redirect_uri: redirectUri,\n state = '',\n nonce = '',\n code_challenge: codeChallenge = '',\n code_challenge_method: codeChallengeMethod = 'plain',\n } = req.body;\n\n if (!redirectUri) {\n res.status(400).json({ error: 'missing_parameters', error_description: 'redirect_uri is required' });\n return;\n }\n\n if (!userId && !customEmail) {\n res.status(400).json({ error: 'missing_parameters', error_description: 'user_id or custom_email is required' });\n return;\n }\n\n let customUser: CustomUser | undefined;\n let finalUserId: string;\n\n if (customEmail) {\n // Create a custom user from the email\n const emailHash = crypto.createHash('md5').update(customEmail.toLowerCase()).digest('hex');\n finalUserId = `custom-${emailHash}`;\n const namePart = customEmail.split('@')[0];\n const name = namePart.charAt(0).toUpperCase() + namePart.slice(1);\n customUser = {\n sub: finalUserId,\n email: customEmail,\n name,\n };\n } else {\n const user = DEV_USERS.find((u) => u.sub === userId);\n if (!user) {\n res.status(400).json({ error: 'invalid_user', error_description: 'User not found' });\n return;\n }\n finalUserId = userId;\n }\n\n const code = crypto.randomBytes(32).toString('hex');\n\n pendingAuthorizations.set(code, {\n userId: finalUserId,\n redirectUri,\n state,\n nonce,\n codeChallenge,\n codeChallengeMethod,\n expiresAt: Date.now() + CODE_EXPIRY,\n customUser,\n });\n\n const redirectUrl = new URL(redirectUri);\n redirectUrl.searchParams.set('code', code);\n if (state) {\n redirectUrl.searchParams.set('state', state);\n }\n\n res.redirect(redirectUrl.toString());\n}\n\nexport async function tokenHandler(req: Request, res: Response): Promise<void> {\n const {\n code,\n code_verifier: codeVerifier,\n grant_type: grantType,\n } = req.body;\n\n if (grantType !== 'authorization_code') {\n res.status(400).json({ error: 'unsupported_grant_type' });\n return;\n }\n\n if (!code) {\n res.status(400).json({ error: 'invalid_request', error_description: 'code is required' });\n return;\n }\n\n const auth = pendingAuthorizations.get(code);\n if (!auth) {\n res.status(400).json({ error: 'invalid_grant', error_description: 'Invalid or expired code' });\n return;\n }\n\n // Delete code immediately (single-use)\n pendingAuthorizations.delete(code);\n\n // Check if code expired\n if (auth.expiresAt < Date.now()) {\n res.status(400).json({ error: 'invalid_grant', error_description: 'Code expired' });\n return;\n }\n\n // Verify PKCE if code_challenge was provided\n if (auth.codeChallenge) {\n if (!codeVerifier) {\n res.status(400).json({ error: 'invalid_request', error_description: 'code_verifier is required' });\n return;\n }\n\n let computedChallenge: string;\n if (auth.codeChallengeMethod === 'S256') {\n computedChallenge = crypto\n .createHash('sha256')\n .update(codeVerifier)\n .digest('base64url');\n } else {\n computedChallenge = codeVerifier;\n }\n\n if (computedChallenge !== auth.codeChallenge) {\n res.status(400).json({ error: 'invalid_grant', error_description: 'Invalid code_verifier' });\n return;\n }\n }\n\n // Get user from predefined list or custom user stored in authorization\n const predefinedUser = DEV_USERS.find((u) => u.sub === auth.userId);\n const user = auth.customUser || predefinedUser;\n\n if (!user) {\n res.status(400).json({ error: 'invalid_grant', error_description: 'User not found' });\n return;\n }\n\n const issuer = getIssuerUrl();\n const audience = getAudience();\n const now = Math.floor(Date.now() / 1000);\n\n const idTokenPayload: jose.JWTPayload = {\n iss: issuer,\n sub: user.sub,\n aud: audience,\n exp: now + TOKEN_EXPIRY,\n iat: now,\n email: user.email,\n email_verified: true,\n name: user.name,\n };\n\n if (auth.nonce) {\n idTokenPayload['nonce'] = auth.nonce;\n }\n\n if ('picture' in user && user.picture) {\n idTokenPayload['picture'] = user.picture;\n }\n\n const privateKey = getPrivateKey();\n\n const idToken = await new jose.SignJWT(idTokenPayload)\n .setProtectedHeader({ alg: 'RS256', kid: getKeyId() })\n .sign(privateKey);\n\n // Access token with same claims for simplicity\n const accessToken = await new jose.SignJWT({\n iss: issuer,\n sub: user.sub,\n aud: audience,\n exp: now + TOKEN_EXPIRY,\n iat: now,\n email: user.email,\n email_verified: true,\n name: user.name,\n })\n .setProtectedHeader({ alg: 'RS256', kid: getKeyId() })\n .sign(privateKey);\n\n res.json({\n access_token: accessToken,\n token_type: 'Bearer',\n expires_in: TOKEN_EXPIRY,\n id_token: idToken,\n });\n}\n\nexport function userinfoHandler(req: Request, res: Response): void {\n const authHeader = req.headers.authorization;\n if (!authHeader || !authHeader.startsWith('Bearer ')) {\n res.status(401).json({ error: 'invalid_token' });\n return;\n }\n\n const token = authHeader.slice(7);\n\n try {\n // Decode without verification (userinfo endpoint trusts the token since it was issued by us)\n const payload = jose.decodeJwt(token);\n\n if (!payload.sub || !payload['email']) {\n res.status(401).json({ error: 'invalid_token' });\n return;\n }\n\n // Use claims directly from token - works for both predefined and custom users\n const response: Record<string, unknown> = {\n sub: payload.sub,\n email: payload['email'],\n email_verified: true,\n name: payload['name'] || payload['email'],\n };\n\n if (payload['picture']) {\n response['picture'] = payload['picture'];\n }\n\n res.json(response);\n } catch {\n res.status(401).json({ error: 'invalid_token' });\n }\n}\n","import { Router, urlencoded } from 'express';\nimport {\n discoveryHandler,\n jwksHandler,\n authorizeGetHandler,\n authorizePostHandler,\n tokenHandler,\n userinfoHandler,\n} from './endpoints';\nimport { initializeKeys } from './keys';\n\nconst router = Router();\n\n// Parse URL-encoded bodies for form submissions\nrouter.use(urlencoded({ extended: true }));\n\n// OIDC Discovery\nrouter.get('/.well-known/openid-configuration', discoveryHandler);\n\n// JWKS endpoint\nrouter.get('/jwks', jwksHandler);\n\n// Authorization endpoint\nrouter.get('/authorize', authorizeGetHandler);\nrouter.post('/authorize', authorizePostHandler);\n\n// Token endpoint\nrouter.post('/token', tokenHandler);\n\n// Userinfo endpoint\nrouter.get('/userinfo', userinfoHandler);\n\nexport { initializeKeys };\nexport default router;\n","import * as jose from 'jose';\n\nlet privateKey: jose.KeyLike | null = null;\nlet publicKey: jose.KeyLike | null = null;\nlet jwk: jose.JWK | null = null;\n\nconst KEY_ID = 'dev-key-1';\n\nexport async function initializeKeys(): Promise<void> {\n if (privateKey && publicKey) {\n return;\n }\n\n const keyPair = await jose.generateKeyPair('RS256');\n privateKey = keyPair.privateKey;\n publicKey = keyPair.publicKey;\n\n jwk = await jose.exportJWK(publicKey);\n jwk.kid = KEY_ID;\n jwk.use = 'sig';\n jwk.alg = 'RS256';\n}\n\nexport function getPrivateKey(): jose.KeyLike {\n if (!privateKey) {\n throw new Error('Keys not initialized. Call initializeKeys() first.');\n }\n return privateKey;\n}\n\nexport function getPublicKey(): jose.KeyLike {\n if (!publicKey) {\n throw new Error('Keys not initialized. Call initializeKeys() first.');\n }\n return publicKey;\n}\n\nexport function getJWKS(): { keys: jose.JWK[] } {\n if (!jwk) {\n throw new Error('Keys not initialized. Call initializeKeys() first.');\n }\n return { keys: [jwk] };\n}\n\nexport function getKeyId(): string {\n return KEY_ID;\n}\n","import { DevUser } from './config';\n\nfunction escapeHtml(text: string): string {\n const map: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n };\n return text.replace(/[&<>\"']/g, (char) => map[char] || char);\n}\n\n// eslint-disable-next-line import/prefer-default-export\nexport function generateLoginPage(\n users: DevUser[],\n redirectUri: string,\n state: string,\n nonce: string,\n codeChallenge: string,\n codeChallengeMethod: string,\n): string {\n const userButtons = users.map((user) => `\n <button type=\"submit\" name=\"user_id\" value=\"${user.sub}\" class=\"user-btn\">\n <span class=\"user-icon\">👤</span>\n <span class=\"user-info\">\n <span class=\"user-name\">${user.name}</span>\n <span class=\"user-email\">${user.email}</span>\n </span>\n </button>\n `).join('\\n');\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>LinkedRecords Dev Login</title>\n <style>\n * {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n }\n\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n }\n\n .login-container {\n background: white;\n border-radius: 16px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n padding: 40px;\n width: 100%;\n max-width: 400px;\n }\n\n .header {\n text-align: center;\n margin-bottom: 30px;\n }\n\n .header h1 {\n color: #333;\n font-size: 24px;\n font-weight: 600;\n margin-bottom: 8px;\n }\n\n .header p {\n color: #666;\n font-size: 14px;\n }\n\n .dev-badge {\n display: inline-block;\n background: #ff6b6b;\n color: white;\n font-size: 10px;\n font-weight: 600;\n padding: 3px 8px;\n border-radius: 4px;\n margin-left: 8px;\n vertical-align: middle;\n }\n\n .user-btn {\n width: 100%;\n display: flex;\n align-items: center;\n padding: 16px;\n margin-bottom: 12px;\n border: 2px solid #e0e0e0;\n border-radius: 12px;\n background: white;\n cursor: pointer;\n transition: all 0.2s ease;\n text-align: left;\n }\n\n .user-btn:hover {\n border-color: #667eea;\n background: #f8f9ff;\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(102, 126, 234, 0.2);\n }\n\n .user-btn:active {\n transform: translateY(0);\n }\n\n .user-icon {\n font-size: 32px;\n margin-right: 16px;\n opacity: 0.8;\n }\n\n .user-info {\n display: flex;\n flex-direction: column;\n }\n\n .user-name {\n font-size: 16px;\n font-weight: 600;\n color: #333;\n margin-bottom: 2px;\n }\n\n .user-email {\n font-size: 13px;\n color: #888;\n }\n\n .divider {\n display: flex;\n align-items: center;\n margin: 20px 0;\n color: #999;\n font-size: 12px;\n }\n\n .divider::before,\n .divider::after {\n content: '';\n flex: 1;\n height: 1px;\n background: #e0e0e0;\n }\n\n .divider span {\n padding: 0 12px;\n }\n\n .custom-login {\n margin-top: 8px;\n }\n\n .custom-login input[type=\"email\"] {\n width: 100%;\n padding: 14px 16px;\n border: 2px solid #e0e0e0;\n border-radius: 12px;\n font-size: 14px;\n outline: none;\n transition: border-color 0.2s ease;\n }\n\n .custom-login input[type=\"email\"]:focus {\n border-color: #667eea;\n }\n\n .custom-login button {\n width: 100%;\n margin-top: 12px;\n padding: 14px 16px;\n border: none;\n border-radius: 12px;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: opacity 0.2s ease, transform 0.2s ease;\n }\n\n .custom-login button:hover {\n opacity: 0.9;\n transform: translateY(-2px);\n }\n\n .custom-login button:active {\n transform: translateY(0);\n }\n\n .footer {\n margin-top: 24px;\n text-align: center;\n font-size: 12px;\n color: #999;\n }\n </style>\n</head>\n<body>\n <div class=\"login-container\">\n <div class=\"header\">\n <h1>LinkedRecords<span class=\"dev-badge\">DEV</span></h1>\n <p>Select a test user to continue</p>\n </div>\n\n <form method=\"POST\" action=\"\">\n <input type=\"hidden\" name=\"redirect_uri\" value=\"${escapeHtml(redirectUri)}\">\n <input type=\"hidden\" name=\"state\" value=\"${escapeHtml(state)}\">\n <input type=\"hidden\" name=\"nonce\" value=\"${escapeHtml(nonce)}\">\n <input type=\"hidden\" name=\"code_challenge\" value=\"${escapeHtml(codeChallenge)}\">\n <input type=\"hidden\" name=\"code_challenge_method\" value=\"${escapeHtml(codeChallengeMethod)}\">\n\n ${userButtons}\n </form>\n\n <div class=\"divider\"><span>or</span></div>\n\n <form method=\"POST\" action=\"\" class=\"custom-login\">\n <input type=\"hidden\" name=\"redirect_uri\" value=\"${escapeHtml(redirectUri)}\">\n <input type=\"hidden\" name=\"state\" value=\"${escapeHtml(state)}\">\n <input type=\"hidden\" name=\"nonce\" value=\"${escapeHtml(nonce)}\">\n <input type=\"hidden\" name=\"code_challenge\" value=\"${escapeHtml(codeChallenge)}\">\n <input type=\"hidden\" name=\"code_challenge_method\" value=\"${escapeHtml(codeChallengeMethod)}\">\n\n <input type=\"email\" name=\"custom_email\" placeholder=\"Enter any email address\" required>\n <button type=\"submit\">Login with custom email</button>\n </form>\n\n <div class=\"footer\">\n Development environment only\n </div>\n </div>\n</body>\n</html>`;\n}\n","/* eslint-disable import/no-cycle */\nimport type Fact from '.';\nimport IsLogger from '../../../lib/is_logger';\nimport { ResolveToAttributesResult } from '../../attributes/attribute_query';\nimport cache from '../../server/cache';\nimport { Role } from './authorization_sql_builder';\nimport FactBox from './fact_box';\n\nexport default class AuthCache {\n static async hasCachedAccess(\n userid: string,\n roles: Role[],\n attributeId: string,\n logger: IsLogger,\n ): Promise<boolean> {\n if (process.env['ENABLE_AUTH_RULE_CACHE'] !== 'true') {\n return false;\n }\n\n const roleKey = roles.sort().join(':');\n const allowedRoleCombos = this.getCachedRoleCombos(userid, attributeId);\n\n const cacheHit = allowedRoleCombos.includes(roleKey);\n\n if (cacheHit) {\n logger.info(`cache hit for access request: ${userid}, ${roles}, ${attributeId}`);\n } else {\n logger.info(`cache MISS!, ${roles}, ${allowedRoleCombos.join(' and ')}`);\n }\n\n return cacheHit;\n }\n\n static async onFactDeletion(\n fact: Fact,\n logger: IsLogger,\n ): Promise<void> {\n if (process.env['ENABLE_AUTH_RULE_CACHE'] !== 'true') {\n return;\n }\n\n if (!fact.predicate.startsWith('$')) {\n return;\n }\n\n if (fact.subject.startsWith('us-')) {\n cache.invalidate(fact.subject);\n return;\n }\n\n const users = await FactBox.getAllAssociatedUsersByNode(fact.subject, logger);\n users.forEach((uid) => cache.invalidate(uid));\n }\n\n static async cache(\n userid: string,\n roles: Role[],\n attributeId: string,\n logger: IsLogger,\n ) {\n if (process.env['ENABLE_AUTH_RULE_CACHE'] !== 'true') {\n return;\n }\n\n if (!userid.startsWith('us-')) {\n throw new Error('caching access rules for non user nodes is not supported.');\n }\n\n logger.info(`cache access cache for: ${userid}, ${roles}, ${attributeId}`);\n\n const userCache = cache.get(userid) || {};\n const roleKey = roles.sort().join(':');\n\n if (!userCache[attributeId]) {\n userCache[attributeId] = [];\n }\n\n if (!userCache[attributeId].includes(roleKey)) {\n userCache[attributeId].push(roleKey);\n cache.set(userid, userCache);\n }\n }\n\n static async cacheQueryResult(\n actorId: string,\n result: ResolveToAttributesResult,\n logger: IsLogger,\n ) {\n if (process.env['ENABLE_AUTH_RULE_CACHE'] !== 'true') {\n return;\n }\n\n if (Array.isArray(result)) {\n result.map((attr) => attr.id && AuthCache.cache(actorId, ['reader'], attr.id, logger));\n } else if (result) {\n const allResults: { id: string }[][] = Object.values(result);\n allResults.map((partialResult: any) => {\n if (Array.isArray(partialResult)) {\n return partialResult.map((attr) => AuthCache.cache(actorId, ['reader'], attr.id, logger));\n }\n\n if (partialResult && partialResult.id) {\n return AuthCache.cache(actorId, ['reader'], partialResult.id, logger);\n }\n\n return undefined;\n });\n }\n }\n\n private static getCachedRoleCombos(\n userid: string,\n attributeId: string,\n ) {\n const userCache = cache.get(userid) || {};\n\n if (!userCache[attributeId]) {\n userCache[attributeId] = [];\n }\n\n return userCache[attributeId];\n }\n}\n","// eslint-disable-next-line import/no-cycle\nimport Fact from '.';\nimport IsLogger from '../../../lib/is_logger';\nimport EnsureIsValid from '../../../lib/utils/sql_values';\n\nexport type Role = 'term' | 'creator' | 'selfAccess' | 'host' | 'member' | 'access' | 'reader' | 'referer' | 'conceptor';\n\nexport const rolePredicateMap = {\n member: '$isMemberOf',\n host: '$isHostOf',\n creator: '$isAccountableFor',\n reader: '$canRead',\n referer: '$canReferTo',\n access: '$canAccess',\n conceptor: '$canRefine',\n};\n\ntype MembershipType = 'all' | 'directUser';\n\nexport default class AuthorizationSqlBuilder {\n public static async getSQLToCheckAccess(\n userid: string,\n roles: Role[],\n attributeId: string,\n logger: IsLogger,\n ) {\n return `(\n SELECT *\n FROM (${await AuthorizationSqlBuilder.selectSubjectsInAnyGroup(userid, roles, attributeId, logger, 'directUser')}) as facts\n WHERE node='${EnsureIsValid.nodeId(attributeId)}'\n UNION ALL\n SELECT *\n FROM (${await AuthorizationSqlBuilder.selectSubjectsInAnyGroup(userid, roles, attributeId, logger, 'all')}) as facts\n WHERE node='${EnsureIsValid.nodeId(attributeId)}'\n )`;\n }\n\n public static async selectSubjectsInAnyGroup(\n userid: string,\n roles: Role[],\n attributeId: string | undefined,\n logger: IsLogger,\n membershipType: MembershipType = 'all',\n ) {\n const selfSubSelect = roles\n .filter((role) => role === 'selfAccess')\n .map(() => `SELECT '${EnsureIsValid.userId(userid)}' as node`);\n\n const termsSubSelect = roles\n .filter((role) => role === 'term')\n .map(() => \"SELECT facts.subject as node FROM facts WHERE facts.predicate='$isATermFor' AND facts.fact_box_id=0\");\n\n const groupRoles = roles\n .filter((role) => Object.keys(rolePredicateMap).includes(role))\n .map(EnsureIsValid.predicate)\n .map((r) => `'${rolePredicateMap[r]}'`);\n\n const groupSubSelect: string[] = [];\n\n if (groupRoles.length) {\n const factScope = await Fact.getFactScopeByUser(userid, logger);\n\n const allDirectAccessibleNodeMembers = `SELECT\n object as node\n FROM facts\n WHERE predicate IN (${groupRoles.join(',')})\n AND fact_box_id IN (${factScope.factBoxIds.map(EnsureIsValid.factBoxId).join(',')})\n AND subject IN (${await this.getGroupsOfTheUser(userid, membershipType, factScope)})`;\n\n const allDirectAccessibleNode = allDirectAccessibleNodeMembers + (attributeId ? ` AND object='${EnsureIsValid.object(attributeId)}'` : '');\n\n groupSubSelect.push(`\n (WITH\n direct_accessible_nodes AS (${allDirectAccessibleNode}),\n direct_accessible_node_members AS (${allDirectAccessibleNodeMembers})\n\n SELECT node FROM direct_accessible_nodes\n UNION ALL\n SELECT subject as node\n FROM facts\n WHERE predicate='$isMemberOf'\n AND fact_box_id IN (${factScope.factBoxIds.map(EnsureIsValid.factBoxId).join(',')})\n AND object IN (SELECT node FROM direct_accessible_node_members))\n `);\n }\n\n return `(${[\n ...selfSubSelect,\n ...termsSubSelect,\n ...groupSubSelect,\n ].join(' UNION ALL ')})`;\n }\n\n public static async getGroupsOfTheUser(\n userid: string,\n membershipType: MembershipType,\n factScope: { internalUserId: number, factBoxIds: number[] },\n ) {\n if (membershipType === 'directUser') {\n return `'${userid}'`;\n }\n\n const factScopeFilter = factScope\n ? ` AND member_facts.fact_box_id IN (${factScope.factBoxIds.map(EnsureIsValid.factBoxId).join(',')})`\n : '';\n\n return `SELECT '${EnsureIsValid.userId(userid)}' as object UNION ALL SELECT object FROM facts as member_facts WHERE member_facts.subject = '${EnsureIsValid.userId(userid)}' AND member_facts.predicate IN ('$isHostOf', '$isMemberOf', '$isAccountableFor')${factScopeFilter}`;\n }\n}\n","/* eslint-disable import/no-cycle */\nimport Fact from '.';\nimport IsLogger from '../../../lib/is_logger';\nimport PgPoolWithLog from '../../../lib/pg-log';\nimport cache from '../../server/cache';\n\nexport default class FactBox {\n id: number;\n\n graphId: number | null;\n\n constructor(id: number, graphId: number | null) {\n this.id = id;\n this.graphId = graphId;\n }\n\n public static async getNewFactBoxId(logger: IsLogger) {\n const pool = new PgPoolWithLog(logger);\n const newFactBoxIdResult = await pool.query(\"SELECT nextval('users__id_seq') as id\");\n\n return newFactBoxIdResult.rows[0].id;\n }\n\n public static async getNewGraphId(logger: IsLogger) {\n const pool = new PgPoolWithLog(logger);\n const newFactBoxIdResult = await pool.query(\"SELECT nextval('graph_id') as id\");\n\n return newFactBoxIdResult.rows[0].id;\n }\n\n static async getFactBoxPlacement(userId: string, fact: Fact, logger: IsLogger): Promise<FactBox> {\n const internalUserId = await FactBox.getInternalUserId(userId, logger);\n\n if (fact.subject.startsWith('us-')) {\n // We end up here when e.g. when\n // us-82054609511ad4ead53fceedf9c2f6bb $isHostOf kv-01943bcc-5db6-7386-9d63-246e0d0f3185\n const objectFactPlacement = await FactBox.getFactPlacementOf(fact.object, userId, logger);\n const internalSubId = await FactBox.getInternalUserId(fact.subject, logger);\n\n if (!objectFactPlacement.graphId) {\n // this is not a private graph but a shared fact box\n // we just have to assign the userId given as subject to the fact box\n await FactBox.ensureUserIsAssignedToFactBox(internalSubId, objectFactPlacement, logger);\n return objectFactPlacement;\n }\n\n if (objectFactPlacement.id === internalSubId) {\n return objectFactPlacement;\n }\n\n const newFactBox = await FactBox.moveUserGraphToNewFactBox(\n objectFactPlacement,\n logger,\n [internalUserId, internalSubId],\n );\n\n return newFactBox;\n }\n\n if (fact.object.startsWith('us-')) {\n if (userId !== fact.object) {\n throw new Error('User can only use its own id as object');\n }\n\n const subjectFactPlacement = await FactBox.getFactPlacementOf(fact.subject, userId, logger);\n\n if (!subjectFactPlacement.graphId) {\n await FactBox.ensureUserIsAssignedToFactBox(internalUserId, subjectFactPlacement, logger);\n return subjectFactPlacement;\n }\n\n return subjectFactPlacement;\n }\n\n const [factBoxSubject, factBoxObject] = await Promise.all([\n FactBox.getFactPlacementOf(fact.subject, userId, logger),\n FactBox.getFactPlacementOf(fact.object, userId, logger),\n ]);\n\n // The object is a term so the fact goes into the fact box of the subject\n if (factBoxObject.id === 0) {\n return factBoxSubject;\n }\n\n // the subject is a term, so it goes into the term box\n if (factBoxSubject.id === 0) {\n return new FactBox(0, null);\n }\n\n // a) both nodes are from the user space\n // -> getFactPlacementOf will make sure that it is the same user\n if (factBoxSubject.graphId && factBoxObject.graphId) {\n // Both nodes belong to the same graph of the same user\n if (factBoxSubject.id === internalUserId\n && factBoxObject.id === internalUserId\n && factBoxSubject.graphId === factBoxObject.graphId) {\n return factBoxObject;\n }\n\n // The nodes belong to the same user but different graphs\n if (factBoxSubject.id === internalUserId && factBoxObject.id === internalUserId) {\n const userGraph = await FactBox.mergeUserGraphs(factBoxSubject, factBoxObject, logger);\n return new FactBox(internalUserId, userGraph);\n }\n\n throw new Error('Unexpected error while trying to determine fact box id');\n }\n\n // b) None of the nodes is from a private graph\n if (!factBoxSubject.graphId && !factBoxObject.graphId) {\n const boxId = await FactBox.mergeFactBoxes(factBoxSubject.id, factBoxObject.id, logger);\n return new FactBox(boxId, null);\n }\n\n // c) subject is a private graph and object is a fact box\n if (!factBoxSubject.graphId && factBoxObject.graphId) {\n const boxId = await FactBox.mergeUserGraphToFactBox(factBoxObject, factBoxSubject, logger);\n return new FactBox(boxId, null);\n }\n\n // d) subject is a fact box and object is a graph box\n if (factBoxSubject.graphId && !factBoxObject.graphId) {\n const boxId = await FactBox.mergeUserGraphToFactBox(factBoxSubject, factBoxObject, logger);\n return new FactBox(boxId, null);\n }\n\n throw new Error('Unexpected error while trying to determine fact box id');\n }\n\n public static async isUserAssociatedToFactBox(\n factBoxId: number,\n userId: string,\n logger: IsLogger,\n ): Promise<boolean> {\n const pool = new PgPoolWithLog(logger);\n\n const internalUserId = await this.getInternalUserId(userId, logger);\n\n if (factBoxId === internalUserId) {\n return true;\n }\n\n return pool.findAny(`\n SELECT DISTINCT users.id\n FROM users_fact_boxes, users\n WHERE users_fact_boxes.user_id = users._id\n AND users_fact_boxes.fact_box_id=$1\n AND users.id=$2`, [factBoxId, userId]);\n }\n\n public static async getAllAssociatedUsersByNode(nodeId: string, logger: IsLogger) {\n const pool = new PgPoolWithLog(logger);\n\n const result = await pool.query(`\n SELECT DISTINCT users.id\n FROM users_fact_boxes, users\n WHERE users_fact_boxes.user_id = users._id\n AND users_fact_boxes.fact_box_id IN (SELECT fact_box_id FROM facts WHERE subject=$1 OR object=$1 LIMIT 1)`, [nodeId]);\n\n return result.rows.map((r) => r.id.trim());\n }\n\n public static async getInternalUserId(userid: string, logger: IsLogger): Promise<number> {\n const hit = cache.get(`internalUserId/${userid}`);\n\n if (hit) {\n return hit;\n }\n\n const pool = new PgPoolWithLog(logger);\n const result = await pool.query('SELECT _id as internal_user_id FROM users WHERE id=$1', [userid]);\n\n if (!result.rows[0]) {\n throw new Error(`User with id ${userid} does not exist`);\n }\n\n if (result) {\n cache.set(`internalUserId/${userid}`, result.rows[0].internal_user_id);\n }\n\n return result.rows[0].internal_user_id;\n }\n\n private static async getFactPlacementOf(\n nodeId: string,\n userId: string,\n logger: IsLogger,\n ): Promise<FactBox> {\n const pool = new PgPoolWithLog(logger);\n\n if (nodeId.startsWith('us-')) {\n if (nodeId !== userId) {\n throw new Error('Not allowed to access fact box of another user');\n }\n\n return {\n id: await FactBox.getInternalUserId(nodeId, logger),\n graphId: null, // Maybe we need another value here: like 0, or -1\n };\n }\n\n if (await Fact.isKnownTerm(nodeId, logger)) {\n return {\n id: 0,\n graphId: null,\n };\n }\n\n const result = await pool.query('SELECT fact_box_id, graph_id FROM facts WHERE subject=$1 OR object=$1 LIMIT 1', [nodeId]);\n\n if (!result.rows[0]) {\n return {\n id: await FactBox.getInternalUserId(userId, logger),\n graphId: await FactBox.getNewGraphId(logger),\n };\n }\n\n return {\n id: result.rows[0].fact_box_id,\n graphId: result.rows[0].graph_id,\n };\n }\n\n private static async ensureUserIsAssignedToFactBox(\n internalUserId: number,\n factBox: FactBox,\n logger: IsLogger,\n ) {\n const pool = new PgPoolWithLog(logger);\n\n if (await pool.findAny('SELECT * FROM users_fact_boxes WHERE fact_box_id=$1 AND fact_box_id=$2', [factBox.id, internalUserId])) {\n return;\n }\n\n cache.invalidate(`factScopeByUser/${internalUserId}`);\n\n await pool.query('INSERT INTO users_fact_boxes (fact_box_id, user_id) VALUES ($1, $2)', [factBox.id, internalUserId]);\n }\n\n private static async moveUserGraphToNewFactBox(\n graphBox: FactBox,\n logger: IsLogger,\n users: number[],\n ): Promise<FactBox> {\n const pool = new PgPoolWithLog(logger);\n const factBoxId = await FactBox.getNewFactBoxId(logger);\n\n if (!graphBox.id || !graphBox.graphId) {\n throw new Error('Cannot migration graph to new fact box as graphBox does not has an id');\n }\n\n await Promise.all([\n pool.query('UPDATE facts SET fact_box_id=$1, graph_id=NULL WHERE graph_id=$2', [factBoxId, graphBox.graphId]),\n ...users.map((userId) => pool.query('INSERT INTO users_fact_boxes (fact_box_id, user_id) VALUES ($1, $2);', [factBoxId, userId])),\n ]);\n\n users.map((userId) => cache.invalidate(`factScopeByUser/${userId}`));\n\n return {\n id: factBoxId,\n graphId: null,\n };\n }\n\n // TODO: make sure the smaller graph box is merged into the bigger graph box;\n private static async mergeUserGraphs(\n gb1: FactBox,\n gb2: FactBox,\n logger: IsLogger,\n ): Promise<number> {\n const pool = new PgPoolWithLog(logger);\n\n if (!gb1.graphId || !gb2.graphId) {\n logger.warn(`Cannot merge a user graph: ${JSON.stringify(gb1)} and ${JSON.stringify(gb2)}`);\n throw new Error('Cannot merge a user graphs. At least one graph box is invalid');\n }\n\n await pool.query('UPDATE facts SET graph_id=$1 WHERE graph_id=$2', [gb1.graphId, gb2.graphId]);\n\n return gb1.graphId;\n }\n\n private static async mergeUserGraphToFactBox(\n graphBox: FactBox,\n factBox: FactBox,\n logger: IsLogger,\n ): Promise<number> {\n const pool = new PgPoolWithLog(logger);\n\n if (!graphBox.graphId && !graphBox.id) {\n logger.warn(`Cannot merge a user graph without a fact box. Graph box is invalid: ${JSON.stringify(graphBox)}`);\n throw new Error('Cannot merge a user graph without a fact box. Graph box is invalid');\n }\n\n if (factBox.graphId || !factBox.id) {\n logger.warn(`Cannot merge a user graph without a fact box. Fact box is invalid: ${JSON.stringify(factBox)}`);\n throw new Error('Cannot merge a user graph without a fact box. Fact box is invalid');\n }\n\n if (!graphBox.graphId || !factBox.id || !graphBox.id) {\n logger.warn(`Unexpected error when merging user graph to fact box, fact box is missing a value: FactBox: ${JSON.stringify(factBox)}, GraphBox: ${JSON.stringify(graphBox)}`);\n throw new Error('Unexpected error when merging user graph to fact box, fact box is missing a value');\n }\n\n cache.invalidate(`factScopeByUser/${graphBox.id}`);\n\n await Promise.all([\n pool.query('UPDATE facts SET fact_box_id=$1, graph_id=NULL WHERE fact_box_id=$2 AND graph_id=$3', [factBox.id, graphBox.id, graphBox.graphId]),\n pool.query('UPDATE users_fact_boxes SET fact_box_id=$1 WHERE fact_box_id=$2', [factBox.id, graphBox.id]),\n FactBox.ensureUserIsAssignedToFactBox(graphBox.id, factBox, logger),\n ]);\n\n return factBox.id;\n }\n\n // TODO: make sure the smaller fact box is merged into the bigger fact box;\n private static async mergeFactBoxes(\n node1Id: number | undefined,\n node2Id: number | undefined,\n logger: IsLogger,\n ): Promise<number> {\n if (!node1Id && node2Id) {\n return node2Id;\n }\n\n if (!node2Id && node1Id) {\n return node1Id;\n }\n\n if (!node1Id && !node1Id) {\n throw new Error('Cannot merge fact boxes without ids');\n }\n\n if (node1Id === 0) {\n // eslint-disable-next-line no-param-reassign\n node1Id = node2Id;\n // eslint-disable-next-line no-param-reassign\n node2Id = 0;\n }\n\n const pool = new PgPoolWithLog(logger);\n\n const usersOfOldFactBox = await pool.query('SELECT user_id FROM users_fact_boxes WHERE fact_box_id=$1', [node1Id]);\n\n usersOfOldFactBox.rows.forEach((row) => {\n cache.invalidate(`factScopeByUser/${row.user_id}`);\n });\n\n await Promise.all([\n pool.query('UPDATE facts SET fact_box_id=$1 WHERE fact_box_id=$2', [node2Id, node1Id]),\n pool.query('UPDATE users_fact_boxes SET fact_box_id=$1 WHERE fact_box_id=$2', [node2Id, node1Id]),\n ]);\n\n if (!node2Id) {\n throw new Error('Unexpected error while merging fact boxes');\n }\n\n return node2Id;\n }\n}\n","/* eslint-disable no-await-in-loop */\n/* eslint-disable import/no-cycle */\n/* eslint-disable no-plusplus */\nimport md5 from 'md5';\nimport assert from 'assert';\nimport { FactQuery, SubjectQueries, SubjectQuery } from '../fact_query';\nimport PgPoolWithLog from '../../../lib/pg-log';\nimport IsLogger from '../../../lib/is_logger';\nimport AuthorizationError from '../../attributes/errors/authorization_error';\nimport SQL, { Role, rolePredicateMap } from './authorization_sql_builder';\nimport cache from '../../server/cache';\nimport EnsureIsValid from '../../../lib/utils/sql_values';\nimport AuthCache from './auth_cache';\nimport FactBox from './fact_box';\nimport QuerySubscriptionService from './query_subscription_service';\n\nfunction andFactory(): () => 'WHERE' | 'AND' {\n let whereUsed = false;\n\n return () => {\n if (!whereUsed) {\n whereUsed = true;\n return 'WHERE';\n }\n\n return 'AND';\n };\n}\n\nfunction hasNotModifier(statement: SubjectQuery): boolean {\n if (!Array.isArray(statement) || !statement[1]) {\n return false;\n }\n\n return !!statement[1].match(/^\\$not\\(.+\\)$/);\n}\n\nfunction hasLatestModifier(statement: SubjectQuery): boolean {\n if (!Array.isArray(statement) || !statement[1]) {\n return false;\n }\n\n return !!statement[0].match(/^\\$latest\\(.+\\)$/);\n}\n\nfunction ensureValidFactQuery({ subject, predicate, object }: FactQuery) {\n const isSubjectEmpty = !subject || subject.length === 0;\n const isObjectEmpty = !object || object.length === 0;\n const isPredicateEmpty = !predicate || predicate.length === 0;\n\n if (isSubjectEmpty && isObjectEmpty && isPredicateEmpty) {\n throw new Error('invalid FactQuery, provide at least one of the following conditions: subject, predicate, object');\n }\n\n if (predicate && !Array.isArray(predicate)) {\n throw new Error('invalid FactQuery, predicate must be an array of strings!');\n }\n\n if (predicate?.find((p) => !EnsureIsValid.predicate(p))) {\n throw new Error(`invalid predicate in query: ${predicate}`);\n }\n\n [...(subject || []), ...(object || [])].forEach((sq) => {\n if (typeof sq === 'string') {\n if (!EnsureIsValid.nodeId(sq)) {\n throw new Error(`invalid Id in subject query: ${sq}`);\n }\n } else if (Array.isArray(sq)) {\n if (sq.length === 3 && !EnsureIsValid.subject(sq[0])) {\n throw new Error(`invalid subject part in fact query detected: ${sq[0]}`);\n }\n\n if (sq.length === 2 && !EnsureIsValid.predicate(sq[0])) {\n throw new Error(`invalid predicate part in fact query detected: ${sq[0]}`);\n }\n\n if (!EnsureIsValid.subject(sq[1])) {\n throw new Error(`invalid subject part in fact query detected: ${sq[1]}`);\n }\n\n if (sq[2] && sq[2] !== '$it') {\n throw new Error(`invalid object part in fact query detected: ${sq[2]}`);\n }\n\n if (sq.length > 3) {\n throw new Error('invalid array length in query detected');\n }\n } else {\n throw new Error(`subject query needs to be array or string: ${sq}`);\n }\n });\n\n return true;\n}\n\nexport default class Fact {\n static reservedPredicates = [\n '$isATermFor',\n '$isAccountableFor',\n '$isMemberOf',\n '$isHostOf',\n '$canRead',\n '$canReferTo',\n '$canAccess',\n '$canRefine',\n ];\n\n subject: string;\n\n predicate: string;\n\n object: string;\n\n logger: IsLogger;\n\n factBox?: FactBox;\n\n static async initDB() {\n const logger = console as unknown as IsLogger;\n const pg = new PgPoolWithLog(logger);\n\n await pg.query(`\n CREATE TABLE IF NOT EXISTS facts (id SERIAL, subject CHAR(40), predicate CHAR(40), object TEXT, created_at timestamp DEFAULT NOW(), created_by CHAR(40));\n CREATE TABLE IF NOT EXISTS deleted_facts (subject CHAR(40), predicate CHAR(40), object TEXT, deleted_at timestamp DEFAULT NOW(), deleted_by CHAR(40));\n CREATE TABLE IF NOT EXISTS users (_id SERIAL, id CHAR(40), hashed_email CHAR(40), username CHAR(40));\n CREATE TABLE IF NOT EXISTS kv_attributes (id UUID, actor_id varchar(36), updated_at TIMESTAMP, created_at TIMESTAMP, value TEXT);\n CREATE TABLE IF NOT EXISTS bl_attributes (id UUID, actor_id varchar(36), updated_at TIMESTAMP, created_at TIMESTAMP, value TEXT);\n ALTER TABLE kv_attributes ADD COLUMN IF NOT EXISTS size int DEFAULT NULL;\n ALTER TABLE bl_attributes ADD COLUMN IF NOT EXISTS size int DEFAULT NULL;\n CREATE INDEX IF NOT EXISTS idx_facts_subject ON facts (subject);\n CREATE INDEX IF NOT EXISTS idx_facts_predicate ON facts (predicate);\n CREATE INDEX IF NOT EXISTS idx_facts_object ON facts (object);\n CREATE INDEX IF NOT EXISTS idx_kv_attr_id ON kv_attributes (id);\n CREATE INDEX IF NOT EXISTS idx_facts_composite ON facts(subject, predicate, object);\n ALTER TABLE facts ALTER COLUMN subject SET NOT NULL;\n ALTER TABLE facts ALTER COLUMN predicate SET NOT NULL;\n ALTER TABLE facts ALTER COLUMN object SET NOT NULL;\n CREATE SEQUENCE IF NOT EXISTS graph_id START WITH 1000;\n ALTER TABLE facts ADD COLUMN IF NOT EXISTS fact_box_id int DEFAULT 0;\n ALTER TABLE facts ADD COLUMN IF NOT EXISTS graph_id int;\n ALTER TABLE facts ADD COLUMN IF NOT EXISTS latest BOOLEAN;\n CREATE INDEX IF NOT EXISTS idx_facts_fact_box_id ON facts (fact_box_id);\n CREATE INDEX IF NOT EXISTS idx_facts_fact_graph_id ON facts (graph_id);\n CREATE INDEX IF NOT EXISTS idx_facts_latest ON facts (latest);\n\n CREATE TABLE IF NOT EXISTS users_fact_boxes (fact_box_id int, user_id int);\n CREATE INDEX IF NOT EXISTS idx_users_fact_boxes_fact_box_id ON users_fact_boxes (fact_box_id);\n CREATE INDEX IF NOT EXISTS idx_users_fact_boxes_user_id ON users_fact_boxes (user_id);\n ALTER TABLE users DROP CONSTRAINT IF EXISTS users_id_unique;\n ALTER TABLE users ADD CONSTRAINT users_id_unique UNIQUE (id);\n\n ALTER TABLE users DROP CONSTRAINT IF EXISTS users_email_unique;\n ALTER TABLE users ADD CONSTRAINT users_email_unique UNIQUE (hashed_email);\n\n CREATE TABLE IF NOT EXISTS quota_events (id SERIAL, node_id CHAR(40), total_storage_available int, created_at timestamp DEFAULT NOW(), payment_provider CHAR(40), payment_provider_payload TEXT);\n ALTER TABLE quota_events ALTER COLUMN total_storage_available TYPE BIGINT;\n ALTER TABLE quota_events ADD COLUMN IF NOT EXISTS provider_id CHAR(40);\n ALTER TABLE quota_events ADD COLUMN IF NOT EXISTS valid_from TIMESTAMP with time zone;\n UPDATE facts SET latest = (SELECT max(id) = facts.id as latest FROM facts as ifacts WHERE facts.subject=ifacts.subject AND facts.predicate=ifacts.predicate) WHERE latest IS NULL AND predicate NOT LIKE '$%';\n `);\n }\n\n public static async getUserIdByEmail(\n email: string,\n logger:\n IsLogger,\n ): Promise<string | undefined> {\n const pool = new PgPoolWithLog(logger);\n const users = await pool.query('SELECT id FROM users WHERE hashed_email = $1', [md5(email)]);\n\n if (users.rows.length === 1) {\n return users.rows[0].id.trim();\n }\n\n return undefined;\n }\n\n public static async recordUserEmail(email: string, userid: string, logger: IsLogger) {\n const pool = new PgPoolWithLog(logger);\n\n if (!(await Fact.getUserIdByEmail(email, logger))) {\n await pool.query('INSERT INTO users (id, hashed_email, username) VALUES ($1, $2, $3)', [userid, md5(email), email]);\n }\n }\n\n public static async isAuthorizedToReadQuota(\n nodeId: string,\n userid: string,\n logger: IsLogger,\n ): Promise<boolean> {\n assert(nodeId, 'nodeId needs to be provided in isAuthorizedToReadQuota');\n assert(userid, 'userid needs to be provided in isAuthorizedToReadQuota');\n\n if (nodeId === userid) {\n return true;\n }\n\n return Fact.hasAccess(\n userid,\n ['creator', 'host', 'member', 'access'],\n nodeId,\n logger,\n );\n }\n\n public static async isAuthorizedToManageQuota(\n nodeId: string,\n userid: string,\n logger: IsLogger,\n ): Promise<boolean> {\n assert(nodeId, 'nodeId needs to be provided in isAuthorizedToManageQuota');\n assert(userid, 'userid needs to be provided in isAuthorizedToManageQuota');\n\n if (nodeId === userid) {\n return true;\n }\n\n return Fact.hasAccess(\n userid,\n ['creator'],\n nodeId,\n logger,\n );\n }\n\n public static async isAuthorizedToModifyPayload(\n nodeId: string, // where nodeId is in most cases an attributeId\n userid: string,\n logger: IsLogger,\n ): Promise<boolean> {\n return Fact.hasAccess(\n userid,\n ['creator', 'host', 'member', 'access'],\n nodeId,\n logger,\n );\n }\n\n public static async isAuthorizedToReadPayload(\n nodeId: string, // where nodeId is in most cases an attributeId\n userid: string,\n logger: IsLogger,\n ): Promise<boolean> {\n const res = await Fact.hasAccess(\n userid,\n ['creator', 'host', 'member', 'access', 'reader'],\n nodeId,\n logger,\n );\n\n return res;\n }\n\n private static async withAuthNodesAndFacts(\n userid: string,\n logger: IsLogger,\n relevantPredicates: string[] = [],\n ) {\n EnsureIsValid.userId(userid);\n\n const predicateFilters = relevantPredicates\n .map((p) => p.trim())\n .map((p) => p.replace('$latest(', '').replace(/\\)$/, ''))\n .map((p) => EnsureIsValid.predicate(p))\n .map((p) => `'${p}'`);\n\n const authorizedNodes = await SQL.selectSubjectsInAnyGroup(\n userid,\n ['selfAccess', 'creator', 'host', 'member', 'access', 'reader'],\n undefined,\n logger,\n );\n\n const [allTerms, factScope] = await Promise.all([\n Fact.getAllTerms(logger),\n Fact.getFactScopeByUser(userid, logger),\n ]);\n\n return `\n WITH auth_nodes AS (${authorizedNodes}),\n auth_facts AS (\n SELECT id, subject, predicate, object, latest\n FROM facts\n WHERE predicate='$isATermFor'\n AND fact_box_id=0\n UNION\n SELECT id, subject, predicate, object, latest\n FROM facts\n WHERE facts.fact_box_id IN (${factScope.factBoxIds.map(EnsureIsValid.factBoxId).join(',')})\n ${predicateFilters.length ? `AND predicate IN (${predicateFilters.join(',')})` : ''}\n AND subject IN (SELECT node FROM auth_nodes)\n AND (object IN (SELECT node FROM auth_nodes) OR object = ANY ('{${allTerms.map(EnsureIsValid.term).join(',')}}'))\n )\n `;\n }\n\n private static async authorizedSelect(\n userid: string,\n logger: IsLogger,\n relevantPredicates: string[] = [],\n ) {\n return `\n ${await this.withAuthNodesAndFacts(userid, logger, relevantPredicates)}\n SELECT subject, predicate, object FROM auth_facts`;\n }\n\n private static getSQLToResolvePossibleTransitiveQuery(\n query: SubjectQuery,\n sqlPrefix: string,\n ): string | string[] {\n const predicatedAllowedToQueryAnyObjects = ['$isATermFor'];\n\n if (typeof query === 'string') {\n return `SELECT '${query}'`;\n }\n\n if (!query || !query.length || query.length !== 2) {\n throw new Error('resolveToSubjectIds must be string or array with two elements');\n }\n\n if (query[1] === '$anything' && query[0] && predicatedAllowedToQueryAnyObjects.includes(query[0])) {\n return `SELECT subject FROM auth_facts WHERE predicate='${EnsureIsValid.predicate(query[0])}' ${sqlPrefix ? `AND ${sqlPrefix}` : ''}`;\n }\n\n if (query[1] === '$anything') {\n throw new Error(`$anything selector is only allowed in context of the following predicates: ${predicatedAllowedToQueryAnyObjects.join(', ')}`);\n }\n\n let table = `(SELECT auth_facts.subject, auth_facts.predicate, auth_facts.object FROM auth_facts\n WHERE object = '${EnsureIsValid.object(query[1])}'\n AND predicate = '${EnsureIsValid.predicate(query[0])}') as f`;\n\n if (query[0].endsWith('*')) {\n table = `(WITH RECURSIVE rfacts AS (\n SELECT auth_facts.subject, auth_facts.predicate, auth_facts.object FROM auth_facts\n WHERE object = '${EnsureIsValid.object(query[1])}'\n AND predicate = '${EnsureIsValid.predicate(query[0])}'\n UNION ALL\n SELECT auth_facts.subject, auth_facts.predicate, auth_facts.object FROM auth_facts, rfacts\n WHERE auth_facts.object = rfacts.subject\n AND auth_facts.predicate = '${EnsureIsValid.predicate(query[0])}'\n )\n CYCLE subject\n SET cycl TO 'Y' DEFAULT 'N'\n USING path_array\n SELECT rfacts.subject, rfacts.predicate, rfacts.object\n FROM rfacts\n WHERE cycl = 'N') as f`;\n }\n\n const condition = [sqlPrefix]\n .filter((c) => c.trim())\n .join(' AND ');\n\n return `SELECT subject FROM ${table} ${condition ? `WHERE ${condition}` : ''}`;\n }\n\n private static getSQLToResolveToSubjectIdsWithModifiers(\n subjectQueries: SubjectQueries,\n ): string {\n const transitiveQueries: SubjectQuery[] = [];\n const sqlConditions: [string, string, string][] = [];\n let sqlPrefix = '';\n\n subjectQueries.forEach((query) => {\n if (!hasNotModifier(query) && !hasLatestModifier(query)) {\n transitiveQueries.push(query);\n } else if (hasNotModifier(query) && !hasLatestModifier(query)) {\n const object = query[1].match(/^\\$not\\(([a-zA-Z0-9-]+)\\)$/)![1];\n\n if (object) {\n sqlConditions.push(['subject', 'NOT IN', `(SELECT subject FROM auth_facts WHERE predicate='${EnsureIsValid.predicate(query[0])}' AND object='${EnsureIsValid.object(object)}')`]);\n }\n } else if (!hasNotModifier(query) && hasLatestModifier(query)) {\n const predicate = query[0].match(/^\\$latest\\(([a-zA-Z]+)\\)$/)![1];\n if (predicate) {\n sqlConditions.push(['subject', 'IN', `(SELECT subject FROM auth_facts WHERE predicate='${EnsureIsValid.predicate(predicate)}' AND object='${EnsureIsValid.object(query[1])}' AND latest=TRUE)`]);\n }\n } else if (hasNotModifier(query) && hasLatestModifier(query)) {\n const predicate = query[0].match(/^\\$latest\\(([a-zA-Z]+)\\)$/)![1];\n const object = query[1].match(/^\\$not\\(([a-zA-Z0-9-]+)\\)$/)![1];\n\n if (predicate && object) {\n sqlConditions.push(['subject', 'NOT IN', `(SELECT subject FROM auth_facts WHERE predicate='${EnsureIsValid.predicate(predicate)}' AND object='${EnsureIsValid.object(object)}' AND latest=TRUE)`]);\n }\n }\n });\n\n if (sqlConditions.length) {\n sqlPrefix = `${sqlConditions\n .map((x) => x.join(' '))\n .join(' AND ')\n .trim()}`;\n }\n\n return transitiveQueries\n .map((subjectQuery) => Fact.getSQLToResolvePossibleTransitiveQuery(\n subjectQuery,\n sqlPrefix,\n ))\n .join(' INTERSECT ');\n }\n\n static async refreshFactBoxPlacements(facts: Fact[], logger: IsLogger) {\n if (facts.length === 0) return;\n\n const pool = new PgPoolWithLog(logger);\n\n // Query by the fact triples to get the current fact_box_id and graph_id\n const conditions = facts\n .map((_, i) => `(subject = $${i * 3 + 1} AND predicate = $${i * 3 + 2} AND object = $${i * 3 + 3})`)\n .join(' OR ');\n const params = facts.flatMap((f) => [f.subject, f.predicate, f.object]);\n\n const result = await pool.query(\n `SELECT subject, predicate, object, fact_box_id, graph_id FROM facts WHERE ${conditions}`,\n params,\n );\n\n // Build a map of \"subject|predicate|object\" -> FactBox\n const factToFactBox = new Map<string, FactBox>();\n result.rows.forEach((row) => {\n const key = `${row.subject.trim()}|${row.predicate.trim()}|${row.object.trim()}`;\n factToFactBox.set(key, new FactBox(row.fact_box_id, row.graph_id));\n });\n\n // Update each fact with its final fact box placement from the database\n facts.forEach((fact) => {\n const key = `${fact.subject}|${fact.predicate}|${fact.object}`;\n const finalFactBox = factToFactBox.get(key);\n if (finalFactBox) {\n fact.setFactBox(finalFactBox);\n }\n });\n }\n\n static async saveAllWithoutAuthCheck(\n facts: Fact[],\n userid: string,\n isNewUserScopedGraph: boolean | undefined,\n logger: IsLogger,\n ): Promise<FactBox | undefined> {\n if (facts.length === 0) return undefined;\n\n const specialFacts = facts.filter((fact) => fact.hasSpecialCreationLogic());\n const nonSpecialFacts = facts.filter((fact) => !fact.hasSpecialCreationLogic());\n let factPlacement: FactBox | undefined;\n\n if (isNewUserScopedGraph) {\n factPlacement = {\n id: await FactBox.getInternalUserId(userid, logger),\n graphId: await FactBox.getNewGraphId(logger),\n };\n }\n\n for (let i = 0; i < specialFacts.length; i += 1) {\n // we need to create this one by one to make sure no\n // duplicates gets inserted and other checks pass.\n // eslint-disable-next-line no-await-in-loop\n await specialFacts[i]?.save(userid);\n }\n\n await this.saveAllWithoutAuthCheckAndSpecialTreatment(\n nonSpecialFacts,\n userid,\n factPlacement,\n logger,\n );\n\n if (isNewUserScopedGraph) {\n return factPlacement;\n }\n\n return undefined;\n }\n\n static async saveAllWithoutAuthCheckAndSpecialTreatment(\n facts: Fact[],\n userid: string,\n factBox: FactBox | undefined,\n logger: IsLogger,\n ) {\n if (facts.length === 0) return;\n\n const pool = new PgPoolWithLog(logger);\n\n if (factBox) {\n const values = facts\n .map((_, i) => `($${i * 6 + 1}, $${i * 6 + 2}, $${i * 6 + 3}, $${i * 6 + 4}, $${i * 6 + 5}, $${i * 6 + 6})`)\n .join(', ');\n\n const flatParams = facts.flatMap((fact) => [\n fact.subject,\n fact.predicate,\n fact.object,\n userid,\n factBox.id,\n factBox.graphId,\n ]);\n\n facts.forEach((f) => { f.setFactBox(factBox); });\n\n if (values.length) {\n await pool.query(\n `INSERT INTO facts (subject, predicate, object, created_by, fact_box_id, graph_id) VALUES ${values}`,\n flatParams,\n );\n }\n } else {\n const promises: Promise<any>[] = [];\n\n for (let index = 0; index < facts.length; index++) {\n const fact = facts[index];\n\n if (fact) {\n const factPlacement = await FactBox.getFactBoxPlacement(userid, fact, logger);\n const insertPromise = pool.query(\n 'INSERT INTO facts (subject, predicate, object, created_by, fact_box_id, graph_id) VALUES ($1, $2, $3, $4, $5, $6)',\n [\n fact.subject,\n fact.predicate,\n fact.object,\n userid,\n factPlacement.id,\n factPlacement.graphId,\n ],\n );\n\n if (factBox) {\n promises.push(insertPromise);\n } else {\n await insertPromise;\n }\n }\n }\n\n await Promise.all(promises);\n\n // Refresh fact box placements after merges may have occurred\n await Fact.refreshFactBoxPlacements(facts, logger);\n }\n\n const subPreds: [string, string][] = [];\n facts.forEach((f) => {\n subPreds.push([f.subject, f.predicate]);\n });\n\n await Fact.refreshLatestState(logger, subPreds);\n\n const querySubscriptionService = new QuerySubscriptionService(logger);\n await querySubscriptionService.onFactsAdded(facts);\n }\n\n static async findNodes(\n isSubjectAllOf: SubjectQueries,\n isObjectAllOf: SubjectQueries,\n blacklistNodes: [string, string][],\n userid: string,\n logger: IsLogger,\n ) {\n const pool = new PgPoolWithLog(logger);\n const relevantPredicates = [\n ...isSubjectAllOf.map((x) => x[0]),\n ...isObjectAllOf.map((x) => x[1]),\n ...blacklistNodes.map((x) => x[1]),\n ];\n\n const baseQuery = await Fact.withAuthNodesAndFacts(userid, logger, relevantPredicates);\n const blacklist = blacklistNodes.map(([s, p]) => (`SELECT object FROM auth_facts where subject='${EnsureIsValid.subject(s)}' AND predicate='${EnsureIsValid.predicate(p)}'`)).join(' UNION ').trim();\n const subjectSet = Fact.getSQLToResolveToSubjectIdsWithModifiers(isSubjectAllOf);\n const objectSet = isObjectAllOf.map((q) => `SELECT object FROM auth_facts WHERE subject='${EnsureIsValid.subject(q[0])}' AND predicate='${EnsureIsValid.predicate(q[1])}'`).join(' INTERSECT ').trim();\n\n const candidateSelects: string[] = [];\n\n if (subjectSet) {\n candidateSelects.push(subjectSet);\n }\n\n if (objectSet) {\n candidateSelects.push(objectSet);\n }\n\n if (!candidateSelects.length) {\n candidateSelects.push('SELECT DISTINCT node FROM auth_nodes');\n }\n\n const result = await pool.query(`\n ${baseQuery}\n SELECT DISTINCT node\n FROM (${candidateSelects.join(' INTERSECT ')}) as t(node)\n ${blacklist ? `WHERE node NOT IN (${blacklist})` : ''}\n `);\n\n return result.rows.map((row) => row.node.trim());\n }\n\n static async findAll(\n { subject, predicate, object }: FactQuery,\n userid: string,\n logger: IsLogger,\n ): Promise<Fact[]> {\n ensureValidFactQuery({ subject, predicate, object });\n\n const pool = new PgPoolWithLog(logger);\n const and = andFactory();\n\n const relevantPredicates: string[] = [];\n\n const containsUnknownPredicateQueries = !!subject?.find((sf) => sf.length !== 2)\n || !!object?.find((of) => of.length !== 2)\n || !predicate?.length;\n\n if (!containsUnknownPredicateQueries) {\n if (subject) {\n relevantPredicates.push(\n ...subject\n .filter(Array.isArray)\n .map((sf) => sf[0]),\n );\n }\n\n if (predicate) {\n relevantPredicates.push(...predicate);\n }\n\n if (object) {\n relevantPredicates.push(\n ...object\n .filter(Array.isArray)\n .map((sf) => sf[0]),\n );\n }\n }\n\n let sqlQuery = await Fact.authorizedSelect(userid, logger, relevantPredicates);\n\n if (subject) {\n const subjectFilter = Fact.getSQLToResolveToSubjectIdsWithModifiers(subject);\n const singleValueMatch = subjectFilter.match(/^SELECT '(.*?)'$/);\n\n if (singleValueMatch && singleValueMatch[1]) {\n sqlQuery += ` ${and()} subject='${EnsureIsValid.subject(singleValueMatch[1])}'`;\n } else {\n sqlQuery += ` ${and()} subject IN (${subjectFilter})`;\n }\n }\n\n if (predicate) {\n if (predicate.length === 1 && predicate[0]) {\n sqlQuery += ` ${and()} predicate='${EnsureIsValid.predicate(predicate[0])}'`;\n } else {\n sqlQuery += ` ${and()} predicate IN (${predicate.map(EnsureIsValid.predicate).map((p) => `'${p}'`).join(',')})`;\n }\n }\n\n if (object) {\n sqlQuery += ` ${and()} object IN (${Fact.getSQLToResolveToSubjectIdsWithModifiers(object)})`;\n }\n\n const result = await pool.query(sqlQuery);\n\n return result.rows.map((row) => new Fact(\n row.subject.trim(),\n row.predicate.trim(),\n row.object.trim(),\n logger,\n ));\n }\n\n constructor(subject: string, predicate: string, object: string, logger: IsLogger) {\n this.subject = subject.trim();\n this.predicate = predicate.trim();\n this.object = object.trim();\n this.logger = logger;\n\n this.ensureValidSyntax();\n }\n\n toJSON() {\n return {\n subject: this.subject,\n predicate: this.predicate,\n object: this.object,\n };\n }\n\n ensureValidSyntax() {\n if (!this.hasValidSubject()\n || !this.hasValidPredicate()\n || !this.hasValidObject()) {\n throw new Error(`Invalid Fact, it contains invalid charters: ${this.subject}, ${this.predicate}, ${this.object}`);\n }\n }\n\n hasValidSubject() {\n return typeof this.subject === 'string'\n && this.subject.match(/^[a-zA-Z0-9-]+$/)\n && this.subject.length <= 40;\n }\n\n hasValidPredicate() {\n return typeof this.predicate === 'string'\n && this.predicate.match(/^\\$?[a-zA-Z0-9-]+\\*?$/)\n && this.predicate.length <= 40;\n }\n\n hasValidObject() {\n return typeof this.object === 'string'\n && this.object.match(/^[a-zA-Z0-9-\\s]+$/)\n && this.object.length <= 500;\n }\n\n async save(userid: string): Promise<void> {\n const querySubscriptionService = new QuerySubscriptionService(this.logger);\n this.ensureValidSyntax();\n\n if (!(await this.isAuthorizedToSave(userid))) {\n throw new AuthorizationError(userid, 'fact', this, this.logger);\n }\n\n const pool = new PgPoolWithLog(this.logger);\n\n if (this.predicate === '$isATermFor') {\n const dbRows = await pool.query('SELECT subject FROM facts WHERE subject=$1 OR object=$1 OR subject=$2', [this.subject, this.object]);\n cache.invalidate('terms');\n\n if (!dbRows.rows.length) {\n if (!userid) {\n throw new Error('In order to save a $isATermFor fact a userid has to be provided as a parameter of the fact.save method.');\n }\n\n await pool.query('INSERT INTO facts (subject, predicate, object, created_by, fact_box_id, graph_id) VALUES ($1, $2, $3, $5, 0, NULL), ($5, $4, $1, NULL, 0, NULL)', [\n this.subject,\n this.predicate,\n this.object,\n '$isAccountableFor',\n userid,\n ]);\n }\n\n return;\n }\n\n const factPlacement = await FactBox.getFactBoxPlacement(userid, this, this.logger);\n\n if (!factPlacement.id) {\n throw new Error('Error creating fact box id: fact placement does not have a id');\n }\n\n if (this.predicate === '$isAccountableFor') {\n const dbRows = await pool.query('SELECT subject, predicate, object FROM facts WHERE object=$1 AND predicate=$2', [this.object, this.predicate]);\n\n if (dbRows.rows.length) {\n for (let index = 0; index < dbRows.rows.length; index++) {\n const r = dbRows.rows[index];\n const oldFact = new Fact(r.subject, r.predicate, r.object, this.logger);\n // eslint-disable-next-line no-await-in-loop\n await oldFact.deleteWithoutAuthCheck(userid);\n }\n }\n\n await pool.query('INSERT INTO facts (subject, predicate, object, created_by, fact_box_id, graph_id) VALUES ($1, $2, $3, $4, $5, $6)', [\n this.subject,\n this.predicate,\n this.object,\n userid,\n factPlacement.id,\n factPlacement.graphId,\n ]);\n } else {\n await pool.query('INSERT INTO facts (subject, predicate, object, created_by, fact_box_id, graph_id) VALUES ($1, $2, $3, $4, $5, $6)', [\n this.subject,\n this.predicate,\n this.object,\n userid,\n factPlacement.id,\n factPlacement.graphId,\n ]);\n }\n\n await Fact.refreshLatestState(this.logger, [[this.subject, this.predicate]]);\n this.setFactBox(factPlacement);\n\n await querySubscriptionService.onFactsAdded([this]);\n }\n\n async delete(userid: string) {\n if (!(await this.isAuthorizedToDelete(userid))) {\n throw new AuthorizationError(userid, 'fact', this, this.logger);\n }\n\n return this.deleteWithoutAuthCheck(userid);\n }\n\n private hasSpecialCreationLogic() {\n return this.predicate === '$isATermFor' || this.predicate === '$isAccountableFor';\n }\n\n private async deleteWithoutAuthCheck(userid: string) {\n const querySubscriptionService = new QuerySubscriptionService(this.logger);\n const pool = new PgPoolWithLog(this.logger);\n\n if (this.predicate === '$isATermFor') {\n cache.invalidate('terms');\n cache.invalidate(`isKnownTerm/${this.subject.trim()}`);\n }\n\n await AuthCache.onFactDeletion(this, this.logger);\n\n const deletedFacts = await pool.query(`WITH deleted_rows AS (\n DELETE FROM facts\n WHERE subject = $1 AND predicate = $2 AND object = $3\n RETURNING *\n ),\n inserted_rows AS (\n INSERT INTO deleted_facts (subject, predicate, object, deleted_by)\n SELECT subject, predicate, object, $4 FROM deleted_rows\n )\n SELECT * FROM deleted_rows;`, [\n this.subject,\n this.predicate,\n this.object,\n userid,\n ]);\n\n if (deletedFacts.rows[0]) {\n this.factBox = new FactBox(deletedFacts.rows[0].fact_box_id, deletedFacts.rows[0].graph_id);\n }\n\n await Fact.refreshLatestState(this.logger, [[this.subject, this.predicate]]);\n\n await querySubscriptionService.onFactsDeleted([this]);\n }\n\n static async refreshLatestState(logger: IsLogger, subPreds: [string, string][]) {\n const pool = new PgPoolWithLog(logger);\n\n const nonAuth = subPreds\n .filter(([, p]) => !p.startsWith('$'));\n\n if (!nonAuth.length) {\n return;\n }\n\n const conditions = nonAuth\n .map(([s, p]) => `(subject='${s}' AND predicate='${p}')`)\n .join(' OR ');\n\n await pool.query(`UPDATE facts\n SET latest = (SELECT max(id) = facts.id as latest FROM facts as ifacts WHERE facts.subject=ifacts.subject AND facts.predicate=ifacts.predicate)\n WHERE ${conditions}`);\n }\n\n async isAuthorizedToDelete(userid: string) {\n if (this.predicate === '$isATermFor') {\n const pool = new PgPoolWithLog(this.logger);\n\n return pool.findAny(\n 'SELECT id FROM facts where subject = $1 AND predicate = $2 AND created_by = $3',\n [this.subject, '$isATermFor', userid],\n );\n }\n\n if (this.predicate === '$isAccountableFor' && userid === this.subject) {\n return false;\n }\n\n if (!(await this.isAuthorizedToSave(userid))) {\n return false;\n }\n\n return true;\n }\n\n async isAuthorizedToSave(userid: string, args?: { attributesInCreation?: string[] }) {\n if (!userid || !userid.trim()) {\n return false;\n }\n\n if (this.object.startsWith('us-') && userid !== this.object) {\n return false;\n }\n\n if (this.subject.startsWith('us-') && !['$isAccountableFor', '$isHostOf', '$isMemberOf', '$canAccess', '$canRead', '$canRefine', '$canReferTo'].includes(this.predicate)) {\n return false;\n }\n\n if (this.predicate.startsWith('$') && !Fact.reservedPredicates.includes(this.predicate)) {\n return false;\n }\n\n if (this.predicate === '$isATermFor') {\n return true;\n }\n\n if (this.predicate === '$isAccountableFor') {\n return await this.isValidCreatedAtFact(userid)\n || await this.isValidAccountabilityTransfer(userid, args);\n }\n\n if (Object.values(rolePredicateMap).includes(this.predicate) && this.subject.trim().startsWith('us-')) {\n return this.isValidInvitation(userid, args);\n }\n\n const pool = new PgPoolWithLog(this.logger);\n\n if (this.predicate === '$isMemberOf') {\n if (await pool.findAny('SELECT id FROM facts WHERE predicate=$1 AND subject=$2 LIMIT 1', ['$isATermFor', this.subject])) {\n return false;\n }\n }\n\n const hasSubjectAccess = args?.attributesInCreation?.includes(this.subject)\n || await Fact.hasAccess(userid, ['creator', 'host', 'member', 'conceptor'], this.subject, this.logger);\n const hasObjectAccess = args?.attributesInCreation?.includes(this.object)\n || await Fact.isKnownTerm(this.object, this.logger)\n || await Fact.hasAccess(userid, ['creator', 'host', 'member', 'access', 'referer', 'selfAccess'], this.object, this.logger);\n\n return hasSubjectAccess && hasObjectAccess;\n }\n\n setFactBox(fb: FactBox) {\n this.factBox = fb;\n }\n\n static async getFactScopeByUser(\n userId: string,\n logger: IsLogger,\n ): Promise<{ internalUserId: number, factBoxIds: number[] }> {\n const pool = new PgPoolWithLog(logger);\n const internalUserId = await FactBox.getInternalUserId(userId, logger);\n\n const hit = cache.get(`factScopeByUser/${internalUserId}`);\n\n if (hit) {\n return hit;\n }\n\n const factBoxIdsResult = await pool.query('SELECT DISTINCT fact_box_id FROM users_fact_boxes WHERE user_id=$1', [internalUserId]);\n const factBoxIds = factBoxIdsResult.rows.map((r) => r.fact_box_id);\n const uniqueBoxIdsSet: Set<number> = new Set(factBoxIds);\n\n const result = {\n internalUserId,\n factBoxIds: [\n 0, internalUserId, ...uniqueBoxIdsSet,\n ],\n };\n\n cache.set(`factScopeByUser/${internalUserId}`, result);\n\n return result;\n }\n\n static async isNewUserScopedGraph(\n facts: Fact[],\n newAttributeIds: string[],\n userId: string,\n logger: IsLogger,\n ): Promise<boolean> {\n const allTerms = await Fact.getAllTerms(logger);\n\n const connectingFact = facts.find((fact) => {\n const sub = fact.subject;\n const obj = fact.object;\n\n if (newAttributeIds.includes(sub) && newAttributeIds.includes(obj)) {\n // subject and object are attribute ids which did not exists before.\n // So, we can say this fact does not connect the new graph to an existing graph.\n return false;\n }\n\n if (newAttributeIds.includes(sub) && allTerms.includes(obj)) {\n // the fact is classifying a new attribute, this does not count as connecting two graphs\n return false;\n }\n\n if (newAttributeIds.includes(sub) && obj === userId) {\n // The subject is a new attribute and the object is the users who created it\n // -> Does not count as connecting the graph to an existing graph\n return false;\n }\n\n return true;\n });\n\n return !connectingFact;\n }\n\n static async moveAllAccountabilityFactsToFactBox(\n attributeIds: string[],\n factBox: FactBox,\n logger: IsLogger,\n ) {\n const pool = new PgPoolWithLog(logger);\n const attributeString = attributeIds.map((id) => `'${EnsureIsValid.nodeId(id)}'`).join(',');\n\n await pool.query(`UPDATE facts SET fact_box_id=$1, graph_id=$2 WHERE predicate='$isAccountableFor' AND object IN (${attributeString})`, [\n factBox.id,\n factBox.graphId,\n ]);\n }\n\n static areKnownSubjects(nodeIds: string[], logger: IsLogger): Promise<boolean> {\n const pool = new PgPoolWithLog(logger);\n const idCheckCondition = nodeIds.map((a, i) => `subject=$${i + 1}`).join(' OR ');\n\n return pool.findAny(`SELECT id FROM facts WHERE ${idCheckCondition}`, nodeIds);\n }\n\n private async isValidInvitation(userid: string, args?: { attributesInCreation?: string[] }) {\n if (args?.attributesInCreation?.includes(this.object)) {\n return true;\n }\n\n const pool = new PgPoolWithLog(this.logger);\n\n const hasObjectAccessPromise = Fact.hasAccess(userid, ['creator', 'host'], this.object, this.logger);\n\n const subjectIsKnownUserPromise = pool.findAny(`\n SELECT id\n FROM users\n WHERE id=$1\n `, [this.subject]);\n\n return await hasObjectAccessPromise && await subjectIsKnownUserPromise;\n }\n\n static async hasAccess(\n userid: string,\n roles: Role[],\n attributeId: string,\n logger: IsLogger,\n ): Promise<boolean> {\n const pool = new PgPoolWithLog(logger);\n\n if (roles.sort().join(':') === 'access:creator:host:member:reader') {\n if (await AuthCache.hasCachedAccess(userid, ['reader'], attributeId, logger)) {\n return true;\n }\n }\n\n if (await AuthCache.hasCachedAccess(userid, roles, attributeId, logger)) {\n return true;\n }\n\n const result = await pool.findAny(SQL.getSQLToCheckAccess(\n userid,\n roles,\n attributeId,\n logger,\n ));\n\n if (result) {\n await AuthCache.cache(userid, roles, attributeId, logger);\n }\n\n return result;\n }\n\n private async isValidCreatedAtFact(userid: string) {\n if (this.subject !== userid) {\n return false;\n }\n\n const pool = new PgPoolWithLog(this.logger);\n return !(await pool.findAny('SELECT subject FROM facts WHERE object=$1 AND predicate=$2', [this.object, this.predicate]));\n }\n\n private async isValidAccountabilityTransfer(userid: string, args?: {\n attributesInCreation?: string[],\n }) {\n if (this.predicate !== '$isAccountableFor') {\n return false;\n }\n\n if (this.subject === this.object) {\n return false;\n }\n\n const pool = new PgPoolWithLog(this.logger);\n\n if (!args?.attributesInCreation?.includes(this.object) && !(await pool.findAny('SELECT subject FROM facts WHERE subject=$1 AND predicate=$2 AND object=$3', [\n userid,\n this.predicate,\n this.object,\n ]))) {\n return false;\n }\n\n if (await Fact.isKnownTerm(this.subject, this.logger)) {\n return false;\n }\n\n const hasSubjectAccess = args?.attributesInCreation?.includes(this.subject) || await Fact.hasAccess(userid, ['creator', 'selfAccess', 'member', 'access', 'conceptor'], this.subject, this.logger);\n const hasObjectAccess = args?.attributesInCreation?.includes(this.object) || await Fact.hasAccess(userid, ['creator'], this.object, this.logger);\n\n return hasSubjectAccess && hasObjectAccess;\n }\n\n static async isKnownTerm(node: string, logger: IsLogger): Promise<boolean> {\n const trimmedNode = node.trim();\n const hit = cache.get(`isKnownTerm/${trimmedNode}`);\n\n if (hit) {\n return hit;\n }\n\n const pool = new PgPoolWithLog(logger);\n\n const result = await pool.findAny(\"SELECT subject FROM facts WHERE subject=$1 AND predicate='$isATermFor'\", [trimmedNode]);\n\n if (result) {\n cache.set(`isKnownTerm/${trimmedNode}`, result);\n }\n\n return result;\n }\n\n private static async getAllTerms(logger) {\n const hit = cache.get('terms');\n\n if (hit) {\n return hit;\n }\n\n const pool = new PgPoolWithLog(logger);\n\n const rawResult = await pool.query(\"SELECT subject FROM facts WHERE predicate='$isATermFor'\");\n const result = rawResult.rows.map((r) => r.subject.trim());\n\n if (result) {\n cache.set('terms', result);\n }\n\n return result;\n }\n}\n","/* eslint-disable import/no-cycle */\nimport type Fact from '.';\nimport IsLogger from '../../../lib/is_logger';\nimport { getSubscribedQueries, notifyQueryResultMightHaveChanged } from '../../server/service_bus_mount';\nimport { CompoundAttributeQuery, isValidCompoundAttributeQuery } from '../../attributes/attribute_query';\nimport FactBox from './fact_box';\n\nexport default class QuerySubscriptionService {\n logger: IsLogger;\n\n constructor(logger: IsLogger) {\n this.logger = logger;\n }\n\n async onFactsDeleted(\n facts: Fact[],\n ): Promise<void> {\n try {\n await this.notifyFactChanged(facts);\n } catch (ex: any) {\n this.logger.warn(`Failed to notify query subscribers on fact deleted: ${ex?.message}`);\n }\n }\n\n async onFactsAdded(\n facts: Fact[],\n ): Promise<void> {\n try {\n await this.notifyFactChanged(facts);\n } catch (ex: any) {\n this.logger.warn(`Failed to notify query subscribers on fact added: ${ex?.message}`);\n }\n }\n\n private async notifyFactChanged(\n facts: Fact[],\n ): Promise<void> {\n const allSubscribedQueries = await getSubscribedQueries(this.logger);\n\n await Promise.all(allSubscribedQueries.map(async ({ userIds, query }) => {\n const affectedUsers = await Promise.all(\n userIds.map(async (userId) => ({\n userId,\n affected: await this.factsChangeMightAffectQuery(facts, query, userId),\n })),\n );\n\n affectedUsers\n .filter(({ affected }) => affected)\n .forEach(({ userId }) => notifyQueryResultMightHaveChanged(query, userId));\n }));\n }\n\n private async factsChangeMightAffectQuery(\n facts: Fact[],\n query: CompoundAttributeQuery,\n userId: string,\n ): Promise<boolean> {\n // eslint-disable-next-line no-restricted-syntax\n for (const fact of facts) {\n // eslint-disable-next-line no-await-in-loop\n if (await this.factChangeMightAffectQuery(fact, query, userId)) {\n return true;\n }\n }\n\n return false;\n }\n\n private async factChangeMightAffectQuery(\n fact: Fact,\n query: CompoundAttributeQuery,\n userid: string, // does the query result change for this user\n ): Promise<boolean> {\n this.logger.debug(`check if fact (${fact.subject}, ${fact.predicate}, ${fact.object}) change might affect query: ${JSON.stringify(query)}`);\n\n if (!isValidCompoundAttributeQuery(query)) {\n throw new Error(`invalid query: ${JSON.stringify(query)}`);\n }\n\n if (fact.predicate === '$isATermFor') {\n // When we query for a term which is not defined yet,\n // this query will not be updated once the term is defined.\n // This should be an edge case, we accept this for now.\n return false;\n }\n\n if (!fact.factBox) {\n this.logger.warn(`unexpected factBox miss for ${fact.subject}, ${fact.predicate}, ${fact.object}. Will not notify subscribers of possible query change!`);\n return false;\n }\n\n if (fact.predicate.startsWith('$')) {\n // We can not simply check for predicates here because this might give\n // a user access to whole bunch of different data\n\n return FactBox.isUserAssociatedToFactBox(fact.factBox.id, userid, this.logger);\n }\n\n if (!QuerySubscriptionService.hasPredicate(query, fact.predicate)) {\n return false;\n }\n\n if (!(await FactBox.isUserAssociatedToFactBox(fact.factBox.id, userid, this.logger))) {\n return false;\n }\n\n return true;\n }\n\n private static hasPredicate(query: CompoundAttributeQuery, predicate: string) {\n const predicates = QuerySubscriptionService.extractAllPredicatesFromQuery(query);\n return predicates.has(predicate);\n }\n\n private static extractAllPredicatesFromQuery(query: CompoundAttributeQuery): Set<string> {\n const predicates = new Set<string>();\n\n // Process each query in the compound query\n Object.values(query).forEach((singleQuery) => {\n if (typeof singleQuery === 'string') {\n // Direct ID query - doesn't need indexing by predicate\n return;\n }\n\n if (Array.isArray(singleQuery)) {\n singleQuery.forEach((queryRecord) => {\n const predicate = queryRecord.length === 2\n ? queryRecord[0]\n : queryRecord[1];\n\n if (typeof predicate === 'string') {\n const modifierMatch = predicate.match(/.*\\((.*?)\\)/);\n\n if (modifierMatch && modifierMatch[1]) {\n predicates.add(modifierMatch[1]);\n } else {\n predicates.add(predicate);\n }\n }\n });\n }\n });\n\n return predicates;\n }\n}\n","import { createClient } from 'redis';\n\nconst cache: Map<any, any> = new Map();\n\nconst redisConnectionsPromise = {};\n\nfunction getRedisConnectionPromise(connectionName) {\n if (!process.env['REDIS_HOST']) {\n return Promise.resolve(undefined);\n }\n\n if (redisConnectionsPromise[connectionName]) {\n return redisConnectionsPromise[connectionName];\n }\n\n const redisClient = createClient({\n username: process.env['REDIS_USERNAME'],\n password: process.env['REDIS_PASSWORD'],\n socket: {\n host: process.env['REDIS_HOST'],\n port: 6379,\n },\n });\n\n redisConnectionsPromise[connectionName] = redisClient.connect();\n return redisConnectionsPromise[connectionName];\n}\n\ngetRedisConnectionPromise('sub').then((redisClient) => {\n if (redisClient) {\n redisClient.subscribe('invalidate_local_cache_entry', (message) => {\n cache.delete(message);\n });\n }\n});\n\nexport default {\n get: (key: string) => cache.get(key),\n set: (key: string, value: any) => cache.set(key, value),\n invalidate: (key: string) => {\n cache.delete(key);\n getRedisConnectionPromise('pub').then((redisClient) => {\n if (redisClient) {\n redisClient.publish('invalidate_local_cache_entry', key);\n }\n });\n },\n};\n","/* eslint-disable no-await-in-loop */\n/* eslint-disable no-plusplus */\n// eslint-disable-next-line max-classes-per-file\nimport { uuidv7 as uuid } from 'uuidv7';\nimport SerializedChangeWithMetadata from '../../attributes/abstract/serialized_change_with_metadata';\nimport QueryExecutor, { AttributeQuery, ResolveToAttributesResult } from '../../attributes/attribute_query';\nimport Fact from '../../facts/server';\nimport PgPoolWithLog from '../../../lib/pg-log';\nimport Quota from '../quota';\nimport AuthCache from '../../facts/server/auth_cache';\nimport IsLogger from '../../../lib/is_logger';\nimport AbstractAttributeServer from '../../attributes/abstract/abstract_attribute_server';\n\nconst attributePrefixMap = {\n KeyValueAttribute: 'kv',\n LongTextAttribute: 'l',\n BlobAttribute: 'bl',\n};\n\nclass UnauthorizedFactsError extends Error {\n public facts: Fact[];\n\n constructor(facts: Fact[]) {\n super();\n this.facts = facts;\n }\n}\n\nexport default class Controller {\n static async index(req, res) {\n const { clientId, actorId } = req;\n const query: AttributeQuery = JSON.parse(req.query.query);\n const queryExecutor = new QueryExecutor(req.log);\n const result: ResolveToAttributesResult = await queryExecutor.resolveToAttributes(\n query,\n clientId,\n actorId,\n );\n\n await AuthCache.cacheQueryResult(actorId, result, req.log);\n\n await Promise.all(\n Controller.resolveToAttributesResultToFlatArray(result).map(async (record) => {\n // eslint-disable-next-line no-param-reassign\n record.readToken = await AbstractAttributeServer.getReadToken(record, actorId);\n }),\n );\n\n res.send(result);\n }\n\n static async getMembers(req, res) {\n if (!req.attribute) {\n throw new Error('Attribute is not initialized');\n }\n\n const pool = new PgPoolWithLog(req.log);\n\n const hasAccess = await Fact.hasAccess(req.hashedUserID, ['creator', 'host'], req.attribute.id, req.log);\n\n if (!hasAccess) {\n res.send({\n notVisibleToUser: true,\n });\n return;\n }\n\n const users = await pool.query(`SELECT id, username FROM users WHERE id IN\n (SELECT subject\n FROM facts\n WHERE subject LIKE 'us-%'\n AND predicate IN ('$isMemberOf', '$isHostOf', '$isAccountableFor')\n AND object=$1)`, [req.attribute.id]);\n\n res.send(\n users.rows.map((row) => ({\n id: row.id.trim(),\n username: row.username.trim(),\n })),\n );\n }\n\n static async createComposition(req, res) {\n try {\n const result = await Controller.createCompositionWithoutRequestObject(\n req.body,\n req.clientId,\n req.actorId,\n req.hashedUserID,\n req.log,\n );\n\n await Promise.all(\n Controller.resolveToAttributesResultToFlatArray(result).map(async (record) => {\n // eslint-disable-next-line no-param-reassign\n record.readToken = await AbstractAttributeServer.getReadToken(record, req.actorId);\n }),\n );\n\n res.send(result);\n } catch (err) {\n if (err instanceof UnauthorizedFactsError) {\n req.log.info(`Attribute was not saved because the request contained unauthorized facts: ${JSON.stringify(err.facts)}`);\n\n res.status(403);\n res.send({ unauthorizedFacts: err.facts });\n } else {\n throw err;\n }\n }\n }\n\n static async create(req, res) {\n const attributesInCreation = req.attribute.id;\n const rawFacts = req.body.facts || [];\n const facts = rawFacts\n .filter((rawFact) => rawFact.length === 2 || (rawFact.length === 3 && rawFact[2] === '$it') || (rawFact.length === 3 && rawFact[0] === '$it'))\n .map((rawFact) => {\n if (rawFact.length === 2) {\n return new Fact(\n attributesInCreation,\n rawFact[0],\n rawFact[1],\n req.log,\n );\n }\n\n if (rawFact.length === 3 && rawFact[0] === '$it') {\n return new Fact(\n attributesInCreation,\n rawFact[1],\n rawFact[2],\n req.log,\n );\n }\n\n return new Fact(\n rawFact[0],\n rawFact[1],\n attributesInCreation,\n req.log,\n );\n });\n\n const unauthorizedFacts: Fact[] = [];\n\n for (let index = 0; index < facts.length; index++) {\n const fact = facts[index];\n if (!(await fact.isAuthorizedToSave(req.hashedUserID, { attributesInCreation }))) {\n unauthorizedFacts.push(fact);\n }\n }\n\n if (unauthorizedFacts.length) {\n req.log.info(`Attribute was not saved because the request contained unauthorized facts: ${JSON.stringify(unauthorizedFacts)}`);\n\n res.status(403);\n res.send({ unauthorizedFacts });\n return;\n }\n\n await Quota.ensureStorageSpaceToSave(\n req.actorId,\n [[req.attribute, req.body.value]],\n req.log,\n facts,\n );\n\n await req.attribute.create(req.body.value);\n const result = {\n ...await req.attribute.get(),\n id: req.attribute.id,\n };\n\n await Fact.saveAllWithoutAuthCheck(facts, req.hashedUserID, undefined, req.log);\n\n if (result instanceof Error) {\n req.log.error(`error in POST /attributes/${req.params.attributeId}`, result.message);\n res.status(404).send({ error: result.message });\n } else {\n res.send(result);\n }\n }\n\n static async get(req, res) {\n let result = await req.attribute.get();\n const mimetype = result?.value?.type;\n const isBlob = result.value instanceof Blob;\n\n if (result instanceof Error) {\n req.log.error(`error in GET /attributes/${req.params.attributeId}`, result.message);\n res.status(404).send({ error: result.message });\n return;\n }\n\n if (typeof result?.value?.arrayBuffer === 'function') {\n result.value = Buffer.from(await result.value.arrayBuffer());\n }\n\n if (req.query.valueOnly === 'true') {\n if (mimetype) {\n res.set('Content-Type', mimetype);\n }\n\n result = result.value;\n }\n\n if (isBlob) {\n result.value = `data:${mimetype};base64,${(result.value || result).toString('base64')}`;\n }\n\n res.send(result);\n }\n\n static async update(req, res) {\n const parsedChange: SerializedChangeWithMetadata<any> = req.body;\n const committedChange: SerializedChangeWithMetadata<any> = await req.attribute.change(\n parsedChange,\n );\n\n res.sendClientServerMessage(req.params.attributeId, committedChange);\n res.status(200);\n res.send();\n }\n\n private static resolveToAttributesResultToFlatArray(\n result: ResolveToAttributesResult | Record<string, { id: string; }>,\n ): any[] {\n if (!result) {\n return [];\n }\n\n if (Array.isArray(result)) {\n return result;\n }\n\n if (result.id) {\n return [result];\n }\n\n return Object.values(result).flatMap((r) => Controller.resolveToAttributesResultToFlatArray(r));\n }\n\n private static async createCompositionWithoutRequestObject(\n composition,\n clientId: string,\n actorId: string,\n hashedUserID: string,\n log: IsLogger,\n ): Promise<Record<string, { id: string }>> {\n const nameIdMap = Controller.getNamedAttributesToIdDictionaryAndAnnotateComposition(\n composition,\n clientId,\n actorId,\n log,\n );\n\n const resolvedFacts = Controller.resolvePlaceholdersInFactComposition(\n composition,\n actorId,\n log,\n nameIdMap,\n );\n\n const unauthorizedFacts = await Controller.findUnauthorizedFacts(\n resolvedFacts,\n hashedUserID,\n nameIdMap,\n );\n\n if (unauthorizedFacts.length) {\n throw new UnauthorizedFactsError(unauthorizedFacts);\n }\n\n const attributesByAttributeClass = Controller.groupCompositionByAttributeClass(\n composition,\n );\n\n await Quota.ensureStorageSpaceToSave(\n actorId,\n Array.from(attributesByAttributeClass.values()).flat(),\n log,\n resolvedFacts,\n );\n\n const isNewUserScopedGraph = await Fact.isNewUserScopedGraph(\n resolvedFacts,\n Object.values(nameIdMap),\n hashedUserID,\n log,\n );\n\n const attributesToSaveEntries = Array.from(attributesByAttributeClass.entries());\n const attributeSavePromises = attributesToSaveEntries\n .map(([AC, attributesAndValues]) => AC.createAll(attributesAndValues));\n const savedAttributeIds = await Promise.all(attributeSavePromises).then((r) => r.flat());\n\n // TODO: This is slow\n const factBox = await Fact.saveAllWithoutAuthCheck(\n resolvedFacts,\n hashedUserID,\n isNewUserScopedGraph,\n log,\n );\n\n if (factBox) {\n await Fact.moveAllAccountabilityFactsToFactBox(savedAttributeIds, factBox, log);\n }\n\n return Controller.getCompositionResult(composition, nameIdMap);\n }\n\n // This has a side effect: It annotates the map with the composition parameter - which is\n // passed by reference - with the actual attribute obj.\n private static getNamedAttributesToIdDictionaryAndAnnotateComposition(\n composition,\n clientId: string,\n actorId: string,\n logger: IsLogger,\n ): Record<string, string> {\n const nameIdMap: Record<string, string> = {};\n\n Object.entries(composition).forEach(([attributeName, config]: [string, any]) => {\n const attributePrefix = attributePrefixMap[config.type] || 'kv';\n const attributeId = `${attributePrefix}-${uuid()}`;\n const AttributeClass = QueryExecutor.getAttributeClassByAttributeId(attributeId);\n\n if (!AttributeClass) {\n throw new Error(`could not find Attribute class for attribute id: ${attributeId}`);\n }\n\n const attribute = new AttributeClass(\n attributeId,\n clientId,\n actorId,\n logger,\n );\n\n // eslint-disable-next-line no-param-reassign\n composition[attributeName].attribute = attribute;\n nameIdMap[attributeName] = attributeId;\n });\n\n return nameIdMap;\n }\n\n private static resolvePlaceholdersInFactComposition(\n composition,\n actorId: string,\n logger: IsLogger,\n nameIdMap: Record<string, string>,\n ): Fact[] {\n const resolvedFacts: Fact[] = [];\n\n const getIdByReferenceName = (node?: string | undefined, rawFact?): string => {\n if (!node) {\n throw new Error(`invalid composition creation request: ${rawFact}`);\n }\n\n const match = node.match(/^{{(.+)}}$/);\n\n if (!match) {\n return node;\n }\n\n const id = nameIdMap[match[1]!];\n\n if (!id) {\n throw new Error(`attribute reference \"${match[0]}\" is not an attribute created within this request. Available names are: ${Object.keys(nameIdMap)}`);\n }\n\n return id;\n };\n\n Object.entries(composition).forEach(([attributeName, config]: [string, any]) => {\n const facts = (config.facts || [])\n .filter((rawFact) => rawFact[1] !== '$isAccountableFor' || rawFact[0] !== actorId)\n .filter((rawFact) => rawFact.length === 2 || (rawFact.length === 3 && rawFact[2] === '$it') || (rawFact.length === 3 && rawFact[0] === '$it'))\n .map((rawFact) => {\n if (rawFact.length === 2) {\n return new Fact(\n nameIdMap[attributeName]!,\n rawFact[0],\n getIdByReferenceName(rawFact[1], rawFact),\n logger,\n );\n }\n\n if (rawFact.length === 3 && rawFact[0] === '$it' && rawFact[2] === '$it' && rawFact[1] === '$isHostOf') {\n return new Fact(\n nameIdMap[attributeName]!,\n rawFact[1],\n nameIdMap[attributeName]!,\n logger,\n );\n }\n\n if (rawFact.length === 3 && rawFact[0] === '$it') {\n return new Fact(\n nameIdMap[attributeName]!,\n rawFact[1],\n getIdByReferenceName(rawFact[2], rawFact),\n logger,\n );\n }\n\n return new Fact(\n getIdByReferenceName(rawFact[0], rawFact),\n rawFact[1],\n nameIdMap[attributeName]!,\n logger,\n );\n });\n\n resolvedFacts.push(...facts);\n });\n\n return resolvedFacts;\n }\n\n private static async findUnauthorizedFacts(\n facts: Fact[],\n hashedUserID: string,\n nameIdMap: Record<string, string>,\n ): Promise<Fact[]> {\n const unauthorizedFacts: Fact[] = [];\n\n for (let index = 0; index < facts.length; index++) {\n const fact = facts[index];\n const authCheckArgs = { attributesInCreation: Object.values(nameIdMap) };\n\n if (!(await fact!.isAuthorizedToSave(hashedUserID, authCheckArgs))) {\n unauthorizedFacts.push(fact!);\n }\n }\n\n return unauthorizedFacts;\n }\n\n private static groupCompositionByAttributeClass(composition) {\n type AttrClass = typeof AbstractAttributeServer<any, any>;\n type A2CMapValue = [AbstractAttributeServer<any, any>, any][];\n const attributesByAttributeClass = new Map<AttrClass, A2CMapValue>();\n\n Object.entries(composition).forEach(([attributeName, config]: [string, any]) => {\n if (!config.value) {\n throw new Error(`invalid composition creation request: a value was not provided for ${attributeName}`);\n }\n\n if (composition[attributeName].attribute) {\n const AC = QueryExecutor\n .getAttributeClassByAttributeId(composition[attributeName].attribute.id);\n\n if (!AC) {\n throw new Error(`could not find Attribute class for attribute id: ${composition[attributeName].attribute.id}`);\n }\n\n if (!attributesByAttributeClass.get(AC)) {\n attributesByAttributeClass.set(AC, []);\n }\n\n let classArray = attributesByAttributeClass.get(AC);\n\n if (!classArray) {\n classArray = [];\n attributesByAttributeClass.set(AC, classArray);\n }\n\n classArray.push([composition[attributeName].attribute, config.value]);\n }\n });\n\n return attributesByAttributeClass;\n }\n\n private static async getCompositionResult(\n composition,\n nameIdMap: Record<string, string>,\n ): Promise<Record<string, { id: string }>> {\n const result: Record<string, { id: string }> = {};\n\n const fp = Object.entries(composition).map(([attributeName, config]: [string, any]) => config\n .attribute.get().then((attrData) => {\n result[attributeName] = {\n ...attrData,\n id: nameIdMap[attributeName],\n };\n }));\n\n await Promise.all(fp);\n\n return result;\n }\n}\n","/* eslint-disable no-await-in-loop */\nimport Fact from '../../facts/server';\n\nexport default {\n async index(req, res) {\n const subject = req.query.subject ? JSON.parse(req.query.subject) : undefined;\n const predicate = req.query.predicate ? JSON.parse(req.query.predicate) : undefined;\n const object = req.query.object ? JSON.parse(req.query.object) : undefined;\n\n const facts = await Fact.findAll({\n subject,\n predicate,\n object,\n }, req.hashedUserID, req.log);\n\n res.status(200);\n res.send(facts);\n },\n\n async create(req, res) {\n const facts = req.body.map((rawFact) => new Fact(\n rawFact[0],\n rawFact[1],\n rawFact[2],\n req.log,\n ));\n\n const authorizedChecks = await Promise.all(\n facts.map((fact) => fact.isAuthorizedToSave(req.hashedUserID)),\n );\n\n const containsUnauthorizedFacts = authorizedChecks.some((x) => !x);\n\n if (containsUnauthorizedFacts) {\n res.status(403);\n res.send({});\n } else {\n await Fact.saveAllWithoutAuthCheck(facts, req.hashedUserID, undefined, req.log);\n\n res.status(200);\n res.send(facts);\n }\n },\n\n async delete(req, res) {\n const facts = req.body.map((rawFact) => new Fact(\n rawFact[0],\n rawFact[1],\n rawFact[2],\n req.log,\n ));\n\n const authorizedChecks = await Promise.all(\n facts.map((fact) => fact.isAuthorizedToSave(req.hashedUserID)),\n );\n\n const containsUnauthorizedFacts = authorizedChecks.some((x) => !x);\n\n if (containsUnauthorizedFacts) {\n res.status(403);\n res.send({});\n } else {\n for (let i = 0; i < facts.length; i += 1) {\n await facts[i].delete(req.hashedUserID);\n }\n\n res.status(200);\n res.send({ status: 'ok' });\n }\n },\n};\n","export default {\n async discovery(_req, res) {\n const authority = process.env['AUTH_ISSUER_BASE_URL'];\n\n if (!authority || typeof authority !== 'string' || !authority.trim()) {\n return res.status(500).send({ error: 'AUTH_ISSUER_BASE_URL is not configured' });\n }\n\n // Return without trailing slash for consistency\n const normalized = authority.replace(/\\/$/, '');\n\n const result: Record<string, string> = {\n authority: normalized,\n };\n\n if (process.env['AUTH_CLIENT_ID']) {\n result['client_id'] = process.env['AUTH_CLIENT_ID'];\n }\n\n return res.status(200).send(result);\n },\n};\n","import Fact from '../../facts/server';\nimport Quota from '../quota';\n\nexport default {\n async get(req, res) {\n if (!req.params.nodeId) {\n throw new Error('no nodeId given to retrieve quota');\n }\n\n if (!await Fact.isAuthorizedToReadQuota(\n req.params.nodeId,\n req.hashedUserID,\n req.log,\n )) {\n res.send({});\n return;\n }\n\n const quota = new Quota(req.params.nodeId, req.log);\n\n const asAccountee = await Fact.isAuthorizedToManageQuota(\n req.params.nodeId,\n req.hashedUserID,\n req.log,\n );\n\n res.send(await quota.toJSON(asAccountee));\n },\n};\n","import md5 from 'md5';\n\nexport const hashUserId = (id) => `us-${md5(id)}`;\nexport const uid = (req) => req?.oidc?.user?.sub && hashUserId(req.oidc.user.sub);\n\nexport default {\n async userinfo(req, res) {\n await req.whenAuthenticated(async () => {\n if (req.query?.email) {\n const user = await req.Fact.getUserIdByEmail(req.query.email, req.log);\n\n if (user) {\n res.status(200).send({ id: user });\n } else {\n res.status(200).send({ id: undefined });\n }\n } else {\n res.status(200).send({\n userId: uid(req),\n userPicture: req?.oidc?.user?.picture,\n userEmail: req?.oidc?.user?.email,\n });\n }\n });\n },\n};\n","import https from 'https';\nimport http from 'http';\nimport createServer from './routes';\n\nconst port = process.env['PORT'] || 6543;\n\nif (process.env['HTTPS'] === 'true') {\n if (!process.env['SSL_KEY'] || !process.env['SSL_CRT']) {\n throw Error('You must provide a valid value for SSL_KEY and SSL_CRT if HTTPS is set to true');\n }\n\n createServer({\n transportDriver: https,\n key: process.env['SSL_KEY'].replace(/\\\\n/g, '\\n').replace(/^\\$/, ''),\n cert: process.env['SSL_CRT'].replace(/\\\\n/g, '\\n').replace(/^\\$/, ''),\n }).then((server) => {\n server.listen(port);\n console.log(`LinkedRecords is running on port ${port} (https)`);\n });\n} else {\n createServer({\n transportDriver: http,\n }).then((server) => {\n server.listen(port);\n console.log(`LinkedRecords is running on port ${port} (http)`);\n });\n}\n","/* eslint-disable import/no-cycle */\nimport md5 from 'md5';\nimport { uuidv7 as uuid } from 'uuidv7';\nimport * as he from 'he';\nimport QueryExecutor from '../../attributes/attribute_query';\nimport AbstractAttributeServer from '../../attributes/abstract/abstract_attribute_server';\nimport IsLogger from '../../../lib/is_logger';\n\nfunction getAttributeIdByRequest(req) {\n let urlMatch = req.originalUrl.match(/\\/attributes\\/(.*?)[?&/^]/);\n\n if (urlMatch && urlMatch[1]) {\n return urlMatch[1];\n }\n\n urlMatch = req.originalUrl.match(/\\/attributes\\/(.*)/);\n\n if (urlMatch && urlMatch[1]) {\n return urlMatch[1];\n }\n\n if (req.originalUrl.match(/\\/attributes/)\n && typeof req.query?.dtp === 'string'\n && req.query.dtp.length >= 1\n ) {\n return `${req.query?.dtp}-${uuid()}`;\n }\n\n return req.query?.attributeId || req.params.attributeId;\n}\n\nfunction getAttributeByParams(\n req,\n AttributeClass,\n): AbstractAttributeServer<any, any> {\n const id = getAttributeIdByRequest(req);\n\n if (!AttributeClass) {\n throw new Error(`Server is not aware of Attribute Type Prefix for id ${id}`);\n }\n\n if (!req.actorId || req.actorId === 'undefined') {\n throw new Error(`The request does not contain a actorId for attribute id: ${id}`);\n }\n\n if (!req.clientId || req.clientId === 'undefined') {\n throw new Error(`The request does not contain a clientId for attribute id: ${id}`);\n }\n\n return new AttributeClass(id, req.clientId, req.actorId, req.log);\n}\n\nexport function getAttributeByMessage(\n attributeId,\n message,\n logger: IsLogger,\n): AbstractAttributeServer<any, any> {\n const AttributeClass = QueryExecutor.getAttributeClassByAttributeId(attributeId);\n\n if (!AttributeClass) {\n throw new Error(`Server is not aware of Attribute Type Prefix for id ${attributeId}`);\n }\n\n if (!message.actorId || message.actorId === 'undefined') {\n throw new Error(`The request does not contain a actorId for attribute id: ${attributeId}`);\n }\n\n if (!message.clientId || message.clientId === 'undefined') {\n throw new Error(`The request does not contain a clientId for attribute id: ${attributeId}`);\n }\n\n return new AttributeClass(\n attributeId,\n message.clientId,\n message.actorId,\n logger,\n );\n}\n\nexport default function attributeMiddleware() {\n return (req, res, next) => {\n const id = getAttributeIdByRequest(req);\n\n req.clientId = req.query?.clientId || req.body?.clientId;\n req.actorId = req?.oidc?.user?.sub;\n\n if (!req.actorId || !req.actorId.trim()) {\n res.sendStatus(401);\n } else {\n try {\n req.actorId = `us-${md5(req.actorId)}`;\n\n if (id) {\n req.attributeClass = QueryExecutor.getAttributeClassByAttributeId(id);\n req.attribute = getAttributeByParams(req, req.attributeClass);\n }\n\n next();\n } catch (ex: any) {\n if (ex?.message?.startsWith('Server is not aware of Attribute Type Prefix for id')) {\n res.status(404).send(he.encode(ex.message));\n } else {\n req.log.error(ex);\n res.sendStatus(500);\n }\n }\n }\n };\n}\n","/* eslint-disable @typescript-eslint/naming-convention */\n/* eslint-disable @typescript-eslint/dot-notation */\nimport { decodeJwt } from 'jose';\nimport * as EmailValidator from 'email-validator';\nimport { auth } from 'express-openid-connect';\nimport { auth as authBearer, JWTPayload } from 'express-oauth2-jwt-bearer';\nimport { uid, hashUserId } from '../controllers/userinfo_controller';\nimport Fact from '../../facts/server';\nimport getCookieSettingsFromEnv from '../../../lib/cookie-settings-from-env';\nimport IsLogger from '../../../lib/is_logger';\n\nconst userInfoEndpointCache = {};\n\ntype TokenCacheEntry = {\n userInfo: any;\n expiresAt: number;\n};\n\nconst tokenCache: Record<string, TokenCacheEntry | undefined> = {};\n\n// Cleanup expired tokens periodically\nsetInterval(() => {\n const now = Date.now();\n Object.keys(tokenCache).forEach((token) => {\n const entry = tokenCache[token];\n if (entry && entry.expiresAt < now) {\n delete tokenCache[token];\n }\n });\n}, 60 * 60 * 1000);\n\nfunction assignWhenAuthenticatedFunction(req, res) {\n req.whenAuthenticated = async (fn) => {\n if (!req?.oidc?.user?.sub || !req.oidc.isAuthenticated()) {\n res.sendStatus(401);\n } else {\n req.hashedUserID = uid(req);\n await fn(uid(req));\n }\n };\n}\n\n// This is the user info endpoint provided by the OIDC provider not the\n// linkedrecords user info endpoint\nasync function getUserInfoEndpoint(): Promise<string> {\n const issuerUrl = process.env['AUTH_ISSUER_BASE_URL']?.replace(/\\/$/, '');\n\n if (!issuerUrl) {\n throw new Error('AUTH_ISSUER_BASE_URL needs to be defined');\n }\n\n if (userInfoEndpointCache[issuerUrl]) {\n return userInfoEndpointCache[issuerUrl];\n }\n\n const res = await fetch(`${issuerUrl}/.well-known/openid-configuration`);\n\n if (!res.ok) {\n throw new Error(`Failed to fetch OIDC configuration: ${res.status} ${res.statusText}`);\n }\n\n const config = await res.json();\n\n if (!config.userinfo_endpoint) {\n throw new Error('userinfo_endpoint not found in OIDC configuration');\n }\n\n userInfoEndpointCache[issuerUrl] = config.userinfo_endpoint;\n\n return config.userinfo_endpoint;\n}\n\nasync function fetchUserInfo(accessToken: string): Promise<any> {\n const userinfoEndpoint = await getUserInfoEndpoint();\n\n const res = await fetch(userinfoEndpoint, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n });\n\n if (!res.ok) {\n throw new Error(`Failed to fetch user info: ${res.status} ${res.statusText}`);\n }\n\n return res.json();\n}\n\nasync function ensureUserIsInLocalDBAndVerified(\n userInfo: JWTPayload,\n logger: IsLogger,\n) {\n const { email, email_verified, sub } = userInfo;\n\n if (email_verified === true\n && typeof email === 'string'\n && EmailValidator.validate(email)\n && typeof sub === 'string'\n && sub.trim()) {\n Fact.recordUserEmail(email, hashUserId(sub), logger);\n return true;\n }\n\n return false;\n}\n\nfunction confidentialClientAuthenticationMiddleware(req, res, next) {\n assignWhenAuthenticatedFunction(req, res);\n const cookieSettings = getCookieSettingsFromEnv();\n\n const authMiddleware = auth({\n baseURL: process.env['FRONTEND_BASE_URL'],\n issuerBaseURL: process.env['AUTH_ISSUER_BASE_URL'],\n clientID: process.env['AUTH_CLIENT_ID'],\n secret: process.env['AUTH_COOKIE_SIGNING_SECRET'],\n clientSecret: process.env['AUTH_CLIENT_SECRET'],\n errorOnRequiredAuth: true,\n enableTelemetry: false,\n idpLogout: process.env['AUTH_IDP_LOGOUT'] === 'true',\n afterCallback: async (_, __, session: any) => {\n const userInfo = decodeJwt(session.id_token);\n const isVerified = await ensureUserIsInLocalDBAndVerified(userInfo, req.log);\n\n if (isVerified !== true) {\n res.redirect('/?email-not-verified');\n }\n\n return session;\n },\n authorizationParams: {\n // We need offline_access because we do XHR call in the background\n // which can not be redirected for refreshing the token.\n scope: 'openid email offline_access profile',\n response_type: 'code',\n prompt: ['none', 'login', 'consent', 'select_account'].includes(req.query.prompt)\n ? req.query.prompt\n : undefined,\n },\n session: {\n cookie: cookieSettings,\n },\n });\n\n return authMiddleware(req, res, next);\n}\n\nasync function httpAuthHeaderMiddleware(req, res, next) {\n const willExpireIn = (token, x) => {\n const payload = JSON.parse(Buffer.from(token.split('.')[1], 'base64').toString());\n return payload.exp * 1000 < Date.now() + x * 1000;\n };\n\n assignWhenAuthenticatedFunction(req, res);\n\n if (req.headers.authorization) {\n const token = req.headers.authorization.split(' ')[1];\n const cachedToken = tokenCache[token];\n\n if (cachedToken) {\n if (!willExpireIn(token, 5)) {\n req.oidc = {\n user: {\n sub: cachedToken.userInfo.sub,\n picture: cachedToken.userInfo.picture,\n email: cachedToken.userInfo.email,\n },\n isAuthenticated: () => !!cachedToken.userInfo.sub?.trim(),\n };\n\n return next();\n }\n\n delete tokenCache[token];\n }\n }\n\n const authMiddleware = authBearer({\n issuerBaseURL: process.env['AUTH_ISSUER_BASE_URL'],\n audience: process.env['AUTH_TOKEN_AUDIENCE'],\n });\n\n return authMiddleware(req, res, async () => {\n if (!req.auth) {\n req.log.info('Request contained invalid access token in http authorization header.');\n return res.sendStatus(401);\n }\n\n const userInfo = await fetchUserInfo(req.auth.token);\n const isVerified = await ensureUserIsInLocalDBAndVerified(userInfo, req.log);\n\n if (isVerified !== true) {\n return res.redirect('/?email-not-verified');\n }\n\n const payload = JSON.parse(Buffer.from(req.auth.token.split('.')[1], 'base64').toString());\n\n tokenCache[req.auth.token] = {\n userInfo,\n expiresAt: payload.exp * 1000,\n };\n\n req.oidc = {\n user: {\n sub: userInfo.sub,\n picture: userInfo.picture,\n email: userInfo.email,\n },\n isAuthenticated: () => !!userInfo.sub?.trim(),\n };\n\n return next();\n });\n}\n\nexport default function authentication() {\n return (req, res, next) => {\n const authHeader = req.headers.authorization;\n\n if (process.env['ALLOW_HTTP_AUTHENTICATION_HEADER'] === 'true' && authHeader) {\n return httpAuthHeaderMiddleware(req, res, next);\n }\n\n if (authHeader) {\n throw new Error('HTTP Authorization header authentication is not enabled. Set ALLOW_HTTP_AUTHENTICATION_HEADER=true to enable it.');\n }\n\n return confidentialClientAuthenticationMiddleware(req, res, next);\n };\n}\n","export default function errorHandler(fn) {\n return async (req, res) => {\n try {\n await fn(req, res);\n } catch (ex: any) {\n if (ex?.message?.startsWith('Not enough storage space available')) {\n res.status(403).send('Not enough storage space available');\n } else {\n req.log.error(ex);\n res.sendStatus(500);\n }\n }\n };\n}\n","import Fact from '../../facts/server';\n\nexport default function factMiddleware() {\n return (req, res, next) => {\n req.Fact = Fact;\n res.Fact = Fact;\n next();\n };\n}\n","import { Request, Response } from 'express';\nimport PaddlePaymentProvider from '../payment_provider/paddle';\nimport Quota from '../quota';\n\nexport default function quotaUpgrade() {\n return async (req: Request, res: Response) => {\n if (req.method.toLowerCase() === 'post' && req.path.toLowerCase() === '/paddle') {\n try {\n const paddleController = new PaddlePaymentProvider();\n const quotaEvent = await paddleController.handleCallback(req, res);\n\n if (!quotaEvent) {\n req.log.warn('quota event does not match an event handler');\n res.sendStatus(422);\n } else {\n const quota = new Quota(quotaEvent.nodeId, req.log);\n await quota.set(\n quotaEvent.totalStorageAvailable,\n quotaEvent.providerId,\n quotaEvent.paymentProvider,\n quotaEvent.providerPayload,\n quotaEvent.validFrom,\n );\n\n res.send(quotaEvent);\n }\n } catch (error) {\n req.log?.error(`Error handling payment provider callback: ${error}`);\n res.status(500).json({ error: 'Internal server error processing payment notification' });\n }\n } else {\n res.sendStatus(404);\n }\n };\n}\n","import { Request, Response } from 'express';\nimport type { QuotaEvent } from '../quota';\n\nexport default abstract class AbstractPaymentProvider {\n static paymentProviderId: string;\n\n abstract handleCallback(req: Request, res: Response): Promise<QuotaEvent | undefined>;\n\n abstract loadDetailsForAccountee(provider_id: string): Promise<Record<string, string>>;\n}\n","import AbstractPaymentProvider from './abstract_provider';\nimport PaddlePaymentProvider from './paddle';\n\nconst providers = [PaddlePaymentProvider];\n\nexport default class PaymentProvider {\n static getById(paymentProviderId: string): AbstractPaymentProvider {\n const Provider = providers.find((p) => p.paymentProviderId === paymentProviderId);\n\n if (!Provider) {\n throw new Error(`Unknown payment provider: ${paymentProviderId}`);\n }\n\n return new Provider();\n }\n}\n","/* eslint-disable class-methods-use-this */\nimport crypto from 'crypto';\nimport assert from 'assert';\nimport type { QuotaEvent } from '../quota';\nimport safeCompare from '../../../lib/utils/safe_compare';\nimport readBody from '../../../lib/utils/read_body';\nimport AbstractPaymentProvider from './abstract_provider';\n\nexport default class PaddlePaymentProvider extends AbstractPaymentProvider {\n secretKey: string;\n\n apiKey: string;\n\n paddleURL: string;\n\n static paymentProviderId: string = 'paddle';\n\n constructor() {\n super();\n const missingConfig: string[] = [];\n\n if (!process.env['PADDLE_NOTIFICATION_SECRET']) {\n missingConfig.push('PADDLE_NOTIFICATION_SECRET');\n }\n\n if (!process.env['PADDLE_API_KEY']) {\n missingConfig.push('PADDLE_API_KEY');\n }\n\n if (!process.env['PADDLE_API_URL']) {\n missingConfig.push('PADDLE_API_URL');\n }\n\n if (missingConfig.length) {\n throw new Error(`this linkedrecords instance is not configured to handle paddle callbacks. The following configurations are missing: ${missingConfig.join(', ')}`);\n }\n\n assert(process.env['PADDLE_API_URL']);\n assert(process.env['PADDLE_API_KEY']);\n assert(process.env['PADDLE_NOTIFICATION_SECRET']);\n\n this.paddleURL = process.env['PADDLE_API_URL'];\n this.apiKey = process.env['PADDLE_API_KEY'];\n this.secretKey = process.env['PADDLE_NOTIFICATION_SECRET'];\n }\n\n getSignature(payload: string, timestamp?: string): string {\n const ts = timestamp || Math.round((Date.now() / 1000));\n const toBeHashed = `${ts}:${payload}`;\n\n const hmac = crypto.createHmac('sha256', this.secretKey);\n hmac.update(toBeHashed);\n const hash = hmac.digest('hex');\n return `ts=${ts};h1=${hash}`;\n }\n\n async handleCallback(req, res): Promise<QuotaEvent | undefined> {\n const payload: any = await this.getPaddlePayload(req, res);\n\n if (!payload) {\n return undefined;\n }\n\n if (payload.event_type === 'subscription.created') {\n return this.handlePaddleSubscriptionCreated(payload, req, res);\n }\n\n if (payload.event_type === 'subscription.updated' && (payload?.data?.scheduled_change?.action === 'cancel' || payload?.data?.status === 'canceled')) {\n return this.handlePaddleSubscriptionCanceled(payload, req, res);\n }\n\n req.log.warn(`no event paddle callback handler found for event type: ${payload.event_type} and action: ${payload?.data?.scheduled_change?.action}`);\n\n return undefined;\n }\n\n async loadDetailsForAccountee(subscriptionId: string): Promise<Record<string, string>> {\n const response = await fetch(`${this.paddleURL}/subscriptions/${subscriptionId}`, {\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n },\n });\n\n return response.json();\n }\n\n private async getPaddlePayload(req, res): Promise<object | undefined> {\n const signature: string = req.headers['paddle-signature'];\n\n if (!signature) {\n req.log.warn('no signature header present in paddle callback');\n res.sendStatus(422);\n return undefined;\n }\n\n const rawRequestBody = await readBody(req);\n const rawTs = signature.split(';')[0];\n\n if (!rawTs) {\n req.log.warn('paddle signature header does not contain timestamp');\n res.sendStatus(422);\n return undefined;\n }\n\n const ts = rawTs.split('=')[1];\n\n if (!ts) {\n req.log.warn('paddle signature header does not contain valid timestamp');\n res.sendStatus(422);\n return undefined;\n }\n\n if (!safeCompare(this.getSignature(rawRequestBody, ts), signature)) {\n req.log.error('invalid paddle signature detected');\n res.sendStatus(422);\n return undefined;\n }\n\n return JSON.parse(rawRequestBody);\n }\n\n private handlePaddleSubscriptionCreated(payload, req, res): QuotaEvent | undefined {\n const nodeId = payload\n ?.data\n ?.custom_data\n ?.nodeId;\n\n const providerId = payload\n ?.data\n ?.id;\n\n const totalStorageAvailableAsString = payload\n ?.data\n ?.items?.[0]\n ?.product.custom_data\n ?.total_storage_available;\n\n req.log.info(`handle paddle subscription created (node: ${nodeId}, storage: ${totalStorageAvailableAsString}) - ${JSON.stringify(payload)}`);\n\n if (!nodeId || !totalStorageAvailableAsString || !providerId) {\n req.log.error('Error updating quota: nodeId, subscriptionId and/or totalStorageAvailableAsString are not available');\n res.sendStatus(422);\n return undefined;\n }\n\n let totalStorageAvailable;\n\n try {\n totalStorageAvailable = Number.parseInt(totalStorageAvailableAsString, 10);\n } catch (ex) {\n req.log.error('Error parsing totalStorageAvailable');\n }\n\n if (totalStorageAvailable === undefined || Number.isNaN(totalStorageAvailable)) {\n req.log.warn('Error updating quota: totalStorageAvailable is not a valid number. Check Paddle product configuration.');\n res.sendStatus(422);\n return undefined;\n }\n\n return {\n nodeId,\n totalStorageAvailable,\n providerId,\n paymentProvider: PaddlePaymentProvider.paymentProviderId,\n providerPayload: payload,\n };\n }\n\n private handlePaddleSubscriptionCanceled(payload, req, res): QuotaEvent | undefined {\n const nodeId = payload\n ?.data\n ?.custom_data\n ?.nodeId;\n\n const providerId = payload\n ?.data\n ?.id;\n\n const totalStorageAvailable = null;\n\n const validFrom = payload?.data?.scheduled_change?.effective_at\n ? new Date(payload?.data?.scheduled_change?.effective_at)\n : new Date();\n\n req.log.info(`handle paddle subscription canceled (node: ${nodeId}, storage: ${totalStorageAvailable}) - ${JSON.stringify(payload)}`);\n\n if (!nodeId || !providerId) {\n req.log.error('Error updating quota: nodeId and/or subscriptionId are not available');\n res.sendStatus(422);\n return undefined;\n }\n\n return {\n nodeId,\n totalStorageAvailable,\n providerId,\n validFrom,\n paymentProvider: PaddlePaymentProvider.paymentProviderId,\n providerPayload: payload,\n };\n }\n}\n","/* eslint-disable import/no-cycle */\nimport AbstractAttributeServer from '../../attributes/abstract/abstract_attribute_server';\nimport Fact from '../../facts/server';\nimport IsLogger from '../../../lib/is_logger';\nimport PgPoolWithLog from '../../../lib/pg-log';\nimport EnsureIsValid from '../../../lib/utils/sql_values';\nimport SerializedChangeWithMetadata from '../../attributes/abstract/serialized_change_with_metadata';\nimport PaymentProvider from '../payment_provider';\nimport AttributeStoragePsqlWithHistory from '../../attributes/attribute_storage/psql_with_history';\nimport AttributeStoragePsql from '../../attributes/attribute_storage/psql';\nimport AttributeStorageS3 from '../../attributes/attribute_storage/s3';\nimport IsAttributeStorage from '../../attributes/abstract/is_attribute_storage';\n\nconst uncheckedStorageConsumption: Record<string, number> = {};\nconst lastKnownStorageAvailable: Record<string, number> = {};\n\nexport type QuotaAsJSON = {\n nodeId: string,\n totalStorageAvailable: number,\n remainingStorageAvailable: number,\n usedStorage: number,\n accounteeInformation: Record<string, string> | undefined,\n userIsAccountable: boolean,\n isUpgraded: boolean,\n};\n\nexport type QuotaEvent = {\n nodeId: string,\n totalStorageAvailable: number | null,\n paymentProvider: string,\n providerPayload: string,\n providerId: string,\n validFrom?: Date,\n};\n\nexport default class Quota {\n readonly nodeId: string;\n\n logger: IsLogger;\n\n pool: PgPoolWithLog;\n\n static getDefaultStorageSizeQuota(): number {\n const mb = 1048576;\n return process.env['DEFAULT_STORAGE_SIZE_QUOTA']\n ? parseInt(process.env['DEFAULT_STORAGE_SIZE_QUOTA'], 10) * mb\n : 500 * mb;\n }\n\n public static async getAccounteeIdForNode(\n nodeId: string,\n logger: IsLogger,\n ): Promise<string> {\n const pool = new PgPoolWithLog(logger);\n\n if (await Quota.isNodeWithQuotaAssignment(nodeId, logger)) {\n return nodeId;\n }\n\n // TODO: find out the fact box and limit the query to the fact box\n\n const res = await pool.query(`WITH RECURSIVE rfacts AS (\n SELECT facts.subject, facts.predicate, facts.object FROM facts\n WHERE object = $1\n AND predicate = '$isAccountableFor'\n UNION ALL\n SELECT facts.subject, facts.predicate, facts.object FROM facts, rfacts\n WHERE facts.object = rfacts.subject\n AND facts.predicate = '$isAccountableFor'\n )\n CYCLE object\n SET cycl TO 'Y' DEFAULT 'N'\n USING path_array\n SELECT rfacts.subject\n FROM rfacts\n WHERE cycl = 'N'`, [nodeId]);\n\n if (res.rows.length === 0) {\n throw new Error(`No accountee found for node ${nodeId}`);\n }\n\n // we have to find the first node which has a quota assigned to it\n // for now it is the last one which is always a user node.\n return res.rows[res.rows.length - 1].subject;\n }\n\n public static async getLatestQuotaEvent(\n nodeId: string,\n logger: IsLogger,\n ): Promise<QuotaEvent | undefined> {\n const pool = new PgPoolWithLog(logger);\n const data = await pool.query('SELECT * FROM quota_events WHERE node_id=$1 AND valid_from < $2 ORDER BY id DESC', [\n nodeId,\n new Date(),\n ]);\n\n if (!data.rows.length || !data.rows[0]) {\n return undefined;\n }\n\n const parsedStorageAvailable = Number.parseInt(data.rows[0].total_storage_available, 10);\n\n return {\n nodeId: data.rows[0].node_id,\n totalStorageAvailable: parsedStorageAvailable,\n paymentProvider: data.rows[0].payment_provider,\n providerPayload: data.rows[0].payment_provider_payload,\n providerId: data.rows[0].provider_id,\n validFrom: data.rows[0].valid_from,\n };\n }\n\n constructor(nodeId: string, logger: IsLogger) {\n this.pool = new PgPoolWithLog(logger);\n this.nodeId = nodeId;\n this.logger = logger;\n }\n\n public async set(\n totalStorageAvailable: number | null,\n providerId: string,\n paymentProvider: string,\n paymentProviderPayload: string,\n validFrom?: Date,\n ) {\n await this.pool.query('INSERT INTO quota_events (node_id, total_storage_available, payment_provider, provider_id, payment_provider_payload, valid_from) VALUES ($1, $2, $3, $4, $5, $6)', [\n this.nodeId,\n totalStorageAvailable,\n paymentProvider,\n providerId,\n paymentProviderPayload,\n validFrom || new Date(),\n ]);\n }\n\n public async toJSON(asAccountee: boolean): Promise<QuotaAsJSON> {\n const data = await Quota.getLatestQuotaEvent(this.nodeId, this.logger);\n\n const [totalStorageAvailable, usedStorage] = await Promise.all([\n this.getTotalStorageAvailable(data),\n this.getUsedStorageSize(this.logger),\n ]);\n\n let accounteeInformation;\n\n if (asAccountee) {\n try {\n const [provider, providerSubId] = await this.getPaymentProviderId();\n const paymentProvider = PaymentProvider.getById(provider);\n accounteeInformation = await paymentProvider.loadDetailsForAccountee(providerSubId);\n } catch (ex) {\n this.logger.warn('details for accountee could not be found, skipping');\n }\n }\n\n return {\n nodeId: this.nodeId,\n userIsAccountable: asAccountee,\n isUpgraded: !!data?.totalStorageAvailable,\n totalStorageAvailable,\n usedStorage,\n remainingStorageAvailable: totalStorageAvailable - usedStorage,\n accounteeInformation,\n };\n }\n\n public async getPaymentProviderId(): Promise<[string, string]> {\n const data = await Quota.getLatestQuotaEvent(this.nodeId, this.logger);\n\n if (!data) {\n throw new Error(`No quota event found for node ${this.nodeId}`);\n }\n\n if (!data.providerId?.trim()) {\n throw new Error(`No provider_id available for quota event with nodeId ${this.nodeId}`);\n }\n\n if (!data.paymentProvider?.trim()) {\n throw new Error(`No payment_provider available for quota event with nodeId ${this.nodeId}`);\n }\n\n return [data.paymentProvider?.trim(), data.providerId.trim()];\n }\n\n public async getTotalStorageAvailable(prefetchedData?: QuotaEvent): Promise<number> {\n const data = prefetchedData || await Quota.getLatestQuotaEvent(this.nodeId, this.logger);\n\n if (data?.totalStorageAvailable) {\n return data.totalStorageAvailable;\n }\n\n if (this.nodeId.startsWith('us-')) {\n return Quota.getDefaultStorageSizeQuota();\n }\n\n return 0;\n }\n\n private static async isNodeWithQuotaAssignment(\n nodeId: string,\n logger: IsLogger,\n ): Promise<boolean> {\n if (nodeId.startsWith('us-')) {\n return true;\n }\n\n const data = await Quota.getLatestQuotaEvent(nodeId, logger);\n return !!data;\n }\n\n private async getAccountableNodes(): Promise<string[]> {\n let factScopeFilter = '';\n\n if (this.nodeId.startsWith('us-')) {\n const factScope = await Fact.getFactScopeByUser(this.nodeId, this.logger);\n factScopeFilter = `AND facts.fact_box_id IN (${factScope.factBoxIds.map(EnsureIsValid.factBoxId).join(',')})`;\n }\n\n const res = await this.pool.query(`WITH RECURSIVE rfacts AS (\n SELECT facts.subject, facts.predicate, facts.object FROM facts\n WHERE subject = $1\n AND predicate = '$isAccountableFor' ${factScopeFilter}\n UNION ALL\n SELECT facts.subject, facts.predicate, facts.object FROM facts, rfacts\n WHERE facts.subject = rfacts.object\n AND facts.predicate = '$isAccountableFor' ${factScopeFilter}\n )\n CYCLE object\n SET cycl TO 'Y' DEFAULT 'N'\n USING path_array\n SELECT rfacts.object\n FROM rfacts\n WHERE cycl = 'N'`, [this.nodeId]);\n\n return res.rows.map((r) => r.object.trim());\n }\n\n static async ensureStorageSpaceToSave<T>(\n actorId: string,\n attributesAndValuesToSave: [AbstractAttributeServer<T, any>, T][],\n logger: IsLogger,\n factsToSave: Fact[] = [],\n ): Promise<void> {\n const storageViolations: string[] = [];\n const accountableMap = await Quota.getAccountableMap(logger, actorId, factsToSave);\n\n const storageRequiredByAccountee = await Quota.getStorageRequiredByAccountee(\n actorId,\n attributesAndValuesToSave,\n accountableMap,\n );\n\n await Promise.all(\n Object.entries(storageRequiredByAccountee).map(async ([accounteeId, storageRequired]) => {\n const available = await Quota.estimateRemainingStorageSize(\n accounteeId,\n storageRequired,\n logger,\n );\n\n if (available < storageRequired) {\n storageViolations.push(accounteeId);\n }\n }),\n );\n\n if (storageViolations.length) {\n throw new Error('Not enough storage space available');\n }\n }\n\n private static async estimateRemainingStorageSize(\n accounteeId: string,\n requiredStorage: number,\n logger: IsLogger,\n ): Promise<number> {\n const mb = 1048576;\n const uncheckedConsumption = (uncheckedStorageConsumption[accounteeId] || 0) + requiredStorage;\n const lastKnownStorageAvailableForAccountee = lastKnownStorageAvailable[accounteeId] || 0;\n\n uncheckedStorageConsumption[accounteeId] = uncheckedConsumption;\n\n if (uncheckedConsumption > (0.05 * mb) || lastKnownStorageAvailableForAccountee <= 0) {\n uncheckedStorageConsumption[accounteeId] = 0;\n lastKnownStorageAvailable[accounteeId] = await Quota.getRemainingStorageSize(\n accounteeId,\n logger,\n );\n }\n\n return lastKnownStorageAvailable[accounteeId] || 0;\n }\n\n private static async getRemainingStorageSize(\n accounteeId: string,\n logger: IsLogger,\n ): Promise<number> {\n const quota = new Quota(accounteeId, logger);\n const totalStoragePromise = quota.getTotalStorageAvailable();\n const usedStoragePromise = quota.getUsedStorageSize(logger);\n\n return (await totalStoragePromise) - (await usedStoragePromise);\n }\n\n private async getUsedStorageSize(logger: IsLogger): Promise<number> {\n const accountableNodes = await this.getAccountableNodes();\n\n // FIXME: we need a pagination / map reduce approach here\n // We can not combine it in one query because we want to be able to store the facts and\n // the attributes in different databases\n if (accountableNodes.length > 5000) {\n this.logger.warn(`accountable nodes for accounteeId ${this.nodeId} is very big (${accountableNodes.length} nodes)! Implement a map reduce based calculation in linkedrecords to prevent to big sql queries`);\n }\n\n const storageDrivers: IsAttributeStorage[] = [];\n\n if (process.env['QUOTA_COUNT_KV_ATTRIBUTES'] === 'true') {\n storageDrivers.push(new AttributeStoragePsql(logger, 'kv'));\n }\n\n if (process.env['QUOTA_COUNT_LT_ATTRIBUTES'] === 'true') {\n storageDrivers.push(new AttributeStoragePsqlWithHistory(logger));\n }\n\n if (AttributeStorageS3.isConfigurationAvailable()) {\n storageDrivers.push(new AttributeStorageS3(logger));\n } else {\n storageDrivers.push(new AttributeStoragePsql(logger, 'bl'));\n }\n\n const sizes = await Promise.all(storageDrivers.map(\n (s) => s.getSizeInBytesForAllAttributes(accountableNodes),\n ));\n\n return sizes.reduce((acc, curr) => acc + curr, 0);\n }\n\n private static async getAccountableMap(\n logger: IsLogger,\n actorId: string,\n factsToSave: Fact[] = [],\n ): Promise<Record<string, string>> {\n const accountableMap: Record<string, string> = factsToSave.reduce((acc, fact) => {\n if (fact.predicate === '$isAccountableFor') {\n // attribute = accountee\n acc[fact.object] = fact.subject;\n }\n\n return acc;\n }, {});\n\n // we have to trace this back to the node which actually has a storage quota assigned to it\n await Promise.all(Object.entries(accountableMap).map(async ([attributeId, accounteeId]) => {\n let nodeWithQuotaAssignment = actorId;\n\n try {\n nodeWithQuotaAssignment = await Quota.getAccounteeIdForNode(accounteeId, logger);\n } catch (error) {\n logger.info(`Error getting accountee id for node ${accounteeId}, defaulting to actorId ${actorId}`);\n }\n\n accountableMap[attributeId] = nodeWithQuotaAssignment.trim();\n }));\n\n return accountableMap;\n }\n\n private static async getStorageRequiredByAccountee<T>(\n actorId: string,\n attributesAndValuesToSave: [AbstractAttributeServer<T, any>, T][],\n accountableMap: Record<string, string>,\n ) {\n const storageRequiredByAccountee: Record<string, number> = {};\n\n await Promise.all(attributesAndValuesToSave.map(async ([attribute, value]) => {\n const change = AbstractAttributeServer.isValidChange(value) ? value : false;\n\n const bytesRequired = change\n ? await attribute.getStorageRequiredForChange(\n change as unknown as SerializedChangeWithMetadata<any>,\n )\n : await attribute.getStorageRequiredForValue(value);\n\n const accountee = accountableMap[attribute.id] || actorId;\n const currently = storageRequiredByAccountee[accountee] || 0;\n storageRequiredByAccountee[accountee] = currently + bytesRequired;\n }));\n\n return storageRequiredByAccountee;\n }\n}\n","/* eslint-disable class-methods-use-this */\n/* eslint-disable max-len */\nimport 'dotenv/config';\nimport https from 'https';\nimport express from 'express';\nimport cors from 'cors';\nimport multer from 'multer';\nimport pino from 'pino-http';\nimport { rateLimit } from 'express-rate-limit';\nimport attributeMiddleware from './middleware/attribute';\nimport factMiddleware from './middleware/fact';\nimport errorHandler from './middleware/error_handler';\nimport Fact from '../facts/server';\nimport factsController from './controllers/facts_controller';\nimport attributesController from './controllers/attributes_controller';\nimport quotaController from './controllers/quota_controller';\nimport userinfoController from './controllers/userinfo_controller';\nimport oidcController from './controllers/oidc_controller';\nimport authentication from './middleware/authentication';\nimport quotaUpgrade from './middleware/quota_upgrade';\nimport mountServiceBus from './service_bus_mount';\nimport AuthorizationError from '../attributes/errors/authorization_error';\nimport BlobAttribute from '../attributes/blob/server';\n\nconst blobUpload = multer().single('change');\n\nconst limiter = rateLimit({\n windowMs: 1000, // 1 second\n limit: 1000, // Limit each IP to 1000 requests per `window` (here, per 1 minute).\n});\n\nFact.initDB();\n\nBlobAttribute.copyFromPSQLToS3({\n warn: console.log,\n info: console.log,\n debug: console.log,\n});\n\nasync function withAuth(req, res, controllerAction) {\n const uploadWrappedControllerAction = (request, response) => new Promise((resolve, reject) => {\n blobUpload(request, response, async (err) => {\n if (err) {\n req.log.error(`error uploading file for ${req.method} ${req.path}`, err);\n }\n\n if (request?.file?.fieldname === 'change' && request.body) {\n if (request.method === 'POST') {\n request.body.value = new Blob([request.file.buffer], { type: request.file.mimetype });\n } else {\n request.body.change = {\n value: new Blob([request.file.buffer], { type: request.file.mimetype }),\n };\n }\n }\n\n controllerAction(request, response)\n .catch(reject)\n .then(resolve);\n });\n });\n\n await req.whenAuthenticated(async () => {\n try {\n await uploadWrappedControllerAction(req, res);\n } catch (ex: any) {\n if (ex instanceof AuthorizationError) {\n res.sendStatus(403);\n } else if (ex?.message?.startsWith('Not enough storage space available')) {\n res.status(403).send('Not enough storage space available');\n } else { // TODO: this should be moved into the error handler\n req.log.error(ex);\n res.sendStatus(500);\n }\n }\n });\n}\n\nfunction getCorsOriginConfig(): string | string[] {\n if (!process.env['CORS_ORIGIN']) {\n if (!process.env['FRONTEND_BASE_URL']) {\n throw new Error('You nee to set the FRONTEND_BASE_URL configuration as environment variable.');\n }\n\n return process.env['FRONTEND_BASE_URL'];\n }\n\n let parsed = process.env['CORS_ORIGIN'];\n\n try {\n parsed = JSON.parse(parsed);\n } catch (ex) {\n // It just URL string, not parsable\n }\n\n if (typeof parsed === 'string' || Array.isArray(parsed)) {\n return parsed;\n }\n\n throw new Error(`Invalid value (${process.env['CORS_ORIGIN']}) for CORS_ORIGIN, needs to be string or JSON array.`);\n}\n\nasync function createApp(httpServer: https.Server) {\n if (!process.env['FRONTEND_BASE_URL']) {\n throw new Error('You nee to set the FRONTEND_BASE_URL configuration as environment variable.');\n }\n\n const app = express();\n await mountServiceBus(httpServer, app);\n\n app.use(limiter);\n app.use(cors({ origin: getCorsOriginConfig(), credentials: true, maxAge: 86400 }));\n app.use(pino({ redact: ['req.headers', 'res.headers'] }));\n app.use('/payment_events', quotaUpgrade());\n app.use(express.json());\n\n // Dev OIDC provider (only in dev mode)\n if (process.env['AUTH_DEV_MODE'] === 'true') {\n // eslint-disable-next-line global-require\n const devOidc = require('../dev-oidc');\n await devOidc.initializeKeys();\n app.use('/dev-oidc', devOidc.default);\n }\n\n app.get('/oidc/discovery', (req, res) => oidcController.discovery(req, res));\n app.use(authentication());\n app.use('/attributes', attributeMiddleware());\n app.use('/attribute-compositions', attributeMiddleware());\n app.use('/', factMiddleware());\n\n app.get('/userinfo', errorHandler((req, res) => userinfoController.userinfo(req, res)));\n app.get('/quota/:nodeId', errorHandler((req, res) => withAuth(req, res, quotaController.get)));\n app.get('/attributes', errorHandler((req, res) => withAuth(req, res, attributesController.index)));\n app.post('/attributes', errorHandler((req, res) => withAuth(req, res, attributesController.create)));\n app.post('/attribute-compositions', errorHandler((req, res) => withAuth(req, res, attributesController.createComposition)));\n app.get('/attributes/:attributeId', errorHandler((req, res) => withAuth(req, res, attributesController.get)));\n app.get('/attributes/:attributeId/members', errorHandler((req, res) => withAuth(req, res, attributesController.getMembers)));\n app.patch('/attributes/:attributeId', errorHandler((req, res) => withAuth(req, res, attributesController.update)));\n app.get('/facts', errorHandler((req, res) => withAuth(req, res, factsController.index)));\n app.post('/facts', errorHandler((req, res) => withAuth(req, res, factsController.create)));\n app.post('/facts/delete', errorHandler((req, res) => withAuth(req, res, factsController.delete)));\n\n return app;\n}\n\nexport default async function createServer(options?) {\n const transportDriver = options?.transportDriver || https;\n const server = transportDriver.createServer(options);\n server.on('request', await createApp(server));\n return server;\n}\n\nprocess.on('uncaughtException', (err) => {\n console.log('uncaughtException', err);\n});\n","/* eslint-disable import/no-cycle */\n/* eslint-disable class-methods-use-this */\n/* eslint-disable max-len */\nimport * as jose from 'jose';\nimport http from 'http';\nimport clientServerBus, { getAllChannels } from '../../lib/client-server-bus/server';\nimport IsLogger from '../../lib/is_logger';\nimport SerializedChangeWithMetadata from '../attributes/abstract/serialized_change_with_metadata';\nimport { getAttributeByMessage } from './middleware/attribute';\nimport Fact from '../facts/server';\nimport { uid } from './controllers/userinfo_controller';\nimport Quota from './quota';\nimport { CompoundAttributeQuery, isValidCompoundAttributeQuery } from '../attributes/attribute_query';\n\nexport type CompoundAttributeQuerySubscribers = {\n query: CompoundAttributeQuery,\n userIds: string[],\n};\n\nlet sendMessage: (channel: string, body: any) => void;\nclass WSAccessControl {\n app: any;\n\n constructor(app) {\n this.app = app;\n }\n\n public verifyAuthenticated(\n request: http.IncomingMessage,\n ): Promise<string> {\n const response = new http.ServerResponse(request);\n\n return new Promise((resolve, reject) => {\n this.app.handle(request, response, () => {\n const { oidc } = request as any;\n\n if (!oidc || !oidc.isAuthenticated() || !oidc?.user?.sub) {\n reject(new Error('No user id found in request'));\n } else {\n resolve(uid(request));\n }\n });\n });\n }\n\n public async verifyAuthorizedChannelJoin(\n userId: string,\n channel: string,\n request: http.IncomingMessage,\n readToken?: string,\n ): Promise<boolean> {\n if (!userId) {\n return Promise.resolve(false);\n }\n\n if (channel.startsWith('query-sub:')) {\n const query = channel.replace(/^query-sub:.*?:/, '').trim();\n\n try {\n const parsedQuery = JSON.parse(query);\n const isValid = isValidCompoundAttributeQuery(parsedQuery);\n\n if (!isValid) {\n request.log.warn('Invalid compound attribute query');\n }\n\n // as long as the query is valid every authenticated user is authorized\n // to execute the query or subscribe to it. The user will receive a result\n // set which will reflect the users authorization.\n // In the current implementation this is handled in the following way:\n // If there might be change which might match the users query subscription the\n // users client receives a simple ping and will then execute the query.\n return isValid;\n } catch (ex: any) {\n request.log.warn(`Unexpected error in verifying query subscription: ${ex?.message}`);\n return false;\n }\n }\n\n if (process.env['SHORT_LIVED_ACCESS_TOKEN_SIGNING'] && readToken) {\n try {\n const secret = new TextEncoder().encode(`${process.env['SHORT_LIVED_ACCESS_TOKEN_SIGNING']}`);\n const verificationResult = await jose.jwtVerify(readToken, secret, { subject: userId });\n\n return verificationResult.payload?.['attrId'] === channel && verificationResult.payload?.sub === userId;\n } catch (ex) {\n request.log.warn(ex);\n }\n }\n\n return Fact.isAuthorizedToReadPayload(channel, userId, request.log as unknown as IsLogger);\n }\n\n public async verifyAuthorizedSend(\n userId: string,\n channel: string,\n request: http.IncomingMessage,\n ): Promise<boolean> {\n if (!userId) {\n return Promise.resolve(false);\n }\n\n return Fact.isAuthorizedToModifyPayload(channel, userId, request.log as unknown as IsLogger);\n }\n}\n\nexport async function getSubscribedQueries(logger: IsLogger): Promise<CompoundAttributeQuerySubscribers[]> {\n const queryUserMap: Record<string, string[]> = {};\n [...(await getAllChannels())]\n .filter((channel) => channel.startsWith('query-sub:'))\n .forEach((channel) => {\n const match = channel.replace(/^query-sub:/, '').match(/^(.*?):(.*)$/);\n\n if (!match || !match[1] || !match[2]) {\n logger.warn(`Unexpected error parsing query in query subscription list (could not determine user of subscription): ${channel}`);\n return;\n }\n\n const userId = match[1].trim();\n const queryString = match[2].trim();\n\n if (!queryUserMap[queryString]) {\n queryUserMap[queryString] = [];\n }\n\n queryUserMap[queryString].push(userId);\n });\n\n return Object.entries(queryUserMap).flatMap(([queryString, userIds]) => {\n try {\n const query = JSON.parse(queryString);\n return { query, userIds };\n } catch (ex) {\n logger.warn(`Unexpected error parsing query in query subscription list (could not parse query): ${queryString}`);\n return [];\n }\n });\n}\n\nexport function notifyQueryResultMightHaveChanged(query: CompoundAttributeQuery, userId) {\n if (!sendMessage) {\n throw new Error('sending messages does not work yet, sendMessage is not initialized');\n }\n\n if (!isValidCompoundAttributeQuery(query)) {\n throw new Error(`invalid query: ${JSON.stringify(query)}`);\n }\n\n sendMessage(`query-sub:${userId}:${JSON.stringify(query)}`, { type: 'resultMightHaveChanged' });\n}\n\nexport default async function mountServiceBus(httpServer, app) {\n sendMessage = await clientServerBus(httpServer, app, new WSAccessControl(app), async (attributeId, change, request, userId) => {\n const logger = request.log as unknown as IsLogger;\n const attribute = getAttributeByMessage(attributeId, change, logger);\n\n try {\n await Quota.ensureStorageSpaceToSave(\n userId,\n [[attribute, change]],\n logger,\n );\n\n const committedChange: SerializedChangeWithMetadata<any> = await attribute.change(\n change,\n );\n\n sendMessage(attributeId, committedChange);\n } catch (ex: any) {\n if (ex.message === 'Not enough storage space available') {\n sendMessage(attributeId, { error: 'quota_violation' });\n } else {\n throw ex;\n }\n }\n });\n}\n","module.exports = require(\"@socket.io/redis-streams-adapter\");","module.exports = require(\"changesets\");","module.exports = require(\"cors\");","module.exports = require(\"diff_match_patch\");","module.exports = require(\"dotenv/config\");","module.exports = require(\"email-validator\");","module.exports = require(\"express\");","module.exports = require(\"express-oauth2-jwt-bearer\");","module.exports = require(\"express-openid-connect\");","module.exports = require(\"express-rate-limit\");","module.exports = require(\"file-type\");","module.exports = require(\"he\");","module.exports = require(\"ioredis\");","module.exports = require(\"jose\");","module.exports = require(\"md5\");","module.exports = require(\"minio\");","module.exports = require(\"multer\");","module.exports = require(\"pg\");","module.exports = require(\"pg-format\");","module.exports = require(\"pino-http\");","module.exports = require(\"queue\");","module.exports = require(\"raw-body\");","module.exports = require(\"redis\");","module.exports = require(\"redis-semaphore\");","module.exports = require(\"set-value\");","module.exports = require(\"socket.io\");","module.exports = require(\"stream-to-blob\");","module.exports = require(\"uuidv7\");","module.exports = require(\"assert\");","module.exports = require(\"crypto\");","module.exports = require(\"http\");","module.exports = require(\"https\");","module.exports = require(\"stream\");","module.exports = require(\"stream/consumers\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\tif (!(moduleId in __webpack_modules__)) {\n\t\tdelete __webpack_module_cache__[moduleId];\n\t\tvar e = new Error(\"Cannot find module '\" + moduleId + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(\"./index.ts\");\n",""],"names":[],"sourceRoot":""}
|