@crowi/api 2.0.0-alpha.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 +21 -0
- package/dist/app.d.ts +8 -0
- package/dist/app.js +65 -0
- package/dist/app.js.map +1 -0
- package/dist/collab/attach.d.ts +33 -0
- package/dist/collab/attach.js +341 -0
- package/dist/collab/attach.js.map +1 -0
- package/dist/collab/extension-redis.d.ts +25 -0
- package/dist/collab/extension-redis.js +133 -0
- package/dist/collab/extension-redis.js.map +1 -0
- package/dist/common/functions/path2name.d.ts +1 -0
- package/dist/common/functions/path2name.js +22 -0
- package/dist/common/functions/path2name.js.map +1 -0
- package/dist/common/functions/renderIcon.d.ts +1 -0
- package/dist/common/functions/renderIcon.js +9 -0
- package/dist/common/functions/renderIcon.js.map +1 -0
- package/dist/controllers/admin.d.ts +3 -0
- package/dist/controllers/admin.js +474 -0
- package/dist/controllers/admin.js.map +1 -0
- package/dist/controllers/attachment.d.ts +4 -0
- package/dist/controllers/attachment.js +200 -0
- package/dist/controllers/attachment.js.map +1 -0
- package/dist/controllers/backlink.d.ts +3 -0
- package/dist/controllers/backlink.js +42 -0
- package/dist/controllers/backlink.js.map +1 -0
- package/dist/controllers/bookmark.d.ts +3 -0
- package/dist/controllers/bookmark.js +100 -0
- package/dist/controllers/bookmark.js.map +1 -0
- package/dist/controllers/comment.d.ts +3 -0
- package/dist/controllers/comment.js +111 -0
- package/dist/controllers/comment.js.map +1 -0
- package/dist/controllers/index.d.ts +25 -0
- package/dist/controllers/index.js +44 -0
- package/dist/controllers/index.js.map +1 -0
- package/dist/controllers/installer.d.ts +3 -0
- package/dist/controllers/installer.js +48 -0
- package/dist/controllers/installer.js.map +1 -0
- package/dist/controllers/login.d.ts +4 -0
- package/dist/controllers/login.js +438 -0
- package/dist/controllers/login.js.map +1 -0
- package/dist/controllers/logout.d.ts +5 -0
- package/dist/controllers/logout.js +11 -0
- package/dist/controllers/logout.js.map +1 -0
- package/dist/controllers/me.d.ts +4 -0
- package/dist/controllers/me.js +369 -0
- package/dist/controllers/me.js.map +1 -0
- package/dist/controllers/notification.d.ts +3 -0
- package/dist/controllers/notification.js +88 -0
- package/dist/controllers/notification.js.map +1 -0
- package/dist/controllers/page.d.ts +3 -0
- package/dist/controllers/page.js +881 -0
- package/dist/controllers/page.js.map +1 -0
- package/dist/controllers/revision.d.ts +3 -0
- package/dist/controllers/revision.js +91 -0
- package/dist/controllers/revision.js.map +1 -0
- package/dist/controllers/search.d.ts +3 -0
- package/dist/controllers/search.js +93 -0
- package/dist/controllers/search.js.map +1 -0
- package/dist/controllers/share.d.ts +3 -0
- package/dist/controllers/share.js +207 -0
- package/dist/controllers/share.js.map +1 -0
- package/dist/controllers/shareAccess.d.ts +3 -0
- package/dist/controllers/shareAccess.js +28 -0
- package/dist/controllers/shareAccess.js.map +1 -0
- package/dist/controllers/slack.d.ts +3 -0
- package/dist/controllers/slack.js +87 -0
- package/dist/controllers/slack.js.map +1 -0
- package/dist/controllers/tokenAuth.d.ts +10 -0
- package/dist/controllers/tokenAuth.js +292 -0
- package/dist/controllers/tokenAuth.js.map +1 -0
- package/dist/controllers/user.d.ts +3 -0
- package/dist/controllers/user.js +67 -0
- package/dist/controllers/user.js.map +1 -0
- package/dist/controllers/version.d.ts +4 -0
- package/dist/controllers/version.js +19 -0
- package/dist/controllers/version.js.map +1 -0
- package/dist/crowi/express-init.d.ts +4 -0
- package/dist/crowi/express-init.js +101 -0
- package/dist/crowi/express-init.js.map +1 -0
- package/dist/crowi/index.d.ts +245 -0
- package/dist/crowi/index.js +726 -0
- package/dist/crowi/index.js.map +1 -0
- package/dist/events/activity.d.ts +7 -0
- package/dist/events/activity.js +15 -0
- package/dist/events/activity.js.map +1 -0
- package/dist/events/bookmark.d.ts +8 -0
- package/dist/events/bookmark.js +16 -0
- package/dist/events/bookmark.js.map +1 -0
- package/dist/events/comment.d.ts +6 -0
- package/dist/events/comment.js +14 -0
- package/dist/events/comment.js.map +1 -0
- package/dist/events/config.d.ts +6 -0
- package/dist/events/config.js +12 -0
- package/dist/events/config.js.map +1 -0
- package/dist/events/index.d.ts +17 -0
- package/dist/events/index.js +22 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/mention-dispatch.d.ts +44 -0
- package/dist/events/mention-dispatch.js +151 -0
- package/dist/events/mention-dispatch.js.map +1 -0
- package/dist/events/notification.d.ts +7 -0
- package/dist/events/notification.js +15 -0
- package/dist/events/notification.js.map +1 -0
- package/dist/events/page.d.ts +44 -0
- package/dist/events/page.js +134 -0
- package/dist/events/page.js.map +1 -0
- package/dist/events/render-cache.d.ts +24 -0
- package/dist/events/render-cache.js +63 -0
- package/dist/events/render-cache.js.map +1 -0
- package/dist/events/user.d.ts +9 -0
- package/dist/events/user.js +39 -0
- package/dist/events/user.js.map +1 -0
- package/dist/form/admin/app.d.ts +2 -0
- package/dist/form/admin/app.js +9 -0
- package/dist/form/admin/app.js.map +1 -0
- package/dist/form/admin/auth.d.ts +2 -0
- package/dist/form/admin/auth.js +9 -0
- package/dist/form/admin/auth.js.map +1 -0
- package/dist/form/admin/aws.d.ts +2 -0
- package/dist/form/admin/aws.js +13 -0
- package/dist/form/admin/aws.js.map +1 -0
- package/dist/form/admin/github.d.ts +2 -0
- package/dist/form/admin/github.js +15 -0
- package/dist/form/admin/github.js.map +1 -0
- package/dist/form/admin/google.d.ts +2 -0
- package/dist/form/admin/google.js +13 -0
- package/dist/form/admin/google.js.map +1 -0
- package/dist/form/admin/mail.d.ts +2 -0
- package/dist/form/admin/mail.js +13 -0
- package/dist/form/admin/mail.js.map +1 -0
- package/dist/form/admin/sec.d.ts +2 -0
- package/dist/form/admin/sec.js +10 -0
- package/dist/form/admin/sec.js.map +1 -0
- package/dist/form/admin/slackSetting.d.ts +2 -0
- package/dist/form/admin/slackSetting.js +13 -0
- package/dist/form/admin/slackSetting.js.map +1 -0
- package/dist/form/admin/userEdit.d.ts +2 -0
- package/dist/form/admin/userEdit.js +9 -0
- package/dist/form/admin/userEdit.js.map +1 -0
- package/dist/form/admin/userInvite.d.ts +2 -0
- package/dist/form/admin/userInvite.js +9 -0
- package/dist/form/admin/userInvite.js.map +1 -0
- package/dist/form/comment.d.ts +2 -0
- package/dist/form/comment.js +9 -0
- package/dist/form/comment.js.map +1 -0
- package/dist/form/index.d.ts +25 -0
- package/dist/form/index.js +48 -0
- package/dist/form/index.js.map +1 -0
- package/dist/form/invited.d.ts +2 -0
- package/dist/form/invited.js +13 -0
- package/dist/form/invited.js.map +1 -0
- package/dist/form/login.d.ts +2 -0
- package/dist/form/login.js +11 -0
- package/dist/form/login.js.map +1 -0
- package/dist/form/me/apiToken.d.ts +2 -0
- package/dist/form/me/apiToken.js +9 -0
- package/dist/form/me/apiToken.js.map +1 -0
- package/dist/form/me/password.d.ts +2 -0
- package/dist/form/me/password.js +11 -0
- package/dist/form/me/password.js.map +1 -0
- package/dist/form/me/user.d.ts +2 -0
- package/dist/form/me/user.js +9 -0
- package/dist/form/me/user.js.map +1 -0
- package/dist/form/register.d.ts +2 -0
- package/dist/form/register.js +13 -0
- package/dist/form/register.js.map +1 -0
- package/dist/form/revision.d.ts +2 -0
- package/dist/form/revision.js +13 -0
- package/dist/form/revision.js.map +1 -0
- package/dist/hono/app.d.ts +19 -0
- package/dist/hono/app.js +21 -0
- package/dist/hono/app.js.map +1 -0
- package/dist/hono/handlers/_helpers/errors.d.ts +61 -0
- package/dist/hono/handlers/_helpers/errors.js +51 -0
- package/dist/hono/handlers/_helpers/errors.js.map +1 -0
- package/dist/hono/handlers/_helpers/user-shape.d.ts +46 -0
- package/dist/hono/handlers/_helpers/user-shape.js +23 -0
- package/dist/hono/handlers/_helpers/user-shape.js.map +1 -0
- package/dist/hono/handlers/access-token.d.ts +221 -0
- package/dist/hono/handlers/access-token.js +113 -0
- package/dist/hono/handlers/access-token.js.map +1 -0
- package/dist/hono/handlers/activation.d.ts +117 -0
- package/dist/hono/handlers/activation.js +77 -0
- package/dist/hono/handlers/activation.js.map +1 -0
- package/dist/hono/handlers/admin/app.d.ts +123 -0
- package/dist/hono/handlers/admin/app.js +76 -0
- package/dist/hono/handlers/admin/app.js.map +1 -0
- package/dist/hono/handlers/admin/auth.d.ts +127 -0
- package/dist/hono/handlers/admin/auth.js +91 -0
- package/dist/hono/handlers/admin/auth.js.map +1 -0
- package/dist/hono/handlers/admin/mail.d.ts +168 -0
- package/dist/hono/handlers/admin/mail.js +76 -0
- package/dist/hono/handlers/admin/mail.js.map +1 -0
- package/dist/hono/handlers/admin/plugins.d.ts +409 -0
- package/dist/hono/handlers/admin/plugins.js +257 -0
- package/dist/hono/handlers/admin/plugins.js.map +1 -0
- package/dist/hono/handlers/admin/search.d.ts +57 -0
- package/dist/hono/handlers/admin/search.js +55 -0
- package/dist/hono/handlers/admin/search.js.map +1 -0
- package/dist/hono/handlers/admin/security.d.ts +112 -0
- package/dist/hono/handlers/admin/security.js +71 -0
- package/dist/hono/handlers/admin/security.js.map +1 -0
- package/dist/hono/handlers/admin/share.d.ts +106 -0
- package/dist/hono/handlers/admin/share.js +55 -0
- package/dist/hono/handlers/admin/share.js.map +1 -0
- package/dist/hono/handlers/admin/storage.d.ts +55 -0
- package/dist/hono/handlers/admin/storage.js +40 -0
- package/dist/hono/handlers/admin/storage.js.map +1 -0
- package/dist/hono/handlers/admin/users.d.ts +1230 -0
- package/dist/hono/handlers/admin/users.js +316 -0
- package/dist/hono/handlers/admin/users.js.map +1 -0
- package/dist/hono/handlers/adminCrypto.d.ts +110 -0
- package/dist/hono/handlers/adminCrypto.js +151 -0
- package/dist/hono/handlers/adminCrypto.js.map +1 -0
- package/dist/hono/handlers/app.d.ts +26 -0
- package/dist/hono/handlers/app.js +34 -0
- package/dist/hono/handlers/app.js.map +1 -0
- package/dist/hono/handlers/attachment-stream.d.ts +4 -0
- package/dist/hono/handlers/attachment-stream.js +211 -0
- package/dist/hono/handlers/attachment-stream.js.map +1 -0
- package/dist/hono/handlers/attachment.d.ts +687 -0
- package/dist/hono/handlers/attachment.js +566 -0
- package/dist/hono/handlers/attachment.js.map +1 -0
- package/dist/hono/handlers/autocomplete.d.ts +160 -0
- package/dist/hono/handlers/autocomplete.js +181 -0
- package/dist/hono/handlers/autocomplete.js.map +1 -0
- package/dist/hono/handlers/backlink.d.ts +78 -0
- package/dist/hono/handlers/backlink.js +93 -0
- package/dist/hono/handlers/backlink.js.map +1 -0
- package/dist/hono/handlers/bookmark.d.ts +558 -0
- package/dist/hono/handlers/bookmark.js +166 -0
- package/dist/hono/handlers/bookmark.js.map +1 -0
- package/dist/hono/handlers/comment.d.ts +231 -0
- package/dist/hono/handlers/comment.js +191 -0
- package/dist/hono/handlers/comment.js.map +1 -0
- package/dist/hono/handlers/draft.d.ts +136 -0
- package/dist/hono/handlers/draft.js +191 -0
- package/dist/hono/handlers/draft.js.map +1 -0
- package/dist/hono/handlers/emailChange.d.ts +124 -0
- package/dist/hono/handlers/emailChange.js +79 -0
- package/dist/hono/handlers/emailChange.js.map +1 -0
- package/dist/hono/handlers/installer.d.ts +94 -0
- package/dist/hono/handlers/installer.js +93 -0
- package/dist/hono/handlers/installer.js.map +1 -0
- package/dist/hono/handlers/inviteAccept.d.ts +180 -0
- package/dist/hono/handlers/inviteAccept.js +94 -0
- package/dist/hono/handlers/inviteAccept.js.map +1 -0
- package/dist/hono/handlers/me.d.ts +401 -0
- package/dist/hono/handlers/me.js +390 -0
- package/dist/hono/handlers/me.js.map +1 -0
- package/dist/hono/handlers/notification.d.ts +274 -0
- package/dist/hono/handlers/notification.js +224 -0
- package/dist/hono/handlers/notification.js.map +1 -0
- package/dist/hono/handlers/oauth.d.ts +299 -0
- package/dist/hono/handlers/oauth.js +443 -0
- package/dist/hono/handlers/oauth.js.map +1 -0
- package/dist/hono/handlers/page-collab.d.ts +79 -0
- package/dist/hono/handlers/page-collab.js +98 -0
- package/dist/hono/handlers/page-collab.js.map +1 -0
- package/dist/hono/handlers/page-preview.d.ts +48 -0
- package/dist/hono/handlers/page-preview.js +83 -0
- package/dist/hono/handlers/page-preview.js.map +1 -0
- package/dist/hono/handlers/page.d.ts +2059 -0
- package/dist/hono/handlers/page.js +793 -0
- package/dist/hono/handlers/page.js.map +1 -0
- package/dist/hono/handlers/passwordReset.d.ts +181 -0
- package/dist/hono/handlers/passwordReset.js +101 -0
- package/dist/hono/handlers/passwordReset.js.map +1 -0
- package/dist/hono/handlers/presence.d.ts +178 -0
- package/dist/hono/handlers/presence.js +163 -0
- package/dist/hono/handlers/presence.js.map +1 -0
- package/dist/hono/handlers/revision.d.ts +345 -0
- package/dist/hono/handlers/revision.js +202 -0
- package/dist/hono/handlers/revision.js.map +1 -0
- package/dist/hono/handlers/search.d.ts +208 -0
- package/dist/hono/handlers/search.js +152 -0
- package/dist/hono/handlers/search.js.map +1 -0
- package/dist/hono/handlers/tokenAuth.d.ts +369 -0
- package/dist/hono/handlers/tokenAuth.js +240 -0
- package/dist/hono/handlers/tokenAuth.js.map +1 -0
- package/dist/hono/handlers/user.d.ts +710 -0
- package/dist/hono/handlers/user.js +212 -0
- package/dist/hono/handlers/user.js.map +1 -0
- package/dist/hono/index.d.ts +289 -0
- package/dist/hono/index.js +240 -0
- package/dist/hono/index.js.map +1 -0
- package/dist/hono/middleware/admin.d.ts +5 -0
- package/dist/hono/middleware/admin.js +34 -0
- package/dist/hono/middleware/admin.js.map +1 -0
- package/dist/hono/middleware/auth.d.ts +54 -0
- package/dist/hono/middleware/auth.js +142 -0
- package/dist/hono/middleware/auth.js.map +1 -0
- package/dist/hono/middleware/cors.d.ts +3 -0
- package/dist/hono/middleware/cors.js +86 -0
- package/dist/hono/middleware/cors.js.map +1 -0
- package/dist/hono/middleware/default-hook.d.ts +8 -0
- package/dist/hono/middleware/default-hook.js +17 -0
- package/dist/hono/middleware/default-hook.js.map +1 -0
- package/dist/hono/middleware/error-handler.d.ts +2 -0
- package/dist/hono/middleware/error-handler.js +20 -0
- package/dist/hono/middleware/error-handler.js.map +1 -0
- package/dist/hono/middleware/rate-limit.d.ts +57 -0
- package/dist/hono/middleware/rate-limit.js +42 -0
- package/dist/hono/middleware/rate-limit.js.map +1 -0
- package/dist/hono/middleware/require-scope.d.ts +50 -0
- package/dist/hono/middleware/require-scope.js +64 -0
- package/dist/hono/middleware/require-scope.js.map +1 -0
- package/dist/hono/path-rewrite.d.ts +15 -0
- package/dist/hono/path-rewrite.js +59 -0
- package/dist/hono/path-rewrite.js.map +1 -0
- package/dist/mail/i18n/en.d.ts +2 -0
- package/dist/mail/i18n/en.js +66 -0
- package/dist/mail/i18n/en.js.map +1 -0
- package/dist/mail/i18n/index.d.ts +46 -0
- package/dist/mail/i18n/index.js +31 -0
- package/dist/mail/i18n/index.js.map +1 -0
- package/dist/mail/i18n/ja.d.ts +2 -0
- package/dist/mail/i18n/ja.js +66 -0
- package/dist/mail/i18n/ja.js.map +1 -0
- package/dist/mcp/attach.d.ts +25 -0
- package/dist/mcp/attach.js +104 -0
- package/dist/mcp/attach.js.map +1 -0
- package/dist/mcp/dispatch.d.ts +59 -0
- package/dist/mcp/dispatch.js +70 -0
- package/dist/mcp/dispatch.js.map +1 -0
- package/dist/mcp/result.d.ts +40 -0
- package/dist/mcp/result.js +78 -0
- package/dist/mcp/result.js.map +1 -0
- package/dist/mcp/server.d.ts +67 -0
- package/dist/mcp/server.js +113 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/page.d.ts +2 -0
- package/dist/mcp/tools/page.js +256 -0
- package/dist/mcp/tools/page.js.map +1 -0
- package/dist/mcp/tools/search.d.ts +2 -0
- package/dist/mcp/tools/search.js +36 -0
- package/dist/mcp/tools/search.js.map +1 -0
- package/dist/middlewares/accessTokenParser.d.ts +4 -0
- package/dist/middlewares/accessTokenParser.js +29 -0
- package/dist/middlewares/accessTokenParser.js.map +1 -0
- package/dist/middlewares/adminRequired.d.ts +10 -0
- package/dist/middlewares/adminRequired.js +35 -0
- package/dist/middlewares/adminRequired.js.map +1 -0
- package/dist/middlewares/applicationInstalled.d.ts +3 -0
- package/dist/middlewares/applicationInstalled.js +20 -0
- package/dist/middlewares/applicationInstalled.js.map +1 -0
- package/dist/middlewares/applicationNotInstalled.d.ts +3 -0
- package/dist/middlewares/applicationNotInstalled.js +13 -0
- package/dist/middlewares/applicationNotInstalled.js.map +1 -0
- package/dist/middlewares/basicAuth.d.ts +4 -0
- package/dist/middlewares/basicAuth.js +23 -0
- package/dist/middlewares/basicAuth.js.map +1 -0
- package/dist/middlewares/csrfVerify.d.ts +4 -0
- package/dist/middlewares/csrfVerify.js +24 -0
- package/dist/middlewares/csrfVerify.js.map +1 -0
- package/dist/middlewares/encodeSpace.d.ts +3 -0
- package/dist/middlewares/encodeSpace.js +14 -0
- package/dist/middlewares/encodeSpace.js.map +1 -0
- package/dist/middlewares/fileAccessRightOrLoginRequired.d.ts +4 -0
- package/dist/middlewares/fileAccessRightOrLoginRequired.js +29 -0
- package/dist/middlewares/fileAccessRightOrLoginRequired.js.map +1 -0
- package/dist/middlewares/index.d.ts +16 -0
- package/dist/middlewares/index.js +30 -0
- package/dist/middlewares/index.js.map +1 -0
- package/dist/middlewares/jwtAdminRequired.d.ts +8 -0
- package/dist/middlewares/jwtAdminRequired.js +35 -0
- package/dist/middlewares/jwtAdminRequired.js.map +1 -0
- package/dist/middlewares/jwtAuth.d.ts +4 -0
- package/dist/middlewares/jwtAuth.js +104 -0
- package/dist/middlewares/jwtAuth.js.map +1 -0
- package/dist/middlewares/loginChecker.d.ts +4 -0
- package/dist/middlewares/loginChecker.js +32 -0
- package/dist/middlewares/loginChecker.js.map +1 -0
- package/dist/middlewares/loginRequired.d.ts +4 -0
- package/dist/middlewares/loginRequired.js +88 -0
- package/dist/middlewares/loginRequired.js.map +1 -0
- package/dist/migration/cli-api.d.ts +83 -0
- package/dist/migration/cli-api.js +128 -0
- package/dist/migration/cli-api.js.map +1 -0
- package/dist/migration/migrations/index.d.ts +12 -0
- package/dist/migration/migrations/index.js +24 -0
- package/dist/migration/migrations/index.js.map +1 -0
- package/dist/migration/migrations/page-status-default.d.ts +25 -0
- package/dist/migration/migrations/page-status-default.js +79 -0
- package/dist/migration/migrations/page-status-default.js.map +1 -0
- package/dist/migration/migrations/revisions-schema-unify.d.ts +33 -0
- package/dist/migration/migrations/revisions-schema-unify.js +88 -0
- package/dist/migration/migrations/revisions-schema-unify.js.map +1 -0
- package/dist/migration/migrations/user-unique-prepare.d.ts +1 -0
- package/dist/migration/migrations/user-unique-prepare.js +214 -0
- package/dist/migration/migrations/user-unique-prepare.js.map +1 -0
- package/dist/migration/migrations/wikilink-format.d.ts +97 -0
- package/dist/migration/migrations/wikilink-format.js +418 -0
- package/dist/migration/migrations/wikilink-format.js.map +1 -0
- package/dist/migration/rebuild-api.d.ts +50 -0
- package/dist/migration/rebuild-api.js +45 -0
- package/dist/migration/rebuild-api.js.map +1 -0
- package/dist/migration/rebuild-runner.d.ts +64 -0
- package/dist/migration/rebuild-runner.js +42 -0
- package/dist/migration/rebuild-runner.js.map +1 -0
- package/dist/migration/rebuilds/index.d.ts +26 -0
- package/dist/migration/rebuilds/index.js +69 -0
- package/dist/migration/rebuilds/index.js.map +1 -0
- package/dist/migration/registry.d.ts +15 -0
- package/dist/migration/registry.js +96 -0
- package/dist/migration/registry.js.map +1 -0
- package/dist/migration/run-boot-migrations.d.ts +31 -0
- package/dist/migration/run-boot-migrations.js +95 -0
- package/dist/migration/run-boot-migrations.js.map +1 -0
- package/dist/migration/runner.d.ts +120 -0
- package/dist/migration/runner.js +276 -0
- package/dist/migration/runner.js.map +1 -0
- package/dist/migration/types.d.ts +153 -0
- package/dist/migration/types.js +13 -0
- package/dist/migration/types.js.map +1 -0
- package/dist/models/activity.d.ts +34 -0
- package/dist/models/activity.js +263 -0
- package/dist/models/activity.js.map +1 -0
- package/dist/models/attachment.d.ts +25 -0
- package/dist/models/attachment.js +82 -0
- package/dist/models/attachment.js.map +1 -0
- package/dist/models/backlink.d.ts +19 -0
- package/dist/models/backlink.js +138 -0
- package/dist/models/backlink.js.map +1 -0
- package/dist/models/bookmark.d.ts +28 -0
- package/dist/models/bookmark.js +136 -0
- package/dist/models/bookmark.js.map +1 -0
- package/dist/models/comment.d.ts +21 -0
- package/dist/models/comment.js +87 -0
- package/dist/models/comment.js.map +1 -0
- package/dist/models/config-sensitive.d.ts +21 -0
- package/dist/models/config-sensitive.js +71 -0
- package/dist/models/config-sensitive.js.map +1 -0
- package/dist/models/config.d.ts +34 -0
- package/dist/models/config.js +161 -0
- package/dist/models/config.js.map +1 -0
- package/dist/models/index.d.ts +30 -0
- package/dist/models/index.js +55 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/migration-application.d.ts +54 -0
- package/dist/models/migration-application.js +36 -0
- package/dist/models/migration-application.js.map +1 -0
- package/dist/models/notification.d.ts +28 -0
- package/dist/models/notification.js +285 -0
- package/dist/models/notification.js.map +1 -0
- package/dist/models/oauth-authorization-code.d.ts +34 -0
- package/dist/models/oauth-authorization-code.js +100 -0
- package/dist/models/oauth-authorization-code.js.map +1 -0
- package/dist/models/oauth-client.d.ts +36 -0
- package/dist/models/oauth-client.js +56 -0
- package/dist/models/oauth-client.js.map +1 -0
- package/dist/models/oauth-device-code.d.ts +55 -0
- package/dist/models/oauth-device-code.js +158 -0
- package/dist/models/oauth-device-code.js.map +1 -0
- package/dist/models/oauth-refresh-token.d.ts +31 -0
- package/dist/models/oauth-refresh-token.js +118 -0
- package/dist/models/oauth-refresh-token.js.map +1 -0
- package/dist/models/page-yjs-update.d.ts +35 -0
- package/dist/models/page-yjs-update.js +33 -0
- package/dist/models/page-yjs-update.js.map +1 -0
- package/dist/models/page.d.ts +200 -0
- package/dist/models/page.js +1117 -0
- package/dist/models/page.js.map +1 -0
- package/dist/models/personal-access-token.d.ts +30 -0
- package/dist/models/personal-access-token.js +107 -0
- package/dist/models/personal-access-token.js.map +1 -0
- package/dist/models/plugin-render-cache.d.ts +40 -0
- package/dist/models/plugin-render-cache.js +39 -0
- package/dist/models/plugin-render-cache.js.map +1 -0
- package/dist/models/revision.d.ts +145 -0
- package/dist/models/revision.js +241 -0
- package/dist/models/revision.js.map +1 -0
- package/dist/models/share.d.ts +38 -0
- package/dist/models/share.js +137 -0
- package/dist/models/share.js.map +1 -0
- package/dist/models/shareAccess.d.ts +20 -0
- package/dist/models/shareAccess.js +45 -0
- package/dist/models/shareAccess.js.map +1 -0
- package/dist/models/tracking.d.ts +14 -0
- package/dist/models/tracking.js +14 -0
- package/dist/models/tracking.js.map +1 -0
- package/dist/models/updatePost.d.ts +25 -0
- package/dist/models/updatePost.js +87 -0
- package/dist/models/updatePost.js.map +1 -0
- package/dist/models/user.d.ts +144 -0
- package/dist/models/user.js +681 -0
- package/dist/models/user.js.map +1 -0
- package/dist/models/watcher.d.ts +23 -0
- package/dist/models/watcher.js +75 -0
- package/dist/models/watcher.js.map +1 -0
- package/dist/notifications/attach.d.ts +63 -0
- package/dist/notifications/attach.js +426 -0
- package/dist/notifications/attach.js.map +1 -0
- package/dist/notifications/channel.d.ts +13 -0
- package/dist/notifications/channel.js +18 -0
- package/dist/notifications/channel.js.map +1 -0
- package/dist/plugin/index.d.ts +2 -0
- package/dist/plugin/index.js +6 -0
- package/dist/plugin/index.js.map +1 -0
- package/dist/plugin/plugin-context.d.ts +22 -0
- package/dist/plugin/plugin-context.js +126 -0
- package/dist/plugin/plugin-context.js.map +1 -0
- package/dist/plugin/plugin-manager.d.ts +164 -0
- package/dist/plugin/plugin-manager.js +328 -0
- package/dist/plugin/plugin-manager.js.map +1 -0
- package/dist/plugin/plugin-namespace.d.ts +28 -0
- package/dist/plugin/plugin-namespace.js +53 -0
- package/dist/plugin/plugin-namespace.js.map +1 -0
- package/dist/plugin/registries.d.ts +38 -0
- package/dist/plugin/registries.js +71 -0
- package/dist/plugin/registries.js.map +1 -0
- package/dist/plugin/schema-serializer.d.ts +34 -0
- package/dist/plugin/schema-serializer.js +122 -0
- package/dist/plugin/schema-serializer.js.map +1 -0
- package/dist/plugin/topo-sort.d.ts +15 -0
- package/dist/plugin/topo-sort.js +59 -0
- package/dist/plugin/topo-sort.js.map +1 -0
- package/dist/presence/attach.d.ts +36 -0
- package/dist/presence/attach.js +399 -0
- package/dist/presence/attach.js.map +1 -0
- package/dist/renderer/__fixtures__/echo-embed.d.ts +27 -0
- package/dist/renderer/__fixtures__/echo-embed.js +24 -0
- package/dist/renderer/__fixtures__/echo-embed.js.map +1 -0
- package/dist/renderer/cache/index.d.ts +60 -0
- package/dist/renderer/cache/index.js +219 -0
- package/dist/renderer/cache/index.js.map +1 -0
- package/dist/renderer/cache/mongodb-cache.d.ts +82 -0
- package/dist/renderer/cache/mongodb-cache.js +180 -0
- package/dist/renderer/cache/mongodb-cache.js.map +1 -0
- package/dist/renderer/cache/reservation.d.ts +20 -0
- package/dist/renderer/cache/reservation.js +115 -0
- package/dist/renderer/cache/reservation.js.map +1 -0
- package/dist/renderer/core/_mdast-walk.d.ts +35 -0
- package/dist/renderer/core/_mdast-walk.js +45 -0
- package/dist/renderer/core/_mdast-walk.js.map +1 -0
- package/dist/renderer/core/code-block-dispatch.d.ts +31 -0
- package/dist/renderer/core/code-block-dispatch.js +166 -0
- package/dist/renderer/core/code-block-dispatch.js.map +1 -0
- package/dist/renderer/core/code-blocks.d.ts +12 -0
- package/dist/renderer/core/code-blocks.js +32 -0
- package/dist/renderer/core/code-blocks.js.map +1 -0
- package/dist/renderer/core/embed-tags.d.ts +14 -0
- package/dist/renderer/core/embed-tags.js +154 -0
- package/dist/renderer/core/embed-tags.js.map +1 -0
- package/dist/renderer/core/headings.d.ts +16 -0
- package/dist/renderer/core/headings.js +31 -0
- package/dist/renderer/core/headings.js.map +1 -0
- package/dist/renderer/core/index.d.ts +65 -0
- package/dist/renderer/core/index.js +83 -0
- package/dist/renderer/core/index.js.map +1 -0
- package/dist/renderer/core/mention-resolve.d.ts +39 -0
- package/dist/renderer/core/mention-resolve.js +75 -0
- package/dist/renderer/core/mention-resolve.js.map +1 -0
- package/dist/renderer/core/mentions.d.ts +2 -0
- package/dist/renderer/core/mentions.js +83 -0
- package/dist/renderer/core/mentions.js.map +1 -0
- package/dist/renderer/core/syntax-highlight.d.ts +21 -0
- package/dist/renderer/core/syntax-highlight.js +64 -0
- package/dist/renderer/core/syntax-highlight.js.map +1 -0
- package/dist/renderer/core/url-inline-expand.d.ts +9 -0
- package/dist/renderer/core/url-inline-expand.js +157 -0
- package/dist/renderer/core/url-inline-expand.js.map +1 -0
- package/dist/renderer/core/wikilinks.d.ts +2 -0
- package/dist/renderer/core/wikilinks.js +118 -0
- package/dist/renderer/core/wikilinks.js.map +1 -0
- package/dist/renderer/index.d.ts +67 -0
- package/dist/renderer/index.js +99 -0
- package/dist/renderer/index.js.map +1 -0
- package/dist/renderer/pipeline.d.ts +134 -0
- package/dist/renderer/pipeline.js +203 -0
- package/dist/renderer/pipeline.js.map +1 -0
- package/dist/renderer/registry.d.ts +83 -0
- package/dist/renderer/registry.js +130 -0
- package/dist/renderer/registry.js.map +1 -0
- package/dist/renderer/serialize.d.ts +27 -0
- package/dist/renderer/serialize.js +46 -0
- package/dist/renderer/serialize.js.map +1 -0
- package/dist/renderer/version.d.ts +30 -0
- package/dist/renderer/version.js +34 -0
- package/dist/renderer/version.js.map +1 -0
- package/dist/routes/admin.d.ts +4 -0
- package/dist/routes/admin.js +17 -0
- package/dist/routes/admin.js.map +1 -0
- package/dist/routes/api/admin.d.ts +4 -0
- package/dist/routes/api/admin.js +37 -0
- package/dist/routes/api/admin.js.map +1 -0
- package/dist/routes/api/attachment.d.ts +4 -0
- package/dist/routes/api/attachment.js +19 -0
- package/dist/routes/api/attachment.js.map +1 -0
- package/dist/routes/api/bookmark.d.ts +4 -0
- package/dist/routes/api/bookmark.js +15 -0
- package/dist/routes/api/bookmark.js.map +1 -0
- package/dist/routes/api/comment.d.ts +4 -0
- package/dist/routes/api/comment.js +14 -0
- package/dist/routes/api/comment.js.map +1 -0
- package/dist/routes/api/index.d.ts +4 -0
- package/dist/routes/api/index.js +36 -0
- package/dist/routes/api/index.js.map +1 -0
- package/dist/routes/api/like.d.ts +4 -0
- package/dist/routes/api/like.js +13 -0
- package/dist/routes/api/like.js.map +1 -0
- package/dist/routes/api/notification.d.ts +4 -0
- package/dist/routes/api/notification.js +15 -0
- package/dist/routes/api/notification.js.map +1 -0
- package/dist/routes/api/page.d.ts +4 -0
- package/dist/routes/api/page.js +24 -0
- package/dist/routes/api/page.js.map +1 -0
- package/dist/routes/api/revision.d.ts +4 -0
- package/dist/routes/api/revision.js +14 -0
- package/dist/routes/api/revision.js.map +1 -0
- package/dist/routes/api/share.d.ts +4 -0
- package/dist/routes/api/share.js +16 -0
- package/dist/routes/api/share.js.map +1 -0
- package/dist/routes/api/version.d.ts +4 -0
- package/dist/routes/api/version.js +10 -0
- package/dist/routes/api/version.js.map +1 -0
- package/dist/routes/index.d.ts +4 -0
- package/dist/routes/index.js +71 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/login.d.ts +4 -0
- package/dist/routes/login.js +18 -0
- package/dist/routes/login.js.map +1 -0
- package/dist/routes/me.d.ts +4 -0
- package/dist/routes/me.js +24 -0
- package/dist/routes/me.js.map +1 -0
- package/dist/routes/ts-rest/admin/app.d.ts +4 -0
- package/dist/routes/ts-rest/admin/app.js +67 -0
- package/dist/routes/ts-rest/admin/app.js.map +1 -0
- package/dist/routes/ts-rest/admin/auth.d.ts +4 -0
- package/dist/routes/ts-rest/admin/auth.js +95 -0
- package/dist/routes/ts-rest/admin/auth.js.map +1 -0
- package/dist/routes/ts-rest/admin/index.d.ts +10 -0
- package/dist/routes/ts-rest/admin/index.js +35 -0
- package/dist/routes/ts-rest/admin/index.js.map +1 -0
- package/dist/routes/ts-rest/admin/mail.d.ts +4 -0
- package/dist/routes/ts-rest/admin/mail.js +156 -0
- package/dist/routes/ts-rest/admin/mail.js.map +1 -0
- package/dist/routes/ts-rest/admin/plugins.d.ts +4 -0
- package/dist/routes/ts-rest/admin/plugins.js +317 -0
- package/dist/routes/ts-rest/admin/plugins.js.map +1 -0
- package/dist/routes/ts-rest/admin/search.d.ts +4 -0
- package/dist/routes/ts-rest/admin/search.js +67 -0
- package/dist/routes/ts-rest/admin/search.js.map +1 -0
- package/dist/routes/ts-rest/admin/security.d.ts +4 -0
- package/dist/routes/ts-rest/admin/security.js +114 -0
- package/dist/routes/ts-rest/admin/security.js.map +1 -0
- package/dist/routes/ts-rest/admin/share.d.ts +4 -0
- package/dist/routes/ts-rest/admin/share.js +69 -0
- package/dist/routes/ts-rest/admin/share.js.map +1 -0
- package/dist/routes/ts-rest/admin/storage.d.ts +4 -0
- package/dist/routes/ts-rest/admin/storage.js +59 -0
- package/dist/routes/ts-rest/admin/storage.js.map +1 -0
- package/dist/routes/ts-rest/admin/users.d.ts +4 -0
- package/dist/routes/ts-rest/admin/users.js +215 -0
- package/dist/routes/ts-rest/admin/users.js.map +1 -0
- package/dist/routes/ts-rest/adminCrypto.d.ts +4 -0
- package/dist/routes/ts-rest/adminCrypto.js +111 -0
- package/dist/routes/ts-rest/adminCrypto.js.map +1 -0
- package/dist/routes/ts-rest/app.d.ts +4 -0
- package/dist/routes/ts-rest/app.js +23 -0
- package/dist/routes/ts-rest/app.js.map +1 -0
- package/dist/routes/ts-rest/attachment.d.ts +4 -0
- package/dist/routes/ts-rest/attachment.js +830 -0
- package/dist/routes/ts-rest/attachment.js.map +1 -0
- package/dist/routes/ts-rest/auth.d.ts +4 -0
- package/dist/routes/ts-rest/auth.js +70 -0
- package/dist/routes/ts-rest/auth.js.map +1 -0
- package/dist/routes/ts-rest/autocomplete.d.ts +30 -0
- package/dist/routes/ts-rest/autocomplete.js +189 -0
- package/dist/routes/ts-rest/autocomplete.js.map +1 -0
- package/dist/routes/ts-rest/backlink.d.ts +4 -0
- package/dist/routes/ts-rest/backlink.js +106 -0
- package/dist/routes/ts-rest/backlink.js.map +1 -0
- package/dist/routes/ts-rest/bookmark.d.ts +4 -0
- package/dist/routes/ts-rest/bookmark.js +189 -0
- package/dist/routes/ts-rest/bookmark.js.map +1 -0
- package/dist/routes/ts-rest/comment.d.ts +4 -0
- package/dist/routes/ts-rest/comment.js +217 -0
- package/dist/routes/ts-rest/comment.js.map +1 -0
- package/dist/routes/ts-rest/draft.d.ts +22 -0
- package/dist/routes/ts-rest/draft.js +200 -0
- package/dist/routes/ts-rest/draft.js.map +1 -0
- package/dist/routes/ts-rest/index.d.ts +4 -0
- package/dist/routes/ts-rest/index.js +103 -0
- package/dist/routes/ts-rest/index.js.map +1 -0
- package/dist/routes/ts-rest/installer.d.ts +4 -0
- package/dist/routes/ts-rest/installer.js +77 -0
- package/dist/routes/ts-rest/installer.js.map +1 -0
- package/dist/routes/ts-rest/me.d.ts +4 -0
- package/dist/routes/ts-rest/me.js +410 -0
- package/dist/routes/ts-rest/me.js.map +1 -0
- package/dist/routes/ts-rest/notification.d.ts +4 -0
- package/dist/routes/ts-rest/notification.js +241 -0
- package/dist/routes/ts-rest/notification.js.map +1 -0
- package/dist/routes/ts-rest/page-collab.d.ts +29 -0
- package/dist/routes/ts-rest/page-collab.js +90 -0
- package/dist/routes/ts-rest/page-collab.js.map +1 -0
- package/dist/routes/ts-rest/page-preview.d.ts +26 -0
- package/dist/routes/ts-rest/page-preview.js +80 -0
- package/dist/routes/ts-rest/page-preview.js.map +1 -0
- package/dist/routes/ts-rest/page.d.ts +4 -0
- package/dist/routes/ts-rest/page.js +676 -0
- package/dist/routes/ts-rest/page.js.map +1 -0
- package/dist/routes/ts-rest/presence.d.ts +30 -0
- package/dist/routes/ts-rest/presence.js +155 -0
- package/dist/routes/ts-rest/presence.js.map +1 -0
- package/dist/routes/ts-rest/revision.d.ts +4 -0
- package/dist/routes/ts-rest/revision.js +240 -0
- package/dist/routes/ts-rest/revision.js.map +1 -0
- package/dist/routes/ts-rest/search.d.ts +4 -0
- package/dist/routes/ts-rest/search.js +121 -0
- package/dist/routes/ts-rest/search.js.map +1 -0
- package/dist/routes/ts-rest/tokenAuth.d.ts +4 -0
- package/dist/routes/ts-rest/tokenAuth.js +94 -0
- package/dist/routes/ts-rest/tokenAuth.js.map +1 -0
- package/dist/routes/ts-rest/user.d.ts +4 -0
- package/dist/routes/ts-rest/user.js +307 -0
- package/dist/routes/ts-rest/user.js.map +1 -0
- package/dist/service/config.d.ts +50 -0
- package/dist/service/config.js +202 -0
- package/dist/service/config.js.map +1 -0
- package/dist/service/lru.d.ts +11 -0
- package/dist/service/lru.js +47 -0
- package/dist/service/lru.js.map +1 -0
- package/dist/service/mail.d.ts +107 -0
- package/dist/service/mail.js +220 -0
- package/dist/service/mail.js.map +1 -0
- package/dist/service/notification.d.ts +9 -0
- package/dist/service/notification.js +19 -0
- package/dist/service/notification.js.map +1 -0
- package/dist/service/presence.d.ts +219 -0
- package/dist/service/presence.js +602 -0
- package/dist/service/presence.js.map +1 -0
- package/dist/types/error.d.ts +13 -0
- package/dist/types/error.js +13 -0
- package/dist/types/error.js.map +1 -0
- package/dist/types/express.d.ts +34 -0
- package/dist/types/express.js +50 -0
- package/dist/types/express.js.map +1 -0
- package/dist/types/mongoose-extensions.d.ts +8 -0
- package/dist/types/mongoose-extensions.js +24 -0
- package/dist/types/mongoose-extensions.js.map +1 -0
- package/dist/util/accessTokenParser.d.ts +1 -0
- package/dist/util/accessTokenParser.js +34 -0
- package/dist/util/accessTokenParser.js.map +1 -0
- package/dist/util/activityDefine.d.ts +15 -0
- package/dist/util/activityDefine.js +52 -0
- package/dist/util/activityDefine.js.map +1 -0
- package/dist/util/admin-config.d.ts +57 -0
- package/dist/util/admin-config.js +99 -0
- package/dist/util/admin-config.js.map +1 -0
- package/dist/util/admin-pager.d.ts +24 -0
- package/dist/util/admin-pager.js +73 -0
- package/dist/util/admin-pager.js.map +1 -0
- package/dist/util/apiPaginate.d.ts +11 -0
- package/dist/util/apiPaginate.js +33 -0
- package/dist/util/apiPaginate.js.map +1 -0
- package/dist/util/apiResponse.d.ts +9 -0
- package/dist/util/apiResponse.js +23 -0
- package/dist/util/apiResponse.js.map +1 -0
- package/dist/util/auth.d.ts +11 -0
- package/dist/util/auth.js +48 -0
- package/dist/util/auth.js.map +1 -0
- package/dist/util/auto-watch.d.ts +35 -0
- package/dist/util/auto-watch.js +24 -0
- package/dist/util/auto-watch.js.map +1 -0
- package/dist/util/autocomplete-match.d.ts +44 -0
- package/dist/util/autocomplete-match.js +80 -0
- package/dist/util/autocomplete-match.js.map +1 -0
- package/dist/util/aws-config-migration.d.ts +11 -0
- package/dist/util/aws-config-migration.js +68 -0
- package/dist/util/aws-config-migration.js.map +1 -0
- package/dist/util/boot-reporter.d.ts +130 -0
- package/dist/util/boot-reporter.js +242 -0
- package/dist/util/boot-reporter.js.map +1 -0
- package/dist/util/collab-cap.d.ts +39 -0
- package/dist/util/collab-cap.js +90 -0
- package/dist/util/collab-cap.js.map +1 -0
- package/dist/util/crypto.d.ts +39 -0
- package/dist/util/crypto.js +105 -0
- package/dist/util/crypto.js.map +1 -0
- package/dist/util/dedup-users.d.ts +96 -0
- package/dist/util/dedup-users.js +149 -0
- package/dist/util/dedup-users.js.map +1 -0
- package/dist/util/editor-cap-counter.d.ts +90 -0
- package/dist/util/editor-cap-counter.js +175 -0
- package/dist/util/editor-cap-counter.js.map +1 -0
- package/dist/util/fileUploader.d.ts +55 -0
- package/dist/util/fileUploader.js +70 -0
- package/dist/util/fileUploader.js.map +1 -0
- package/dist/util/formUtil.d.ts +2 -0
- package/dist/util/formUtil.js +15 -0
- package/dist/util/formUtil.js.map +1 -0
- package/dist/util/githubAuth.d.ts +2 -0
- package/dist/util/githubAuth.js +82 -0
- package/dist/util/githubAuth.js.map +1 -0
- package/dist/util/googleAuth.d.ts +2 -0
- package/dist/util/googleAuth.js +85 -0
- package/dist/util/googleAuth.js.map +1 -0
- package/dist/util/jwt.d.ts +50 -0
- package/dist/util/jwt.js +127 -0
- package/dist/util/jwt.js.map +1 -0
- package/dist/util/linkDetector.d.ts +3 -0
- package/dist/util/linkDetector.js +91 -0
- package/dist/util/linkDetector.js.map +1 -0
- package/dist/util/mail-token.d.ts +24 -0
- package/dist/util/mail-token.js +117 -0
- package/dist/util/mail-token.js.map +1 -0
- package/dist/util/mailer.d.ts +7 -0
- package/dist/util/mailer.js +98 -0
- package/dist/util/mailer.js.map +1 -0
- package/dist/util/map-duplicate-key-error.d.ts +26 -0
- package/dist/util/map-duplicate-key-error.js +41 -0
- package/dist/util/map-duplicate-key-error.js.map +1 -0
- package/dist/util/mongoose-paginate.d.ts +10 -0
- package/dist/util/mongoose-paginate.js +23 -0
- package/dist/util/mongoose-paginate.js.map +1 -0
- package/dist/util/notifications-token.d.ts +35 -0
- package/dist/util/notifications-token.js +140 -0
- package/dist/util/notifications-token.js.map +1 -0
- package/dist/util/oauth-client-seed.d.ts +2 -0
- package/dist/util/oauth-client-seed.js +48 -0
- package/dist/util/oauth-client-seed.js.map +1 -0
- package/dist/util/oauth-redirect-uri.d.ts +2 -0
- package/dist/util/oauth-redirect-uri.js +55 -0
- package/dist/util/oauth-redirect-uri.js.map +1 -0
- package/dist/util/page-response.d.ts +113 -0
- package/dist/util/page-response.js +154 -0
- package/dist/util/page-response.js.map +1 -0
- package/dist/util/page-search-index.d.ts +19 -0
- package/dist/util/page-search-index.js +91 -0
- package/dist/util/page-search-index.js.map +1 -0
- package/dist/util/page-status-migration.d.ts +23 -0
- package/dist/util/page-status-migration.js +48 -0
- package/dist/util/page-status-migration.js.map +1 -0
- package/dist/util/path.d.ts +2 -0
- package/dist/util/path.js +12 -0
- package/dist/util/path.js.map +1 -0
- package/dist/util/pkce.d.ts +13 -0
- package/dist/util/pkce.js +30 -0
- package/dist/util/pkce.js.map +1 -0
- package/dist/util/presence-token.d.ts +21 -0
- package/dist/util/presence-token.js +120 -0
- package/dist/util/presence-token.js.map +1 -0
- package/dist/util/rate-limit.d.ts +67 -0
- package/dist/util/rate-limit.js +87 -0
- package/dist/util/rate-limit.js.map +1 -0
- package/dist/util/rebuild-backlink.d.ts +25 -0
- package/dist/util/rebuild-backlink.js +7 -0
- package/dist/util/rebuild-backlink.js.map +1 -0
- package/dist/util/rebuild-renderer.d.ts +31 -0
- package/dist/util/rebuild-renderer.js +7 -0
- package/dist/util/rebuild-renderer.js.map +1 -0
- package/dist/util/redis-opts.d.ts +17 -0
- package/dist/util/redis-opts.js +40 -0
- package/dist/util/redis-opts.js.map +1 -0
- package/dist/util/regex.d.ts +2 -0
- package/dist/util/regex.js +8 -0
- package/dist/util/regex.js.map +1 -0
- package/dist/util/search-rebuild.d.ts +18 -0
- package/dist/util/search-rebuild.js +28 -0
- package/dist/util/search-rebuild.js.map +1 -0
- package/dist/util/ssr.d.ts +3 -0
- package/dist/util/ssr.js +9 -0
- package/dist/util/ssr.js.map +1 -0
- package/dist/util/storage-copy.d.ts +40 -0
- package/dist/util/storage-copy.js +123 -0
- package/dist/util/storage-copy.js.map +1 -0
- package/dist/util/ts-rest-helpers.d.ts +110 -0
- package/dist/util/ts-rest-helpers.js +110 -0
- package/dist/util/ts-rest-helpers.js.map +1 -0
- package/dist/util/url.d.ts +1 -0
- package/dist/util/url.js +11 -0
- package/dist/util/url.js.map +1 -0
- package/dist/util/user-code.d.ts +10 -0
- package/dist/util/user-code.js +55 -0
- package/dist/util/user-code.js.map +1 -0
- package/dist/util/view.d.ts +10 -0
- package/dist/util/view.js +99 -0
- package/dist/util/view.js.map +1 -0
- package/dist/util/watcher-backfill.d.ts +30 -0
- package/dist/util/watcher-backfill.js +43 -0
- package/dist/util/watcher-backfill.js.map +1 -0
- package/dist/util/ws-token.d.ts +24 -0
- package/dist/util/ws-token.js +134 -0
- package/dist/util/ws-token.js.map +1 -0
- package/package.json +106 -0
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ARRAY_USER_REFS = exports.SCALAR_USER_REFS = void 0;
|
|
4
|
+
exports.reassignUserReferences = reassignUserReferences;
|
|
5
|
+
exports.mergeUserGroups = mergeUserGroups;
|
|
6
|
+
exports.chooseSurvivor = chooseSurvivor;
|
|
7
|
+
/**
|
|
8
|
+
* The full scalar reference set (uniqueness spec §c). `from` is matched by
|
|
9
|
+
* exact equality; reassigned to `to` via `$set`.
|
|
10
|
+
*/
|
|
11
|
+
exports.SCALAR_USER_REFS = [
|
|
12
|
+
{ collection: 'pages', field: 'creator' },
|
|
13
|
+
{ collection: 'pages', field: 'lastUpdateUser' },
|
|
14
|
+
{ collection: 'revisions', field: 'author' },
|
|
15
|
+
{ collection: 'revisions', field: 'savedBy' },
|
|
16
|
+
{ collection: 'comments', field: 'creator' },
|
|
17
|
+
// `bookmarks.user`: the compound-unique conflict (a page both users
|
|
18
|
+
// bookmarked) is resolved first by UNIQUE_PER_USER_REFS below; the remaining
|
|
19
|
+
// non-conflicting rows reassign here like any other scalar.
|
|
20
|
+
{ collection: 'bookmarks', field: 'user' },
|
|
21
|
+
{ collection: 'attachments', field: 'creator' },
|
|
22
|
+
{ collection: 'shares', field: 'creator' },
|
|
23
|
+
{ collection: 'watchers', field: 'user' },
|
|
24
|
+
{ collection: 'activities', field: 'user' },
|
|
25
|
+
{ collection: 'notifications', field: 'user' },
|
|
26
|
+
{ collection: 'updateposts', field: 'creator' },
|
|
27
|
+
];
|
|
28
|
+
/** The full array reference set (uniqueness spec §c). */
|
|
29
|
+
exports.ARRAY_USER_REFS = [
|
|
30
|
+
{ collection: 'pages', field: 'grantedUsers' },
|
|
31
|
+
{ collection: 'pages', field: 'liker' },
|
|
32
|
+
{ collection: 'pages', field: 'seenUsers' },
|
|
33
|
+
{ collection: 'revisions', field: 'contributors' },
|
|
34
|
+
];
|
|
35
|
+
/**
|
|
36
|
+
* Collections with a unique `{ <pageField>, user }` index where reassigning a
|
|
37
|
+
* losing user's row onto the survivor could collide with an existing survivor
|
|
38
|
+
* row. Those losing rows are deleted before the generic scalar reassign so the
|
|
39
|
+
* `$set` never trips the compound unique index. `bookmarks` is the only such
|
|
40
|
+
* collection in the §c set.
|
|
41
|
+
*/
|
|
42
|
+
const UNIQUE_PER_USER_REFS = [{ collection: 'bookmarks', userField: 'user' }];
|
|
43
|
+
/**
|
|
44
|
+
* Reassign every ownership reference from `from` to `to`. Does not touch the
|
|
45
|
+
* `users` collection itself (the caller deletes/keeps the user docs). Pure data
|
|
46
|
+
* movement — safe to call repeatedly (idempotent: a second run finds no `from`
|
|
47
|
+
* references left).
|
|
48
|
+
*/
|
|
49
|
+
async function reassignUserReferences(db, from, to, logger) {
|
|
50
|
+
const reassigned = {};
|
|
51
|
+
let deletedConflicting = 0;
|
|
52
|
+
// 1. Resolve compound-unique collisions first (delete losing rows that would
|
|
53
|
+
// collide with an existing survivor row on reassign). For bookmarks the
|
|
54
|
+
// unique key is { page, user }: delete a `from` bookmark whose page the
|
|
55
|
+
// `to` user already bookmarks.
|
|
56
|
+
for (const { collection, userField } of UNIQUE_PER_USER_REFS) {
|
|
57
|
+
const col = db.collection(collection);
|
|
58
|
+
const fromRows = await col.find({ [userField]: from }).toArray();
|
|
59
|
+
for (const row of fromRows) {
|
|
60
|
+
const page = row.page;
|
|
61
|
+
const survivorHas = await col.findOne({ page, [userField]: to });
|
|
62
|
+
if (survivorHas) {
|
|
63
|
+
await col.deleteOne({ _id: row._id });
|
|
64
|
+
deletedConflicting += 1;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// 2. Scalar references: `$set` field = to where field = from.
|
|
69
|
+
for (const { collection, field } of exports.SCALAR_USER_REFS) {
|
|
70
|
+
const res = await db.collection(collection).updateMany({ [field]: from }, { $set: { [field]: to } });
|
|
71
|
+
const n = res.modifiedCount ?? 0;
|
|
72
|
+
if (n > 0)
|
|
73
|
+
reassigned[`${collection}.${field}`] = n;
|
|
74
|
+
}
|
|
75
|
+
// 3. Array references: add the survivor, then remove the loser. `$addToSet`
|
|
76
|
+
// keeps the survivor unique; doing it before `$pull` means a doc that had
|
|
77
|
+
// only `from` still ends up with `to`.
|
|
78
|
+
for (const { collection, field } of exports.ARRAY_USER_REFS) {
|
|
79
|
+
const col = db.collection(collection);
|
|
80
|
+
const added = await col.updateMany({ [field]: from }, { $addToSet: { [field]: to } });
|
|
81
|
+
const pulled = await col.updateMany({ [field]: from }, { $pull: { [field]: from } });
|
|
82
|
+
const n = Math.max(added.modifiedCount ?? 0, pulled.modifiedCount ?? 0);
|
|
83
|
+
if (n > 0)
|
|
84
|
+
reassigned[`${collection}.${field}`] = n;
|
|
85
|
+
}
|
|
86
|
+
logger?.debug(`reassignUserReferences: ${from} -> ${to}`, reassigned, { deletedConflicting });
|
|
87
|
+
return { reassigned, deletedConflicting };
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Merge each group: reassign every removed user's references onto `keep`, then
|
|
91
|
+
* delete the removed user docs. `dryRun` reports the would-be effect without
|
|
92
|
+
* writing.
|
|
93
|
+
*/
|
|
94
|
+
async function mergeUserGroups(db, groups, opts) {
|
|
95
|
+
const reassigned = {};
|
|
96
|
+
let usersRemoved = 0;
|
|
97
|
+
let deletedConflicting = 0;
|
|
98
|
+
let groupsMerged = 0;
|
|
99
|
+
for (const group of groups) {
|
|
100
|
+
if (group.remove.length === 0)
|
|
101
|
+
continue;
|
|
102
|
+
groupsMerged += 1;
|
|
103
|
+
if (opts.dryRun) {
|
|
104
|
+
usersRemoved += group.remove.length;
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
for (const from of group.remove) {
|
|
108
|
+
const result = await reassignUserReferences(db, from, group.keep, opts.logger);
|
|
109
|
+
for (const [key, n] of Object.entries(result.reassigned)) {
|
|
110
|
+
reassigned[key] = (reassigned[key] ?? 0) + n;
|
|
111
|
+
}
|
|
112
|
+
deletedConflicting += result.deletedConflicting;
|
|
113
|
+
await db.collection('users').deleteOne({ _id: from });
|
|
114
|
+
usersRemoved += 1;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return { groupsMerged, usersRemoved, reassigned, deletedConflicting };
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* The policy for choosing which user in a duplicate group survives
|
|
121
|
+
* (uniqueness spec §c): keep the one with the most content, breaking ties by
|
|
122
|
+
* oldest `createdAt`. "Content" is approximated by the number of pages the user
|
|
123
|
+
* created — the dominant signal in the incident and cheap to count.
|
|
124
|
+
*
|
|
125
|
+
* Returns the group with `keep` set to the winner and `remove` to the rest.
|
|
126
|
+
*/
|
|
127
|
+
async function chooseSurvivor(db, candidateIds) {
|
|
128
|
+
if (candidateIds.length === 0)
|
|
129
|
+
throw new Error('chooseSurvivor: empty candidate set');
|
|
130
|
+
const users = await db
|
|
131
|
+
.collection('users')
|
|
132
|
+
.find({ _id: { $in: candidateIds } })
|
|
133
|
+
.toArray();
|
|
134
|
+
const pages = db.collection('pages');
|
|
135
|
+
const scored = await Promise.all(users.map(async (u) => {
|
|
136
|
+
const id = u._id;
|
|
137
|
+
const createdAt = u.createdAt ?? new Date(0);
|
|
138
|
+
const pageCount = await pages.countDocuments({ creator: id });
|
|
139
|
+
return { id, createdAt, pageCount };
|
|
140
|
+
}));
|
|
141
|
+
scored.sort((a, b) => {
|
|
142
|
+
if (b.pageCount !== a.pageCount)
|
|
143
|
+
return b.pageCount - a.pageCount; // most content first
|
|
144
|
+
return a.createdAt.getTime() - b.createdAt.getTime(); // then oldest first
|
|
145
|
+
});
|
|
146
|
+
const [winner, ...losers] = scored;
|
|
147
|
+
return { keep: winner.id, remove: losers.map((l) => l.id) };
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=dedup-users.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedup-users.js","sourceRoot":"","sources":["../../src/util/dedup-users.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/** Default editor cap when `COLLAB_MAX_EDITORS_PER_PAGE` is unset / invalid. */
|
|
2
|
+
export declare const DEFAULT_MAX_EDITORS = 20;
|
|
3
|
+
/**
|
|
4
|
+
* Parse `COLLAB_MAX_EDITORS_PER_PAGE` (or any equivalent env string)
|
|
5
|
+
* defensively. Empty / non-numeric / non-positive values fall back to
|
|
6
|
+
* `DEFAULT_MAX_EDITORS` so callers never have to remember the
|
|
7
|
+
* "isFinite && > 0" dance.
|
|
8
|
+
*/
|
|
9
|
+
export declare function parseCapEnv(value: string | undefined): number;
|
|
10
|
+
export interface TryAcquireResult {
|
|
11
|
+
acquired: boolean;
|
|
12
|
+
/** Post-acquire SCARD (or the SCARD observed when rejection happens). */
|
|
13
|
+
count: number;
|
|
14
|
+
cap: number;
|
|
15
|
+
}
|
|
16
|
+
export interface EditorCapCounter {
|
|
17
|
+
/** Soft maximum editors per page (`COLLAB_MAX_EDITORS_PER_PAGE`, default 20). */
|
|
18
|
+
readonly maxEditorsPerPage: number;
|
|
19
|
+
/**
|
|
20
|
+
* Read-only count check. Used by the wsToken endpoint so a 21st
|
|
21
|
+
* client gets a `readonly: true` token *before* the WebSocket
|
|
22
|
+
* connects, avoiding the "editable for a millisecond then forced
|
|
23
|
+
* readonly" UX bug.
|
|
24
|
+
*/
|
|
25
|
+
peek(pageId: string): Promise<{
|
|
26
|
+
count: number;
|
|
27
|
+
cap: number;
|
|
28
|
+
}>;
|
|
29
|
+
/**
|
|
30
|
+
* SADD the `<userId>:<socketId>` entry **after** verifying the
|
|
31
|
+
* pre-acquire count is under the cap. Returns `acquired: false`
|
|
32
|
+
* when the entry is rejected so the caller can flip the readonly
|
|
33
|
+
* bit on the connection.
|
|
34
|
+
*/
|
|
35
|
+
tryAcquire(pageId: string, userId: string, socketId: string): Promise<TryAcquireResult>;
|
|
36
|
+
/**
|
|
37
|
+
* SREM the entry. Best-effort: failures are warn-only (the entry
|
|
38
|
+
* eventually expires via the per-key TTL). No-op for entries that
|
|
39
|
+
* were never acquired (Redis SREM returns 0).
|
|
40
|
+
*/
|
|
41
|
+
release(pageId: string, userId: string, socketId: string): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Disconnect handler. Embedded collab shares `crowi.redis` so the
|
|
44
|
+
* disconnect call is a no-op (api owns the client lifecycle). The
|
|
45
|
+
* method stays on the interface so a future Phase 9 multi-instance
|
|
46
|
+
* extension that owns its own client can implement teardown
|
|
47
|
+
* symmetrically.
|
|
48
|
+
*/
|
|
49
|
+
disconnect(): Promise<void>;
|
|
50
|
+
}
|
|
51
|
+
export interface CreateEditorCapCounterOptions {
|
|
52
|
+
/**
|
|
53
|
+
* Pre-built node-redis v4 client (typed structurally as
|
|
54
|
+
* `MinimalRedisClient`). Pass `crowi.redis` from the api boot.
|
|
55
|
+
* `null` / `undefined` → return a no-op counter (Redis not
|
|
56
|
+
* configured; cap disabled).
|
|
57
|
+
*/
|
|
58
|
+
redisClient?: MinimalRedisClient | null;
|
|
59
|
+
/** Override the default 20-editor cap. */
|
|
60
|
+
maxEditorsPerPage?: number;
|
|
61
|
+
/**
|
|
62
|
+
* Test seam — inject a pre-built `RedisClientType`-shaped object.
|
|
63
|
+
* Kept distinct from `redisClient` so unit tests can drive a fake
|
|
64
|
+
* without the api passing a real client (the production wiring
|
|
65
|
+
* always uses `redisClient`; tests that mock the fake go through
|
|
66
|
+
* this seam).
|
|
67
|
+
*/
|
|
68
|
+
__clientForTest?: MinimalRedisClient;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Minimum surface of node-redis v4 we lean on. Keeps the test mock
|
|
72
|
+
* surface narrow and gives us a single place to extend if Phase 9's
|
|
73
|
+
* multi-server work needs more commands.
|
|
74
|
+
*/
|
|
75
|
+
export interface MinimalRedisClient {
|
|
76
|
+
isOpen: boolean;
|
|
77
|
+
connect(): Promise<unknown>;
|
|
78
|
+
disconnect(): Promise<unknown>;
|
|
79
|
+
sCard(key: string): Promise<number>;
|
|
80
|
+
sAdd(key: string, member: string): Promise<number>;
|
|
81
|
+
sRem(key: string, member: string): Promise<number>;
|
|
82
|
+
expire(key: string, seconds: number): Promise<unknown>;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Build an editor-cap counter against a shared Redis client.
|
|
86
|
+
*
|
|
87
|
+
* Returns a no-op counter when `redisClient` is null/undefined — the
|
|
88
|
+
* API surface is identical so callers don't have to branch.
|
|
89
|
+
*/
|
|
90
|
+
export declare function createEditorCapCounter(opts?: CreateEditorCapCounterOptions): Promise<EditorCapCounter>;
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.DEFAULT_MAX_EDITORS = void 0;
|
|
7
|
+
exports.parseCapEnv = parseCapEnv;
|
|
8
|
+
exports.createEditorCapCounter = createEditorCapCounter;
|
|
9
|
+
const debug_1 = __importDefault(require("debug"));
|
|
10
|
+
const debug = (0, debug_1.default)('crowi:util:editor-cap-counter');
|
|
11
|
+
/**
|
|
12
|
+
* RFC-0003 Phase 6 — Redis-backed editor cap counter.
|
|
13
|
+
*
|
|
14
|
+
* Tracks the set of currently-connected editors per page so the
|
|
15
|
+
* wsToken issuance path (api HTTP handler) and the WebSocket
|
|
16
|
+
* `onAuthenticate` hook (in-process Hocuspocus engine; see
|
|
17
|
+
* `src/collab/attach.ts`) agree on a single cluster-wide count.
|
|
18
|
+
*
|
|
19
|
+
* Wire-level design:
|
|
20
|
+
*
|
|
21
|
+
* - Key: `crowi:collab:editors:<pageId>`
|
|
22
|
+
* - Value: a **Set** of `<userId>:<socketId>` entries (one entry
|
|
23
|
+
* per active WebSocket connection).
|
|
24
|
+
* - TTL: `EXPIRE 86400` (24 h) is re-applied on every successful
|
|
25
|
+
* `SADD` so an idle key naturally evaporates after a day
|
|
26
|
+
* of stillness. Stale entries left behind by abnormal
|
|
27
|
+
* disconnects are bounded by the same TTL — the spec
|
|
28
|
+
* (`defence in depth`) explicitly allows up to 24 h of
|
|
29
|
+
* overcount before Redis garbage-collects.
|
|
30
|
+
*
|
|
31
|
+
* Why a Set, not INCR/DECR?
|
|
32
|
+
*
|
|
33
|
+
* - INCR / DECR is asymmetric on abnormal close: a +1 that never
|
|
34
|
+
* gets the matching -1 climbs the counter until an operator
|
|
35
|
+
* manually resets it. SADD-with-EXPIRE self-heals.
|
|
36
|
+
* - SCARD is O(1) so the read cost matches GET-against-INCR.
|
|
37
|
+
* - The same `<userId>:<socketId>` can be SADD'd twice (handler
|
|
38
|
+
* retry, etc.) without inflating the count (Set idempotency).
|
|
39
|
+
*
|
|
40
|
+
* Race window:
|
|
41
|
+
*
|
|
42
|
+
* - SCARD + SADD is *not* atomic; a 21st client racing 20 acquirers
|
|
43
|
+
* can briefly observe `count = 20`, write its entry, then settle
|
|
44
|
+
* at 21. The spec accepts this — Phase 6 is "defence in depth",
|
|
45
|
+
* not "hard cap with Redis Lua". A `simplify` pass may add a Lua
|
|
46
|
+
* script if operations need stricter semantics.
|
|
47
|
+
*
|
|
48
|
+
* Fail-open posture:
|
|
49
|
+
*
|
|
50
|
+
* - `redisClient` null/undefined (= REDIS_URL unset) → return a
|
|
51
|
+
* no-op counter: `peek` is always 0, `tryAcquire` is always
|
|
52
|
+
* `{acquired: true}`, `release` is a no-op. The cap is a soft
|
|
53
|
+
* limit by design.
|
|
54
|
+
*
|
|
55
|
+
* Phase 9 (same-process attach) signature change: the previous
|
|
56
|
+
* `redisOpts` argument is replaced with a pre-built `redisClient`
|
|
57
|
+
* (typed structurally as `MinimalRedisClient`). The api boot opens
|
|
58
|
+
* exactly one Redis client per process (`crowi.redis`); embedded
|
|
59
|
+
* collab now shares it instead of opening a second connection — see
|
|
60
|
+
* `.feature-state/specs/feature-collab-embed-into-api.md` §"Redis
|
|
61
|
+
* client 共有".
|
|
62
|
+
*/
|
|
63
|
+
const KEY_PREFIX = 'crowi:collab:editors:';
|
|
64
|
+
/** Default editor cap when `COLLAB_MAX_EDITORS_PER_PAGE` is unset / invalid. */
|
|
65
|
+
exports.DEFAULT_MAX_EDITORS = 20;
|
|
66
|
+
const TTL_SECONDS = 86400; // 24h sliding window via re-EXPIRE on SADD
|
|
67
|
+
const keyFor = (pageId) => `${KEY_PREFIX}${pageId}`;
|
|
68
|
+
const entryFor = (userId, socketId) => `${userId}:${socketId}`;
|
|
69
|
+
/**
|
|
70
|
+
* Parse `COLLAB_MAX_EDITORS_PER_PAGE` (or any equivalent env string)
|
|
71
|
+
* defensively. Empty / non-numeric / non-positive values fall back to
|
|
72
|
+
* `DEFAULT_MAX_EDITORS` so callers never have to remember the
|
|
73
|
+
* "isFinite && > 0" dance.
|
|
74
|
+
*/
|
|
75
|
+
function parseCapEnv(value) {
|
|
76
|
+
const n = parseInt(value ?? '', 10);
|
|
77
|
+
return Number.isFinite(n) && n > 0 ? n : exports.DEFAULT_MAX_EDITORS;
|
|
78
|
+
}
|
|
79
|
+
const makeNoopCounter = (maxEditorsPerPage) => ({
|
|
80
|
+
maxEditorsPerPage,
|
|
81
|
+
async peek() {
|
|
82
|
+
return { count: 0, cap: maxEditorsPerPage };
|
|
83
|
+
},
|
|
84
|
+
async tryAcquire() {
|
|
85
|
+
return { acquired: true, count: 0, cap: maxEditorsPerPage };
|
|
86
|
+
},
|
|
87
|
+
async release() {
|
|
88
|
+
/* nothing */
|
|
89
|
+
},
|
|
90
|
+
async disconnect() {
|
|
91
|
+
/* nothing */
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
/**
|
|
95
|
+
* Build an editor-cap counter against a shared Redis client.
|
|
96
|
+
*
|
|
97
|
+
* Returns a no-op counter when `redisClient` is null/undefined — the
|
|
98
|
+
* API surface is identical so callers don't have to branch.
|
|
99
|
+
*/
|
|
100
|
+
async function createEditorCapCounter(opts = {}) {
|
|
101
|
+
const maxEditorsPerPage = opts.maxEditorsPerPage ?? exports.DEFAULT_MAX_EDITORS;
|
|
102
|
+
if (opts.__clientForTest) {
|
|
103
|
+
return wrapClient(opts.__clientForTest, maxEditorsPerPage);
|
|
104
|
+
}
|
|
105
|
+
if (!opts.redisClient) {
|
|
106
|
+
debug('redis client not provided — editor cap counter disabled (fail-open)');
|
|
107
|
+
return makeNoopCounter(maxEditorsPerPage);
|
|
108
|
+
}
|
|
109
|
+
debug('editor cap counter ready (max=%d, key prefix=%s)', maxEditorsPerPage, KEY_PREFIX);
|
|
110
|
+
return wrapClient(opts.redisClient, maxEditorsPerPage);
|
|
111
|
+
}
|
|
112
|
+
function wrapClient(client, maxEditorsPerPage) {
|
|
113
|
+
return {
|
|
114
|
+
maxEditorsPerPage,
|
|
115
|
+
async peek(pageId) {
|
|
116
|
+
try {
|
|
117
|
+
const count = await client.sCard(keyFor(pageId));
|
|
118
|
+
return { count, cap: maxEditorsPerPage };
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
console.warn(`[crowi:editor-cap-counter] peek failed for ${pageId} — treating as 0:`, err.message);
|
|
122
|
+
return { count: 0, cap: maxEditorsPerPage };
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
async tryAcquire(pageId, userId, socketId) {
|
|
126
|
+
const key = keyFor(pageId);
|
|
127
|
+
const entry = entryFor(userId, socketId);
|
|
128
|
+
let preCount;
|
|
129
|
+
try {
|
|
130
|
+
preCount = await client.sCard(key);
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
console.warn(`[crowi:editor-cap-counter] tryAcquire SCARD failed for ${pageId} — fail-open:`, err.message);
|
|
134
|
+
return { acquired: true, count: 0, cap: maxEditorsPerPage };
|
|
135
|
+
}
|
|
136
|
+
if (preCount >= maxEditorsPerPage) {
|
|
137
|
+
debug('cap exceeded for page %s (count=%d max=%d)', pageId, preCount, maxEditorsPerPage);
|
|
138
|
+
return { acquired: false, count: preCount, cap: maxEditorsPerPage };
|
|
139
|
+
}
|
|
140
|
+
try {
|
|
141
|
+
const added = await client.sAdd(key, entry);
|
|
142
|
+
await client.expire(key, TTL_SECONDS);
|
|
143
|
+
// `added === 0` means the entry already existed in the set;
|
|
144
|
+
// treat it as a successful acquire so a handler retry is
|
|
145
|
+
// idempotent. The count reported is `preCount` (unchanged)
|
|
146
|
+
// when the entry was already present.
|
|
147
|
+
const count = preCount + (added > 0 ? 1 : 0);
|
|
148
|
+
debug('acquired page=%s entry=%s count=%d', pageId, entry, count);
|
|
149
|
+
return { acquired: true, count, cap: maxEditorsPerPage };
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
console.warn(`[crowi:editor-cap-counter] tryAcquire SADD failed for ${pageId} — fail-open:`, err.message);
|
|
153
|
+
return { acquired: true, count: preCount, cap: maxEditorsPerPage };
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
async release(pageId, userId, socketId) {
|
|
157
|
+
try {
|
|
158
|
+
await client.sRem(keyFor(pageId), entryFor(userId, socketId));
|
|
159
|
+
debug('released page=%s user=%s socket=%s', pageId, userId, socketId);
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
console.warn(`[crowi:editor-cap-counter] release failed for ${pageId}:`, err.message);
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
async disconnect() {
|
|
166
|
+
// Shared client lifecycle is owned by Crowi (api boot). The
|
|
167
|
+
// counter doesn't `disconnect()` the underlying client here —
|
|
168
|
+
// doing so would tear down session storage / config pub-sub /
|
|
169
|
+
// page-event pubsub too. Phase 9 multi-instance extensions
|
|
170
|
+
// that *do* own a private client can override this.
|
|
171
|
+
debug('disconnect() noop — shared client lifetime owned by Crowi');
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=editor-cap-counter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor-cap-counter.js","sourceRoot":"","sources":["../../src/util/editor-cap-counter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Readable } from 'node:stream';
|
|
2
|
+
import type Crowi from '../crowi';
|
|
3
|
+
import type { StorageDriver } from '@crowi/plugin-api';
|
|
4
|
+
/**
|
|
5
|
+
* Look up a storage driver by its registered name. Throws with the list
|
|
6
|
+
* of available drivers when no match — used by the `crowi-admin storage
|
|
7
|
+
* copy` CLI which addresses non-active drivers by name.
|
|
8
|
+
*/
|
|
9
|
+
export declare function getStorageDriverByName(crowi: Crowi, name: string): StorageDriver;
|
|
10
|
+
export interface FileUploader {
|
|
11
|
+
/**
|
|
12
|
+
* Upload a file from a local path or a Readable stream. Used by the
|
|
13
|
+
* attachment / profile-picture controllers.
|
|
14
|
+
*
|
|
15
|
+
* `filePath` is the storage key (forwarded verbatim to the driver).
|
|
16
|
+
* `type` is the MIME content type. `fileStream` may be a Readable or
|
|
17
|
+
* the path of a temp file on disk (legacy callers pass either).
|
|
18
|
+
*/
|
|
19
|
+
uploadFile(filePath: string, type: string, fileStream: Readable | string, options?: Record<string, unknown>): Promise<{
|
|
20
|
+
key: string;
|
|
21
|
+
}>;
|
|
22
|
+
/** Stream a stored file back to the caller. */
|
|
23
|
+
findDeliveryFile(attachmentId: unknown, filePath: string): Promise<Readable>;
|
|
24
|
+
/** Delete a stored file. Idempotent. */
|
|
25
|
+
deleteFile(attachmentId: unknown, filePath: string): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Build a URL the browser can fetch. Drivers that support
|
|
28
|
+
* `signedUrl` (e.g. S3) return a time-limited URL; drivers that
|
|
29
|
+
* don't fall back to the API streaming endpoint.
|
|
30
|
+
*
|
|
31
|
+
* NOTE: For values that get *persisted* (e.g. `user.image`) use
|
|
32
|
+
* {@link persistentUrl} instead — a signed URL expires and would
|
|
33
|
+
* 403 once stored.
|
|
34
|
+
*/
|
|
35
|
+
generateUrl(filePath: string, expiresInSec?: number): Promise<string>;
|
|
36
|
+
/**
|
|
37
|
+
* Stable, non-expiring URL for a `user/`-prefixed key, suitable for
|
|
38
|
+
* storing in the DB (`user.image`). Always the `by-key` streaming
|
|
39
|
+
* proxy (`/api/v2/attachments/by-key/:key`), never a time-limited
|
|
40
|
+
* signed URL — regardless of the active driver. The proxy streams
|
|
41
|
+
* from whichever driver is active (local or S3) and is reachable from
|
|
42
|
+
* an `<img src>` via the access-token cookie, so avatars survive past
|
|
43
|
+
* any signed-URL TTL.
|
|
44
|
+
*/
|
|
45
|
+
persistentUrl(filePath: string): string;
|
|
46
|
+
}
|
|
47
|
+
declare const _default: (crowi: Crowi) => FileUploader;
|
|
48
|
+
export default _default;
|
|
49
|
+
/**
|
|
50
|
+
* Path prefix used by `generateUrl()` when a driver has no `signedUrl`.
|
|
51
|
+
* Hoisted so the storage-copy migration can recognise the same shape
|
|
52
|
+
* when extracting keys from `User.image` URLs without re-encoding the
|
|
53
|
+
* route knowledge in two places.
|
|
54
|
+
*/
|
|
55
|
+
export declare const BY_KEY_URL_PREFIX = "/api/v2/attachments/by-key/";
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BY_KEY_URL_PREFIX = void 0;
|
|
4
|
+
exports.getStorageDriverByName = getStorageDriverByName;
|
|
5
|
+
const node_fs_1 = require("node:fs");
|
|
6
|
+
// Resolved per call (not cached at module init) because the
|
|
7
|
+
// PluginManager bootstraps after this module is required.
|
|
8
|
+
function activeDriver(crowi) {
|
|
9
|
+
const driver = crowi.getPlugins().active.storage;
|
|
10
|
+
if (!driver) {
|
|
11
|
+
throw new Error('Storage driver not registered. Install @crowi/plugin-storage-local (default) or @crowi/plugin-storage-aws-s3.');
|
|
12
|
+
}
|
|
13
|
+
return driver;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Look up a storage driver by its registered name. Throws with the list
|
|
17
|
+
* of available drivers when no match — used by the `crowi-admin storage
|
|
18
|
+
* copy` CLI which addresses non-active drivers by name.
|
|
19
|
+
*/
|
|
20
|
+
function getStorageDriverByName(crowi, name) {
|
|
21
|
+
const driver = crowi.getPlugins().storage.get(name);
|
|
22
|
+
if (driver)
|
|
23
|
+
return driver;
|
|
24
|
+
const available = crowi
|
|
25
|
+
.getPlugins()
|
|
26
|
+
.storage.list()
|
|
27
|
+
.map((d) => d.driverName)
|
|
28
|
+
.join(', ');
|
|
29
|
+
throw new Error(`Storage driver '${name}' is not registered. Available drivers: ${available || '(none)'}.`);
|
|
30
|
+
}
|
|
31
|
+
exports.default = (crowi) => ({
|
|
32
|
+
async uploadFile(filePath, type, fileStream, _options) {
|
|
33
|
+
const driver = activeDriver(crowi);
|
|
34
|
+
const stream = typeof fileStream === 'string' ? (0, node_fs_1.createReadStream)(fileStream) : fileStream;
|
|
35
|
+
return driver.put(filePath, stream, { contentType: type });
|
|
36
|
+
},
|
|
37
|
+
async findDeliveryFile(_attachmentId, filePath) {
|
|
38
|
+
const driver = activeDriver(crowi);
|
|
39
|
+
return driver.get(filePath);
|
|
40
|
+
},
|
|
41
|
+
async deleteFile(_attachmentId, filePath) {
|
|
42
|
+
const driver = activeDriver(crowi);
|
|
43
|
+
await driver.delete(filePath);
|
|
44
|
+
},
|
|
45
|
+
async generateUrl(filePath, expiresInSec = 60 * 5) {
|
|
46
|
+
const driver = activeDriver(crowi);
|
|
47
|
+
if (driver.signedUrl) {
|
|
48
|
+
return driver.signedUrl(filePath, expiresInSec);
|
|
49
|
+
}
|
|
50
|
+
// Drivers without signedUrl (e.g. local) fall back to the ts-rest
|
|
51
|
+
// streaming endpoint mounted at `/api/v2/attachments/by-key/:key`.
|
|
52
|
+
// The `by-key` route only accepts keys under the `user/` prefix
|
|
53
|
+
// (profile pictures); attachment-row-backed files use the
|
|
54
|
+
// `/api/v2/attachments/:id` route via `Attachment.fileUrl`.
|
|
55
|
+
return `${exports.BY_KEY_URL_PREFIX}${encodeURIComponent(filePath)}`;
|
|
56
|
+
},
|
|
57
|
+
persistentUrl(filePath) {
|
|
58
|
+
// Always the stable proxy — never a signed URL — because the value
|
|
59
|
+
// is persisted (e.g. user.image). See the interface doc.
|
|
60
|
+
return `${exports.BY_KEY_URL_PREFIX}${encodeURIComponent(filePath)}`;
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
/**
|
|
64
|
+
* Path prefix used by `generateUrl()` when a driver has no `signedUrl`.
|
|
65
|
+
* Hoisted so the storage-copy migration can recognise the same shape
|
|
66
|
+
* when extracting keys from `User.image` URLs without re-encoding the
|
|
67
|
+
* route knowledge in two places.
|
|
68
|
+
*/
|
|
69
|
+
exports.BY_KEY_URL_PREFIX = '/api/v2/attachments/by-key/';
|
|
70
|
+
//# sourceMappingURL=fileUploader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileUploader.js","sourceRoot":"","sources":["../../src/util/fileUploader.ts"],"names":[],"mappings":";;;AAoBA,wDASC;AA7BD,qCAA2C;AAK3C,4DAA4D;AAC5D,0DAA0D;AAC1D,SAAS,YAAY,CAAC,KAAY;IAChC,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;IACjD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,+GAA+G,CAAC,CAAC;IACnI,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,SAAgB,sBAAsB,CAAC,KAAY,EAAE,IAAY;IAC/D,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,SAAS,GAAG,KAAK;SACpB,UAAU,EAAE;SACZ,OAAO,CAAC,IAAI,EAAE;SACd,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;SACxB,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,2CAA2C,SAAS,IAAI,QAAQ,GAAG,CAAC,CAAC;AAC9G,CAAC;AA0CD,kBAAe,CAAC,KAAY,EAAgB,EAAE,CAAC,CAAC;IAC9C,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ;QACnD,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,MAAM,GAAa,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAA,0BAAgB,EAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;QACpG,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,aAAa,EAAE,QAAQ;QAC5C,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACnC,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,aAAa,EAAE,QAAQ;QACtC,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,YAAY,GAAG,EAAE,GAAG,CAAC;QAC/C,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAClD,CAAC;QACD,kEAAkE;QAClE,mEAAmE;QACnE,gEAAgE;QAChE,0DAA0D;QAC1D,4DAA4D;QAC5D,OAAO,GAAG,yBAAiB,GAAG,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC/D,CAAC;IAED,aAAa,CAAC,QAAQ;QACpB,mEAAmE;QACnE,yDAAyD;QACzD,OAAO,GAAG,yBAAiB,GAAG,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC/D,CAAC;CACF,CAAC,CAAC;AAEH;;;;;GAKG;AACU,QAAA,iBAAiB,GAAG,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.stringToArrayFilter = exports.normalizeCRLFFilter = void 0;
|
|
4
|
+
const normalizeCRLFFilter = (value) => {
|
|
5
|
+
return value.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
|
|
6
|
+
};
|
|
7
|
+
exports.normalizeCRLFFilter = normalizeCRLFFilter;
|
|
8
|
+
const stringToArrayFilter = (value) => {
|
|
9
|
+
if (!value || value === '') {
|
|
10
|
+
return [];
|
|
11
|
+
}
|
|
12
|
+
return value.split('\n');
|
|
13
|
+
};
|
|
14
|
+
exports.stringToArrayFilter = stringToArrayFilter;
|
|
15
|
+
//# sourceMappingURL=formUtil.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formUtil.js","sourceRoot":"","sources":["../../src/util/formUtil.ts"],"names":[],"mappings":";;;AAAO,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,EAAE;IAC3C,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC3D,CAAC,CAAC;AAFW,QAAA,mBAAmB,uBAE9B;AAEK,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,EAAE;IAC3C,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC,CAAC;AANW,QAAA,mBAAmB,uBAM9B"}
|