@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,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.pageToResponse = exports.computeRevisionRenderArtifactsAsync = exports.resolveRevisionMeta = exports.toRevisionResponse = exports.isPopulatedRevision = void 0;
|
|
4
|
+
const revision_1 = require("../models/revision");
|
|
5
|
+
const version_1 = require("../renderer/version");
|
|
6
|
+
const ts_rest_helpers_1 = require("./ts-rest-helpers");
|
|
7
|
+
/**
|
|
8
|
+
* Heuristic: a `revision` field is populated when it has the `_id` + `path`
|
|
9
|
+
* + `body` triplet. Plain `ObjectId` refs only carry `_id`.
|
|
10
|
+
*/
|
|
11
|
+
const isPopulatedRevision = (value) => {
|
|
12
|
+
return typeof value === 'object' && value !== null && '_id' in value && 'path' in value && 'body' in value;
|
|
13
|
+
};
|
|
14
|
+
exports.isPopulatedRevision = isPopulatedRevision;
|
|
15
|
+
// Epoch fallback (not "now") so a document missing timestamps doesn't
|
|
16
|
+
// look like it was just created — schema only requires the field be set.
|
|
17
|
+
const EPOCH_ISO = new Date(0).toISOString();
|
|
18
|
+
const toRevisionResponse = (revision, options = {}) => ({
|
|
19
|
+
_id: revision._id.toString(),
|
|
20
|
+
path: revision.path,
|
|
21
|
+
body: revision.body,
|
|
22
|
+
format: revision.format || 'markdown',
|
|
23
|
+
author: revision.author ? (0, ts_rest_helpers_1.toPageUser)(revision.author) : null,
|
|
24
|
+
...(revision.editVia !== undefined ? { editVia: revision.editVia } : {}),
|
|
25
|
+
createdAt: (0, ts_rest_helpers_1.toISOStringOrNull)(revision.createdAt) || EPOCH_ISO,
|
|
26
|
+
// Sync path: only emits stored meta + renderedAst. Detail endpoints
|
|
27
|
+
// (getPage, getRevision) compose with `computeRevisionRenderArtifactsAsync`
|
|
28
|
+
// afterwards to fold in the on-the-fly fallback for legacy revisions.
|
|
29
|
+
meta: (0, exports.resolveRevisionMeta)(revision.meta, options.withMeta),
|
|
30
|
+
...(options.withRenderedAst ? { renderedAst: revision.renderedAst, rendererVersion: revision.rendererVersion } : {}),
|
|
31
|
+
});
|
|
32
|
+
exports.toRevisionResponse = toRevisionResponse;
|
|
33
|
+
const resolveRevisionMeta = (stored, emit) => {
|
|
34
|
+
if (!emit)
|
|
35
|
+
return undefined;
|
|
36
|
+
if (!stored)
|
|
37
|
+
return undefined;
|
|
38
|
+
const out = pickStoredMeta(stored);
|
|
39
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
40
|
+
};
|
|
41
|
+
exports.resolveRevisionMeta = resolveRevisionMeta;
|
|
42
|
+
// Avoids leaking Mongoose internals (the document carries `$__` etc.)
|
|
43
|
+
// into the response shape.
|
|
44
|
+
function pickStoredMeta(stored) {
|
|
45
|
+
const out = {};
|
|
46
|
+
if (stored.toc !== undefined)
|
|
47
|
+
out.toc = stored.toc;
|
|
48
|
+
if (stored.wikiLinks !== undefined)
|
|
49
|
+
out.wikiLinks = stored.wikiLinks;
|
|
50
|
+
if (stored.mentions !== undefined)
|
|
51
|
+
out.mentions = stored.mentions;
|
|
52
|
+
if (stored.codeBlockLanguages !== undefined)
|
|
53
|
+
out.codeBlockLanguages = stored.codeBlockLanguages;
|
|
54
|
+
return out;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Async fallback compute for revision render artifacts (meta +
|
|
58
|
+
* renderedAst). Detail endpoints (getPage, getRevision) call this AFTER
|
|
59
|
+
* `pageToResponse` so the projection path stays sync; meta + AST get
|
|
60
|
+
* attached to the populated revision response in one go.
|
|
61
|
+
*
|
|
62
|
+
* Why one call instead of two: legacy revisions (Phase 1: only `toc`
|
|
63
|
+
* stored / Phase 2: meta but no `renderedAst`) would otherwise trigger
|
|
64
|
+
* back-to-back `runMetadata` + `runRender` invocations, each running a
|
|
65
|
+
* full parse+transform+shiki pipeline on the same body. `runRender`
|
|
66
|
+
* already produces both, so fold the calls into one and pull the
|
|
67
|
+
* needed pieces out.
|
|
68
|
+
*
|
|
69
|
+
* Stored values stay authoritative on merge: Phase 1's `toc` (the
|
|
70
|
+
* anchor ids the heading stamper aligns against) wins over recomputed
|
|
71
|
+
* ones, and a stored `renderedAst` is returned verbatim without
|
|
72
|
+
* re-rendering.
|
|
73
|
+
*/
|
|
74
|
+
const computeRevisionRenderArtifactsAsync = async (crowi, storedMeta, storedAst, body, storedRendererVersion, pageId) => {
|
|
75
|
+
const fromStored = storedMeta ? pickStoredMeta(storedMeta) : {};
|
|
76
|
+
// Phase 2-written revisions persist all 4 meta fields (even empty
|
|
77
|
+
// arrays); the presence of these 3 is the marker that no fallback
|
|
78
|
+
// is needed for meta.
|
|
79
|
+
const metaIsComplete = fromStored.wikiLinks !== undefined && fromStored.mentions !== undefined && fromStored.codeBlockLanguages !== undefined;
|
|
80
|
+
const astIsStored = storedAst !== undefined;
|
|
81
|
+
// RFC-0002 round 3.1: a stored `rendererVersion` that does NOT match
|
|
82
|
+
// the running pipeline marks the AST as stale. A missing
|
|
83
|
+
// `rendererVersion` (revisions saved before this field landed) is
|
|
84
|
+
// treated as "trust the stored AST" — re-rendering every pre-existing
|
|
85
|
+
// revision on every read would be unaffordable, and the user-facing
|
|
86
|
+
// workaround (re-save the page) is already documented. Once
|
|
87
|
+
// `renderer:rebuild` lands (RFC-0008), operators can backfill.
|
|
88
|
+
const astIsFresh = astIsStored && (storedRendererVersion === undefined || storedRendererVersion === version_1.RENDERER_PIPELINE_VERSION);
|
|
89
|
+
if (metaIsComplete && astIsFresh) {
|
|
90
|
+
return {
|
|
91
|
+
meta: Object.keys(fromStored).length > 0 ? fromStored : undefined,
|
|
92
|
+
renderedAst: storedAst,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
if (!body) {
|
|
96
|
+
return {
|
|
97
|
+
meta: metaIsComplete && Object.keys(fromStored).length > 0 ? fromStored : undefined,
|
|
98
|
+
renderedAst: astIsFresh ? storedAst : undefined,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
// `pageId` threads through so the Phase 4+ plugin-dispatch transforms
|
|
102
|
+
// (embed-tag / url-inline-expand / code-block) can fire on the
|
|
103
|
+
// fallback path the same way they do at save time. Callers that
|
|
104
|
+
// genuinely don't know the page (unit tests, orphan revision bodies)
|
|
105
|
+
// can omit it — dispatch then degrades to no-op and the `code` /
|
|
106
|
+
// `@[tag](url)` nodes survive as plain text.
|
|
107
|
+
const { metadata, renderedAst } = await crowi.getRenderer().runRender(body, { mode: 'read', pageId });
|
|
108
|
+
const mergedMeta = { ...pickStoredMeta((0, revision_1.metadataToRevisionMeta)(metadata)), ...fromStored };
|
|
109
|
+
return {
|
|
110
|
+
meta: Object.keys(mergedMeta).length > 0 ? mergedMeta : undefined,
|
|
111
|
+
renderedAst: astIsFresh ? storedAst : renderedAst,
|
|
112
|
+
};
|
|
113
|
+
};
|
|
114
|
+
exports.computeRevisionRenderArtifactsAsync = computeRevisionRenderArtifactsAsync;
|
|
115
|
+
/**
|
|
116
|
+
* Project a populated Page document (or plain `PageLike`) into the contract
|
|
117
|
+
* Page shape. Unpopulated refs collapse safely:
|
|
118
|
+
* - revision: ObjectId-ref → undefined
|
|
119
|
+
* - creator / lastUpdateUser: ObjectId-ref → null
|
|
120
|
+
*
|
|
121
|
+
* Returns `any` because the runtime shape satisfies either `Page` or
|
|
122
|
+
* `PageWithRevision` depending on whether revision was populated; ts-rest
|
|
123
|
+
* contracts pin one or the other and each handler narrows at its return.
|
|
124
|
+
*/
|
|
125
|
+
// biome-ignore lint/suspicious/noExplicitAny: see jsdoc
|
|
126
|
+
const pageToResponse = (page, options = {}) => {
|
|
127
|
+
const pageObj = typeof page.toObject === 'function' ? page.toObject() : page;
|
|
128
|
+
// likerCount / seenUsersCount are dynamic properties set by populatePageData
|
|
129
|
+
// on the Mongoose document; toObject() drops them, so read off the original.
|
|
130
|
+
const dynamic = page;
|
|
131
|
+
return {
|
|
132
|
+
_id: (0, ts_rest_helpers_1.toStringId)(pageObj._id),
|
|
133
|
+
path: pageObj.path,
|
|
134
|
+
revision: pageObj.revision && (0, exports.isPopulatedRevision)(pageObj.revision)
|
|
135
|
+
? (0, exports.toRevisionResponse)(pageObj.revision, { withMeta: options.withMeta, withRenderedAst: options.withRenderedAst })
|
|
136
|
+
: undefined,
|
|
137
|
+
redirectTo: pageObj.redirectTo || null,
|
|
138
|
+
status: pageObj.status || undefined,
|
|
139
|
+
grant: pageObj.grant,
|
|
140
|
+
grantedUsers: pageObj.grantedUsers?.map(ts_rest_helpers_1.toStringId) || [],
|
|
141
|
+
creator: pageObj.creator && (0, ts_rest_helpers_1.isPopulatedUser)(pageObj.creator) ? (0, ts_rest_helpers_1.toPageUser)(pageObj.creator) : null,
|
|
142
|
+
lastUpdateUser: pageObj.lastUpdateUser && (0, ts_rest_helpers_1.isPopulatedUser)(pageObj.lastUpdateUser) ? (0, ts_rest_helpers_1.toPageUser)(pageObj.lastUpdateUser) : null,
|
|
143
|
+
liker: pageObj.liker?.map(ts_rest_helpers_1.toStringId) || [],
|
|
144
|
+
commentCount: pageObj.commentCount || 0,
|
|
145
|
+
extended: pageObj.extended,
|
|
146
|
+
createdAt: (0, ts_rest_helpers_1.toISOStringOrNull)(pageObj.createdAt) || EPOCH_ISO,
|
|
147
|
+
updatedAt: (0, ts_rest_helpers_1.toISOStringOrNull)(pageObj.updatedAt) || undefined,
|
|
148
|
+
latestRevision: pageObj.latestRevision ? (0, ts_rest_helpers_1.toStringId)(pageObj.latestRevision) : undefined,
|
|
149
|
+
likerCount: dynamic.likerCount,
|
|
150
|
+
seenUsersCount: dynamic.seenUsersCount,
|
|
151
|
+
};
|
|
152
|
+
};
|
|
153
|
+
exports.pageToResponse = pageToResponse;
|
|
154
|
+
//# sourceMappingURL=page-response.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-response.js","sourceRoot":"","sources":["../../src/util/page-response.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type Crowi from '../crowi';
|
|
2
|
+
import { type PageLike } from './page-response';
|
|
3
|
+
/**
|
|
4
|
+
* Push a page into the active search driver after a save / rename.
|
|
5
|
+
* Pages that have become redirects or `status='deleted'` are removed
|
|
6
|
+
* from the index instead — mirrors `shouldIndex()` in the ES driver's
|
|
7
|
+
* rebuild path.
|
|
8
|
+
*
|
|
9
|
+
* RFC-0004: `status='draft'` pages are likewise kept out of the index
|
|
10
|
+
* — a draft is visible only to its author, and search results have no
|
|
11
|
+
* per-viewer draft-author filter. When the author publishes (Phase 3),
|
|
12
|
+
* the resulting `update` event re-runs this helper with
|
|
13
|
+
* `status='published'` and the page is indexed normally.
|
|
14
|
+
*
|
|
15
|
+
* Fire-and-forget at the call site: the helper logs and swallows
|
|
16
|
+
* errors so a search-cluster outage never breaks page CRUD.
|
|
17
|
+
*/
|
|
18
|
+
export declare function indexPageInSearch(crowi: Crowi, page: PageLike): Promise<void>;
|
|
19
|
+
export declare function removePageFromSearch(crowi: Crowi, page: PageLike): Promise<void>;
|
|
@@ -0,0 +1,91 @@
|
|
|
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.indexPageInSearch = indexPageInSearch;
|
|
7
|
+
exports.removePageFromSearch = removePageFromSearch;
|
|
8
|
+
const page_1 = require("../models/page");
|
|
9
|
+
const debug_1 = __importDefault(require("debug"));
|
|
10
|
+
const ts_rest_helpers_1 = require("./ts-rest-helpers");
|
|
11
|
+
const page_response_1 = require("./page-response");
|
|
12
|
+
const debug = (0, debug_1.default)('crowi:util:page-search-index');
|
|
13
|
+
/**
|
|
14
|
+
* Push a page into the active search driver after a save / rename.
|
|
15
|
+
* Pages that have become redirects or `status='deleted'` are removed
|
|
16
|
+
* from the index instead — mirrors `shouldIndex()` in the ES driver's
|
|
17
|
+
* rebuild path.
|
|
18
|
+
*
|
|
19
|
+
* RFC-0004: `status='draft'` pages are likewise kept out of the index
|
|
20
|
+
* — a draft is visible only to its author, and search results have no
|
|
21
|
+
* per-viewer draft-author filter. When the author publishes (Phase 3),
|
|
22
|
+
* the resulting `update` event re-runs this helper with
|
|
23
|
+
* `status='published'` and the page is indexed normally.
|
|
24
|
+
*
|
|
25
|
+
* Fire-and-forget at the call site: the helper logs and swallows
|
|
26
|
+
* errors so a search-cluster outage never breaks page CRUD.
|
|
27
|
+
*/
|
|
28
|
+
async function indexPageInSearch(crowi, page) {
|
|
29
|
+
const searcher = crowi.getSearcher();
|
|
30
|
+
if (!searcher)
|
|
31
|
+
return;
|
|
32
|
+
const id = (0, ts_rest_helpers_1.toStringId)(page._id);
|
|
33
|
+
try {
|
|
34
|
+
if (page.redirectTo || page.status === page_1.STATUS_DELETED || page.status === page_1.STATUS_DRAFT) {
|
|
35
|
+
await searcher.remove(id);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
// The rename path emits 'update' with revision still as an
|
|
39
|
+
// ObjectId ref, so refetch when the payload isn't already
|
|
40
|
+
// carrying a populated revision body.
|
|
41
|
+
const target = (0, page_response_1.isPopulatedRevision)(page.revision) ? page : await refetchPopulated(crowi, id);
|
|
42
|
+
if (!target) {
|
|
43
|
+
await searcher.remove(id);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (target.redirectTo || target.status === page_1.STATUS_DELETED || target.status === page_1.STATUS_DRAFT) {
|
|
47
|
+
await searcher.remove(id);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (!(0, page_response_1.isPopulatedRevision)(target.revision) || !target.revision.body) {
|
|
51
|
+
debug('skip: no revision body for page %s', id);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const creator = (0, ts_rest_helpers_1.isPopulatedUser)(target.creator) ? target.creator : null;
|
|
55
|
+
const doc = {
|
|
56
|
+
id,
|
|
57
|
+
path: target.path,
|
|
58
|
+
body: target.revision.body,
|
|
59
|
+
meta: {
|
|
60
|
+
username: creator?.username,
|
|
61
|
+
grant: target.grant,
|
|
62
|
+
granted_users: (target.grantedUsers ?? []).map(ts_rest_helpers_1.toStringId),
|
|
63
|
+
comment_count: target.commentCount ?? 0,
|
|
64
|
+
like_count: target.liker?.length ?? 0,
|
|
65
|
+
created_at: target.createdAt,
|
|
66
|
+
updated_at: target.updatedAt,
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
await searcher.index(doc);
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
debug('search index failed for page %s: %s', id, err.message);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async function removePageFromSearch(crowi, page) {
|
|
76
|
+
const searcher = crowi.getSearcher();
|
|
77
|
+
if (!searcher)
|
|
78
|
+
return;
|
|
79
|
+
const id = (0, ts_rest_helpers_1.toStringId)(page._id);
|
|
80
|
+
try {
|
|
81
|
+
await searcher.remove(id);
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
debug('search remove failed for page %s: %s', id, err.message);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
async function refetchPopulated(crowi, id) {
|
|
88
|
+
const Page = crowi.model('Page');
|
|
89
|
+
return (await Page.findById(id).populate('revision').populate('creator'));
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=page-search-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-search-index.js","sourceRoot":"","sources":["../../src/util/page-search-index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type Crowi from '../crowi';
|
|
2
|
+
/**
|
|
3
|
+
* RFC-0004 backfill: stamp `status: 'published'` onto every legacy
|
|
4
|
+
* `Page` row that has no `status` (the field is missing, or stored as
|
|
5
|
+
* `null`).
|
|
6
|
+
*
|
|
7
|
+
* Why this is needed: RFC-0004 introduces a first-class `draft` state
|
|
8
|
+
* and the listing / search / backlink queries now branch on
|
|
9
|
+
* `Page.status`. Pages created before the `status` field existed read
|
|
10
|
+
* back as `null`; `Page.isPublished()` already treats `null` as
|
|
11
|
+
* published for back-compat, but the query-level `$or` filters and the
|
|
12
|
+
* collab draft gate are clearer — and future-proof against a stricter
|
|
13
|
+
* `required: true` — when every row carries an explicit value.
|
|
14
|
+
*
|
|
15
|
+
* Idempotent: the filter only matches rows that are still unset, so a
|
|
16
|
+
* second run touches nothing. Pages already `published` / `draft` /
|
|
17
|
+
* `deleted` / `deprecated` / `wip` are left exactly as they are — in
|
|
18
|
+
* particular this never rewrites a `draft` back to `published`, which
|
|
19
|
+
* would violate the one-way transition rule.
|
|
20
|
+
*
|
|
21
|
+
* Returns the number of rows updated, so the boot log can report it.
|
|
22
|
+
*/
|
|
23
|
+
export declare function runPageStatusMigration(crowi: Crowi): Promise<number>;
|
|
@@ -0,0 +1,48 @@
|
|
|
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.runPageStatusMigration = runPageStatusMigration;
|
|
7
|
+
const debug_1 = __importDefault(require("debug"));
|
|
8
|
+
const page_1 = require("../models/page");
|
|
9
|
+
const debug = (0, debug_1.default)('crowi:util:page-status-migration');
|
|
10
|
+
/**
|
|
11
|
+
* RFC-0004 backfill: stamp `status: 'published'` onto every legacy
|
|
12
|
+
* `Page` row that has no `status` (the field is missing, or stored as
|
|
13
|
+
* `null`).
|
|
14
|
+
*
|
|
15
|
+
* Why this is needed: RFC-0004 introduces a first-class `draft` state
|
|
16
|
+
* and the listing / search / backlink queries now branch on
|
|
17
|
+
* `Page.status`. Pages created before the `status` field existed read
|
|
18
|
+
* back as `null`; `Page.isPublished()` already treats `null` as
|
|
19
|
+
* published for back-compat, but the query-level `$or` filters and the
|
|
20
|
+
* collab draft gate are clearer — and future-proof against a stricter
|
|
21
|
+
* `required: true` — when every row carries an explicit value.
|
|
22
|
+
*
|
|
23
|
+
* Idempotent: the filter only matches rows that are still unset, so a
|
|
24
|
+
* second run touches nothing. Pages already `published` / `draft` /
|
|
25
|
+
* `deleted` / `deprecated` / `wip` are left exactly as they are — in
|
|
26
|
+
* particular this never rewrites a `draft` back to `published`, which
|
|
27
|
+
* would violate the one-way transition rule.
|
|
28
|
+
*
|
|
29
|
+
* Returns the number of rows updated, so the boot log can report it.
|
|
30
|
+
*/
|
|
31
|
+
async function runPageStatusMigration(crowi) {
|
|
32
|
+
const Page = crowi.model('Page');
|
|
33
|
+
// `status: null` matches both an explicit null and a missing field
|
|
34
|
+
// in MongoDB query semantics, so a single condition covers every
|
|
35
|
+
// legacy shape.
|
|
36
|
+
const result = await Page.updateMany({ status: null }, { $set: { status: page_1.STATUS_PUBLISHED } });
|
|
37
|
+
// Mongoose's UpdateResult exposes `modifiedCount`; fall back to 0 for
|
|
38
|
+
// any driver shape that omits it.
|
|
39
|
+
const modified = result.modifiedCount ?? 0;
|
|
40
|
+
if (modified > 0) {
|
|
41
|
+
console.log(`[crowi] Backfilled status='published' on ${modified} legacy page row(s).`);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
debug('no legacy pages without status — nothing to migrate');
|
|
45
|
+
}
|
|
46
|
+
return modified;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=page-status-migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-status-migration.js","sourceRoot":"","sources":["../../src/util/page-status-migration.ts"],"names":[],"mappings":";;;;;AA2BA,wDAiBC;AA5CD,kDAA0B;AAE1B,0CAAmD;AAEnD,MAAM,KAAK,GAAG,IAAA,eAAK,EAAC,kCAAkC,CAAC,CAAC;AAExD;;;;;;;;;;;;;;;;;;;;GAoBG;AACI,KAAK,UAAU,sBAAsB,CAAC,KAAY;IACvD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAEjC,mEAAmE;IACnE,iEAAiE;IACjE,gBAAgB;IAChB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,uBAAgB,EAAE,EAAE,CAAC,CAAC;IAE/F,sEAAsE;IACtE,kCAAkC;IAClC,MAAM,QAAQ,GAAI,MAAqC,CAAC,aAAa,IAAI,CAAC,CAAC;IAC3E,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,4CAA4C,QAAQ,sBAAsB,CAAC,CAAC;IAC1F,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,qDAAqD,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.decodeSpace = exports.encodeSpace = void 0;
|
|
4
|
+
const encodeSpace = (s) => {
|
|
5
|
+
return s.replace(/ /g, '+');
|
|
6
|
+
};
|
|
7
|
+
exports.encodeSpace = encodeSpace;
|
|
8
|
+
const decodeSpace = (s) => {
|
|
9
|
+
return s.replace(/\+/g, ' ');
|
|
10
|
+
};
|
|
11
|
+
exports.decodeSpace = decodeSpace;
|
|
12
|
+
//# sourceMappingURL=path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/util/path.ts"],"names":[],"mappings":";;;AAAO,MAAM,WAAW,GAAG,CAAC,CAAC,EAAE,EAAE;IAC/B,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAC9B,CAAC,CAAC;AAFW,QAAA,WAAW,eAEtB;AAEK,MAAM,WAAW,GAAG,CAAC,CAAC,EAAE,EAAE;IAC/B,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC/B,CAAC,CAAC;AAFW,QAAA,WAAW,eAEtB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RFC 7636 PKCE — S256 code-challenge verification.
|
|
3
|
+
*
|
|
4
|
+
* The client sends `code_challenge = base64url(sha256(code_verifier))` at
|
|
5
|
+
* authorize time and the raw `code_verifier` at token time. We recompute
|
|
6
|
+
* the challenge from the verifier and compare. Only S256 is supported
|
|
7
|
+
* (RFC-0010 §Security — the `plain` method is rejected upstream so it is
|
|
8
|
+
* not handled here).
|
|
9
|
+
*
|
|
10
|
+
* The comparison is constant-time (`crypto.timingSafeEqual`) to avoid
|
|
11
|
+
* leaking how many leading bytes matched.
|
|
12
|
+
*/
|
|
13
|
+
export declare function verifyPkceS256(codeVerifier: string, codeChallenge: string): boolean;
|
|
@@ -0,0 +1,30 @@
|
|
|
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.verifyPkceS256 = verifyPkceS256;
|
|
7
|
+
const node_crypto_1 = __importDefault(require("node:crypto"));
|
|
8
|
+
/**
|
|
9
|
+
* RFC 7636 PKCE — S256 code-challenge verification.
|
|
10
|
+
*
|
|
11
|
+
* The client sends `code_challenge = base64url(sha256(code_verifier))` at
|
|
12
|
+
* authorize time and the raw `code_verifier` at token time. We recompute
|
|
13
|
+
* the challenge from the verifier and compare. Only S256 is supported
|
|
14
|
+
* (RFC-0010 §Security — the `plain` method is rejected upstream so it is
|
|
15
|
+
* not handled here).
|
|
16
|
+
*
|
|
17
|
+
* The comparison is constant-time (`crypto.timingSafeEqual`) to avoid
|
|
18
|
+
* leaking how many leading bytes matched.
|
|
19
|
+
*/
|
|
20
|
+
function verifyPkceS256(codeVerifier, codeChallenge) {
|
|
21
|
+
const computed = node_crypto_1.default.createHash('sha256').update(codeVerifier).digest('base64url');
|
|
22
|
+
const a = Buffer.from(computed);
|
|
23
|
+
const b = Buffer.from(codeChallenge);
|
|
24
|
+
// timingSafeEqual throws on length mismatch — a length difference is
|
|
25
|
+
// already a definitive non-match, so short-circuit.
|
|
26
|
+
if (a.length !== b.length)
|
|
27
|
+
return false;
|
|
28
|
+
return node_crypto_1.default.timingSafeEqual(a, b);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=pkce.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pkce.js","sourceRoot":"","sources":["../../src/util/pkce.ts"],"names":[],"mappings":";;;;;AAcA,wCAQC;AAtBD,8DAAiC;AAEjC;;;;;;;;;;;GAWG;AACH,SAAgB,cAAc,CAAC,YAAoB,EAAE,aAAqB;IACxE,MAAM,QAAQ,GAAG,qBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACtF,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACrC,qEAAqE;IACrE,oDAAoD;IACpD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,qBAAM,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type PresenceTokenPayload } from '@crowi/api-contract';
|
|
2
|
+
/** Claims signed into a presence token. */
|
|
3
|
+
export interface PresenceTokenClaims {
|
|
4
|
+
userId: string;
|
|
5
|
+
pageId: string;
|
|
6
|
+
}
|
|
7
|
+
export interface SignPresenceTokenResult {
|
|
8
|
+
/** Compact JWT string presented by the browser on the WebSocket connect. */
|
|
9
|
+
token: string;
|
|
10
|
+
/** ISO 8601 expiry timestamp, mirrors `exp * 1000` as a Date. */
|
|
11
|
+
expiresAt: Date;
|
|
12
|
+
}
|
|
13
|
+
declare function buildPresenceTokenUtil(): {
|
|
14
|
+
signPresenceToken: (claims: PresenceTokenClaims) => SignPresenceTokenResult;
|
|
15
|
+
verifyPresenceToken: (token: string) => PresenceTokenPayload | null;
|
|
16
|
+
ttlSeconds: number;
|
|
17
|
+
issuer: string;
|
|
18
|
+
};
|
|
19
|
+
export type PresenceTokenUtil = ReturnType<typeof buildPresenceTokenUtil>;
|
|
20
|
+
export declare function createPresenceTokenUtil(): PresenceTokenUtil;
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,120 @@
|
|
|
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.createPresenceTokenUtil = createPresenceTokenUtil;
|
|
7
|
+
const node_crypto_1 = __importDefault(require("node:crypto"));
|
|
8
|
+
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
9
|
+
const api_contract_1 = require("@crowi/api-contract");
|
|
10
|
+
const debug_1 = __importDefault(require("debug"));
|
|
11
|
+
const debug = (0, debug_1.default)('crowi:util:presence-token');
|
|
12
|
+
/**
|
|
13
|
+
* Issuer claim used to sign / verify presence tokens (RFC-0005).
|
|
14
|
+
*
|
|
15
|
+
* Deliberately distinct from the collab wsToken issuer
|
|
16
|
+
* (`'crowi-collab'`, see `util/ws-token.ts`) and the HTTP access/refresh
|
|
17
|
+
* token issuer (`'crowi'`). A leaked presence token must never be
|
|
18
|
+
* replayable against the collab WebSocket — `/collab` carries write
|
|
19
|
+
* access to the Y.Doc, `/presence` is read-only viewer tracking — so
|
|
20
|
+
* the two channels verify against different `iss` claims even though
|
|
21
|
+
* they share the same `WS_TOKEN_SECRET` key material.
|
|
22
|
+
*/
|
|
23
|
+
const PRESENCE_TOKEN_ISSUER = 'crowi-presence';
|
|
24
|
+
/**
|
|
25
|
+
* Lifetime of an issued presence token. Five minutes mirrors the
|
|
26
|
+
* collab wsToken TTL: short enough that a leaked token has limited
|
|
27
|
+
* blast radius, long enough to cover reconnect storms. The browser
|
|
28
|
+
* uses `expiresAt` to proactively re-fetch before the WebSocket would
|
|
29
|
+
* otherwise be dropped.
|
|
30
|
+
*/
|
|
31
|
+
const PRESENCE_TOKEN_TTL_SECONDS = 300;
|
|
32
|
+
/**
|
|
33
|
+
* Resolve the signing secret once per util instance.
|
|
34
|
+
*
|
|
35
|
+
* Presence reuses `WS_TOKEN_SECRET` rather than introducing a new env:
|
|
36
|
+
* the two token kinds are isolated by their `iss` claim, so sharing the
|
|
37
|
+
* key material is safe and keeps operators from having to distribute a
|
|
38
|
+
* second secret. When `WS_TOKEN_SECRET` is unset we generate a random
|
|
39
|
+
* in-memory secret and warn — single-instance dev still works, but
|
|
40
|
+
* process restarts invalidate outstanding tokens and multi-instance
|
|
41
|
+
* deployments cannot cross-verify.
|
|
42
|
+
*/
|
|
43
|
+
const resolvePresenceTokenSecret = () => {
|
|
44
|
+
const fromEnv = process.env.WS_TOKEN_SECRET;
|
|
45
|
+
if (fromEnv && fromEnv.length > 0) {
|
|
46
|
+
debug('presence token secret resolved from WS_TOKEN_SECRET');
|
|
47
|
+
return fromEnv;
|
|
48
|
+
}
|
|
49
|
+
const generated = node_crypto_1.default.randomBytes(32).toString('base64');
|
|
50
|
+
console.warn('[crowi] WS_TOKEN_SECRET is not set — generated a random in-memory secret for presence tokens. ' +
|
|
51
|
+
'Process restarts will invalidate outstanding presence tokens, and multi-instance deployments ' +
|
|
52
|
+
'will not be able to cross-verify them. Set WS_TOKEN_SECRET to a stable base64-encoded 32-byte ' +
|
|
53
|
+
'value (`openssl rand -base64 32`) in production.');
|
|
54
|
+
return generated;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Build a sign / verify pair bound to a single resolved secret.
|
|
58
|
+
*
|
|
59
|
+
* Memoised for the same reason `createWsTokenUtil` is: when
|
|
60
|
+
* `WS_TOKEN_SECRET` is unset, `resolvePresenceTokenSecret` mints a
|
|
61
|
+
* fresh random secret per call. Two `createPresenceTokenUtil()` calls
|
|
62
|
+
* would otherwise close over different secrets and the HTTP-sign /
|
|
63
|
+
* WebSocket-verify pair would silently break in dev.
|
|
64
|
+
*/
|
|
65
|
+
let cachedUtil = null;
|
|
66
|
+
function buildPresenceTokenUtil() {
|
|
67
|
+
const secret = resolvePresenceTokenSecret();
|
|
68
|
+
/**
|
|
69
|
+
* Sign a presence token for the given claims. Returns the compact
|
|
70
|
+
* JWT plus the absolute ISO expiry; the route serialises the
|
|
71
|
+
* timestamp into `PresenceTokenResponseSchema.expiresAt`.
|
|
72
|
+
*/
|
|
73
|
+
function signPresenceToken(claims) {
|
|
74
|
+
// Pin `iat` ourselves so the response's `expiresAt` is exactly the
|
|
75
|
+
// same instant as the JWT's `exp` claim.
|
|
76
|
+
const iat = Math.floor(Date.now() / 1000);
|
|
77
|
+
const exp = iat + PRESENCE_TOKEN_TTL_SECONDS;
|
|
78
|
+
const token = jsonwebtoken_1.default.sign({ ...claims, iat, exp }, secret, {
|
|
79
|
+
issuer: PRESENCE_TOKEN_ISSUER,
|
|
80
|
+
algorithm: 'HS256',
|
|
81
|
+
});
|
|
82
|
+
return { token, expiresAt: new Date(exp * 1000) };
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Verify a presence token. Returns the validated payload, or `null`
|
|
86
|
+
* for any failure (expired, bad signature, wrong issuer, malformed
|
|
87
|
+
* claims). Callers must treat `null` as "reject the connection".
|
|
88
|
+
*/
|
|
89
|
+
function verifyPresenceToken(token) {
|
|
90
|
+
try {
|
|
91
|
+
const decoded = jsonwebtoken_1.default.verify(token, secret, {
|
|
92
|
+
issuer: PRESENCE_TOKEN_ISSUER,
|
|
93
|
+
algorithms: ['HS256'],
|
|
94
|
+
});
|
|
95
|
+
const parsed = api_contract_1.PresenceTokenPayloadSchema.safeParse(decoded);
|
|
96
|
+
if (!parsed.success) {
|
|
97
|
+
debug('presence token payload failed schema validation:', parsed.error.issues);
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
return parsed.data;
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
debug('presence token verification failed:', err.message);
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
signPresenceToken,
|
|
109
|
+
verifyPresenceToken,
|
|
110
|
+
ttlSeconds: PRESENCE_TOKEN_TTL_SECONDS,
|
|
111
|
+
issuer: PRESENCE_TOKEN_ISSUER,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
function createPresenceTokenUtil() {
|
|
115
|
+
if (cachedUtil === null) {
|
|
116
|
+
cachedUtil = buildPresenceTokenUtil();
|
|
117
|
+
}
|
|
118
|
+
return cachedUtil;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=presence-token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presence-token.js","sourceRoot":"","sources":["../../src/util/presence-token.ts"],"names":[],"mappings":";;;;;AAqIA,0DAKC;AA1ID,8DAAiC;AACjC,gEAA+B;AAC/B,sDAA4F;AAC5F,kDAA0B;AAE1B,MAAM,KAAK,GAAG,IAAA,eAAK,EAAC,2BAA2B,CAAC,CAAC;AAEjD;;;;;;;;;;GAUG;AACH,MAAM,qBAAqB,GAAG,gBAAgB,CAAC;AAE/C;;;;;;GAMG;AACH,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAevC;;;;;;;;;;GAUG;AACH,MAAM,0BAA0B,GAAG,GAAW,EAAE;IAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAC5C,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,KAAK,CAAC,qDAAqD,CAAC,CAAC;QAC7D,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,SAAS,GAAG,qBAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5D,OAAO,CAAC,IAAI,CACV,gGAAgG;QAC9F,+FAA+F;QAC/F,gGAAgG;QAChG,kDAAkD,CACrD,CAAC;IACF,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,IAAI,UAAU,GAAqD,IAAI,CAAC;AAExE,SAAS,sBAAsB;IAC7B,MAAM,MAAM,GAAG,0BAA0B,EAAE,CAAC;IAE5C;;;;OAIG;IACH,SAAS,iBAAiB,CAAC,MAA2B;QACpD,mEAAmE;QACnE,yCAAyC;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,GAAG,GAAG,0BAA0B,CAAC;QAC7C,MAAM,KAAK,GAAG,sBAAG,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE;YACtD,MAAM,EAAE,qBAAqB;YAC7B,SAAS,EAAE,OAAO;SACnB,CAAC,CAAC;QACH,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC;IACpD,CAAC;IAED;;;;OAIG;IACH,SAAS,mBAAmB,CAAC,KAAa;QACxC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,sBAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE;gBACxC,MAAM,EAAE,qBAAqB;gBAC7B,UAAU,EAAE,CAAC,OAAO,CAAC;aACtB,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,yCAA0B,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAC7D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,KAAK,CAAC,kDAAkD,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC/E,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,MAAM,CAAC,IAAI,CAAC;QACrB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,CAAC,qCAAqC,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;YACrE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO;QACL,iBAAiB;QACjB,mBAAmB;QACnB,UAAU,EAAE,0BAA0B;QACtC,MAAM,EAAE,qBAAqB;KAC9B,CAAC;AACJ,CAAC;AAID,SAAgB,uBAAuB;IACrC,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,UAAU,GAAG,sBAAsB,EAAE,CAAC;IACxC,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RFC-0004 Phase 5 — generic per-user fixed-window rate limiter.
|
|
3
|
+
*
|
|
4
|
+
* Used by the autocomplete endpoints (60 req/min/user) and, from
|
|
5
|
+
* Phase 6, the attachment-upload endpoint (20 req/min/user). There was
|
|
6
|
+
* no shared rate-limit utility before RFC-0004, so this is new.
|
|
7
|
+
*
|
|
8
|
+
* Storage strategy:
|
|
9
|
+
* - When a Redis client is supplied (multi-instance api deployment),
|
|
10
|
+
* counters live in Redis so the limit is shared across replicas.
|
|
11
|
+
* A fixed window keyed by `floor(now / windowMs)` keeps the logic
|
|
12
|
+
* to one `INCR` + one `EXPIRE` — no Lua, no sorted sets.
|
|
13
|
+
* - When no Redis client is supplied (single-instance dev), an
|
|
14
|
+
* in-memory `Map` fallback applies the same fixed-window logic
|
|
15
|
+
* within the process. Stale windows are pruned lazily on access
|
|
16
|
+
* plus by a low-frequency sweep so the map cannot grow unbounded.
|
|
17
|
+
*
|
|
18
|
+
* Fail-open posture: if the Redis round-trip throws, the request is
|
|
19
|
+
* allowed. A rate limiter that hard-fails closed would turn a Redis
|
|
20
|
+
* blip into a full feature outage, which is worse than briefly losing
|
|
21
|
+
* the limit. The same posture is used by `editor-cap-counter.ts`.
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* Minimum surface of a node-redis v4 client this limiter leans on.
|
|
25
|
+
* Structurally compatible with `crowi.redis`; kept narrow so tests can
|
|
26
|
+
* supply a tiny fake.
|
|
27
|
+
*/
|
|
28
|
+
export interface RateLimitRedisClient {
|
|
29
|
+
incr(key: string): Promise<number>;
|
|
30
|
+
pExpire(key: string, ms: number): Promise<unknown>;
|
|
31
|
+
}
|
|
32
|
+
export interface RateLimitOptions {
|
|
33
|
+
/** Logical bucket name, e.g. `'autocomplete'`. Namespaces the keys. */
|
|
34
|
+
name: string;
|
|
35
|
+
/** Max allowed requests per window. */
|
|
36
|
+
limit: number;
|
|
37
|
+
/** Window length in milliseconds. */
|
|
38
|
+
windowMs: number;
|
|
39
|
+
/** Shared Redis client; omit / pass `null` to use the in-memory fallback. */
|
|
40
|
+
redisClient?: RateLimitRedisClient | null;
|
|
41
|
+
}
|
|
42
|
+
export interface RateLimitResult {
|
|
43
|
+
/** Whether this request is within budget (and should proceed). */
|
|
44
|
+
allowed: boolean;
|
|
45
|
+
/** Requests already counted in the current window (including this one). */
|
|
46
|
+
count: number;
|
|
47
|
+
/** Configured limit, echoed for response headers. */
|
|
48
|
+
limit: number;
|
|
49
|
+
/**
|
|
50
|
+
* Seconds until the current window resets. Surfaced as `Retry-After`
|
|
51
|
+
* on a 429. Always ≥ 1.
|
|
52
|
+
*/
|
|
53
|
+
retryAfterSeconds: number;
|
|
54
|
+
}
|
|
55
|
+
export interface RateLimiter {
|
|
56
|
+
/**
|
|
57
|
+
* Count one request for `userId` and report whether it is allowed.
|
|
58
|
+
* `userId` should be the stable user id; the limiter namespaces it
|
|
59
|
+
* with `name` and the window index internally.
|
|
60
|
+
*/
|
|
61
|
+
hit(userId: string): Promise<RateLimitResult>;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Build a per-user rate limiter. Same API whether it is Redis-backed or
|
|
65
|
+
* in-memory, so callers never branch.
|
|
66
|
+
*/
|
|
67
|
+
export declare function createRateLimiter(options: RateLimitOptions): RateLimiter;
|