@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
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2013 Sotaro KARASAWA <sotaro.k@gmail.com>
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
|
13
|
+
all copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
21
|
+
THE SOFTWARE.
|
package/dist/app.d.ts
ADDED
package/dist/app.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Crowi::app.js
|
|
5
|
+
*
|
|
6
|
+
* @package Crowi
|
|
7
|
+
* @author Sotaro KARASAWA <sotarok@crocos.co.jp>
|
|
8
|
+
*/
|
|
9
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
10
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
const dotenv_1 = __importDefault(require("dotenv"));
|
|
14
|
+
const crowi_1 = __importDefault(require("./crowi"));
|
|
15
|
+
const path_1 = require("path");
|
|
16
|
+
// load .env
|
|
17
|
+
dotenv_1.default.config();
|
|
18
|
+
const crowi = new crowi_1.default((0, path_1.resolve)((0, path_1.join)(__dirname, '..')), process.env);
|
|
19
|
+
crowi.init().then(crowi.start).catch(crowi.exitOnError);
|
|
20
|
+
/**
|
|
21
|
+
* RFC-0003 — graceful shutdown for the embedded Hocuspocus engine.
|
|
22
|
+
*
|
|
23
|
+
* Two routes can fire the teardown:
|
|
24
|
+
* - `SIGINT` (Ctrl-C in dev / orchestrator stop)
|
|
25
|
+
* - `SIGTERM` (docker stop / systemd / k8s)
|
|
26
|
+
*
|
|
27
|
+
* `shutdown()` flushes pending Y.Doc checkpoints before dropping
|
|
28
|
+
* connections — without this hook, an unsaved-debounce window's worth
|
|
29
|
+
* of edits would be lost on every process restart. We defer the actual
|
|
30
|
+
* `process.exit` to Node's default behaviour after the handler resolves
|
|
31
|
+
* so any other registered shutdown logic still runs.
|
|
32
|
+
*/
|
|
33
|
+
let shuttingDown = false;
|
|
34
|
+
const shutdown = async (signal) => {
|
|
35
|
+
if (shuttingDown)
|
|
36
|
+
return;
|
|
37
|
+
shuttingDown = true;
|
|
38
|
+
console.log(`[crowi] ${signal} received — shutting down`);
|
|
39
|
+
try {
|
|
40
|
+
await crowi.collabAttachment?.shutdown();
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
console.error('[crowi] collabAttachment.shutdown failed:', err);
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
await crowi.presenceAttachment?.shutdown();
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
console.error('[crowi] presenceAttachment.shutdown failed:', err);
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
await crowi.notificationsAttachment?.shutdown();
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
console.error('[crowi] notificationsAttachment.shutdown failed:', err);
|
|
56
|
+
}
|
|
57
|
+
process.exit(0);
|
|
58
|
+
};
|
|
59
|
+
process.on('SIGINT', () => {
|
|
60
|
+
void shutdown('SIGINT');
|
|
61
|
+
});
|
|
62
|
+
process.on('SIGTERM', () => {
|
|
63
|
+
void shutdown('SIGTERM');
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=app.js.map
|
package/dist/app.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":";;AACA;;;;;GAKG;;;;;AAEH,oDAA4B;AAC5B,sDAA8B;AAC9B,+BAAqC;AAErC,YAAY;AACZ,gBAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,MAAM,KAAK,GAAG,IAAI,eAAK,CAAC,IAAA,cAAO,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;AAErE,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AAExD;;;;;;;;;;;;GAYG;AACH,IAAI,YAAY,GAAG,KAAK,CAAC;AACzB,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAiB,EAAE;IACvD,IAAI,YAAY;QAAE,OAAO;IACzB,YAAY,GAAG,IAAI,CAAC;IACpB,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,2BAA2B,CAAC,CAAC;IAC1D,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,gBAAgB,EAAE,QAAQ,EAAE,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,GAAG,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,kBAAkB,EAAE,QAAQ,EAAE,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,6CAA6C,EAAE,GAAG,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,uBAAuB,EAAE,QAAQ,EAAE,CAAC;IAClD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,kDAAkD,EAAE,GAAG,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC;AACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC1B,CAAC,CAAC,CAAC;AACH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;IACzB,KAAK,QAAQ,CAAC,SAAS,CAAC,CAAC;AAC3B,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Server as HttpServer } from 'node:http';
|
|
2
|
+
import type Crowi from '../crowi';
|
|
3
|
+
/**
|
|
4
|
+
* Public surface returned from `attachCollabServer`. The api boot
|
|
5
|
+
* keeps the handle so SIGINT teardown can flush pending stores,
|
|
6
|
+
* destroy the engine, and disconnect the cap counter before mongoose
|
|
7
|
+
* shuts down.
|
|
8
|
+
*/
|
|
9
|
+
export interface AttachedCollab {
|
|
10
|
+
/**
|
|
11
|
+
* Detach + tear down the Hocuspocus engine. Idempotent and safe to
|
|
12
|
+
* call from a SIGINT handler that also calls other shutdown hooks.
|
|
13
|
+
* `flushPendingStores` is fired so the next-after-debounce
|
|
14
|
+
* `onStoreDocument` actually runs before the engine drops references
|
|
15
|
+
* to live Y.Docs.
|
|
16
|
+
*/
|
|
17
|
+
shutdown(): Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Wire the `@crowi/collab` Hocuspocus engine into the api's existing
|
|
21
|
+
* Express http.Server. The engine handles `ws://<api-host>/collab/:pageId?token=<wsToken>`
|
|
22
|
+
* via the `ws` library's `noServer` mode — same Node process, same
|
|
23
|
+
* event loop, same Mongoose connection, same Redis client.
|
|
24
|
+
*
|
|
25
|
+
* Replaces the standalone `@crowi/collab` CLI from RFC-0003 Phase 3-8.
|
|
26
|
+
* The motivation + design lives in `.feature-state/specs/feature-collab-embed-into-api.md`.
|
|
27
|
+
*
|
|
28
|
+
* Boot order: must be called **after** `setupModels` + `setupRenderer`
|
|
29
|
+
* (renderer pipeline is read by `Revision.prepareRevision` from the
|
|
30
|
+
* save flow). The api's `Crowi.start` invokes this right before
|
|
31
|
+
* `server.listen`.
|
|
32
|
+
*/
|
|
33
|
+
export declare function attachCollabServer(httpServer: HttpServer, crowi: Crowi): Promise<AttachedCollab>;
|
|
@@ -0,0 +1,341 @@
|
|
|
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.attachCollabServer = attachCollabServer;
|
|
7
|
+
const debug_1 = __importDefault(require("debug"));
|
|
8
|
+
const ws_1 = require("ws");
|
|
9
|
+
const collab_cap_1 = require("../util/collab-cap");
|
|
10
|
+
const ws_token_1 = require("../util/ws-token");
|
|
11
|
+
const presence_1 = require("../service/presence");
|
|
12
|
+
const extension_redis_1 = require("./extension-redis");
|
|
13
|
+
const debug = (0, debug_1.default)('crowi:collab:attach');
|
|
14
|
+
/**
|
|
15
|
+
* Path namespace the Hocuspocus engine answers on. HocuspocusProvider
|
|
16
|
+
* uses `url` verbatim as the WebSocket endpoint and sends the document
|
|
17
|
+
* name (= pageId) through the protocol after the handshake, so the
|
|
18
|
+
* path the browser hits is `/collab` (no document segment). The
|
|
19
|
+
* upgrade filter accepts both `/collab` and `/collab/...` so future
|
|
20
|
+
* variants that *do* include the document in the path keep working,
|
|
21
|
+
* and so sibling WebSocket handlers (socket.io etc.) can coexist on
|
|
22
|
+
* the same listener.
|
|
23
|
+
*/
|
|
24
|
+
const COLLAB_PATH = '/collab';
|
|
25
|
+
/**
|
|
26
|
+
* Default Hocuspocus debounce window (ms) — matches the upstream v4
|
|
27
|
+
* default (`debounce: 2000`). Re-declared here so the api-side attach
|
|
28
|
+
* can pin it explicitly without importing private upstream constants.
|
|
29
|
+
*/
|
|
30
|
+
const DEFAULT_DEBOUNCE_MS = 2000;
|
|
31
|
+
const DEFAULT_MAX_DEBOUNCE_MS = 10000;
|
|
32
|
+
/**
|
|
33
|
+
* Graceful-drain window between asking sockets to close politely and
|
|
34
|
+
* force-terminating any stragglers. Clients normally close within a
|
|
35
|
+
* round-trip; this gives them ~500 ms to flush their final `update`
|
|
36
|
+
* frame before SIGINT kicks them off.
|
|
37
|
+
*/
|
|
38
|
+
const SHUTDOWN_DRAIN_MS = 500;
|
|
39
|
+
/**
|
|
40
|
+
* Wire the `@crowi/collab` Hocuspocus engine into the api's existing
|
|
41
|
+
* Express http.Server. The engine handles `ws://<api-host>/collab/:pageId?token=<wsToken>`
|
|
42
|
+
* via the `ws` library's `noServer` mode — same Node process, same
|
|
43
|
+
* event loop, same Mongoose connection, same Redis client.
|
|
44
|
+
*
|
|
45
|
+
* Replaces the standalone `@crowi/collab` CLI from RFC-0003 Phase 3-8.
|
|
46
|
+
* The motivation + design lives in `.feature-state/specs/feature-collab-embed-into-api.md`.
|
|
47
|
+
*
|
|
48
|
+
* Boot order: must be called **after** `setupModels` + `setupRenderer`
|
|
49
|
+
* (renderer pipeline is read by `Revision.prepareRevision` from the
|
|
50
|
+
* save flow). The api's `Crowi.start` invokes this right before
|
|
51
|
+
* `server.listen`.
|
|
52
|
+
*/
|
|
53
|
+
async function attachCollabServer(httpServer, crowi) {
|
|
54
|
+
// Reach for the api-side models — they were already wired by
|
|
55
|
+
// `setupModels` against the same Mongoose connection collab will
|
|
56
|
+
// use, so save / load / compaction all operate on the same row
|
|
57
|
+
// identities the HTTP path observes.
|
|
58
|
+
const models = {
|
|
59
|
+
Page: crowi.model('Page'),
|
|
60
|
+
Revision: crowi.model('Revision'),
|
|
61
|
+
PageYjsUpdate: crowi.model('PageYjsUpdate'),
|
|
62
|
+
User: crowi.model('User'),
|
|
63
|
+
PluginRenderCache: crowi.model('PluginRenderCache'),
|
|
64
|
+
};
|
|
65
|
+
// Same sign+verify pair the wsToken HTTP handler uses. In the
|
|
66
|
+
// RFC-0003 same-process attach world, the api signs in
|
|
67
|
+
// `routes/ts-rest/page-collab.ts` and verifies here against the
|
|
68
|
+
// **same closure-captured secret** — no env distribution drift.
|
|
69
|
+
const wsTokenUtil = (0, ws_token_1.createWsTokenUtil)();
|
|
70
|
+
// Process-wide cap counter shared with the wsToken HTTP handler
|
|
71
|
+
// (`util/collab-cap.ts:checkEditorCap`). Both call sites route
|
|
72
|
+
// through `getEditorCapCounter(crowi)` so sign-time `peek` and
|
|
73
|
+
// connect-time `tryAcquire` operate on the same instance — one
|
|
74
|
+
// Redis client, one cap key, one in-process cache. When
|
|
75
|
+
// `crowi.redis` is null (REDIS_URL unset) the counter degrades to
|
|
76
|
+
// its built-in no-op shape (same fail-open posture as Phase 6).
|
|
77
|
+
const editorCapCounter = await (0, collab_cap_1.getEditorCapCounter)(crowi);
|
|
78
|
+
// pageEvent in-process adapter: the collab save flow publishes
|
|
79
|
+
// `update` after a successful checkpoint, and we forward it to the
|
|
80
|
+
// api's local `EventEmitter` so render-cache invalidation /
|
|
81
|
+
// mention-dispatch / search indexing react as if the save had
|
|
82
|
+
// happened over HTTP. Re-fetching Page + User mirrors what the
|
|
83
|
+
// cross-process subscriber did in `service/page-event-pubsub.ts`,
|
|
84
|
+
// so listeners can read the latest state without worrying about
|
|
85
|
+
// BSON ↔ JSON round-trips dropping fields.
|
|
86
|
+
const pageEventPublisher = {
|
|
87
|
+
async publish(eventName, payload) {
|
|
88
|
+
try {
|
|
89
|
+
const Page = crowi.model('Page');
|
|
90
|
+
const User = crowi.model('User');
|
|
91
|
+
// `revision` MUST be populated: `Page.updatePage` / `pushRevision`
|
|
92
|
+
// emit the event with `revision` as the full Revision document,
|
|
93
|
+
// and listeners rely on it — `events/page.ts` reads
|
|
94
|
+
// `revision.body` to build backlinks, `mention-dispatch` reads
|
|
95
|
+
// `revision.meta`. A bare ObjectId here makes those silently
|
|
96
|
+
// no-op (the backlink builder throws "no revision/body" and the
|
|
97
|
+
// error is swallowed at debug level).
|
|
98
|
+
const [pageDoc, userDoc] = await Promise.all([Page.findById(payload.pageId).populate('revision').exec(), User.findById(payload.userId).exec()]);
|
|
99
|
+
if (!pageDoc) {
|
|
100
|
+
debug('pageEventPublisher: page %s not found, skipping emit', payload.pageId);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
// Same wire shape as `Page.updatePage` / `Page.createPage` so
|
|
104
|
+
// api-side listeners (events/page.ts, events/render-cache.ts,
|
|
105
|
+
// events/mention-dispatch.ts) don't need a collab-specific
|
|
106
|
+
// branch. The 4th arg flags "a new revision was created": a collab
|
|
107
|
+
// save always pushes a new revision (save-flow Step 2), so
|
|
108
|
+
// forward `true` for 'update' so events/page.ts fans out an UPDATE
|
|
109
|
+
// notification on the realtime path too.
|
|
110
|
+
crowi.event('Page').emit(eventName, pageDoc, userDoc, payload.bookmarkCount ?? 0, eventName === 'update');
|
|
111
|
+
debug('pageEventPublisher: emitted %s for page %s', eventName, payload.pageId);
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
// Save already committed — fan-out is best-effort.
|
|
115
|
+
console.warn(`[crowi:collab] pageEventPublisher.publish failed for page ${payload.pageId}:`, err.message);
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
// Phase 6 cap peek used by `on-authenticate`. The collab hook OR's
|
|
120
|
+
// this peek result with the token's readonly bit, so a Redis-reported
|
|
121
|
+
// cap-reached reading downgrades the connection to readonly even
|
|
122
|
+
// when the token was minted editable. Same `peek` implementation
|
|
123
|
+
// the wsToken endpoint uses → no drift between sign-time and
|
|
124
|
+
// connect-time cap state.
|
|
125
|
+
const checkEditorCap = async (pageId) => {
|
|
126
|
+
const { count, cap } = await editorCapCounter.peek(pageId);
|
|
127
|
+
return { readonly: count >= cap };
|
|
128
|
+
};
|
|
129
|
+
// Phase 9 — when this api process has a Redis client wired
|
|
130
|
+
// (`REDIS_URL` set), attach `@hocuspocus/extension-redis` so cross-
|
|
131
|
+
// instance Y.Doc updates + awareness fan out via Redis pub/sub.
|
|
132
|
+
// When `crowi.redis === null` (single-instance dev) the extensions
|
|
133
|
+
// array stays empty and Hocuspocus runs in standalone mode — same
|
|
134
|
+
// shape as Phase 8.5 landed.
|
|
135
|
+
//
|
|
136
|
+
// The extension creates its own ioredis clients (pub + sub) via the
|
|
137
|
+
// `createClient` callback we provide; api's existing node-redis v4
|
|
138
|
+
// client is not shared (the two libraries have incompatible APIs).
|
|
139
|
+
const extensions = [];
|
|
140
|
+
const redisExtension = (0, extension_redis_1.buildCollabRedisExtension)(crowi);
|
|
141
|
+
if (redisExtension !== null) {
|
|
142
|
+
extensions.push(redisExtension);
|
|
143
|
+
}
|
|
144
|
+
// Lazy `require()` so Jest never tries to parse `crossws`'s ESM
|
|
145
|
+
// bundle during test collection (the api boot graph reaches this
|
|
146
|
+
// file via `src/crowi/index.ts` even when tests don't actually
|
|
147
|
+
// call `start()`). The collab dist is plain CJS so the require
|
|
148
|
+
// resolves cleanly under both jest and the dev runner.
|
|
149
|
+
//
|
|
150
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
151
|
+
const collab = require('@crowi/collab');
|
|
152
|
+
// RFC-0005 — the api-side presence adapter so a collab connect /
|
|
153
|
+
// disconnect records a short-lived editing signal (the `✏️` badge).
|
|
154
|
+
// `@crowi/collab` is crowi-agnostic; this adapter resolves the
|
|
155
|
+
// process-shared presence service lazily and swallows failures. It
|
|
156
|
+
// also owns a periodic refresher whose timer must be stopped on
|
|
157
|
+
// shutdown — hence the handle is kept (see `shutdown()` below).
|
|
158
|
+
const presenceDeps = (0, presence_1.createPresenceCollabDeps)(crowi);
|
|
159
|
+
const hocuspocus = collab.createCollabServer({
|
|
160
|
+
models,
|
|
161
|
+
wsTokenUtil,
|
|
162
|
+
debounce: DEFAULT_DEBOUNCE_MS,
|
|
163
|
+
maxDebounce: DEFAULT_MAX_DEBOUNCE_MS,
|
|
164
|
+
checkEditorCap,
|
|
165
|
+
editorCapCounter,
|
|
166
|
+
pageEventPublisher,
|
|
167
|
+
extensions,
|
|
168
|
+
presence: presenceDeps,
|
|
169
|
+
});
|
|
170
|
+
// `noServer: true` — the upgrade handshake is owned by the api
|
|
171
|
+
// process; we forward only `/collab/*` upgrades into Hocuspocus.
|
|
172
|
+
const wss = new ws_1.WebSocketServer({ noServer: true });
|
|
173
|
+
// Track sockets so `shutdown` can terminate any still-open
|
|
174
|
+
// connections without waiting for them to drain (test harnesses
|
|
175
|
+
// / abnormal client behaviour leave sockets in CLOSE_WAIT
|
|
176
|
+
// otherwise, and `server.close()` would hang).
|
|
177
|
+
const liveSockets = new Set();
|
|
178
|
+
/**
|
|
179
|
+
* Wire one `ws.WebSocket` to its Hocuspocus `ClientConnection`.
|
|
180
|
+
* Hocuspocus delivers events into the connection via
|
|
181
|
+
* `handleMessage` / `handleClose` — when running through the
|
|
182
|
+
* `Server` wrapper (crossws) it's done by the adapter; here we do
|
|
183
|
+
* it manually so the dependency on `ws` stays narrow.
|
|
184
|
+
*
|
|
185
|
+
* Buffer → Uint8Array: the default `binaryType` for the `ws`
|
|
186
|
+
* server is `nodebuffer`, and Hocuspocus expects `Uint8Array` in
|
|
187
|
+
* `handleMessage`. `Buffer` inherits from `Uint8Array` so a
|
|
188
|
+
* direct pass-through is structurally valid, but we coerce
|
|
189
|
+
* explicitly so a future `binaryType` flip stays safe.
|
|
190
|
+
*/
|
|
191
|
+
const wireConnection = (ws, request) => {
|
|
192
|
+
liveSockets.add(ws);
|
|
193
|
+
const clientConnection = hocuspocus.handleConnection(ws, request);
|
|
194
|
+
ws.on('message', (data) => {
|
|
195
|
+
// `ws` default `binaryType: 'nodebuffer'` → Buffer (extends
|
|
196
|
+
// Uint8Array, structurally compatible with Hocuspocus). The
|
|
197
|
+
// ArrayBuffer branch covers `binaryType: 'arraybuffer'` if it
|
|
198
|
+
// ever flips. We don't request `'fragments'` mode, so the
|
|
199
|
+
// `Buffer[]` shape never reaches us.
|
|
200
|
+
const view = data instanceof ArrayBuffer ? new Uint8Array(data) : data;
|
|
201
|
+
clientConnection.handleMessage(view);
|
|
202
|
+
});
|
|
203
|
+
ws.on('close', (code, reason) => {
|
|
204
|
+
liveSockets.delete(ws);
|
|
205
|
+
clientConnection.handleClose({ code, reason: reason?.toString?.() ?? '' });
|
|
206
|
+
});
|
|
207
|
+
ws.on('error', (err) => {
|
|
208
|
+
// Don't crash the api process on a single bad socket. Mirror
|
|
209
|
+
// Hocuspocus's upstream Server behaviour (`console.error` +
|
|
210
|
+
// continue).
|
|
211
|
+
console.error('[crowi:collab] websocket error', err);
|
|
212
|
+
});
|
|
213
|
+
};
|
|
214
|
+
/**
|
|
215
|
+
* `'upgrade'` event handler. Path filter the request first so
|
|
216
|
+
* sibling upgrade handlers (none today, but planned: socket.io for
|
|
217
|
+
* notifications) keep their slots. `socket.destroy()` is **not**
|
|
218
|
+
* called on a no-match — letting Node.js move on to the next
|
|
219
|
+
* registered listener is the documented behaviour for cooperating
|
|
220
|
+
* upgrade handlers.
|
|
221
|
+
*/
|
|
222
|
+
const upgradeHandler = (request, socket, head) => {
|
|
223
|
+
// HTTP request lines look like `/path?query` — strip at the
|
|
224
|
+
// first `?` to get the pathname. A full WHATWG URL parse here
|
|
225
|
+
// would allocate on every upgrade for no extra correctness.
|
|
226
|
+
const rawUrl = request.url ?? '';
|
|
227
|
+
const queryIdx = rawUrl.indexOf('?');
|
|
228
|
+
const pathname = queryIdx < 0 ? rawUrl : rawUrl.slice(0, queryIdx);
|
|
229
|
+
// Accept the bare path (`/collab`, what HocuspocusProvider hits
|
|
230
|
+
// today) and the namespaced path (`/collab/anything`) — leaves
|
|
231
|
+
// room for a future variant that includes the document name in
|
|
232
|
+
// the URL without forcing a server-side migration.
|
|
233
|
+
if (pathname !== COLLAB_PATH && !pathname.startsWith(`${COLLAB_PATH}/`)) {
|
|
234
|
+
// Not ours — let other handlers attempt the upgrade.
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
wss.handleUpgrade(request, socket, head, (ws) => {
|
|
238
|
+
wireConnection(ws, request);
|
|
239
|
+
});
|
|
240
|
+
};
|
|
241
|
+
httpServer.on('upgrade', upgradeHandler);
|
|
242
|
+
debug('collab attached to http.Server (path=%s)', COLLAB_PATH);
|
|
243
|
+
let didShutdown = false;
|
|
244
|
+
return {
|
|
245
|
+
async shutdown() {
|
|
246
|
+
// Re-entry from a second SIGINT (operator impatient with Ctrl-C)
|
|
247
|
+
// or from app.ts orchestration. The first call owns the teardown.
|
|
248
|
+
if (didShutdown)
|
|
249
|
+
return;
|
|
250
|
+
didShutdown = true;
|
|
251
|
+
// 1. Refuse new connections first so the rest of the sequence
|
|
252
|
+
// operates on a closed front door — no `'upgrade'` event can
|
|
253
|
+
// add to `liveSockets` while we drain.
|
|
254
|
+
try {
|
|
255
|
+
httpServer.off('upgrade', upgradeHandler);
|
|
256
|
+
}
|
|
257
|
+
catch {
|
|
258
|
+
// best-effort — the api may already be tearing the server down
|
|
259
|
+
}
|
|
260
|
+
// 2. Ask Hocuspocus to close connections politely. Clients see
|
|
261
|
+
// a normal close frame and can flush their last `update`
|
|
262
|
+
// message to the server before they disconnect — which the
|
|
263
|
+
// next step then persists.
|
|
264
|
+
try {
|
|
265
|
+
hocuspocus.closeConnections();
|
|
266
|
+
}
|
|
267
|
+
catch (err) {
|
|
268
|
+
console.error('[crowi:collab] closeConnections failed during shutdown:', err);
|
|
269
|
+
}
|
|
270
|
+
// 3. Brief drain window so any in-flight client `update` frames
|
|
271
|
+
// actually deliver before we terminate sockets. Cheap insurance
|
|
272
|
+
// against the "SIGINT mid-edit" data-loss window.
|
|
273
|
+
if (liveSockets.size > 0) {
|
|
274
|
+
await new Promise((resolveDrain) => setTimeout(resolveDrain, SHUTDOWN_DRAIN_MS));
|
|
275
|
+
}
|
|
276
|
+
// 4. Flush any in-flight `onStoreDocument` debounces now that
|
|
277
|
+
// sockets have had a chance to deliver their final updates.
|
|
278
|
+
// The next-after-debounce `onStoreDocument` actually runs
|
|
279
|
+
// before we drop references to the Y.Docs.
|
|
280
|
+
try {
|
|
281
|
+
hocuspocus.flushPendingStores();
|
|
282
|
+
}
|
|
283
|
+
catch (err) {
|
|
284
|
+
console.error('[crowi:collab] flushPendingStores failed during shutdown:', err);
|
|
285
|
+
}
|
|
286
|
+
// 5. Force-terminate any straggler sockets. Required because
|
|
287
|
+
// `wss.close()` waits for normal close handshakes otherwise,
|
|
288
|
+
// which can hang on abnormal teardown (test harness with a
|
|
289
|
+
// dropped client, mis-behaving browser).
|
|
290
|
+
try {
|
|
291
|
+
for (const ws of liveSockets) {
|
|
292
|
+
try {
|
|
293
|
+
ws.terminate();
|
|
294
|
+
}
|
|
295
|
+
catch {
|
|
296
|
+
// ignore — best-effort
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
liveSockets.clear();
|
|
300
|
+
wss.close();
|
|
301
|
+
}
|
|
302
|
+
catch (err) {
|
|
303
|
+
console.error('[crowi:collab] wss.close failed during shutdown:', err);
|
|
304
|
+
}
|
|
305
|
+
// 5b. Stop the RFC-0005 presence editing-hash refresher so its
|
|
306
|
+
// `setInterval` does not outlive the collab engine. The
|
|
307
|
+
// timer is already `.unref()`-d (it never blocks process
|
|
308
|
+
// exit), but a test harness that calls `shutdown()` and
|
|
309
|
+
// keeps the process alive would otherwise see it tick on.
|
|
310
|
+
try {
|
|
311
|
+
presenceDeps.shutdown();
|
|
312
|
+
}
|
|
313
|
+
catch (err) {
|
|
314
|
+
console.error('[crowi:collab] presence refresher shutdown failed:', err);
|
|
315
|
+
}
|
|
316
|
+
// 6. Disconnect the cap counter last. With a shared `crowi.redis`
|
|
317
|
+
// this is a documented no-op, but we still await it so a
|
|
318
|
+
// future per-counter client doesn't silently regress this
|
|
319
|
+
// ordering.
|
|
320
|
+
//
|
|
321
|
+
// Note (Phase 9): registered Hocuspocus extensions
|
|
322
|
+
// (`@hocuspocus/extension-redis`) define `onDestroy` lifecycle
|
|
323
|
+
// hooks, but the pure `Hocuspocus` engine we use here doesn't
|
|
324
|
+
// expose a `destroy()` method — only the wrapping `Server`
|
|
325
|
+
// class (= the crossws adapter we replaced with our own ws
|
|
326
|
+
// attach) calls extension `onDestroy`. The extension's pub +
|
|
327
|
+
// sub ioredis clients therefore live until process exit,
|
|
328
|
+
// which the OS reaps along with everything else. Test
|
|
329
|
+
// harnesses that call `shutdown()` and keep the process alive
|
|
330
|
+
// are the only ones that observe the leak; jest exits its
|
|
331
|
+
// worker after the suite anyway, so this is acceptable.
|
|
332
|
+
try {
|
|
333
|
+
await editorCapCounter.disconnect();
|
|
334
|
+
}
|
|
335
|
+
catch (err) {
|
|
336
|
+
console.error('[crowi:collab] editorCapCounter.disconnect failed during shutdown:', err);
|
|
337
|
+
}
|
|
338
|
+
},
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
//# sourceMappingURL=attach.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attach.js","sourceRoot":"","sources":["../../src/collab/attach.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Extension } from '@hocuspocus/server';
|
|
2
|
+
import type Crowi from '../crowi';
|
|
3
|
+
/**
|
|
4
|
+
* Build the `@hocuspocus/extension-redis` instance the api injects into
|
|
5
|
+
* `createCollabServer` for cross-instance pub/sub of Y.Doc updates +
|
|
6
|
+
* awareness state. Returns `null` when this api process is not wired
|
|
7
|
+
* to Redis (`crowi.redis === null` ⇔ `REDIS_URL` unset) — single-
|
|
8
|
+
* instance dev keeps working unchanged.
|
|
9
|
+
*
|
|
10
|
+
* Design (Phase 9):
|
|
11
|
+
* - api uses node-redis v4 (`crowi.redis`); the extension expects
|
|
12
|
+
* ioredis. The two clients can't be shared, so the extension creates
|
|
13
|
+
* its own pub + sub ioredis clients via the `createClient` callback
|
|
14
|
+
* we hand it. `crowi.redisUrl` is parsed into the host/port/auth/tls
|
|
15
|
+
* shape ioredis accepts.
|
|
16
|
+
* - `identifier` is `process.env.HOSTNAME ?? crowi-<pid>`. In docker /
|
|
17
|
+
* k8s `HOSTNAME` is set to the container / pod name automatically,
|
|
18
|
+
* which is the right cross-instance discriminator; bare-metal dev
|
|
19
|
+
* falls back to the pid.
|
|
20
|
+
* - When `REDIS_URL` is set but `crowi.redis === null` (boot warned
|
|
21
|
+
* that Redis is unreachable), we still skip the extension —
|
|
22
|
+
* `crowi.redis` is the single source of truth for "Redis is
|
|
23
|
+
* actually usable from this process".
|
|
24
|
+
*/
|
|
25
|
+
export declare function buildCollabRedisExtension(crowi: Crowi): Extension | null;
|
|
@@ -0,0 +1,133 @@
|
|
|
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.buildCollabRedisExtension = buildCollabRedisExtension;
|
|
7
|
+
const node_url_1 = __importDefault(require("node:url"));
|
|
8
|
+
const debug_1 = __importDefault(require("debug"));
|
|
9
|
+
const debug = (0, debug_1.default)('crowi:collab:extension-redis');
|
|
10
|
+
/**
|
|
11
|
+
* Namespace for the Redis keys + pub/sub channels owned by
|
|
12
|
+
* `@hocuspocus/extension-redis`. The extension's own prefix is
|
|
13
|
+
* concatenated with sub-keys like `:awareness:<docname>` / `:y-update:<docname>`,
|
|
14
|
+
* so this prefix is **disjoint** from the Phase 6 editor cap
|
|
15
|
+
* counter's keyspace (`crowi:collab:editors:<pageId>` — `editors`
|
|
16
|
+
* segment is the discriminator). Documenting the carve-up here so a
|
|
17
|
+
* future operator-side prefix override doesn't accidentally collide.
|
|
18
|
+
*/
|
|
19
|
+
const COLLAB_REDIS_PREFIX = 'crowi:collab';
|
|
20
|
+
/**
|
|
21
|
+
* Build the `@hocuspocus/extension-redis` instance the api injects into
|
|
22
|
+
* `createCollabServer` for cross-instance pub/sub of Y.Doc updates +
|
|
23
|
+
* awareness state. Returns `null` when this api process is not wired
|
|
24
|
+
* to Redis (`crowi.redis === null` ⇔ `REDIS_URL` unset) — single-
|
|
25
|
+
* instance dev keeps working unchanged.
|
|
26
|
+
*
|
|
27
|
+
* Design (Phase 9):
|
|
28
|
+
* - api uses node-redis v4 (`crowi.redis`); the extension expects
|
|
29
|
+
* ioredis. The two clients can't be shared, so the extension creates
|
|
30
|
+
* its own pub + sub ioredis clients via the `createClient` callback
|
|
31
|
+
* we hand it. `crowi.redisUrl` is parsed into the host/port/auth/tls
|
|
32
|
+
* shape ioredis accepts.
|
|
33
|
+
* - `identifier` is `process.env.HOSTNAME ?? crowi-<pid>`. In docker /
|
|
34
|
+
* k8s `HOSTNAME` is set to the container / pod name automatically,
|
|
35
|
+
* which is the right cross-instance discriminator; bare-metal dev
|
|
36
|
+
* falls back to the pid.
|
|
37
|
+
* - When `REDIS_URL` is set but `crowi.redis === null` (boot warned
|
|
38
|
+
* that Redis is unreachable), we still skip the extension —
|
|
39
|
+
* `crowi.redis` is the single source of truth for "Redis is
|
|
40
|
+
* actually usable from this process".
|
|
41
|
+
*/
|
|
42
|
+
function buildCollabRedisExtension(crowi) {
|
|
43
|
+
// `crowi.redis` is the api's node-redis client; null when REDIS_URL
|
|
44
|
+
// is unset OR when the boot-time connection failed. Either way we
|
|
45
|
+
// can't safely run the extension here — fall back to single-instance
|
|
46
|
+
// mode and let the operator notice the boot-time Redis warning.
|
|
47
|
+
if (crowi.redis === null) {
|
|
48
|
+
debug('skip extension-redis: crowi.redis is null (single-instance mode)');
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
if (!crowi.redisUrl) {
|
|
52
|
+
// Defensive: `crowi.redis` non-null without `redisUrl` should be
|
|
53
|
+
// unreachable today, but guard so a future refactor that injects
|
|
54
|
+
// a client without an URL doesn't silently mint an extension with
|
|
55
|
+
// no connection target. `debug` instead of `console.warn` because
|
|
56
|
+
// this only fires on bug, not on operator misconfiguration.
|
|
57
|
+
debug('skip extension-redis: crowi.redis set but redisUrl missing (likely a refactor regression)');
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
// Always include `pid` so two api processes on the same host (= same
|
|
61
|
+
// `HOSTNAME`, common in systemd / bare-metal multi-worker setups)
|
|
62
|
+
// don't dedupe their extension-redis broadcasts under the same
|
|
63
|
+
// identifier. In docker / k8s the `HOSTNAME` part is the container
|
|
64
|
+
// / pod id and pid is typically `1`, but the suffix keeps the shape
|
|
65
|
+
// consistent across runtimes.
|
|
66
|
+
const identifier = `${process.env.HOSTNAME ?? 'crowi'}-${process.pid}`;
|
|
67
|
+
const ioredisOptions = parseRedisUrlForIoredis(crowi.redisUrl);
|
|
68
|
+
// Lazy `require()` so this module's TS surface doesn't pull
|
|
69
|
+
// `@hocuspocus/extension-redis` into Jest's CJS loader at test
|
|
70
|
+
// collect time (the package's transitive dep graph is fine, but
|
|
71
|
+
// keeping the require local matches the pattern used for
|
|
72
|
+
// `@crowi/collab` in `attach.ts`). `ioredis` is loaded the same way
|
|
73
|
+
// — we don't import it statically because it's a transitive dep of
|
|
74
|
+
// the extension (no @types/ioredis needed in api's package.json).
|
|
75
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
76
|
+
const { Redis: RedisExtension } = require('@hocuspocus/extension-redis');
|
|
77
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-explicit-any
|
|
78
|
+
const IORedisModule = require('ioredis');
|
|
79
|
+
// ioredis exports both CJS (default) and ESM (named) shapes; pick
|
|
80
|
+
// whichever the loader handed us.
|
|
81
|
+
const IORedisCtor = IORedisModule.default ?? IORedisModule.Redis ?? IORedisModule;
|
|
82
|
+
debug('attaching extension-redis (identifier=%s, prefix=%s)', identifier, COLLAB_REDIS_PREFIX);
|
|
83
|
+
return new RedisExtension({
|
|
84
|
+
identifier,
|
|
85
|
+
prefix: COLLAB_REDIS_PREFIX,
|
|
86
|
+
// The extension wants two long-lived ioredis connections (one for
|
|
87
|
+
// PUB, one for SUB). The `createClient` callback is invoked twice
|
|
88
|
+
// internally and we hand back a fresh ioredis client each time
|
|
89
|
+
// pointing at the same Redis as `crowi.redis`.
|
|
90
|
+
//
|
|
91
|
+
// `lazyConnect: true` defers the TCP `connect()` until the
|
|
92
|
+
// extension actually uses the client — without this, a slow /
|
|
93
|
+
// misconfigured Redis would hang the api's `start()` (which
|
|
94
|
+
// awaits `attachCollabServer`) indefinitely while ioredis retries
|
|
95
|
+
// the initial socket. `connectTimeout: 10000` puts a hard ceiling
|
|
96
|
+
// on individual connection attempts so a permanent outage surfaces
|
|
97
|
+
// as a logged error instead of a silent stall.
|
|
98
|
+
//
|
|
99
|
+
// Cast on return because we intentionally don't drag ioredis
|
|
100
|
+
// types into api's surface; `RedisInstance` (the extension's own
|
|
101
|
+
// type) is structurally compatible.
|
|
102
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
103
|
+
createClient: () => new IORedisCtor({ ...ioredisOptions, lazyConnect: true, connectTimeout: 10_000 }),
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Parse a `redis://` / `rediss://` URL into the option shape ioredis
|
|
108
|
+
* accepts via its constructor. Mirrors the field-level translation
|
|
109
|
+
* `src/util/redis-opts.ts` does for node-redis v4, with ioredis-native
|
|
110
|
+
* keys: `host`, `port`, `username`, `password`, `tls`. ioredis also
|
|
111
|
+
* accepts a URL string directly but going through this parse lets us
|
|
112
|
+
* apply the same `REDIS_REJECT_UNAUTHORIZED` env override the api's
|
|
113
|
+
* primary client respects.
|
|
114
|
+
*/
|
|
115
|
+
function parseRedisUrlForIoredis(redisUrl) {
|
|
116
|
+
const { hostname, port, auth, protocol } = node_url_1.default.parse(redisUrl);
|
|
117
|
+
const host = hostname ?? '127.0.0.1';
|
|
118
|
+
const portNumber = port ? Number.parseInt(port, 10) : 6379;
|
|
119
|
+
const opts = { host, port: portNumber };
|
|
120
|
+
if (auth) {
|
|
121
|
+
const [user, pass] = auth.split(':');
|
|
122
|
+
if (user)
|
|
123
|
+
opts.username = decodeURIComponent(user);
|
|
124
|
+
if (pass !== undefined)
|
|
125
|
+
opts.password = decodeURIComponent(pass);
|
|
126
|
+
}
|
|
127
|
+
if (protocol === 'rediss:') {
|
|
128
|
+
const rejectUnauthorized = process.env.REDIS_REJECT_UNAUTHORIZED !== '0';
|
|
129
|
+
opts.tls = { rejectUnauthorized };
|
|
130
|
+
}
|
|
131
|
+
return opts;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=extension-redis.js.map
|