@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.
Files changed (887) hide show
  1. package/LICENSE +21 -0
  2. package/dist/app.d.ts +8 -0
  3. package/dist/app.js +65 -0
  4. package/dist/app.js.map +1 -0
  5. package/dist/collab/attach.d.ts +33 -0
  6. package/dist/collab/attach.js +341 -0
  7. package/dist/collab/attach.js.map +1 -0
  8. package/dist/collab/extension-redis.d.ts +25 -0
  9. package/dist/collab/extension-redis.js +133 -0
  10. package/dist/collab/extension-redis.js.map +1 -0
  11. package/dist/common/functions/path2name.d.ts +1 -0
  12. package/dist/common/functions/path2name.js +22 -0
  13. package/dist/common/functions/path2name.js.map +1 -0
  14. package/dist/common/functions/renderIcon.d.ts +1 -0
  15. package/dist/common/functions/renderIcon.js +9 -0
  16. package/dist/common/functions/renderIcon.js.map +1 -0
  17. package/dist/controllers/admin.d.ts +3 -0
  18. package/dist/controllers/admin.js +474 -0
  19. package/dist/controllers/admin.js.map +1 -0
  20. package/dist/controllers/attachment.d.ts +4 -0
  21. package/dist/controllers/attachment.js +200 -0
  22. package/dist/controllers/attachment.js.map +1 -0
  23. package/dist/controllers/backlink.d.ts +3 -0
  24. package/dist/controllers/backlink.js +42 -0
  25. package/dist/controllers/backlink.js.map +1 -0
  26. package/dist/controllers/bookmark.d.ts +3 -0
  27. package/dist/controllers/bookmark.js +100 -0
  28. package/dist/controllers/bookmark.js.map +1 -0
  29. package/dist/controllers/comment.d.ts +3 -0
  30. package/dist/controllers/comment.js +111 -0
  31. package/dist/controllers/comment.js.map +1 -0
  32. package/dist/controllers/index.d.ts +25 -0
  33. package/dist/controllers/index.js +44 -0
  34. package/dist/controllers/index.js.map +1 -0
  35. package/dist/controllers/installer.d.ts +3 -0
  36. package/dist/controllers/installer.js +48 -0
  37. package/dist/controllers/installer.js.map +1 -0
  38. package/dist/controllers/login.d.ts +4 -0
  39. package/dist/controllers/login.js +438 -0
  40. package/dist/controllers/login.js.map +1 -0
  41. package/dist/controllers/logout.d.ts +5 -0
  42. package/dist/controllers/logout.js +11 -0
  43. package/dist/controllers/logout.js.map +1 -0
  44. package/dist/controllers/me.d.ts +4 -0
  45. package/dist/controllers/me.js +369 -0
  46. package/dist/controllers/me.js.map +1 -0
  47. package/dist/controllers/notification.d.ts +3 -0
  48. package/dist/controllers/notification.js +88 -0
  49. package/dist/controllers/notification.js.map +1 -0
  50. package/dist/controllers/page.d.ts +3 -0
  51. package/dist/controllers/page.js +881 -0
  52. package/dist/controllers/page.js.map +1 -0
  53. package/dist/controllers/revision.d.ts +3 -0
  54. package/dist/controllers/revision.js +91 -0
  55. package/dist/controllers/revision.js.map +1 -0
  56. package/dist/controllers/search.d.ts +3 -0
  57. package/dist/controllers/search.js +93 -0
  58. package/dist/controllers/search.js.map +1 -0
  59. package/dist/controllers/share.d.ts +3 -0
  60. package/dist/controllers/share.js +207 -0
  61. package/dist/controllers/share.js.map +1 -0
  62. package/dist/controllers/shareAccess.d.ts +3 -0
  63. package/dist/controllers/shareAccess.js +28 -0
  64. package/dist/controllers/shareAccess.js.map +1 -0
  65. package/dist/controllers/slack.d.ts +3 -0
  66. package/dist/controllers/slack.js +87 -0
  67. package/dist/controllers/slack.js.map +1 -0
  68. package/dist/controllers/tokenAuth.d.ts +10 -0
  69. package/dist/controllers/tokenAuth.js +292 -0
  70. package/dist/controllers/tokenAuth.js.map +1 -0
  71. package/dist/controllers/user.d.ts +3 -0
  72. package/dist/controllers/user.js +67 -0
  73. package/dist/controllers/user.js.map +1 -0
  74. package/dist/controllers/version.d.ts +4 -0
  75. package/dist/controllers/version.js +19 -0
  76. package/dist/controllers/version.js.map +1 -0
  77. package/dist/crowi/express-init.d.ts +4 -0
  78. package/dist/crowi/express-init.js +101 -0
  79. package/dist/crowi/express-init.js.map +1 -0
  80. package/dist/crowi/index.d.ts +245 -0
  81. package/dist/crowi/index.js +726 -0
  82. package/dist/crowi/index.js.map +1 -0
  83. package/dist/events/activity.d.ts +7 -0
  84. package/dist/events/activity.js +15 -0
  85. package/dist/events/activity.js.map +1 -0
  86. package/dist/events/bookmark.d.ts +8 -0
  87. package/dist/events/bookmark.js +16 -0
  88. package/dist/events/bookmark.js.map +1 -0
  89. package/dist/events/comment.d.ts +6 -0
  90. package/dist/events/comment.js +14 -0
  91. package/dist/events/comment.js.map +1 -0
  92. package/dist/events/config.d.ts +6 -0
  93. package/dist/events/config.js +12 -0
  94. package/dist/events/config.js.map +1 -0
  95. package/dist/events/index.d.ts +17 -0
  96. package/dist/events/index.js +22 -0
  97. package/dist/events/index.js.map +1 -0
  98. package/dist/events/mention-dispatch.d.ts +44 -0
  99. package/dist/events/mention-dispatch.js +151 -0
  100. package/dist/events/mention-dispatch.js.map +1 -0
  101. package/dist/events/notification.d.ts +7 -0
  102. package/dist/events/notification.js +15 -0
  103. package/dist/events/notification.js.map +1 -0
  104. package/dist/events/page.d.ts +44 -0
  105. package/dist/events/page.js +134 -0
  106. package/dist/events/page.js.map +1 -0
  107. package/dist/events/render-cache.d.ts +24 -0
  108. package/dist/events/render-cache.js +63 -0
  109. package/dist/events/render-cache.js.map +1 -0
  110. package/dist/events/user.d.ts +9 -0
  111. package/dist/events/user.js +39 -0
  112. package/dist/events/user.js.map +1 -0
  113. package/dist/form/admin/app.d.ts +2 -0
  114. package/dist/form/admin/app.js +9 -0
  115. package/dist/form/admin/app.js.map +1 -0
  116. package/dist/form/admin/auth.d.ts +2 -0
  117. package/dist/form/admin/auth.js +9 -0
  118. package/dist/form/admin/auth.js.map +1 -0
  119. package/dist/form/admin/aws.d.ts +2 -0
  120. package/dist/form/admin/aws.js +13 -0
  121. package/dist/form/admin/aws.js.map +1 -0
  122. package/dist/form/admin/github.d.ts +2 -0
  123. package/dist/form/admin/github.js +15 -0
  124. package/dist/form/admin/github.js.map +1 -0
  125. package/dist/form/admin/google.d.ts +2 -0
  126. package/dist/form/admin/google.js +13 -0
  127. package/dist/form/admin/google.js.map +1 -0
  128. package/dist/form/admin/mail.d.ts +2 -0
  129. package/dist/form/admin/mail.js +13 -0
  130. package/dist/form/admin/mail.js.map +1 -0
  131. package/dist/form/admin/sec.d.ts +2 -0
  132. package/dist/form/admin/sec.js +10 -0
  133. package/dist/form/admin/sec.js.map +1 -0
  134. package/dist/form/admin/slackSetting.d.ts +2 -0
  135. package/dist/form/admin/slackSetting.js +13 -0
  136. package/dist/form/admin/slackSetting.js.map +1 -0
  137. package/dist/form/admin/userEdit.d.ts +2 -0
  138. package/dist/form/admin/userEdit.js +9 -0
  139. package/dist/form/admin/userEdit.js.map +1 -0
  140. package/dist/form/admin/userInvite.d.ts +2 -0
  141. package/dist/form/admin/userInvite.js +9 -0
  142. package/dist/form/admin/userInvite.js.map +1 -0
  143. package/dist/form/comment.d.ts +2 -0
  144. package/dist/form/comment.js +9 -0
  145. package/dist/form/comment.js.map +1 -0
  146. package/dist/form/index.d.ts +25 -0
  147. package/dist/form/index.js +48 -0
  148. package/dist/form/index.js.map +1 -0
  149. package/dist/form/invited.d.ts +2 -0
  150. package/dist/form/invited.js +13 -0
  151. package/dist/form/invited.js.map +1 -0
  152. package/dist/form/login.d.ts +2 -0
  153. package/dist/form/login.js +11 -0
  154. package/dist/form/login.js.map +1 -0
  155. package/dist/form/me/apiToken.d.ts +2 -0
  156. package/dist/form/me/apiToken.js +9 -0
  157. package/dist/form/me/apiToken.js.map +1 -0
  158. package/dist/form/me/password.d.ts +2 -0
  159. package/dist/form/me/password.js +11 -0
  160. package/dist/form/me/password.js.map +1 -0
  161. package/dist/form/me/user.d.ts +2 -0
  162. package/dist/form/me/user.js +9 -0
  163. package/dist/form/me/user.js.map +1 -0
  164. package/dist/form/register.d.ts +2 -0
  165. package/dist/form/register.js +13 -0
  166. package/dist/form/register.js.map +1 -0
  167. package/dist/form/revision.d.ts +2 -0
  168. package/dist/form/revision.js +13 -0
  169. package/dist/form/revision.js.map +1 -0
  170. package/dist/hono/app.d.ts +19 -0
  171. package/dist/hono/app.js +21 -0
  172. package/dist/hono/app.js.map +1 -0
  173. package/dist/hono/handlers/_helpers/errors.d.ts +61 -0
  174. package/dist/hono/handlers/_helpers/errors.js +51 -0
  175. package/dist/hono/handlers/_helpers/errors.js.map +1 -0
  176. package/dist/hono/handlers/_helpers/user-shape.d.ts +46 -0
  177. package/dist/hono/handlers/_helpers/user-shape.js +23 -0
  178. package/dist/hono/handlers/_helpers/user-shape.js.map +1 -0
  179. package/dist/hono/handlers/access-token.d.ts +221 -0
  180. package/dist/hono/handlers/access-token.js +113 -0
  181. package/dist/hono/handlers/access-token.js.map +1 -0
  182. package/dist/hono/handlers/activation.d.ts +117 -0
  183. package/dist/hono/handlers/activation.js +77 -0
  184. package/dist/hono/handlers/activation.js.map +1 -0
  185. package/dist/hono/handlers/admin/app.d.ts +123 -0
  186. package/dist/hono/handlers/admin/app.js +76 -0
  187. package/dist/hono/handlers/admin/app.js.map +1 -0
  188. package/dist/hono/handlers/admin/auth.d.ts +127 -0
  189. package/dist/hono/handlers/admin/auth.js +91 -0
  190. package/dist/hono/handlers/admin/auth.js.map +1 -0
  191. package/dist/hono/handlers/admin/mail.d.ts +168 -0
  192. package/dist/hono/handlers/admin/mail.js +76 -0
  193. package/dist/hono/handlers/admin/mail.js.map +1 -0
  194. package/dist/hono/handlers/admin/plugins.d.ts +409 -0
  195. package/dist/hono/handlers/admin/plugins.js +257 -0
  196. package/dist/hono/handlers/admin/plugins.js.map +1 -0
  197. package/dist/hono/handlers/admin/search.d.ts +57 -0
  198. package/dist/hono/handlers/admin/search.js +55 -0
  199. package/dist/hono/handlers/admin/search.js.map +1 -0
  200. package/dist/hono/handlers/admin/security.d.ts +112 -0
  201. package/dist/hono/handlers/admin/security.js +71 -0
  202. package/dist/hono/handlers/admin/security.js.map +1 -0
  203. package/dist/hono/handlers/admin/share.d.ts +106 -0
  204. package/dist/hono/handlers/admin/share.js +55 -0
  205. package/dist/hono/handlers/admin/share.js.map +1 -0
  206. package/dist/hono/handlers/admin/storage.d.ts +55 -0
  207. package/dist/hono/handlers/admin/storage.js +40 -0
  208. package/dist/hono/handlers/admin/storage.js.map +1 -0
  209. package/dist/hono/handlers/admin/users.d.ts +1230 -0
  210. package/dist/hono/handlers/admin/users.js +316 -0
  211. package/dist/hono/handlers/admin/users.js.map +1 -0
  212. package/dist/hono/handlers/adminCrypto.d.ts +110 -0
  213. package/dist/hono/handlers/adminCrypto.js +151 -0
  214. package/dist/hono/handlers/adminCrypto.js.map +1 -0
  215. package/dist/hono/handlers/app.d.ts +26 -0
  216. package/dist/hono/handlers/app.js +34 -0
  217. package/dist/hono/handlers/app.js.map +1 -0
  218. package/dist/hono/handlers/attachment-stream.d.ts +4 -0
  219. package/dist/hono/handlers/attachment-stream.js +211 -0
  220. package/dist/hono/handlers/attachment-stream.js.map +1 -0
  221. package/dist/hono/handlers/attachment.d.ts +687 -0
  222. package/dist/hono/handlers/attachment.js +566 -0
  223. package/dist/hono/handlers/attachment.js.map +1 -0
  224. package/dist/hono/handlers/autocomplete.d.ts +160 -0
  225. package/dist/hono/handlers/autocomplete.js +181 -0
  226. package/dist/hono/handlers/autocomplete.js.map +1 -0
  227. package/dist/hono/handlers/backlink.d.ts +78 -0
  228. package/dist/hono/handlers/backlink.js +93 -0
  229. package/dist/hono/handlers/backlink.js.map +1 -0
  230. package/dist/hono/handlers/bookmark.d.ts +558 -0
  231. package/dist/hono/handlers/bookmark.js +166 -0
  232. package/dist/hono/handlers/bookmark.js.map +1 -0
  233. package/dist/hono/handlers/comment.d.ts +231 -0
  234. package/dist/hono/handlers/comment.js +191 -0
  235. package/dist/hono/handlers/comment.js.map +1 -0
  236. package/dist/hono/handlers/draft.d.ts +136 -0
  237. package/dist/hono/handlers/draft.js +191 -0
  238. package/dist/hono/handlers/draft.js.map +1 -0
  239. package/dist/hono/handlers/emailChange.d.ts +124 -0
  240. package/dist/hono/handlers/emailChange.js +79 -0
  241. package/dist/hono/handlers/emailChange.js.map +1 -0
  242. package/dist/hono/handlers/installer.d.ts +94 -0
  243. package/dist/hono/handlers/installer.js +93 -0
  244. package/dist/hono/handlers/installer.js.map +1 -0
  245. package/dist/hono/handlers/inviteAccept.d.ts +180 -0
  246. package/dist/hono/handlers/inviteAccept.js +94 -0
  247. package/dist/hono/handlers/inviteAccept.js.map +1 -0
  248. package/dist/hono/handlers/me.d.ts +401 -0
  249. package/dist/hono/handlers/me.js +390 -0
  250. package/dist/hono/handlers/me.js.map +1 -0
  251. package/dist/hono/handlers/notification.d.ts +274 -0
  252. package/dist/hono/handlers/notification.js +224 -0
  253. package/dist/hono/handlers/notification.js.map +1 -0
  254. package/dist/hono/handlers/oauth.d.ts +299 -0
  255. package/dist/hono/handlers/oauth.js +443 -0
  256. package/dist/hono/handlers/oauth.js.map +1 -0
  257. package/dist/hono/handlers/page-collab.d.ts +79 -0
  258. package/dist/hono/handlers/page-collab.js +98 -0
  259. package/dist/hono/handlers/page-collab.js.map +1 -0
  260. package/dist/hono/handlers/page-preview.d.ts +48 -0
  261. package/dist/hono/handlers/page-preview.js +83 -0
  262. package/dist/hono/handlers/page-preview.js.map +1 -0
  263. package/dist/hono/handlers/page.d.ts +2059 -0
  264. package/dist/hono/handlers/page.js +793 -0
  265. package/dist/hono/handlers/page.js.map +1 -0
  266. package/dist/hono/handlers/passwordReset.d.ts +181 -0
  267. package/dist/hono/handlers/passwordReset.js +101 -0
  268. package/dist/hono/handlers/passwordReset.js.map +1 -0
  269. package/dist/hono/handlers/presence.d.ts +178 -0
  270. package/dist/hono/handlers/presence.js +163 -0
  271. package/dist/hono/handlers/presence.js.map +1 -0
  272. package/dist/hono/handlers/revision.d.ts +345 -0
  273. package/dist/hono/handlers/revision.js +202 -0
  274. package/dist/hono/handlers/revision.js.map +1 -0
  275. package/dist/hono/handlers/search.d.ts +208 -0
  276. package/dist/hono/handlers/search.js +152 -0
  277. package/dist/hono/handlers/search.js.map +1 -0
  278. package/dist/hono/handlers/tokenAuth.d.ts +369 -0
  279. package/dist/hono/handlers/tokenAuth.js +240 -0
  280. package/dist/hono/handlers/tokenAuth.js.map +1 -0
  281. package/dist/hono/handlers/user.d.ts +710 -0
  282. package/dist/hono/handlers/user.js +212 -0
  283. package/dist/hono/handlers/user.js.map +1 -0
  284. package/dist/hono/index.d.ts +289 -0
  285. package/dist/hono/index.js +240 -0
  286. package/dist/hono/index.js.map +1 -0
  287. package/dist/hono/middleware/admin.d.ts +5 -0
  288. package/dist/hono/middleware/admin.js +34 -0
  289. package/dist/hono/middleware/admin.js.map +1 -0
  290. package/dist/hono/middleware/auth.d.ts +54 -0
  291. package/dist/hono/middleware/auth.js +142 -0
  292. package/dist/hono/middleware/auth.js.map +1 -0
  293. package/dist/hono/middleware/cors.d.ts +3 -0
  294. package/dist/hono/middleware/cors.js +86 -0
  295. package/dist/hono/middleware/cors.js.map +1 -0
  296. package/dist/hono/middleware/default-hook.d.ts +8 -0
  297. package/dist/hono/middleware/default-hook.js +17 -0
  298. package/dist/hono/middleware/default-hook.js.map +1 -0
  299. package/dist/hono/middleware/error-handler.d.ts +2 -0
  300. package/dist/hono/middleware/error-handler.js +20 -0
  301. package/dist/hono/middleware/error-handler.js.map +1 -0
  302. package/dist/hono/middleware/rate-limit.d.ts +57 -0
  303. package/dist/hono/middleware/rate-limit.js +42 -0
  304. package/dist/hono/middleware/rate-limit.js.map +1 -0
  305. package/dist/hono/middleware/require-scope.d.ts +50 -0
  306. package/dist/hono/middleware/require-scope.js +64 -0
  307. package/dist/hono/middleware/require-scope.js.map +1 -0
  308. package/dist/hono/path-rewrite.d.ts +15 -0
  309. package/dist/hono/path-rewrite.js +59 -0
  310. package/dist/hono/path-rewrite.js.map +1 -0
  311. package/dist/mail/i18n/en.d.ts +2 -0
  312. package/dist/mail/i18n/en.js +66 -0
  313. package/dist/mail/i18n/en.js.map +1 -0
  314. package/dist/mail/i18n/index.d.ts +46 -0
  315. package/dist/mail/i18n/index.js +31 -0
  316. package/dist/mail/i18n/index.js.map +1 -0
  317. package/dist/mail/i18n/ja.d.ts +2 -0
  318. package/dist/mail/i18n/ja.js +66 -0
  319. package/dist/mail/i18n/ja.js.map +1 -0
  320. package/dist/mcp/attach.d.ts +25 -0
  321. package/dist/mcp/attach.js +104 -0
  322. package/dist/mcp/attach.js.map +1 -0
  323. package/dist/mcp/dispatch.d.ts +59 -0
  324. package/dist/mcp/dispatch.js +70 -0
  325. package/dist/mcp/dispatch.js.map +1 -0
  326. package/dist/mcp/result.d.ts +40 -0
  327. package/dist/mcp/result.js +78 -0
  328. package/dist/mcp/result.js.map +1 -0
  329. package/dist/mcp/server.d.ts +67 -0
  330. package/dist/mcp/server.js +113 -0
  331. package/dist/mcp/server.js.map +1 -0
  332. package/dist/mcp/tools/page.d.ts +2 -0
  333. package/dist/mcp/tools/page.js +256 -0
  334. package/dist/mcp/tools/page.js.map +1 -0
  335. package/dist/mcp/tools/search.d.ts +2 -0
  336. package/dist/mcp/tools/search.js +36 -0
  337. package/dist/mcp/tools/search.js.map +1 -0
  338. package/dist/middlewares/accessTokenParser.d.ts +4 -0
  339. package/dist/middlewares/accessTokenParser.js +29 -0
  340. package/dist/middlewares/accessTokenParser.js.map +1 -0
  341. package/dist/middlewares/adminRequired.d.ts +10 -0
  342. package/dist/middlewares/adminRequired.js +35 -0
  343. package/dist/middlewares/adminRequired.js.map +1 -0
  344. package/dist/middlewares/applicationInstalled.d.ts +3 -0
  345. package/dist/middlewares/applicationInstalled.js +20 -0
  346. package/dist/middlewares/applicationInstalled.js.map +1 -0
  347. package/dist/middlewares/applicationNotInstalled.d.ts +3 -0
  348. package/dist/middlewares/applicationNotInstalled.js +13 -0
  349. package/dist/middlewares/applicationNotInstalled.js.map +1 -0
  350. package/dist/middlewares/basicAuth.d.ts +4 -0
  351. package/dist/middlewares/basicAuth.js +23 -0
  352. package/dist/middlewares/basicAuth.js.map +1 -0
  353. package/dist/middlewares/csrfVerify.d.ts +4 -0
  354. package/dist/middlewares/csrfVerify.js +24 -0
  355. package/dist/middlewares/csrfVerify.js.map +1 -0
  356. package/dist/middlewares/encodeSpace.d.ts +3 -0
  357. package/dist/middlewares/encodeSpace.js +14 -0
  358. package/dist/middlewares/encodeSpace.js.map +1 -0
  359. package/dist/middlewares/fileAccessRightOrLoginRequired.d.ts +4 -0
  360. package/dist/middlewares/fileAccessRightOrLoginRequired.js +29 -0
  361. package/dist/middlewares/fileAccessRightOrLoginRequired.js.map +1 -0
  362. package/dist/middlewares/index.d.ts +16 -0
  363. package/dist/middlewares/index.js +30 -0
  364. package/dist/middlewares/index.js.map +1 -0
  365. package/dist/middlewares/jwtAdminRequired.d.ts +8 -0
  366. package/dist/middlewares/jwtAdminRequired.js +35 -0
  367. package/dist/middlewares/jwtAdminRequired.js.map +1 -0
  368. package/dist/middlewares/jwtAuth.d.ts +4 -0
  369. package/dist/middlewares/jwtAuth.js +104 -0
  370. package/dist/middlewares/jwtAuth.js.map +1 -0
  371. package/dist/middlewares/loginChecker.d.ts +4 -0
  372. package/dist/middlewares/loginChecker.js +32 -0
  373. package/dist/middlewares/loginChecker.js.map +1 -0
  374. package/dist/middlewares/loginRequired.d.ts +4 -0
  375. package/dist/middlewares/loginRequired.js +88 -0
  376. package/dist/middlewares/loginRequired.js.map +1 -0
  377. package/dist/migration/cli-api.d.ts +83 -0
  378. package/dist/migration/cli-api.js +128 -0
  379. package/dist/migration/cli-api.js.map +1 -0
  380. package/dist/migration/migrations/index.d.ts +12 -0
  381. package/dist/migration/migrations/index.js +24 -0
  382. package/dist/migration/migrations/index.js.map +1 -0
  383. package/dist/migration/migrations/page-status-default.d.ts +25 -0
  384. package/dist/migration/migrations/page-status-default.js +79 -0
  385. package/dist/migration/migrations/page-status-default.js.map +1 -0
  386. package/dist/migration/migrations/revisions-schema-unify.d.ts +33 -0
  387. package/dist/migration/migrations/revisions-schema-unify.js +88 -0
  388. package/dist/migration/migrations/revisions-schema-unify.js.map +1 -0
  389. package/dist/migration/migrations/user-unique-prepare.d.ts +1 -0
  390. package/dist/migration/migrations/user-unique-prepare.js +214 -0
  391. package/dist/migration/migrations/user-unique-prepare.js.map +1 -0
  392. package/dist/migration/migrations/wikilink-format.d.ts +97 -0
  393. package/dist/migration/migrations/wikilink-format.js +418 -0
  394. package/dist/migration/migrations/wikilink-format.js.map +1 -0
  395. package/dist/migration/rebuild-api.d.ts +50 -0
  396. package/dist/migration/rebuild-api.js +45 -0
  397. package/dist/migration/rebuild-api.js.map +1 -0
  398. package/dist/migration/rebuild-runner.d.ts +64 -0
  399. package/dist/migration/rebuild-runner.js +42 -0
  400. package/dist/migration/rebuild-runner.js.map +1 -0
  401. package/dist/migration/rebuilds/index.d.ts +26 -0
  402. package/dist/migration/rebuilds/index.js +69 -0
  403. package/dist/migration/rebuilds/index.js.map +1 -0
  404. package/dist/migration/registry.d.ts +15 -0
  405. package/dist/migration/registry.js +96 -0
  406. package/dist/migration/registry.js.map +1 -0
  407. package/dist/migration/run-boot-migrations.d.ts +31 -0
  408. package/dist/migration/run-boot-migrations.js +95 -0
  409. package/dist/migration/run-boot-migrations.js.map +1 -0
  410. package/dist/migration/runner.d.ts +120 -0
  411. package/dist/migration/runner.js +276 -0
  412. package/dist/migration/runner.js.map +1 -0
  413. package/dist/migration/types.d.ts +153 -0
  414. package/dist/migration/types.js +13 -0
  415. package/dist/migration/types.js.map +1 -0
  416. package/dist/models/activity.d.ts +34 -0
  417. package/dist/models/activity.js +263 -0
  418. package/dist/models/activity.js.map +1 -0
  419. package/dist/models/attachment.d.ts +25 -0
  420. package/dist/models/attachment.js +82 -0
  421. package/dist/models/attachment.js.map +1 -0
  422. package/dist/models/backlink.d.ts +19 -0
  423. package/dist/models/backlink.js +138 -0
  424. package/dist/models/backlink.js.map +1 -0
  425. package/dist/models/bookmark.d.ts +28 -0
  426. package/dist/models/bookmark.js +136 -0
  427. package/dist/models/bookmark.js.map +1 -0
  428. package/dist/models/comment.d.ts +21 -0
  429. package/dist/models/comment.js +87 -0
  430. package/dist/models/comment.js.map +1 -0
  431. package/dist/models/config-sensitive.d.ts +21 -0
  432. package/dist/models/config-sensitive.js +71 -0
  433. package/dist/models/config-sensitive.js.map +1 -0
  434. package/dist/models/config.d.ts +34 -0
  435. package/dist/models/config.js +161 -0
  436. package/dist/models/config.js.map +1 -0
  437. package/dist/models/index.d.ts +30 -0
  438. package/dist/models/index.js +55 -0
  439. package/dist/models/index.js.map +1 -0
  440. package/dist/models/migration-application.d.ts +54 -0
  441. package/dist/models/migration-application.js +36 -0
  442. package/dist/models/migration-application.js.map +1 -0
  443. package/dist/models/notification.d.ts +28 -0
  444. package/dist/models/notification.js +285 -0
  445. package/dist/models/notification.js.map +1 -0
  446. package/dist/models/oauth-authorization-code.d.ts +34 -0
  447. package/dist/models/oauth-authorization-code.js +100 -0
  448. package/dist/models/oauth-authorization-code.js.map +1 -0
  449. package/dist/models/oauth-client.d.ts +36 -0
  450. package/dist/models/oauth-client.js +56 -0
  451. package/dist/models/oauth-client.js.map +1 -0
  452. package/dist/models/oauth-device-code.d.ts +55 -0
  453. package/dist/models/oauth-device-code.js +158 -0
  454. package/dist/models/oauth-device-code.js.map +1 -0
  455. package/dist/models/oauth-refresh-token.d.ts +31 -0
  456. package/dist/models/oauth-refresh-token.js +118 -0
  457. package/dist/models/oauth-refresh-token.js.map +1 -0
  458. package/dist/models/page-yjs-update.d.ts +35 -0
  459. package/dist/models/page-yjs-update.js +33 -0
  460. package/dist/models/page-yjs-update.js.map +1 -0
  461. package/dist/models/page.d.ts +200 -0
  462. package/dist/models/page.js +1117 -0
  463. package/dist/models/page.js.map +1 -0
  464. package/dist/models/personal-access-token.d.ts +30 -0
  465. package/dist/models/personal-access-token.js +107 -0
  466. package/dist/models/personal-access-token.js.map +1 -0
  467. package/dist/models/plugin-render-cache.d.ts +40 -0
  468. package/dist/models/plugin-render-cache.js +39 -0
  469. package/dist/models/plugin-render-cache.js.map +1 -0
  470. package/dist/models/revision.d.ts +145 -0
  471. package/dist/models/revision.js +241 -0
  472. package/dist/models/revision.js.map +1 -0
  473. package/dist/models/share.d.ts +38 -0
  474. package/dist/models/share.js +137 -0
  475. package/dist/models/share.js.map +1 -0
  476. package/dist/models/shareAccess.d.ts +20 -0
  477. package/dist/models/shareAccess.js +45 -0
  478. package/dist/models/shareAccess.js.map +1 -0
  479. package/dist/models/tracking.d.ts +14 -0
  480. package/dist/models/tracking.js +14 -0
  481. package/dist/models/tracking.js.map +1 -0
  482. package/dist/models/updatePost.d.ts +25 -0
  483. package/dist/models/updatePost.js +87 -0
  484. package/dist/models/updatePost.js.map +1 -0
  485. package/dist/models/user.d.ts +144 -0
  486. package/dist/models/user.js +681 -0
  487. package/dist/models/user.js.map +1 -0
  488. package/dist/models/watcher.d.ts +23 -0
  489. package/dist/models/watcher.js +75 -0
  490. package/dist/models/watcher.js.map +1 -0
  491. package/dist/notifications/attach.d.ts +63 -0
  492. package/dist/notifications/attach.js +426 -0
  493. package/dist/notifications/attach.js.map +1 -0
  494. package/dist/notifications/channel.d.ts +13 -0
  495. package/dist/notifications/channel.js +18 -0
  496. package/dist/notifications/channel.js.map +1 -0
  497. package/dist/plugin/index.d.ts +2 -0
  498. package/dist/plugin/index.js +6 -0
  499. package/dist/plugin/index.js.map +1 -0
  500. package/dist/plugin/plugin-context.d.ts +22 -0
  501. package/dist/plugin/plugin-context.js +126 -0
  502. package/dist/plugin/plugin-context.js.map +1 -0
  503. package/dist/plugin/plugin-manager.d.ts +164 -0
  504. package/dist/plugin/plugin-manager.js +328 -0
  505. package/dist/plugin/plugin-manager.js.map +1 -0
  506. package/dist/plugin/plugin-namespace.d.ts +28 -0
  507. package/dist/plugin/plugin-namespace.js +53 -0
  508. package/dist/plugin/plugin-namespace.js.map +1 -0
  509. package/dist/plugin/registries.d.ts +38 -0
  510. package/dist/plugin/registries.js +71 -0
  511. package/dist/plugin/registries.js.map +1 -0
  512. package/dist/plugin/schema-serializer.d.ts +34 -0
  513. package/dist/plugin/schema-serializer.js +122 -0
  514. package/dist/plugin/schema-serializer.js.map +1 -0
  515. package/dist/plugin/topo-sort.d.ts +15 -0
  516. package/dist/plugin/topo-sort.js +59 -0
  517. package/dist/plugin/topo-sort.js.map +1 -0
  518. package/dist/presence/attach.d.ts +36 -0
  519. package/dist/presence/attach.js +399 -0
  520. package/dist/presence/attach.js.map +1 -0
  521. package/dist/renderer/__fixtures__/echo-embed.d.ts +27 -0
  522. package/dist/renderer/__fixtures__/echo-embed.js +24 -0
  523. package/dist/renderer/__fixtures__/echo-embed.js.map +1 -0
  524. package/dist/renderer/cache/index.d.ts +60 -0
  525. package/dist/renderer/cache/index.js +219 -0
  526. package/dist/renderer/cache/index.js.map +1 -0
  527. package/dist/renderer/cache/mongodb-cache.d.ts +82 -0
  528. package/dist/renderer/cache/mongodb-cache.js +180 -0
  529. package/dist/renderer/cache/mongodb-cache.js.map +1 -0
  530. package/dist/renderer/cache/reservation.d.ts +20 -0
  531. package/dist/renderer/cache/reservation.js +115 -0
  532. package/dist/renderer/cache/reservation.js.map +1 -0
  533. package/dist/renderer/core/_mdast-walk.d.ts +35 -0
  534. package/dist/renderer/core/_mdast-walk.js +45 -0
  535. package/dist/renderer/core/_mdast-walk.js.map +1 -0
  536. package/dist/renderer/core/code-block-dispatch.d.ts +31 -0
  537. package/dist/renderer/core/code-block-dispatch.js +166 -0
  538. package/dist/renderer/core/code-block-dispatch.js.map +1 -0
  539. package/dist/renderer/core/code-blocks.d.ts +12 -0
  540. package/dist/renderer/core/code-blocks.js +32 -0
  541. package/dist/renderer/core/code-blocks.js.map +1 -0
  542. package/dist/renderer/core/embed-tags.d.ts +14 -0
  543. package/dist/renderer/core/embed-tags.js +154 -0
  544. package/dist/renderer/core/embed-tags.js.map +1 -0
  545. package/dist/renderer/core/headings.d.ts +16 -0
  546. package/dist/renderer/core/headings.js +31 -0
  547. package/dist/renderer/core/headings.js.map +1 -0
  548. package/dist/renderer/core/index.d.ts +65 -0
  549. package/dist/renderer/core/index.js +83 -0
  550. package/dist/renderer/core/index.js.map +1 -0
  551. package/dist/renderer/core/mention-resolve.d.ts +39 -0
  552. package/dist/renderer/core/mention-resolve.js +75 -0
  553. package/dist/renderer/core/mention-resolve.js.map +1 -0
  554. package/dist/renderer/core/mentions.d.ts +2 -0
  555. package/dist/renderer/core/mentions.js +83 -0
  556. package/dist/renderer/core/mentions.js.map +1 -0
  557. package/dist/renderer/core/syntax-highlight.d.ts +21 -0
  558. package/dist/renderer/core/syntax-highlight.js +64 -0
  559. package/dist/renderer/core/syntax-highlight.js.map +1 -0
  560. package/dist/renderer/core/url-inline-expand.d.ts +9 -0
  561. package/dist/renderer/core/url-inline-expand.js +157 -0
  562. package/dist/renderer/core/url-inline-expand.js.map +1 -0
  563. package/dist/renderer/core/wikilinks.d.ts +2 -0
  564. package/dist/renderer/core/wikilinks.js +118 -0
  565. package/dist/renderer/core/wikilinks.js.map +1 -0
  566. package/dist/renderer/index.d.ts +67 -0
  567. package/dist/renderer/index.js +99 -0
  568. package/dist/renderer/index.js.map +1 -0
  569. package/dist/renderer/pipeline.d.ts +134 -0
  570. package/dist/renderer/pipeline.js +203 -0
  571. package/dist/renderer/pipeline.js.map +1 -0
  572. package/dist/renderer/registry.d.ts +83 -0
  573. package/dist/renderer/registry.js +130 -0
  574. package/dist/renderer/registry.js.map +1 -0
  575. package/dist/renderer/serialize.d.ts +27 -0
  576. package/dist/renderer/serialize.js +46 -0
  577. package/dist/renderer/serialize.js.map +1 -0
  578. package/dist/renderer/version.d.ts +30 -0
  579. package/dist/renderer/version.js +34 -0
  580. package/dist/renderer/version.js.map +1 -0
  581. package/dist/routes/admin.d.ts +4 -0
  582. package/dist/routes/admin.js +17 -0
  583. package/dist/routes/admin.js.map +1 -0
  584. package/dist/routes/api/admin.d.ts +4 -0
  585. package/dist/routes/api/admin.js +37 -0
  586. package/dist/routes/api/admin.js.map +1 -0
  587. package/dist/routes/api/attachment.d.ts +4 -0
  588. package/dist/routes/api/attachment.js +19 -0
  589. package/dist/routes/api/attachment.js.map +1 -0
  590. package/dist/routes/api/bookmark.d.ts +4 -0
  591. package/dist/routes/api/bookmark.js +15 -0
  592. package/dist/routes/api/bookmark.js.map +1 -0
  593. package/dist/routes/api/comment.d.ts +4 -0
  594. package/dist/routes/api/comment.js +14 -0
  595. package/dist/routes/api/comment.js.map +1 -0
  596. package/dist/routes/api/index.d.ts +4 -0
  597. package/dist/routes/api/index.js +36 -0
  598. package/dist/routes/api/index.js.map +1 -0
  599. package/dist/routes/api/like.d.ts +4 -0
  600. package/dist/routes/api/like.js +13 -0
  601. package/dist/routes/api/like.js.map +1 -0
  602. package/dist/routes/api/notification.d.ts +4 -0
  603. package/dist/routes/api/notification.js +15 -0
  604. package/dist/routes/api/notification.js.map +1 -0
  605. package/dist/routes/api/page.d.ts +4 -0
  606. package/dist/routes/api/page.js +24 -0
  607. package/dist/routes/api/page.js.map +1 -0
  608. package/dist/routes/api/revision.d.ts +4 -0
  609. package/dist/routes/api/revision.js +14 -0
  610. package/dist/routes/api/revision.js.map +1 -0
  611. package/dist/routes/api/share.d.ts +4 -0
  612. package/dist/routes/api/share.js +16 -0
  613. package/dist/routes/api/share.js.map +1 -0
  614. package/dist/routes/api/version.d.ts +4 -0
  615. package/dist/routes/api/version.js +10 -0
  616. package/dist/routes/api/version.js.map +1 -0
  617. package/dist/routes/index.d.ts +4 -0
  618. package/dist/routes/index.js +71 -0
  619. package/dist/routes/index.js.map +1 -0
  620. package/dist/routes/login.d.ts +4 -0
  621. package/dist/routes/login.js +18 -0
  622. package/dist/routes/login.js.map +1 -0
  623. package/dist/routes/me.d.ts +4 -0
  624. package/dist/routes/me.js +24 -0
  625. package/dist/routes/me.js.map +1 -0
  626. package/dist/routes/ts-rest/admin/app.d.ts +4 -0
  627. package/dist/routes/ts-rest/admin/app.js +67 -0
  628. package/dist/routes/ts-rest/admin/app.js.map +1 -0
  629. package/dist/routes/ts-rest/admin/auth.d.ts +4 -0
  630. package/dist/routes/ts-rest/admin/auth.js +95 -0
  631. package/dist/routes/ts-rest/admin/auth.js.map +1 -0
  632. package/dist/routes/ts-rest/admin/index.d.ts +10 -0
  633. package/dist/routes/ts-rest/admin/index.js +35 -0
  634. package/dist/routes/ts-rest/admin/index.js.map +1 -0
  635. package/dist/routes/ts-rest/admin/mail.d.ts +4 -0
  636. package/dist/routes/ts-rest/admin/mail.js +156 -0
  637. package/dist/routes/ts-rest/admin/mail.js.map +1 -0
  638. package/dist/routes/ts-rest/admin/plugins.d.ts +4 -0
  639. package/dist/routes/ts-rest/admin/plugins.js +317 -0
  640. package/dist/routes/ts-rest/admin/plugins.js.map +1 -0
  641. package/dist/routes/ts-rest/admin/search.d.ts +4 -0
  642. package/dist/routes/ts-rest/admin/search.js +67 -0
  643. package/dist/routes/ts-rest/admin/search.js.map +1 -0
  644. package/dist/routes/ts-rest/admin/security.d.ts +4 -0
  645. package/dist/routes/ts-rest/admin/security.js +114 -0
  646. package/dist/routes/ts-rest/admin/security.js.map +1 -0
  647. package/dist/routes/ts-rest/admin/share.d.ts +4 -0
  648. package/dist/routes/ts-rest/admin/share.js +69 -0
  649. package/dist/routes/ts-rest/admin/share.js.map +1 -0
  650. package/dist/routes/ts-rest/admin/storage.d.ts +4 -0
  651. package/dist/routes/ts-rest/admin/storage.js +59 -0
  652. package/dist/routes/ts-rest/admin/storage.js.map +1 -0
  653. package/dist/routes/ts-rest/admin/users.d.ts +4 -0
  654. package/dist/routes/ts-rest/admin/users.js +215 -0
  655. package/dist/routes/ts-rest/admin/users.js.map +1 -0
  656. package/dist/routes/ts-rest/adminCrypto.d.ts +4 -0
  657. package/dist/routes/ts-rest/adminCrypto.js +111 -0
  658. package/dist/routes/ts-rest/adminCrypto.js.map +1 -0
  659. package/dist/routes/ts-rest/app.d.ts +4 -0
  660. package/dist/routes/ts-rest/app.js +23 -0
  661. package/dist/routes/ts-rest/app.js.map +1 -0
  662. package/dist/routes/ts-rest/attachment.d.ts +4 -0
  663. package/dist/routes/ts-rest/attachment.js +830 -0
  664. package/dist/routes/ts-rest/attachment.js.map +1 -0
  665. package/dist/routes/ts-rest/auth.d.ts +4 -0
  666. package/dist/routes/ts-rest/auth.js +70 -0
  667. package/dist/routes/ts-rest/auth.js.map +1 -0
  668. package/dist/routes/ts-rest/autocomplete.d.ts +30 -0
  669. package/dist/routes/ts-rest/autocomplete.js +189 -0
  670. package/dist/routes/ts-rest/autocomplete.js.map +1 -0
  671. package/dist/routes/ts-rest/backlink.d.ts +4 -0
  672. package/dist/routes/ts-rest/backlink.js +106 -0
  673. package/dist/routes/ts-rest/backlink.js.map +1 -0
  674. package/dist/routes/ts-rest/bookmark.d.ts +4 -0
  675. package/dist/routes/ts-rest/bookmark.js +189 -0
  676. package/dist/routes/ts-rest/bookmark.js.map +1 -0
  677. package/dist/routes/ts-rest/comment.d.ts +4 -0
  678. package/dist/routes/ts-rest/comment.js +217 -0
  679. package/dist/routes/ts-rest/comment.js.map +1 -0
  680. package/dist/routes/ts-rest/draft.d.ts +22 -0
  681. package/dist/routes/ts-rest/draft.js +200 -0
  682. package/dist/routes/ts-rest/draft.js.map +1 -0
  683. package/dist/routes/ts-rest/index.d.ts +4 -0
  684. package/dist/routes/ts-rest/index.js +103 -0
  685. package/dist/routes/ts-rest/index.js.map +1 -0
  686. package/dist/routes/ts-rest/installer.d.ts +4 -0
  687. package/dist/routes/ts-rest/installer.js +77 -0
  688. package/dist/routes/ts-rest/installer.js.map +1 -0
  689. package/dist/routes/ts-rest/me.d.ts +4 -0
  690. package/dist/routes/ts-rest/me.js +410 -0
  691. package/dist/routes/ts-rest/me.js.map +1 -0
  692. package/dist/routes/ts-rest/notification.d.ts +4 -0
  693. package/dist/routes/ts-rest/notification.js +241 -0
  694. package/dist/routes/ts-rest/notification.js.map +1 -0
  695. package/dist/routes/ts-rest/page-collab.d.ts +29 -0
  696. package/dist/routes/ts-rest/page-collab.js +90 -0
  697. package/dist/routes/ts-rest/page-collab.js.map +1 -0
  698. package/dist/routes/ts-rest/page-preview.d.ts +26 -0
  699. package/dist/routes/ts-rest/page-preview.js +80 -0
  700. package/dist/routes/ts-rest/page-preview.js.map +1 -0
  701. package/dist/routes/ts-rest/page.d.ts +4 -0
  702. package/dist/routes/ts-rest/page.js +676 -0
  703. package/dist/routes/ts-rest/page.js.map +1 -0
  704. package/dist/routes/ts-rest/presence.d.ts +30 -0
  705. package/dist/routes/ts-rest/presence.js +155 -0
  706. package/dist/routes/ts-rest/presence.js.map +1 -0
  707. package/dist/routes/ts-rest/revision.d.ts +4 -0
  708. package/dist/routes/ts-rest/revision.js +240 -0
  709. package/dist/routes/ts-rest/revision.js.map +1 -0
  710. package/dist/routes/ts-rest/search.d.ts +4 -0
  711. package/dist/routes/ts-rest/search.js +121 -0
  712. package/dist/routes/ts-rest/search.js.map +1 -0
  713. package/dist/routes/ts-rest/tokenAuth.d.ts +4 -0
  714. package/dist/routes/ts-rest/tokenAuth.js +94 -0
  715. package/dist/routes/ts-rest/tokenAuth.js.map +1 -0
  716. package/dist/routes/ts-rest/user.d.ts +4 -0
  717. package/dist/routes/ts-rest/user.js +307 -0
  718. package/dist/routes/ts-rest/user.js.map +1 -0
  719. package/dist/service/config.d.ts +50 -0
  720. package/dist/service/config.js +202 -0
  721. package/dist/service/config.js.map +1 -0
  722. package/dist/service/lru.d.ts +11 -0
  723. package/dist/service/lru.js +47 -0
  724. package/dist/service/lru.js.map +1 -0
  725. package/dist/service/mail.d.ts +107 -0
  726. package/dist/service/mail.js +220 -0
  727. package/dist/service/mail.js.map +1 -0
  728. package/dist/service/notification.d.ts +9 -0
  729. package/dist/service/notification.js +19 -0
  730. package/dist/service/notification.js.map +1 -0
  731. package/dist/service/presence.d.ts +219 -0
  732. package/dist/service/presence.js +602 -0
  733. package/dist/service/presence.js.map +1 -0
  734. package/dist/types/error.d.ts +13 -0
  735. package/dist/types/error.js +13 -0
  736. package/dist/types/error.js.map +1 -0
  737. package/dist/types/express.d.ts +34 -0
  738. package/dist/types/express.js +50 -0
  739. package/dist/types/express.js.map +1 -0
  740. package/dist/types/mongoose-extensions.d.ts +8 -0
  741. package/dist/types/mongoose-extensions.js +24 -0
  742. package/dist/types/mongoose-extensions.js.map +1 -0
  743. package/dist/util/accessTokenParser.d.ts +1 -0
  744. package/dist/util/accessTokenParser.js +34 -0
  745. package/dist/util/accessTokenParser.js.map +1 -0
  746. package/dist/util/activityDefine.d.ts +15 -0
  747. package/dist/util/activityDefine.js +52 -0
  748. package/dist/util/activityDefine.js.map +1 -0
  749. package/dist/util/admin-config.d.ts +57 -0
  750. package/dist/util/admin-config.js +99 -0
  751. package/dist/util/admin-config.js.map +1 -0
  752. package/dist/util/admin-pager.d.ts +24 -0
  753. package/dist/util/admin-pager.js +73 -0
  754. package/dist/util/admin-pager.js.map +1 -0
  755. package/dist/util/apiPaginate.d.ts +11 -0
  756. package/dist/util/apiPaginate.js +33 -0
  757. package/dist/util/apiPaginate.js.map +1 -0
  758. package/dist/util/apiResponse.d.ts +9 -0
  759. package/dist/util/apiResponse.js +23 -0
  760. package/dist/util/apiResponse.js.map +1 -0
  761. package/dist/util/auth.d.ts +11 -0
  762. package/dist/util/auth.js +48 -0
  763. package/dist/util/auth.js.map +1 -0
  764. package/dist/util/auto-watch.d.ts +35 -0
  765. package/dist/util/auto-watch.js +24 -0
  766. package/dist/util/auto-watch.js.map +1 -0
  767. package/dist/util/autocomplete-match.d.ts +44 -0
  768. package/dist/util/autocomplete-match.js +80 -0
  769. package/dist/util/autocomplete-match.js.map +1 -0
  770. package/dist/util/aws-config-migration.d.ts +11 -0
  771. package/dist/util/aws-config-migration.js +68 -0
  772. package/dist/util/aws-config-migration.js.map +1 -0
  773. package/dist/util/boot-reporter.d.ts +130 -0
  774. package/dist/util/boot-reporter.js +242 -0
  775. package/dist/util/boot-reporter.js.map +1 -0
  776. package/dist/util/collab-cap.d.ts +39 -0
  777. package/dist/util/collab-cap.js +90 -0
  778. package/dist/util/collab-cap.js.map +1 -0
  779. package/dist/util/crypto.d.ts +39 -0
  780. package/dist/util/crypto.js +105 -0
  781. package/dist/util/crypto.js.map +1 -0
  782. package/dist/util/dedup-users.d.ts +96 -0
  783. package/dist/util/dedup-users.js +149 -0
  784. package/dist/util/dedup-users.js.map +1 -0
  785. package/dist/util/editor-cap-counter.d.ts +90 -0
  786. package/dist/util/editor-cap-counter.js +175 -0
  787. package/dist/util/editor-cap-counter.js.map +1 -0
  788. package/dist/util/fileUploader.d.ts +55 -0
  789. package/dist/util/fileUploader.js +70 -0
  790. package/dist/util/fileUploader.js.map +1 -0
  791. package/dist/util/formUtil.d.ts +2 -0
  792. package/dist/util/formUtil.js +15 -0
  793. package/dist/util/formUtil.js.map +1 -0
  794. package/dist/util/githubAuth.d.ts +2 -0
  795. package/dist/util/githubAuth.js +82 -0
  796. package/dist/util/githubAuth.js.map +1 -0
  797. package/dist/util/googleAuth.d.ts +2 -0
  798. package/dist/util/googleAuth.js +85 -0
  799. package/dist/util/googleAuth.js.map +1 -0
  800. package/dist/util/jwt.d.ts +50 -0
  801. package/dist/util/jwt.js +127 -0
  802. package/dist/util/jwt.js.map +1 -0
  803. package/dist/util/linkDetector.d.ts +3 -0
  804. package/dist/util/linkDetector.js +91 -0
  805. package/dist/util/linkDetector.js.map +1 -0
  806. package/dist/util/mail-token.d.ts +24 -0
  807. package/dist/util/mail-token.js +117 -0
  808. package/dist/util/mail-token.js.map +1 -0
  809. package/dist/util/mailer.d.ts +7 -0
  810. package/dist/util/mailer.js +98 -0
  811. package/dist/util/mailer.js.map +1 -0
  812. package/dist/util/map-duplicate-key-error.d.ts +26 -0
  813. package/dist/util/map-duplicate-key-error.js +41 -0
  814. package/dist/util/map-duplicate-key-error.js.map +1 -0
  815. package/dist/util/mongoose-paginate.d.ts +10 -0
  816. package/dist/util/mongoose-paginate.js +23 -0
  817. package/dist/util/mongoose-paginate.js.map +1 -0
  818. package/dist/util/notifications-token.d.ts +35 -0
  819. package/dist/util/notifications-token.js +140 -0
  820. package/dist/util/notifications-token.js.map +1 -0
  821. package/dist/util/oauth-client-seed.d.ts +2 -0
  822. package/dist/util/oauth-client-seed.js +48 -0
  823. package/dist/util/oauth-client-seed.js.map +1 -0
  824. package/dist/util/oauth-redirect-uri.d.ts +2 -0
  825. package/dist/util/oauth-redirect-uri.js +55 -0
  826. package/dist/util/oauth-redirect-uri.js.map +1 -0
  827. package/dist/util/page-response.d.ts +113 -0
  828. package/dist/util/page-response.js +154 -0
  829. package/dist/util/page-response.js.map +1 -0
  830. package/dist/util/page-search-index.d.ts +19 -0
  831. package/dist/util/page-search-index.js +91 -0
  832. package/dist/util/page-search-index.js.map +1 -0
  833. package/dist/util/page-status-migration.d.ts +23 -0
  834. package/dist/util/page-status-migration.js +48 -0
  835. package/dist/util/page-status-migration.js.map +1 -0
  836. package/dist/util/path.d.ts +2 -0
  837. package/dist/util/path.js +12 -0
  838. package/dist/util/path.js.map +1 -0
  839. package/dist/util/pkce.d.ts +13 -0
  840. package/dist/util/pkce.js +30 -0
  841. package/dist/util/pkce.js.map +1 -0
  842. package/dist/util/presence-token.d.ts +21 -0
  843. package/dist/util/presence-token.js +120 -0
  844. package/dist/util/presence-token.js.map +1 -0
  845. package/dist/util/rate-limit.d.ts +67 -0
  846. package/dist/util/rate-limit.js +87 -0
  847. package/dist/util/rate-limit.js.map +1 -0
  848. package/dist/util/rebuild-backlink.d.ts +25 -0
  849. package/dist/util/rebuild-backlink.js +7 -0
  850. package/dist/util/rebuild-backlink.js.map +1 -0
  851. package/dist/util/rebuild-renderer.d.ts +31 -0
  852. package/dist/util/rebuild-renderer.js +7 -0
  853. package/dist/util/rebuild-renderer.js.map +1 -0
  854. package/dist/util/redis-opts.d.ts +17 -0
  855. package/dist/util/redis-opts.js +40 -0
  856. package/dist/util/redis-opts.js.map +1 -0
  857. package/dist/util/regex.d.ts +2 -0
  858. package/dist/util/regex.js +8 -0
  859. package/dist/util/regex.js.map +1 -0
  860. package/dist/util/search-rebuild.d.ts +18 -0
  861. package/dist/util/search-rebuild.js +28 -0
  862. package/dist/util/search-rebuild.js.map +1 -0
  863. package/dist/util/ssr.d.ts +3 -0
  864. package/dist/util/ssr.js +9 -0
  865. package/dist/util/ssr.js.map +1 -0
  866. package/dist/util/storage-copy.d.ts +40 -0
  867. package/dist/util/storage-copy.js +123 -0
  868. package/dist/util/storage-copy.js.map +1 -0
  869. package/dist/util/ts-rest-helpers.d.ts +110 -0
  870. package/dist/util/ts-rest-helpers.js +110 -0
  871. package/dist/util/ts-rest-helpers.js.map +1 -0
  872. package/dist/util/url.d.ts +1 -0
  873. package/dist/util/url.js +11 -0
  874. package/dist/util/url.js.map +1 -0
  875. package/dist/util/user-code.d.ts +10 -0
  876. package/dist/util/user-code.js +55 -0
  877. package/dist/util/user-code.js.map +1 -0
  878. package/dist/util/view.d.ts +10 -0
  879. package/dist/util/view.js +99 -0
  880. package/dist/util/view.js.map +1 -0
  881. package/dist/util/watcher-backfill.d.ts +30 -0
  882. package/dist/util/watcher-backfill.js +43 -0
  883. package/dist/util/watcher-backfill.js.map +1 -0
  884. package/dist/util/ws-token.d.ts +24 -0
  885. package/dist/util/ws-token.js +134 -0
  886. package/dist/util/ws-token.js.map +1 -0
  887. 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
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Crowi::app.js
4
+ *
5
+ * @package Crowi
6
+ * @author Sotaro KARASAWA <sotarok@crocos.co.jp>
7
+ */
8
+ export {};
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
@@ -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