@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,122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.serializeConfigSchema = serializeConfigSchema;
|
|
4
|
+
// Plugin config schemas are still authored against zod v3 (see
|
|
5
|
+
// `packages/plugin-*`/index.ts). The serializer introspects v3 internals
|
|
6
|
+
// (`_def`, `ZodEffects`, `ZodNativeEnum`, etc.) that were restructured in
|
|
7
|
+
// zod v4, so we explicitly pin this file to the `zod/v3` compat module
|
|
8
|
+
// that the v4 package ships. The v4 schemas live in `@crowi/api-contract`
|
|
9
|
+
// and never reach this code path.
|
|
10
|
+
const v3_1 = require("zod/v3");
|
|
11
|
+
const plugin_api_1 = require("@crowi/plugin-api");
|
|
12
|
+
/**
|
|
13
|
+
* Walk a plugin's `configSchema` (assumed to be a `z.object({...})`)
|
|
14
|
+
* and produce a flat list of fields the admin form can render. Only
|
|
15
|
+
* the field shapes the plugin RFC committed to are recognised:
|
|
16
|
+
* string / number / boolean / enum / string[]. Anything else falls
|
|
17
|
+
* back to `kind: 'string'` (with a descriptive log on the server).
|
|
18
|
+
*/
|
|
19
|
+
function serializeConfigSchema(schema) {
|
|
20
|
+
const out = [];
|
|
21
|
+
for (const [name, raw] of Object.entries(schema.shape)) {
|
|
22
|
+
out.push(serializeField(name, raw));
|
|
23
|
+
}
|
|
24
|
+
return out;
|
|
25
|
+
}
|
|
26
|
+
function serializeField(name, raw) {
|
|
27
|
+
const { unwrapped, optional, defaultValue } = unwrapMeta(raw);
|
|
28
|
+
const description = (unwrapped.description ?? raw.description) || undefined;
|
|
29
|
+
const cleanedDescription = stripMarkers(description);
|
|
30
|
+
const action = (0, plugin_api_1.getActionAnnotation)(raw) ?? (0, plugin_api_1.getActionAnnotation)(unwrapped) ?? undefined;
|
|
31
|
+
const sensitive = describesSensitive(raw) || describesSensitive(unwrapped);
|
|
32
|
+
const kindResult = detectKind(unwrapped, sensitive);
|
|
33
|
+
return {
|
|
34
|
+
name,
|
|
35
|
+
kind: kindResult.kind,
|
|
36
|
+
description: cleanedDescription,
|
|
37
|
+
// Sensitive defaults are not echoed back — operators set their own.
|
|
38
|
+
defaultValue: sensitive ? undefined : defaultValue,
|
|
39
|
+
options: kindResult.options,
|
|
40
|
+
action,
|
|
41
|
+
optional,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Strip `ZodOptional` / `ZodDefault` / `ZodEffects` wrappers (which
|
|
46
|
+
* `z.string().refine(...)` introduces) so we can introspect the inner
|
|
47
|
+
* primitive type.
|
|
48
|
+
*/
|
|
49
|
+
function unwrapMeta(node) {
|
|
50
|
+
let cur = node;
|
|
51
|
+
let optional = false;
|
|
52
|
+
let defaultValue = undefined;
|
|
53
|
+
// Unwrap up to a small depth to avoid pathological loops.
|
|
54
|
+
for (let i = 0; i < 6; i++) {
|
|
55
|
+
if (cur instanceof v3_1.z.ZodOptional) {
|
|
56
|
+
optional = true;
|
|
57
|
+
cur = cur._def.innerType;
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
if (cur instanceof v3_1.z.ZodDefault) {
|
|
61
|
+
const def = cur._def.defaultValue;
|
|
62
|
+
defaultValue = typeof def === 'function' ? def() : def;
|
|
63
|
+
cur = cur._def.innerType;
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (cur instanceof v3_1.z.ZodEffects) {
|
|
67
|
+
// refine / transform — keep the underlying schema for kind detection
|
|
68
|
+
cur = cur._def.schema;
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
return { unwrapped: cur, optional, defaultValue };
|
|
74
|
+
}
|
|
75
|
+
function detectKind(unwrapped, sensitive) {
|
|
76
|
+
if (unwrapped instanceof v3_1.z.ZodString) {
|
|
77
|
+
return { kind: sensitive ? 'secret' : 'string' };
|
|
78
|
+
}
|
|
79
|
+
if (unwrapped instanceof v3_1.z.ZodNumber) {
|
|
80
|
+
return { kind: 'number' };
|
|
81
|
+
}
|
|
82
|
+
if (unwrapped instanceof v3_1.z.ZodBoolean) {
|
|
83
|
+
return { kind: 'boolean' };
|
|
84
|
+
}
|
|
85
|
+
if (unwrapped instanceof v3_1.z.ZodEnum) {
|
|
86
|
+
return { kind: 'enum', options: [...unwrapped._def.values] };
|
|
87
|
+
}
|
|
88
|
+
if (unwrapped instanceof v3_1.z.ZodNativeEnum) {
|
|
89
|
+
const values = Object.values(unwrapped._def.values).filter((v) => typeof v === 'string');
|
|
90
|
+
return { kind: 'enum', options: values };
|
|
91
|
+
}
|
|
92
|
+
if (unwrapped instanceof v3_1.z.ZodArray && unwrapped._def.type instanceof v3_1.z.ZodString) {
|
|
93
|
+
return { kind: 'string-array' };
|
|
94
|
+
}
|
|
95
|
+
// Unrecognised shape — fall back to string (admin form renders an Input).
|
|
96
|
+
return { kind: 'string' };
|
|
97
|
+
}
|
|
98
|
+
function describesSensitive(node) {
|
|
99
|
+
const d = node.description;
|
|
100
|
+
return typeof d === 'string' && d.trimStart().startsWith(plugin_api_1.SENSITIVE_FIELD_MARKER);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Remove the leading `@sensitive` / `@action ...` marker from a
|
|
104
|
+
* description so the admin form can render it as plain help text.
|
|
105
|
+
* The marker payload is already extracted into `kind`/`action`.
|
|
106
|
+
*/
|
|
107
|
+
function stripMarkers(description) {
|
|
108
|
+
if (!description)
|
|
109
|
+
return undefined;
|
|
110
|
+
const trimmed = description.trimStart();
|
|
111
|
+
if (trimmed.startsWith(plugin_api_1.SENSITIVE_FIELD_MARKER)) {
|
|
112
|
+
return trimmed.slice(plugin_api_1.SENSITIVE_FIELD_MARKER.length).trim() || undefined;
|
|
113
|
+
}
|
|
114
|
+
if (trimmed.startsWith(plugin_api_1.ACTION_FIELD_MARKER)) {
|
|
115
|
+
// The full annotation `"label" METHOD /path` is captured into
|
|
116
|
+
// `action`; the leftover after parsing is rarely useful for help
|
|
117
|
+
// text, so omit it entirely.
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
return description;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=schema-serializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-serializer.js","sourceRoot":"","sources":["../../src/plugin/schema-serializer.ts"],"names":[],"mappings":";;AAsCA,sDAMC;AA5CD,+DAA+D;AAC/D,yEAAyE;AACzE,0EAA0E;AAC1E,uEAAuE;AACvE,0EAA0E;AAC1E,kCAAkC;AAClC,+BAA4C;AAC5C,kDAAqG;AAwBrG;;;;;;GAMG;AACH,SAAgB,qBAAqB,CAAC,MAA+C;IACnF,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,GAAe;IACnD,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAG,CAAC,SAAS,CAAC,WAAW,IAAI,GAAG,CAAC,WAAW,CAAC,IAAI,SAAS,CAAC;IAC5E,MAAM,kBAAkB,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,IAAA,gCAAmB,EAAC,GAAG,CAAC,IAAI,IAAA,gCAAmB,EAAC,SAAS,CAAC,IAAI,SAAS,CAAC;IACvF,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAE3E,MAAM,UAAU,GAAG,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAEpD,OAAO;QACL,IAAI;QACJ,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,WAAW,EAAE,kBAAkB;QAC/B,oEAAoE;QACpE,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY;QAClD,OAAO,EAAE,UAAU,CAAC,OAAO;QAC3B,MAAM;QACN,QAAQ;KACT,CAAC;AACJ,CAAC;AAQD;;;;GAIG;AACH,SAAS,UAAU,CAAC,IAAgB;IAClC,IAAI,GAAG,GAAe,IAAI,CAAC;IAC3B,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,YAAY,GAAY,SAAS,CAAC;IAEtC,0DAA0D;IAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,GAAG,YAAY,MAAC,CAAC,WAAW,EAAE,CAAC;YACjC,QAAQ,GAAG,IAAI,CAAC;YAChB,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;YACzB,SAAS;QACX,CAAC;QACD,IAAI,GAAG,YAAY,MAAC,CAAC,UAAU,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC;YAClC,YAAY,GAAG,OAAO,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YACvD,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;YACzB,SAAS;QACX,CAAC;QACD,IAAI,GAAG,YAAY,MAAC,CAAC,UAAU,EAAE,CAAC;YAChC,qEAAqE;YACrE,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;YACtB,SAAS;QACX,CAAC;QACD,MAAM;IACR,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,UAAU,CAAC,SAAqB,EAAE,SAAkB;IAC3D,IAAI,SAAS,YAAY,MAAC,CAAC,SAAS,EAAE,CAAC;QACrC,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACnD,CAAC;IACD,IAAI,SAAS,YAAY,MAAC,CAAC,SAAS,EAAE,CAAC;QACrC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC5B,CAAC;IACD,IAAI,SAAS,YAAY,MAAC,CAAC,UAAU,EAAE,CAAC;QACtC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC7B,CAAC;IACD,IAAI,SAAS,YAAY,MAAC,CAAC,OAAO,EAAE,CAAC;QACnC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IAC/D,CAAC;IACD,IAAI,SAAS,YAAY,MAAC,CAAC,aAAa,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;QACtG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC3C,CAAC;IACD,IAAI,SAAS,YAAY,MAAC,CAAC,QAAQ,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,YAAY,MAAC,CAAC,SAAS,EAAE,CAAC;QAClF,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;IAClC,CAAC;IACD,0EAA0E;IAC1E,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAgB;IAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;IAC3B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,mCAAsB,CAAC,CAAC;AACnF,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CAAC,WAA+B;IACnD,IAAI,CAAC,WAAW;QAAE,OAAO,SAAS,CAAC;IACnC,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,EAAE,CAAC;IACxC,IAAI,OAAO,CAAC,UAAU,CAAC,mCAAsB,CAAC,EAAE,CAAC;QAC/C,OAAO,OAAO,CAAC,KAAK,CAAC,mCAAsB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;IAC1E,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,gCAAmB,CAAC,EAAE,CAAC;QAC5C,8DAA8D;QAC9D,iEAAiE;QACjE,6BAA6B;QAC7B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { CrowiPlugin } from '@crowi/plugin-api';
|
|
2
|
+
/**
|
|
3
|
+
* Topologically sort the loaded plugins so each plugin's `requires`
|
|
4
|
+
* are processed (registered) before the plugin itself. A `requires`
|
|
5
|
+
* entry that points at a plugin not in the input set is ignored
|
|
6
|
+
* (already-loaded core defaults / sibling plugins): we only sort what
|
|
7
|
+
* we have.
|
|
8
|
+
*
|
|
9
|
+
* @throws on cycle, naming the plugins involved
|
|
10
|
+
* @throws on a `requires` entry that genuinely cannot be resolved
|
|
11
|
+
* (i.e. neither in the input set nor declared as
|
|
12
|
+
* "already-loaded"). The caller controls "already loaded"
|
|
13
|
+
* via `alreadyLoaded`.
|
|
14
|
+
*/
|
|
15
|
+
export declare function topoSortPlugins(plugins: CrowiPlugin[], alreadyLoaded?: ReadonlySet<string>): CrowiPlugin[];
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.topoSortPlugins = topoSortPlugins;
|
|
4
|
+
/**
|
|
5
|
+
* Topologically sort the loaded plugins so each plugin's `requires`
|
|
6
|
+
* are processed (registered) before the plugin itself. A `requires`
|
|
7
|
+
* entry that points at a plugin not in the input set is ignored
|
|
8
|
+
* (already-loaded core defaults / sibling plugins): we only sort what
|
|
9
|
+
* we have.
|
|
10
|
+
*
|
|
11
|
+
* @throws on cycle, naming the plugins involved
|
|
12
|
+
* @throws on a `requires` entry that genuinely cannot be resolved
|
|
13
|
+
* (i.e. neither in the input set nor declared as
|
|
14
|
+
* "already-loaded"). The caller controls "already loaded"
|
|
15
|
+
* via `alreadyLoaded`.
|
|
16
|
+
*/
|
|
17
|
+
function topoSortPlugins(plugins, alreadyLoaded = new Set()) {
|
|
18
|
+
const byName = new Map();
|
|
19
|
+
for (const p of plugins) {
|
|
20
|
+
if (byName.has(p.name)) {
|
|
21
|
+
throw new Error(`Plugin '${p.name}' loaded twice — duplicate npm package?`);
|
|
22
|
+
}
|
|
23
|
+
byName.set(p.name, p);
|
|
24
|
+
}
|
|
25
|
+
// Validate `requires` references resolve.
|
|
26
|
+
for (const p of plugins) {
|
|
27
|
+
for (const dep of p.requires ?? []) {
|
|
28
|
+
if (!byName.has(dep) && !alreadyLoaded.has(dep)) {
|
|
29
|
+
throw new Error(`Plugin '${p.name}' requires '${dep}', which is not installed.`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// Standard DFS topo with cycle detection.
|
|
34
|
+
const visited = new Set();
|
|
35
|
+
const visiting = new Set();
|
|
36
|
+
const order = [];
|
|
37
|
+
const visit = (name, trail) => {
|
|
38
|
+
if (visited.has(name))
|
|
39
|
+
return;
|
|
40
|
+
if (visiting.has(name)) {
|
|
41
|
+
throw new Error(`Plugin dependency cycle detected: ${[...trail, name].join(' → ')}`);
|
|
42
|
+
}
|
|
43
|
+
const plugin = byName.get(name);
|
|
44
|
+
if (!plugin)
|
|
45
|
+
return; // already-loaded dep, not in this batch
|
|
46
|
+
visiting.add(name);
|
|
47
|
+
for (const dep of plugin.requires ?? []) {
|
|
48
|
+
visit(dep, [...trail, name]);
|
|
49
|
+
}
|
|
50
|
+
visiting.delete(name);
|
|
51
|
+
visited.add(name);
|
|
52
|
+
order.push(plugin);
|
|
53
|
+
};
|
|
54
|
+
for (const p of plugins) {
|
|
55
|
+
visit(p.name, []);
|
|
56
|
+
}
|
|
57
|
+
return order;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=topo-sort.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"topo-sort.js","sourceRoot":"","sources":["../../src/plugin/topo-sort.ts"],"names":[],"mappings":";;AAeA,0CA4CC;AAzDD;;;;;;;;;;;;GAYG;AACH,SAAgB,eAAe,CAAC,OAAsB,EAAE,gBAAqC,IAAI,GAAG,EAAE;IACpG,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC9C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,yCAAyC,CAAC,CAAC;QAC9E,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACxB,CAAC;IAED,0CAA0C;IAC1C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChD,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,eAAe,GAAG,4BAA4B,CAAC,CAAC;YACnF,CAAC;QACH,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,KAAK,GAAkB,EAAE,CAAC;IAEhC,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,KAAe,EAAQ,EAAE;QACpD,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO;QAC9B,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvF,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,wCAAwC;QAC7D,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;YACxC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QAC/B,CAAC;QACD,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { Server as HttpServer } from 'node:http';
|
|
2
|
+
import type Crowi from '../crowi';
|
|
3
|
+
/**
|
|
4
|
+
* Public surface returned from `attachPresenceServer`. The api boot
|
|
5
|
+
* keeps the handle so SIGINT teardown can drain sockets and tear down
|
|
6
|
+
* the presence pub/sub subscriber.
|
|
7
|
+
*/
|
|
8
|
+
export interface AttachedPresence {
|
|
9
|
+
/** Detach + tear down. Idempotent; safe to call from a SIGINT handler. */
|
|
10
|
+
shutdown(): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Wire the RFC-0005 `/presence` WebSocket into the api's existing
|
|
14
|
+
* Express http.Server, using the `ws` library's `noServer` mode — same
|
|
15
|
+
* process, same event loop, same Mongoose connection, same Redis
|
|
16
|
+
* client as `/collab`.
|
|
17
|
+
*
|
|
18
|
+
* Connection lifecycle:
|
|
19
|
+
* 1. Upgrade filter accepts `/presence` / `/presence/*`.
|
|
20
|
+
* 2. Verify the `?token=` presence JWT (signature + issuer).
|
|
21
|
+
* 3. Verify `token.pageId` matches the `/presence/<pageId>` path
|
|
22
|
+
* segment when one is present.
|
|
23
|
+
* 4. Re-check read permission against Mongo (the token was minted up
|
|
24
|
+
* to 5 min ago — grants can be revoked in between).
|
|
25
|
+
* 5. `presence.join` registers the viewer; the page's viewer list is
|
|
26
|
+
* broadcast to every connected client (this instance + others via
|
|
27
|
+
* Redis pub/sub).
|
|
28
|
+
* 6. Client heartbeats every 15s refresh the Redis TTL; a heartbeat
|
|
29
|
+
* past the permission-cache window re-checks read grant and
|
|
30
|
+
* disconnects a revoked viewer.
|
|
31
|
+
* 7. On close, `presence.leave` removes the viewer and re-broadcasts.
|
|
32
|
+
*
|
|
33
|
+
* Boot order: call after `setupModels`. The api's `Crowi.start`
|
|
34
|
+
* invokes this right before `server.listen`, next to `attachCollabServer`.
|
|
35
|
+
*/
|
|
36
|
+
export declare function attachPresenceServer(httpServer: HttpServer, crowi: Crowi): Promise<AttachedPresence>;
|
|
@@ -0,0 +1,399 @@
|
|
|
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.attachPresenceServer = attachPresenceServer;
|
|
7
|
+
const debug_1 = __importDefault(require("debug"));
|
|
8
|
+
const ws_1 = require("ws");
|
|
9
|
+
const api_contract_1 = require("@crowi/api-contract");
|
|
10
|
+
const presence_token_1 = require("../util/presence-token");
|
|
11
|
+
const presence_1 = require("../service/presence");
|
|
12
|
+
const debug = (0, debug_1.default)('crowi:presence:attach');
|
|
13
|
+
/**
|
|
14
|
+
* Path namespace the presence WebSocket answers on. The browser dials
|
|
15
|
+
* `/presence/<pageId>?token=<presenceToken>`; the upgrade filter
|
|
16
|
+
* accepts both the bare `/presence` and `/presence/...` so the design
|
|
17
|
+
* mirrors `collab/attach.ts` exactly (sibling upgrade handlers — collab
|
|
18
|
+
* at `/collab`, presence at `/presence` — coexist on one listener).
|
|
19
|
+
*/
|
|
20
|
+
const PRESENCE_PATH = '/presence';
|
|
21
|
+
/**
|
|
22
|
+
* WebSocket close codes the presence handler uses. 4401 / 4403 are in
|
|
23
|
+
* the 4000–4999 application-private range; 1001 ("going away") is the
|
|
24
|
+
* standard code for a graceful server shutdown.
|
|
25
|
+
*/
|
|
26
|
+
const WS_CLOSE = {
|
|
27
|
+
INVALID_TOKEN: 4401,
|
|
28
|
+
NO_ACCESS: 4403,
|
|
29
|
+
SHUTDOWN: 1001,
|
|
30
|
+
};
|
|
31
|
+
/** Split a request URL into its pathname and raw query string. */
|
|
32
|
+
const splitUrl = (rawUrl) => {
|
|
33
|
+
const queryIdx = rawUrl.indexOf('?');
|
|
34
|
+
return queryIdx < 0 ? { pathname: rawUrl, query: '' } : { pathname: rawUrl.slice(0, queryIdx), query: rawUrl.slice(queryIdx + 1) };
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Per-connection read-permission cache TTL. After a viewer's read
|
|
38
|
+
* grant is confirmed once, subsequent heartbeats skip the Mongo lookup
|
|
39
|
+
* for this long; a heartbeat after the window re-checks, so a mid-
|
|
40
|
+
* session permission revocation is detected within ~60s + one
|
|
41
|
+
* heartbeat interval. RFC-0005 §"Permission boundary".
|
|
42
|
+
*/
|
|
43
|
+
const PERMISSION_CACHE_TTL_MS = 60_000;
|
|
44
|
+
/**
|
|
45
|
+
* Grace window between asking sockets to close politely and force-
|
|
46
|
+
* terminating stragglers on shutdown. Mirrors `collab/attach.ts`.
|
|
47
|
+
*/
|
|
48
|
+
const SHUTDOWN_DRAIN_MS = 500;
|
|
49
|
+
/**
|
|
50
|
+
* Wire the RFC-0005 `/presence` WebSocket into the api's existing
|
|
51
|
+
* Express http.Server, using the `ws` library's `noServer` mode — same
|
|
52
|
+
* process, same event loop, same Mongoose connection, same Redis
|
|
53
|
+
* client as `/collab`.
|
|
54
|
+
*
|
|
55
|
+
* Connection lifecycle:
|
|
56
|
+
* 1. Upgrade filter accepts `/presence` / `/presence/*`.
|
|
57
|
+
* 2. Verify the `?token=` presence JWT (signature + issuer).
|
|
58
|
+
* 3. Verify `token.pageId` matches the `/presence/<pageId>` path
|
|
59
|
+
* segment when one is present.
|
|
60
|
+
* 4. Re-check read permission against Mongo (the token was minted up
|
|
61
|
+
* to 5 min ago — grants can be revoked in between).
|
|
62
|
+
* 5. `presence.join` registers the viewer; the page's viewer list is
|
|
63
|
+
* broadcast to every connected client (this instance + others via
|
|
64
|
+
* Redis pub/sub).
|
|
65
|
+
* 6. Client heartbeats every 15s refresh the Redis TTL; a heartbeat
|
|
66
|
+
* past the permission-cache window re-checks read grant and
|
|
67
|
+
* disconnects a revoked viewer.
|
|
68
|
+
* 7. On close, `presence.leave` removes the viewer and re-broadcasts.
|
|
69
|
+
*
|
|
70
|
+
* Boot order: call after `setupModels`. The api's `Crowi.start`
|
|
71
|
+
* invokes this right before `server.listen`, next to `attachCollabServer`.
|
|
72
|
+
*/
|
|
73
|
+
async function attachPresenceServer(httpServer, crowi) {
|
|
74
|
+
const presenceTokenUtil = (0, presence_token_1.createPresenceTokenUtil)();
|
|
75
|
+
const presence = await (0, presence_1.getPresenceService)(crowi);
|
|
76
|
+
const Page = crowi.model('Page');
|
|
77
|
+
const User = crowi.model('User');
|
|
78
|
+
// `noServer: true` — the upgrade handshake is owned by the api
|
|
79
|
+
// process; we forward only `/presence/*` upgrades here.
|
|
80
|
+
const wss = new ws_1.WebSocketServer({ noServer: true });
|
|
81
|
+
// Every live connection, keyed by socket. Used to broadcast a page's
|
|
82
|
+
// viewer list to exactly its connected clients and to drain on
|
|
83
|
+
// shutdown.
|
|
84
|
+
const connections = new Map();
|
|
85
|
+
/** Send a JSON message to one socket; ignore a dead socket. */
|
|
86
|
+
const sendJson = (ws, payload) => {
|
|
87
|
+
if (ws.readyState !== ws.OPEN)
|
|
88
|
+
return;
|
|
89
|
+
try {
|
|
90
|
+
ws.send(JSON.stringify(payload));
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
debug('send failed: %s', err.message);
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* Broadcast the current viewer list of `pageId` to every locally-
|
|
98
|
+
* connected client for that page. Triggered by `presence`'s change
|
|
99
|
+
* events (local writes + cross-instance pub/sub).
|
|
100
|
+
*/
|
|
101
|
+
const broadcastViewers = async (pageId) => {
|
|
102
|
+
// Collect the local sockets watching this page before the await so
|
|
103
|
+
// a concurrent close doesn't matter — `sendJson` no-ops on a
|
|
104
|
+
// non-OPEN socket.
|
|
105
|
+
const targets = [];
|
|
106
|
+
for (const conn of connections.values()) {
|
|
107
|
+
if (conn.pageId === pageId)
|
|
108
|
+
targets.push(conn.ws);
|
|
109
|
+
}
|
|
110
|
+
if (targets.length === 0)
|
|
111
|
+
return;
|
|
112
|
+
let viewers;
|
|
113
|
+
try {
|
|
114
|
+
viewers = await presence.listViewers(pageId);
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
console.warn(`[crowi:presence] listViewers failed for page ${pageId}:`, err.message);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const message = { type: 'viewers', viewers };
|
|
121
|
+
for (const ws of targets) {
|
|
122
|
+
sendJson(ws, message);
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
// Subscribe to viewer-list changes (local + cross-instance). The
|
|
126
|
+
// unsubscribe fn is invoked on shutdown.
|
|
127
|
+
const unsubscribe = presence.onViewersChanged((pageId) => {
|
|
128
|
+
void broadcastViewers(pageId);
|
|
129
|
+
});
|
|
130
|
+
/**
|
|
131
|
+
* Re-verify that `userId` still has read grant on `pageId`. Returns
|
|
132
|
+
* `false` when the page vanished or the grant was revoked. A throw
|
|
133
|
+
* is treated as "no permission" (fail-closed).
|
|
134
|
+
*/
|
|
135
|
+
const hasReadPermission = async (pageId, userId) => {
|
|
136
|
+
try {
|
|
137
|
+
const page = await Page.findById(pageId).exec();
|
|
138
|
+
if (!page)
|
|
139
|
+
return false;
|
|
140
|
+
// `isGrantedFor` takes a user-like object; load the connecting
|
|
141
|
+
// user so OWNER / GROUP grants resolve against the real record.
|
|
142
|
+
const userDoc = (await User.findById(userId).exec());
|
|
143
|
+
if (!userDoc)
|
|
144
|
+
return false;
|
|
145
|
+
return page.isGrantedFor(userDoc);
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
debug('permission re-check threw for page=%s user=%s: %s', pageId, userId, err.message);
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
/** Load the connecting user's denormalised identity for the hash. */
|
|
153
|
+
const loadViewerIdentity = async (userId) => {
|
|
154
|
+
const userDoc = (await User.findById(userId).exec());
|
|
155
|
+
if (!userDoc)
|
|
156
|
+
return null;
|
|
157
|
+
return {
|
|
158
|
+
userId,
|
|
159
|
+
username: userDoc.username ?? '',
|
|
160
|
+
displayName: userDoc.name ?? userDoc.username ?? '',
|
|
161
|
+
avatarUrl: userDoc.image ?? null,
|
|
162
|
+
};
|
|
163
|
+
};
|
|
164
|
+
/**
|
|
165
|
+
* Wire one freshly-upgraded `ws.WebSocket`. Authentication runs
|
|
166
|
+
* inline: a bad token / page mismatch / revoked grant closes the
|
|
167
|
+
* socket immediately. A clean connection is added to `connections`
|
|
168
|
+
* and gets the first viewer-list broadcast.
|
|
169
|
+
*/
|
|
170
|
+
const wireConnection = async (ws, request) => {
|
|
171
|
+
const { pathname, query } = splitUrl(request.url ?? '');
|
|
172
|
+
const token = new URLSearchParams(query).get('token') ?? '';
|
|
173
|
+
// 1. token present + verifies (signature, issuer, schema).
|
|
174
|
+
const claims = token.length > 0 ? presenceTokenUtil.verifyPresenceToken(token) : null;
|
|
175
|
+
if (!claims) {
|
|
176
|
+
debug('reject: presence token missing / invalid');
|
|
177
|
+
ws.close(WS_CLOSE.INVALID_TOKEN, 'invalid token');
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
// 2. `/presence/<pageId>` path segment, when present, must match
|
|
181
|
+
// the token. The bare `/presence` form is also accepted (the
|
|
182
|
+
// token is the authoritative pageId source).
|
|
183
|
+
const pathSegment = pathname.startsWith(`${PRESENCE_PATH}/`) ? pathname.slice(PRESENCE_PATH.length + 1) : '';
|
|
184
|
+
if (pathSegment.length > 0 && pathSegment !== claims.pageId) {
|
|
185
|
+
debug('reject: path pageId %s != token pageId %s', pathSegment, claims.pageId);
|
|
186
|
+
ws.close(WS_CLOSE.INVALID_TOKEN, 'invalid token');
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
// The token verified, so userId / pageId are known. Register the
|
|
190
|
+
// close + error handlers NOW, before the async permission / identity
|
|
191
|
+
// round-trips below. A socket that closes *during* those awaits (a
|
|
192
|
+
// fast client navigation, React's dev double-mount) would otherwise
|
|
193
|
+
// fire `'close'` into the void — the handler being attached only
|
|
194
|
+
// after the awaits — leaving a phantom `connections` entry whose
|
|
195
|
+
// `'close'` never runs. That phantom poisons the multi-tab
|
|
196
|
+
// `userStillConnected` check in `handleClose`, so a later *real*
|
|
197
|
+
// disconnect skips `presence.leave` and the viewer is stuck in the
|
|
198
|
+
// hash for every other client on the page.
|
|
199
|
+
const conn = {
|
|
200
|
+
ws,
|
|
201
|
+
userId: claims.userId,
|
|
202
|
+
pageId: claims.pageId,
|
|
203
|
+
permittedUntil: 0,
|
|
204
|
+
};
|
|
205
|
+
let closed = false;
|
|
206
|
+
ws.on('close', () => {
|
|
207
|
+
closed = true;
|
|
208
|
+
void handleClose(conn);
|
|
209
|
+
});
|
|
210
|
+
ws.on('error', (err) => {
|
|
211
|
+
// A single bad socket must not crash the api process.
|
|
212
|
+
console.error('[crowi:presence] websocket error', err);
|
|
213
|
+
});
|
|
214
|
+
// 3. re-check read permission (token was minted up to 5 min ago).
|
|
215
|
+
const permitted = await hasReadPermission(claims.pageId, claims.userId);
|
|
216
|
+
if (!permitted) {
|
|
217
|
+
debug('reject: user %s lost read grant on page %s', claims.userId, claims.pageId);
|
|
218
|
+
ws.close(WS_CLOSE.NO_ACCESS, 'no access');
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
const identity = await loadViewerIdentity(claims.userId);
|
|
222
|
+
if (!identity) {
|
|
223
|
+
debug('reject: connecting user %s not found', claims.userId);
|
|
224
|
+
ws.close(WS_CLOSE.NO_ACCESS, 'no access');
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
// The socket closed while permission / identity were resolving —
|
|
228
|
+
// the close handler has already run; do not register a viewer.
|
|
229
|
+
if (closed) {
|
|
230
|
+
debug('presence socket closed during setup user=%s page=%s', conn.userId, conn.pageId);
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
conn.permittedUntil = Date.now() + PERMISSION_CACHE_TTL_MS;
|
|
234
|
+
connections.set(ws, conn);
|
|
235
|
+
ws.on('message', (data) => {
|
|
236
|
+
void handleClientMessage(conn, data);
|
|
237
|
+
});
|
|
238
|
+
// Register the viewer. `join` publishes a viewer-list change, which
|
|
239
|
+
// flows back through `onViewersChanged` → `broadcastViewers`, so
|
|
240
|
+
// this socket (and every other on the page) gets the fresh list.
|
|
241
|
+
try {
|
|
242
|
+
await presence.join(conn.pageId, identity);
|
|
243
|
+
}
|
|
244
|
+
catch (err) {
|
|
245
|
+
console.warn(`[crowi:presence] join failed for page ${conn.pageId}:`, err.message);
|
|
246
|
+
}
|
|
247
|
+
// The socket closed while `join` was in flight — the close handler
|
|
248
|
+
// ran before the viewer entry existed, so reconcile now to remove
|
|
249
|
+
// the entry `join` just wrote.
|
|
250
|
+
if (closed) {
|
|
251
|
+
debug('presence socket closed during join user=%s page=%s', conn.userId, conn.pageId);
|
|
252
|
+
void handleClose(conn);
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
debug('presence connected user=%s page=%s', conn.userId, conn.pageId);
|
|
256
|
+
};
|
|
257
|
+
/**
|
|
258
|
+
* Handle a client → server frame. The only valid message is
|
|
259
|
+
* `{ type: 'heartbeat' }`; anything else is ignored (forward-compat).
|
|
260
|
+
*/
|
|
261
|
+
const handleClientMessage = async (conn, data) => {
|
|
262
|
+
let parsedJson;
|
|
263
|
+
try {
|
|
264
|
+
const text = data instanceof ArrayBuffer ? Buffer.from(data).toString('utf8') : data.toString('utf8');
|
|
265
|
+
parsedJson = JSON.parse(text);
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
debug('ignore: non-JSON client frame on page %s', conn.pageId);
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
const message = api_contract_1.PresenceClientMessageSchema.safeParse(parsedJson);
|
|
272
|
+
if (!message.success) {
|
|
273
|
+
debug('ignore: unrecognised client message on page %s', conn.pageId);
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
// Heartbeat: re-verify read grant if the cache window lapsed, then
|
|
277
|
+
// refresh the Redis TTL.
|
|
278
|
+
if (Date.now() >= conn.permittedUntil) {
|
|
279
|
+
const stillPermitted = await hasReadPermission(conn.pageId, conn.userId);
|
|
280
|
+
if (!stillPermitted) {
|
|
281
|
+
debug('heartbeat: user %s lost grant on page %s — disconnecting', conn.userId, conn.pageId);
|
|
282
|
+
conn.ws.close(WS_CLOSE.NO_ACCESS, 'no access');
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
conn.permittedUntil = Date.now() + PERMISSION_CACHE_TTL_MS;
|
|
286
|
+
}
|
|
287
|
+
try {
|
|
288
|
+
const present = await presence.heartbeat(conn.pageId, conn.userId);
|
|
289
|
+
if (!present) {
|
|
290
|
+
// Swept while the socket was briefly idle — re-register.
|
|
291
|
+
const identity = await loadViewerIdentity(conn.userId);
|
|
292
|
+
if (identity)
|
|
293
|
+
await presence.join(conn.pageId, identity);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
catch (err) {
|
|
297
|
+
debug('heartbeat failed for page %s: %s', conn.pageId, err.message);
|
|
298
|
+
}
|
|
299
|
+
};
|
|
300
|
+
/** Handle a socket close — remove the viewer and re-broadcast. */
|
|
301
|
+
const handleClose = async (conn) => {
|
|
302
|
+
connections.delete(conn.ws);
|
|
303
|
+
// Only `leave` when no *other* socket for the same user-page pair
|
|
304
|
+
// remains — multi-tab dedup: closing one of three tabs must not
|
|
305
|
+
// remove the user from the viewer list.
|
|
306
|
+
let userStillConnected = false;
|
|
307
|
+
for (const other of connections.values()) {
|
|
308
|
+
if (other.userId === conn.userId && other.pageId === conn.pageId) {
|
|
309
|
+
userStillConnected = true;
|
|
310
|
+
break;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
if (userStillConnected) {
|
|
314
|
+
debug('close: user %s still has another tab on page %s — keep viewer', conn.userId, conn.pageId);
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
try {
|
|
318
|
+
await presence.leave(conn.pageId, conn.userId);
|
|
319
|
+
}
|
|
320
|
+
catch (err) {
|
|
321
|
+
debug('leave failed for page %s: %s', conn.pageId, err.message);
|
|
322
|
+
}
|
|
323
|
+
};
|
|
324
|
+
/**
|
|
325
|
+
* `'upgrade'` handler. Path-filter first so the sibling `/collab`
|
|
326
|
+
* handler keeps its slot; `socket.destroy()` is intentionally NOT
|
|
327
|
+
* called on a no-match so Node moves on to the next listener.
|
|
328
|
+
*/
|
|
329
|
+
const upgradeHandler = (request, socket, head) => {
|
|
330
|
+
const { pathname } = splitUrl(request.url ?? '');
|
|
331
|
+
if (pathname !== PRESENCE_PATH && !pathname.startsWith(`${PRESENCE_PATH}/`)) {
|
|
332
|
+
return; // not ours — let other upgrade handlers try.
|
|
333
|
+
}
|
|
334
|
+
wss.handleUpgrade(request, socket, head, (ws) => {
|
|
335
|
+
void wireConnection(ws, request);
|
|
336
|
+
});
|
|
337
|
+
};
|
|
338
|
+
httpServer.on('upgrade', upgradeHandler);
|
|
339
|
+
debug('presence attached to http.Server (path=%s)', PRESENCE_PATH);
|
|
340
|
+
let didShutdown = false;
|
|
341
|
+
return {
|
|
342
|
+
async shutdown() {
|
|
343
|
+
if (didShutdown)
|
|
344
|
+
return;
|
|
345
|
+
didShutdown = true;
|
|
346
|
+
// 1. Refuse new upgrades.
|
|
347
|
+
try {
|
|
348
|
+
httpServer.off('upgrade', upgradeHandler);
|
|
349
|
+
}
|
|
350
|
+
catch {
|
|
351
|
+
// best-effort — server may already be tearing down.
|
|
352
|
+
}
|
|
353
|
+
// 2. Stop reacting to viewer-list changes.
|
|
354
|
+
try {
|
|
355
|
+
unsubscribe();
|
|
356
|
+
}
|
|
357
|
+
catch {
|
|
358
|
+
// best-effort
|
|
359
|
+
}
|
|
360
|
+
// 3. Politely close every live socket.
|
|
361
|
+
for (const conn of connections.values()) {
|
|
362
|
+
try {
|
|
363
|
+
conn.ws.close(WS_CLOSE.SHUTDOWN, 'server shutting down');
|
|
364
|
+
}
|
|
365
|
+
catch {
|
|
366
|
+
// ignore — best-effort
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
// 4. Brief drain so close frames flush.
|
|
370
|
+
if (connections.size > 0) {
|
|
371
|
+
await new Promise((resolveDrain) => setTimeout(resolveDrain, SHUTDOWN_DRAIN_MS));
|
|
372
|
+
}
|
|
373
|
+
// 5. Force-terminate stragglers.
|
|
374
|
+
try {
|
|
375
|
+
for (const conn of connections.values()) {
|
|
376
|
+
try {
|
|
377
|
+
conn.ws.terminate();
|
|
378
|
+
}
|
|
379
|
+
catch {
|
|
380
|
+
// ignore
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
connections.clear();
|
|
384
|
+
wss.close();
|
|
385
|
+
}
|
|
386
|
+
catch (err) {
|
|
387
|
+
console.error('[crowi:presence] wss.close failed during shutdown:', err);
|
|
388
|
+
}
|
|
389
|
+
// 6. Tear down the presence service's pub/sub subscriber.
|
|
390
|
+
try {
|
|
391
|
+
await presence.shutdown();
|
|
392
|
+
}
|
|
393
|
+
catch (err) {
|
|
394
|
+
console.error('[crowi:presence] presence.shutdown failed:', err);
|
|
395
|
+
}
|
|
396
|
+
},
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
//# sourceMappingURL=attach.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attach.js","sourceRoot":"","sources":["../../src/presence/attach.ts"],"names":[],"mappings":"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"}
|