@hed-hog/core 0.0.398 → 0.0.400
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/dist/ai/ai-agent.sort.d.ts +6 -0
- package/dist/ai/ai-agent.sort.d.ts.map +1 -0
- package/dist/ai/ai-agent.sort.js +21 -0
- package/dist/ai/ai-agent.sort.js.map +1 -0
- package/dist/ai/ai.controller.d.ts +4 -4
- package/dist/ai/ai.service.d.ts +35 -4
- package/dist/ai/ai.service.d.ts.map +1 -1
- package/dist/ai/ai.service.js +51 -137
- package/dist/ai/ai.service.js.map +1 -1
- package/dist/ai-instruction/ai-instruction.service.d.ts.map +1 -1
- package/dist/ai-instruction/ai-instruction.service.js +26 -23
- package/dist/ai-instruction/ai-instruction.service.js.map +1 -1
- package/dist/ai-instruction/ai-instruction.sort.d.ts +16 -0
- package/dist/ai-instruction/ai-instruction.sort.d.ts.map +1 -0
- package/dist/ai-instruction/ai-instruction.sort.js +32 -0
- package/dist/ai-instruction/ai-instruction.sort.js.map +1 -0
- package/dist/auth/auth.controller.d.ts +24 -8
- package/dist/auth/auth.controller.d.ts.map +1 -1
- package/dist/auth/auth.module.d.ts.map +1 -1
- package/dist/auth/auth.module.js +8 -1
- package/dist/auth/auth.module.js.map +1 -1
- package/dist/auth/auth.service.d.ts +72 -25
- package/dist/auth/auth.service.d.ts.map +1 -1
- package/dist/auth/auth.service.js +41 -4
- package/dist/auth/auth.service.js.map +1 -1
- package/dist/auth/guards/auth.guard.d.ts +3 -1
- package/dist/auth/guards/auth.guard.d.ts.map +1 -1
- package/dist/auth/guards/auth.guard.js +12 -3
- package/dist/auth/guards/auth.guard.js.map +1 -1
- package/dist/authorize/authorize.controller.d.ts +30 -6
- package/dist/authorize/authorize.controller.d.ts.map +1 -1
- package/dist/authorize/authorize.controller.js +120 -13
- package/dist/authorize/authorize.controller.js.map +1 -1
- package/dist/authorize/authorize.errors.d.ts +34 -0
- package/dist/authorize/authorize.errors.d.ts.map +1 -0
- package/dist/authorize/authorize.errors.js +37 -0
- package/dist/authorize/authorize.errors.js.map +1 -0
- package/dist/authorize/authorize.module.d.ts.map +1 -1
- package/dist/authorize/authorize.module.js +6 -1
- package/dist/authorize/authorize.module.js.map +1 -1
- package/dist/authorize/authorize.service.d.ts +78 -4
- package/dist/authorize/authorize.service.d.ts.map +1 -1
- package/dist/authorize/authorize.service.js +212 -21
- package/dist/authorize/authorize.service.js.map +1 -1
- package/dist/authorize/dto/authorize-info.dto.d.ts +10 -1
- package/dist/authorize/dto/authorize-info.dto.d.ts.map +1 -1
- package/dist/authorize/dto/authorize-info.dto.js +16 -1
- package/dist/authorize/dto/authorize-info.dto.js.map +1 -1
- package/dist/authorize/dto/consent.dto.d.ts +10 -1
- package/dist/authorize/dto/consent.dto.d.ts.map +1 -1
- package/dist/authorize/dto/consent.dto.js +16 -1
- package/dist/authorize/dto/consent.dto.js.map +1 -1
- package/dist/authorize/dto/token.dto.d.ts +12 -0
- package/dist/authorize/dto/token.dto.d.ts.map +1 -1
- package/dist/authorize/dto/token.dto.js +21 -1
- package/dist/authorize/dto/token.dto.js.map +1 -1
- package/dist/authorize/oauth-exception.filter.d.ts +17 -0
- package/dist/authorize/oauth-exception.filter.d.ts.map +1 -0
- package/dist/authorize/oauth-exception.filter.js +54 -0
- package/dist/authorize/oauth-exception.filter.js.map +1 -0
- package/dist/authorize/oauth-metadata.service.d.ts +39 -0
- package/dist/authorize/oauth-metadata.service.d.ts.map +1 -0
- package/dist/authorize/oauth-metadata.service.js +81 -0
- package/dist/authorize/oauth-metadata.service.js.map +1 -0
- package/dist/authorize/well-known.controller.d.ts +67 -0
- package/dist/authorize/well-known.controller.d.ts.map +1 -0
- package/dist/authorize/well-known.controller.js +126 -0
- package/dist/authorize/well-known.controller.js.map +1 -0
- package/dist/captcha/captcha.service.d.ts +32 -2
- package/dist/captcha/captcha.service.d.ts.map +1 -1
- package/dist/captcha/captcha.service.js +85 -12
- package/dist/captcha/captcha.service.js.map +1 -1
- package/dist/challenge/challenge.service.d.ts +2 -2
- package/dist/core.module.d.ts.map +1 -1
- package/dist/core.module.js +6 -0
- package/dist/core.module.js.map +1 -1
- package/dist/dashboard/dashboard/dashboard.controller.d.ts +9 -9
- package/dist/dashboard/dashboard/dashboard.service.d.ts +9 -9
- package/dist/dashboard/dashboard-component/dashboard-component.controller.d.ts +3 -3
- package/dist/dashboard/dashboard-component/dashboard-component.service.d.ts +3 -3
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.controller.d.ts +3 -3
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts +3 -3
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts.map +1 -1
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.js +2 -4
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.js.map +1 -1
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.d.ts +8 -0
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.d.ts.map +1 -0
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.js +18 -0
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.js.map +1 -0
- package/dist/dashboard/dashboard-item/dashboard-item.service.d.ts.map +1 -1
- package/dist/dashboard/dashboard-item/dashboard-item.service.js +2 -4
- package/dist/dashboard/dashboard-item/dashboard-item.service.js.map +1 -1
- package/dist/dashboard/dashboard-item/dashboard-item.sort.d.ts +9 -0
- package/dist/dashboard/dashboard-item/dashboard-item.sort.d.ts.map +1 -0
- package/dist/dashboard/dashboard-item/dashboard-item.sort.js +19 -0
- package/dist/dashboard/dashboard-item/dashboard-item.sort.js.map +1 -0
- package/dist/dashboard/dashboard-role/dashboard-role.controller.d.ts +3 -3
- package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts +3 -3
- package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts.map +1 -1
- package/dist/dashboard/dashboard-role/dashboard-role.service.js +2 -4
- package/dist/dashboard/dashboard-role/dashboard-role.service.js.map +1 -1
- package/dist/dashboard/dashboard-role/dashboard-role.sort.d.ts +8 -0
- package/dist/dashboard/dashboard-role/dashboard-role.sort.d.ts.map +1 -0
- package/dist/dashboard/dashboard-role/dashboard-role.sort.js +16 -0
- package/dist/dashboard/dashboard-role/dashboard-role.sort.js.map +1 -0
- package/dist/file/file-upload-ticket.service.d.ts +160 -0
- package/dist/file/file-upload-ticket.service.d.ts.map +1 -0
- package/dist/file/file-upload-ticket.service.js +382 -0
- package/dist/file/file-upload-ticket.service.js.map +1 -0
- package/dist/file/file.controller.d.ts +24 -1
- package/dist/file/file.controller.d.ts.map +1 -1
- package/dist/file/file.controller.js +63 -2
- package/dist/file/file.controller.js.map +1 -1
- package/dist/file/file.module.d.ts.map +1 -1
- package/dist/file/file.module.js +14 -2
- package/dist/file/file.module.js.map +1 -1
- package/dist/file/file.service.d.ts +182 -6
- package/dist/file/file.service.d.ts.map +1 -1
- package/dist/file/file.service.js +385 -36
- package/dist/file/file.service.js.map +1 -1
- package/dist/file/filename-encoding.util.d.ts +24 -0
- package/dist/file/filename-encoding.util.d.ts.map +1 -0
- package/dist/file/filename-encoding.util.js +63 -0
- package/dist/file/filename-encoding.util.js.map +1 -0
- package/dist/file/image-optimization.service.d.ts +27 -0
- package/dist/file/image-optimization.service.d.ts.map +1 -1
- package/dist/file/image-optimization.service.js +63 -14
- package/dist/file/image-optimization.service.js.map +1 -1
- package/dist/file/mcp-file-source.schema.d.ts +33 -0
- package/dist/file/mcp-file-source.schema.d.ts.map +1 -0
- package/dist/file/mcp-file-source.schema.js +75 -0
- package/dist/file/mcp-file-source.schema.js.map +1 -0
- package/dist/file/mcp-file-source.service.d.ts +124 -0
- package/dist/file/mcp-file-source.service.d.ts.map +1 -0
- package/dist/file/mcp-file-source.service.js +262 -0
- package/dist/file/mcp-file-source.service.js.map +1 -0
- package/dist/file/mimetype-sniff.util.d.ts +62 -0
- package/dist/file/mimetype-sniff.util.d.ts.map +1 -0
- package/dist/file/mimetype-sniff.util.js +226 -0
- package/dist/file/mimetype-sniff.util.js.map +1 -0
- package/dist/file/remote-fetch.util.d.ts +35 -0
- package/dist/file/remote-fetch.util.d.ts.map +1 -0
- package/dist/file/remote-fetch.util.js +236 -0
- package/dist/file/remote-fetch.util.js.map +1 -0
- package/dist/impersonation/dto/start-impersonation.dto.d.ts +4 -1
- package/dist/impersonation/dto/start-impersonation.dto.d.ts.map +1 -1
- package/dist/impersonation/dto/start-impersonation.dto.js +1 -1
- package/dist/impersonation/dto/start-impersonation.dto.js.map +1 -1
- package/dist/impersonation/impersonation.service.d.ts +8 -3
- package/dist/impersonation/impersonation.service.d.ts.map +1 -1
- package/dist/impersonation/impersonation.service.js +14 -4
- package/dist/impersonation/impersonation.service.js.map +1 -1
- package/dist/incident/incident.controller.d.ts +2 -1
- package/dist/incident/incident.controller.d.ts.map +1 -1
- package/dist/incident/incident.controller.js +10 -6
- package/dist/incident/incident.controller.js.map +1 -1
- package/dist/incident/incident.service.d.ts +2 -0
- package/dist/incident/incident.service.d.ts.map +1 -1
- package/dist/incident/incident.service.js +4 -0
- package/dist/incident/incident.service.js.map +1 -1
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -1
- package/dist/integration-profile/integration-profile.secrets.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.secrets.js +7 -0
- package/dist/integration-profile/integration-profile.secrets.js.map +1 -1
- package/dist/integration-profile/integration-profile.service.d.ts +0 -13
- package/dist/integration-profile/integration-profile.service.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.service.js +5 -40
- package/dist/integration-profile/integration-profile.service.js.map +1 -1
- package/dist/integration-profile/integration-profile.utils.js +5 -5
- package/dist/integration-profile/integration-profile.utils.js.map +1 -1
- package/dist/integration-profile/testers/index.d.ts.map +1 -1
- package/dist/integration-profile/testers/index.js +2 -0
- package/dist/integration-profile/testers/index.js.map +1 -1
- package/dist/integration-profile/testers/shipping.testers.d.ts +3 -0
- package/dist/integration-profile/testers/shipping.testers.d.ts.map +1 -0
- package/dist/integration-profile/testers/shipping.testers.js +71 -0
- package/dist/integration-profile/testers/shipping.testers.js.map +1 -0
- package/dist/locale/locale.controller.d.ts +1 -1
- package/dist/locale/locale.service.d.ts +1 -1
- package/dist/mail/dto/send.dto.d.ts +6 -1
- package/dist/mail/dto/send.dto.d.ts.map +1 -1
- package/dist/mail/dto/send.dto.js.map +1 -1
- package/dist/mail/mail.service.d.ts +9 -0
- package/dist/mail/mail.service.d.ts.map +1 -1
- package/dist/mail/mail.service.js +34 -14
- package/dist/mail/mail.service.js.map +1 -1
- package/dist/mail-sent/mail-sent.controller.d.ts +1 -1
- package/dist/mail-sent/mail-sent.service.d.ts +1 -1
- package/dist/mail-sent/mail-sent.service.d.ts.map +1 -1
- package/dist/mail-sent/mail-sent.service.js +2 -1
- package/dist/mail-sent/mail-sent.service.js.map +1 -1
- package/dist/mail-sent/mail-sent.sort.d.ts +9 -0
- package/dist/mail-sent/mail-sent.sort.d.ts.map +1 -0
- package/dist/mail-sent/mail-sent.sort.js +19 -0
- package/dist/mail-sent/mail-sent.sort.js.map +1 -0
- package/dist/mcp/filters/mcp-challenge.filter.d.ts +20 -0
- package/dist/mcp/filters/mcp-challenge.filter.d.ts.map +1 -0
- package/dist/mcp/filters/mcp-challenge.filter.js +69 -0
- package/dist/mcp/filters/mcp-challenge.filter.js.map +1 -0
- package/dist/mcp/guards/mcp-auth.guard.d.ts +4 -1
- package/dist/mcp/guards/mcp-auth.guard.d.ts.map +1 -1
- package/dist/mcp/guards/mcp-auth.guard.js +19 -5
- package/dist/mcp/guards/mcp-auth.guard.js.map +1 -1
- package/dist/mcp/guards/mcp-permission.guard.d.ts +25 -3
- package/dist/mcp/guards/mcp-permission.guard.d.ts.map +1 -1
- package/dist/mcp/guards/mcp-permission.guard.js +46 -26
- package/dist/mcp/guards/mcp-permission.guard.js.map +1 -1
- package/dist/mcp/mcp-audit.service.d.ts +17 -0
- package/dist/mcp/mcp-audit.service.d.ts.map +1 -1
- package/dist/mcp/mcp-audit.service.js +32 -3
- package/dist/mcp/mcp-audit.service.js.map +1 -1
- package/dist/mcp/mcp-permission.service.d.ts +64 -0
- package/dist/mcp/mcp-permission.service.d.ts.map +1 -0
- package/dist/mcp/mcp-permission.service.js +178 -0
- package/dist/mcp/mcp-permission.service.js.map +1 -0
- package/dist/mcp/mcp-server.service.d.ts +3 -1
- package/dist/mcp/mcp-server.service.d.ts.map +1 -1
- package/dist/mcp/mcp-server.service.js +36 -15
- package/dist/mcp/mcp-server.service.js.map +1 -1
- package/dist/mcp/mcp.controller.d.ts.map +1 -1
- package/dist/mcp/mcp.controller.js +10 -2
- package/dist/mcp/mcp.controller.js.map +1 -1
- package/dist/mcp/mcp.module.d.ts.map +1 -1
- package/dist/mcp/mcp.module.js +5 -1
- package/dist/mcp/mcp.module.js.map +1 -1
- package/dist/mcp/tools/core-ai.mcp-tools.js +2 -9
- package/dist/mcp/tools/core-ai.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-dashboard-items.mcp-tools.js +1 -1
- package/dist/mcp/tools/core-dashboard-items.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-dashboard.mcp-tools.js +2 -9
- package/dist/mcp/tools/core-dashboard.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-event-webhooks.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-event-webhooks.mcp-tools.js +2 -10
- package/dist/mcp/tools/core-event-webhooks.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-files.mcp-tools.d.ts +17 -5
- package/dist/mcp/tools/core-files.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-files.mcp-tools.js +186 -24
- package/dist/mcp/tools/core-files.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-integration-events.mcp-tools.js +2 -9
- package/dist/mcp/tools/core-integration-events.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-mail-sent.mcp-tools.js +2 -14
- package/dist/mcp/tools/core-mail-sent.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-mail.mcp-tools.js +2 -9
- package/dist/mcp/tools/core-mail.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-menus.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-menus.mcp-tools.js +2 -10
- package/dist/mcp/tools/core-menus.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-notifications.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-notifications.mcp-tools.js +0 -1
- package/dist/mcp/tools/core-notifications.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-roles.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-roles.mcp-tools.js +2 -13
- package/dist/mcp/tools/core-roles.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-routes.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-routes.mcp-tools.js +2 -11
- package/dist/mcp/tools/core-routes.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-screens.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-screens.mcp-tools.js +2 -11
- package/dist/mcp/tools/core-screens.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-sessions.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-sessions.mcp-tools.js +0 -2
- package/dist/mcp/tools/core-sessions.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-settings.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-settings.mcp-tools.js +2 -10
- package/dist/mcp/tools/core-settings.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-users.mcp-tools.js +2 -9
- package/dist/mcp/tools/core-users.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-webhooks.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-webhooks.mcp-tools.js +2 -10
- package/dist/mcp/tools/core-webhooks.mcp-tools.js.map +1 -1
- package/dist/mcp/types/mcp-context.type.d.ts +9 -0
- package/dist/mcp/types/mcp-context.type.d.ts.map +1 -1
- package/dist/mcp-chat/mcp-chat.service.d.ts.map +1 -1
- package/dist/mcp-chat/mcp-chat.service.js +8 -0
- package/dist/mcp-chat/mcp-chat.service.js.map +1 -1
- package/dist/meeting/meeting-provider.registry.d.ts +115 -0
- package/dist/meeting/meeting-provider.registry.d.ts.map +1 -1
- package/dist/meeting/meeting-provider.registry.js.map +1 -1
- package/dist/meeting/meeting.constants.d.ts +70 -0
- package/dist/meeting/meeting.constants.d.ts.map +1 -1
- package/dist/meeting/meeting.constants.js +9 -1
- package/dist/meeting/meeting.constants.js.map +1 -1
- package/dist/menu/menu.service.d.ts.map +1 -1
- package/dist/menu/menu.service.js +29 -9
- package/dist/menu/menu.service.js.map +1 -1
- package/dist/message-template/dto/update-message-template.dto.d.ts +18 -0
- package/dist/message-template/dto/update-message-template.dto.d.ts.map +1 -0
- package/dist/message-template/dto/update-message-template.dto.js +38 -0
- package/dist/message-template/dto/update-message-template.dto.js.map +1 -0
- package/dist/message-template/message-template-admin.service.d.ts +70 -0
- package/dist/message-template/message-template-admin.service.d.ts.map +1 -0
- package/dist/message-template/message-template-admin.service.js +226 -0
- package/dist/message-template/message-template-admin.service.js.map +1 -0
- package/dist/message-template/message-template.controller.d.ts +29 -0
- package/dist/message-template/message-template.controller.d.ts.map +1 -0
- package/dist/message-template/message-template.controller.js +101 -0
- package/dist/message-template/message-template.controller.js.map +1 -0
- package/dist/message-template/message-template.module.d.ts +10 -0
- package/dist/message-template/message-template.module.d.ts.map +1 -0
- package/dist/message-template/message-template.module.js +33 -0
- package/dist/message-template/message-template.module.js.map +1 -0
- package/dist/message-template/message-template.registry.d.ts +55 -0
- package/dist/message-template/message-template.registry.d.ts.map +1 -0
- package/dist/message-template/message-template.registry.js +64 -0
- package/dist/message-template/message-template.registry.js.map +1 -0
- package/dist/message-template/message-template.service.d.ts +59 -0
- package/dist/message-template/message-template.service.d.ts.map +1 -0
- package/dist/message-template/message-template.service.js +166 -0
- package/dist/message-template/message-template.service.js.map +1 -0
- package/dist/notification/notification.constants.d.ts +11 -0
- package/dist/notification/notification.constants.d.ts.map +1 -0
- package/dist/notification/notification.constants.js +14 -0
- package/dist/notification/notification.constants.js.map +1 -0
- package/dist/notification/notification.controller.d.ts +20 -20
- package/dist/notification/notification.module.d.ts.map +1 -1
- package/dist/notification/notification.module.js +3 -0
- package/dist/notification/notification.module.js.map +1 -1
- package/dist/notification/notification.service.d.ts +33 -21
- package/dist/notification/notification.service.d.ts.map +1 -1
- package/dist/notification/notification.service.js +36 -2
- package/dist/notification/notification.service.js.map +1 -1
- package/dist/oauth/oauth.controller.d.ts +4 -6
- package/dist/oauth/oauth.controller.d.ts.map +1 -1
- package/dist/oauth/oauth.controller.js +0 -1
- package/dist/oauth/oauth.controller.js.map +1 -1
- package/dist/oauth/oauth.errors.d.ts +15 -1
- package/dist/oauth/oauth.errors.d.ts.map +1 -1
- package/dist/oauth/oauth.errors.js +9 -1
- package/dist/oauth/oauth.errors.js.map +1 -1
- package/dist/oauth/oauth.module.d.ts.map +1 -1
- package/dist/oauth/oauth.module.js +6 -1
- package/dist/oauth/oauth.module.js.map +1 -1
- package/dist/oauth/oauth.service.d.ts +25 -5
- package/dist/oauth/oauth.service.d.ts.map +1 -1
- package/dist/oauth/oauth.service.js +63 -27
- package/dist/oauth/oauth.service.js.map +1 -1
- package/dist/oauth/providers/abstract.provider.d.ts +10 -0
- package/dist/oauth/providers/abstract.provider.d.ts.map +1 -1
- package/dist/oauth/providers/abstract.provider.js +39 -12
- package/dist/oauth/providers/abstract.provider.js.map +1 -1
- package/dist/oauth/providers/github.provider.d.ts +1 -1
- package/dist/oauth/providers/github.provider.d.ts.map +1 -1
- package/dist/oauth/providers/github.provider.js +48 -22
- package/dist/oauth/providers/github.provider.js.map +1 -1
- package/dist/oauth/providers/microsoft-entra-id.provider.d.ts.map +1 -1
- package/dist/oauth/providers/microsoft-entra-id.provider.js +6 -0
- package/dist/oauth/providers/microsoft-entra-id.provider.js.map +1 -1
- package/dist/observability/monitored-cron.d.ts +29 -12
- package/dist/observability/monitored-cron.d.ts.map +1 -1
- package/dist/observability/monitored-cron.js +131 -46
- package/dist/observability/monitored-cron.js.map +1 -1
- package/dist/pairing/pairing.controller.d.ts +9 -9
- package/dist/pairing/pairing.service.d.ts +15 -11
- package/dist/pairing/pairing.service.d.ts.map +1 -1
- package/dist/profile/dto/change-password.dto.d.ts.map +1 -1
- package/dist/profile/dto/change-password.dto.js +4 -6
- package/dist/profile/dto/change-password.dto.js.map +1 -1
- package/dist/profile/profile.controller.d.ts +1 -1
- package/dist/profile/profile.service.d.ts +1 -1
- package/dist/profile/profile.service.d.ts.map +1 -1
- package/dist/profile/profile.service.js +9 -3
- package/dist/profile/profile.service.js.map +1 -1
- package/dist/realtime/realtime-tick.coalescer.d.ts +34 -0
- package/dist/realtime/realtime-tick.coalescer.d.ts.map +1 -0
- package/dist/realtime/realtime-tick.coalescer.js +60 -0
- package/dist/realtime/realtime-tick.coalescer.js.map +1 -0
- package/dist/realtime/realtime.service.d.ts +2 -0
- package/dist/realtime/realtime.service.d.ts.map +1 -1
- package/dist/realtime/realtime.service.js +22 -2
- package/dist/realtime/realtime.service.js.map +1 -1
- package/dist/redis/redis-kv.service.d.ts +90 -0
- package/dist/redis/redis-kv.service.d.ts.map +1 -0
- package/dist/redis/redis-kv.service.js +247 -0
- package/dist/redis/redis-kv.service.js.map +1 -0
- package/dist/redis/redis-master.d.ts +29 -0
- package/dist/redis/redis-master.d.ts.map +1 -0
- package/dist/redis/redis-master.js +81 -0
- package/dist/redis/redis-master.js.map +1 -0
- package/dist/redis/redis-pubsub.d.ts +12 -0
- package/dist/redis/redis-pubsub.d.ts.map +1 -1
- package/dist/redis/redis-pubsub.js +25 -2
- package/dist/redis/redis-pubsub.js.map +1 -1
- package/dist/redis/redis.module.d.ts +11 -0
- package/dist/redis/redis.module.d.ts.map +1 -0
- package/dist/redis/redis.module.js +30 -0
- package/dist/redis/redis.module.js.map +1 -0
- package/dist/session/session.controller.d.ts +6 -2
- package/dist/session/session.controller.d.ts.map +1 -1
- package/dist/session/session.service.d.ts +118 -15
- package/dist/session/session.service.d.ts.map +1 -1
- package/dist/session/session.service.js +251 -77
- package/dist/session/session.service.js.map +1 -1
- package/dist/setting/setting.controller.d.ts +5 -0
- package/dist/setting/setting.controller.d.ts.map +1 -1
- package/dist/setting/setting.service.d.ts +7 -0
- package/dist/setting/setting.service.d.ts.map +1 -1
- package/dist/setting/setting.service.js +38 -3
- package/dist/setting/setting.service.js.map +1 -1
- package/dist/task/task.service.d.ts +17 -0
- package/dist/task/task.service.d.ts.map +1 -1
- package/dist/task/task.service.js +48 -13
- package/dist/task/task.service.js.map +1 -1
- package/dist/token/token.service.d.ts +19 -1
- package/dist/token/token.service.d.ts.map +1 -1
- package/dist/token/token.service.js +39 -2
- package/dist/token/token.service.js.map +1 -1
- package/dist/user/user-credential.util.d.ts +10 -0
- package/dist/user/user-credential.util.d.ts.map +1 -1
- package/dist/user/user-credential.util.js +14 -1
- package/dist/user/user-credential.util.js.map +1 -1
- package/dist/user/user.service.d.ts +12 -4
- package/dist/user/user.service.d.ts.map +1 -1
- package/dist/user/user.service.js +2 -11
- package/dist/user/user.service.js.map +1 -1
- package/dist/user/user.sort.d.ts +16 -0
- package/dist/user/user.sort.d.ts.map +1 -0
- package/dist/user/user.sort.js +25 -0
- package/dist/user/user.sort.js.map +1 -0
- package/dist/utils/abbreviate-name.d.ts +13 -0
- package/dist/utils/abbreviate-name.d.ts.map +1 -0
- package/dist/utils/abbreviate-name.js +42 -0
- package/dist/utils/abbreviate-name.js.map +1 -0
- package/dist/utils/date-range-query.dto.d.ts +11 -0
- package/dist/utils/date-range-query.dto.d.ts.map +1 -0
- package/dist/utils/date-range-query.dto.js +63 -0
- package/dist/utils/date-range-query.dto.js.map +1 -0
- package/dist/utils/date-range.d.ts +96 -0
- package/dist/utils/date-range.d.ts.map +1 -0
- package/dist/utils/date-range.js +172 -0
- package/dist/utils/date-range.js.map +1 -0
- package/dist/webhook-integration/webhook-utils.d.ts.map +1 -1
- package/dist/webhook-integration/webhook-utils.js +24 -0
- package/dist/webhook-integration/webhook-utils.js.map +1 -1
- package/dist/whatsapp-sender/whatsapp-recipients.d.ts +49 -0
- package/dist/whatsapp-sender/whatsapp-recipients.d.ts.map +1 -0
- package/dist/whatsapp-sender/whatsapp-recipients.js +66 -0
- package/dist/whatsapp-sender/whatsapp-recipients.js.map +1 -0
- package/dist/whatsapp-sender/whatsapp-sender.service.d.ts +25 -0
- package/dist/whatsapp-sender/whatsapp-sender.service.d.ts.map +1 -1
- package/dist/whatsapp-sender/whatsapp-sender.service.js +46 -5
- package/dist/whatsapp-sender/whatsapp-sender.service.js.map +1 -1
- package/hedhog/data/integration_provider.yaml +9 -0
- package/hedhog/data/integration_type.yaml +6 -0
- package/hedhog/data/locale.yaml +0 -1
- package/hedhog/data/mail.yaml +2 -2
- package/hedhog/data/mail_layout.yaml +6 -3
- package/hedhog/data/menu.yaml +25 -5
- package/hedhog/data/route.yaml +140 -0
- package/hedhog/data/setting_group.yaml +137 -3
- package/hedhog/frontend/app/access-log/page.tsx.ejs +47 -53
- package/hedhog/frontend/app/account/components/active-sessions.tsx.ejs +33 -8
- package/hedhog/frontend/app/account/components/mcp-tokens.tsx.ejs +54 -13
- package/hedhog/frontend/app/account/components/mfa-method-card.tsx.ejs +7 -1
- package/hedhog/frontend/app/account/components/recovery-codes-dialog.tsx.ejs +1 -0
- package/hedhog/frontend/app/account/components/tokens.tsx.ejs +47 -17
- package/hedhog/frontend/app/ai_agent/page.tsx.ejs +46 -5
- package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-form.tsx.ejs +101 -30
- package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-versions.tsx.ejs +24 -8
- package/hedhog/frontend/app/ai_instruction/page.tsx.ejs +80 -15
- package/hedhog/frontend/app/configurations/[slug]/components/image-optimization-action.tsx.ejs +166 -0
- package/hedhog/frontend/app/configurations/[slug]/components/setting-field.test.tsx.ejs +145 -45
- package/hedhog/frontend/app/configurations/[slug]/components/setting-field.tsx.ejs +99 -219
- package/hedhog/frontend/app/configurations/[slug]/page.tsx.ejs +19 -1
- package/hedhog/frontend/app/configurations/layout.tsx.ejs +19 -5
- package/hedhog/frontend/app/dashboard/[slug]/widget-renderer.tsx.ejs +2 -8
- package/hedhog/frontend/app/dashboard/components/dynamic-widget.tsx.ejs +3 -0
- package/hedhog/frontend/app/dashboard/components/widget-wrapper.tsx.ejs +4 -0
- package/hedhog/frontend/app/dashboard/dashboard-home-tabs.tsx.ejs +43 -44
- package/hedhog/frontend/app/dashboard/management/tabs/component-roles-tab.tsx.ejs +41 -3
- package/hedhog/frontend/app/dashboard/management/tabs/components-tab.tsx.ejs +42 -2
- package/hedhog/frontend/app/dashboard/management/tabs/dashboard-roles-tab.tsx.ejs +41 -3
- package/hedhog/frontend/app/dashboard/management/tabs/dashboards-tab.tsx.ejs +39 -4
- package/hedhog/frontend/app/dashboard/management/tabs/items-tab.tsx.ejs +42 -3
- package/hedhog/frontend/app/incidents/page.tsx.ejs +60 -31
- package/hedhog/frontend/app/integration/profiles/page.tsx.ejs +45 -5
- package/hedhog/frontend/app/integrations-webhooks/page.tsx.ejs +92 -15
- package/hedhog/frontend/app/mail/log/page.tsx.ejs +109 -61
- package/hedhog/frontend/app/mail/template/page.tsx.ejs +125 -23
- package/hedhog/frontend/app/mcp_chat/chat-components.tsx.ejs +13 -15
- package/hedhog/frontend/app/mcp_chat/page.tsx.ejs +116 -110
- package/hedhog/frontend/app/message-templates/_components/message-template-sheet.tsx.ejs +245 -0
- package/hedhog/frontend/app/message-templates/_lib/types.ts.ejs +24 -0
- package/hedhog/frontend/app/message-templates/page.tsx.ejs +182 -0
- package/hedhog/frontend/app/pages/_components/page-wizard-sheet.tsx.ejs +1 -0
- package/hedhog/frontend/app/pages/page.tsx.ejs +94 -9
- package/hedhog/frontend/app/roles/menus.tsx.ejs +4 -4
- package/hedhog/frontend/app/roles/routes.tsx.ejs +4 -4
- package/hedhog/frontend/app/roles/users.tsx.ejs +4 -4
- package/hedhog/frontend/app/setting-list/page.tsx.ejs +71 -9
- package/hedhog/frontend/app/users/page.tsx.ejs +77 -67
- package/hedhog/frontend/messages/en.json +183 -36
- package/hedhog/frontend/messages/pt.json +183 -36
- package/hedhog/table/cron_lock.yaml +17 -0
- package/hedhog/table/file.yaml +13 -1
- package/hedhog/table/file_upload_chunk.yaml +23 -0
- package/hedhog/table/file_upload_ticket.yaml +67 -0
- package/hedhog/table/mcp_tool_call_log.yaml +30 -22
- package/hedhog/table/message_template.yaml +33 -0
- package/hedhog/table/setting.yaml +8 -0
- package/hedhog/table/user_session.yaml +36 -1
- package/package.json +8 -6
- package/src/ai/ai-agent.sort.ts +21 -0
- package/src/ai/ai.service.spec.ts +173 -1
- package/src/ai/ai.service.ts +64 -193
- package/src/ai-instruction/ai-instruction.service.ts +32 -28
- package/src/ai-instruction/ai-instruction.sort.ts +32 -0
- package/src/auth/auth.module.ts +8 -1
- package/src/auth/auth.service.spec.ts +108 -1
- package/src/auth/auth.service.ts +59 -5
- package/src/auth/guards/auth.guard.ts +9 -1
- package/src/authorize/authorize.controller.ts +126 -11
- package/src/authorize/authorize.errors.ts +55 -0
- package/src/authorize/authorize.module.ts +6 -1
- package/src/authorize/authorize.service.spec.ts +379 -7
- package/src/authorize/authorize.service.ts +309 -23
- package/src/authorize/dto/authorize-info.dto.ts +21 -3
- package/src/authorize/dto/consent.dto.ts +21 -3
- package/src/authorize/dto/token.dto.ts +24 -2
- package/src/authorize/oauth-exception.filter.ts +58 -0
- package/src/authorize/oauth-metadata.service.ts +67 -0
- package/src/authorize/well-known.controller.spec.ts +84 -0
- package/src/authorize/well-known.controller.ts +96 -0
- package/src/captcha/captcha.service.spec.ts +211 -4
- package/src/captcha/captcha.service.ts +127 -10
- package/src/core.module.ts +6 -0
- package/src/dashboard/dashboard-component-role/dashboard-component-role.service.ts +2 -3
- package/src/dashboard/dashboard-component-role/dashboard-component-role.sort.ts +18 -0
- package/src/dashboard/dashboard-item/dashboard-item.service.ts +2 -3
- package/src/dashboard/dashboard-item/dashboard-item.sort.ts +19 -0
- package/src/dashboard/dashboard-role/dashboard-role.service.ts +2 -3
- package/src/dashboard/dashboard-role/dashboard-role.sort.ts +16 -0
- package/src/file/file-upload-ticket.service.spec.ts +422 -0
- package/src/file/file-upload-ticket.service.ts +513 -0
- package/src/file/file.controller.ts +65 -0
- package/src/file/file.module.ts +14 -2
- package/src/file/file.service.spec.ts +94 -0
- package/src/file/file.service.ts +432 -30
- package/src/file/filename-encoding.util.spec.ts +54 -0
- package/src/file/filename-encoding.util.ts +67 -0
- package/src/file/image-optimization.service.spec.ts +156 -19
- package/src/file/image-optimization.service.ts +106 -21
- package/src/file/mcp-file-source.schema.ts +83 -0
- package/src/file/mcp-file-source.service.spec.ts +473 -0
- package/src/file/mcp-file-source.service.ts +445 -0
- package/src/file/mimetype-sniff.util.spec.ts +126 -0
- package/src/file/mimetype-sniff.util.ts +265 -0
- package/src/file/remote-fetch.util.spec.ts +117 -0
- package/src/file/remote-fetch.util.ts +330 -0
- package/src/impersonation/dto/start-impersonation.dto.ts +5 -2
- package/src/impersonation/impersonation.service.spec.ts +24 -1
- package/src/impersonation/impersonation.service.ts +14 -4
- package/src/incident/incident.controller.ts +9 -1
- package/src/incident/incident.service.ts +7 -0
- package/src/index.ts +17 -0
- package/src/integration-profile/integration-profile.secrets.ts +7 -0
- package/src/integration-profile/integration-profile.service.ts +7 -64
- package/src/integration-profile/integration-profile.utils.spec.ts +9 -0
- package/src/integration-profile/integration-profile.utils.ts +5 -5
- package/src/integration-profile/testers/index.ts +2 -0
- package/src/integration-profile/testers/remaining.testers.spec.ts +79 -0
- package/src/integration-profile/testers/shipping.testers.ts +94 -0
- package/src/mail/dto/send.dto.ts +6 -1
- package/src/mail/mail-template.spec.ts +58 -1
- package/src/mail/mail.service.spec.ts +112 -0
- package/src/mail/mail.service.ts +42 -4
- package/src/mail-sent/mail-sent.service.ts +3 -0
- package/src/mail-sent/mail-sent.sort.ts +19 -0
- package/src/mcp/filters/mcp-challenge.filter.spec.ts +76 -0
- package/src/mcp/filters/mcp-challenge.filter.ts +70 -0
- package/src/mcp/guards/mcp-auth.guard.spec.ts +51 -2
- package/src/mcp/guards/mcp-auth.guard.ts +24 -1
- package/src/mcp/guards/mcp-permission.guard.spec.ts +109 -15
- package/src/mcp/guards/mcp-permission.guard.ts +76 -51
- package/src/mcp/mcp-audit.service.spec.ts +107 -0
- package/src/mcp/mcp-audit.service.ts +37 -1
- package/src/mcp/mcp-permission.service.spec.ts +197 -0
- package/src/mcp/mcp-permission.service.ts +184 -0
- package/src/mcp/mcp-server.service.spec.ts +84 -2
- package/src/mcp/mcp-server.service.ts +111 -87
- package/src/mcp/mcp.controller.ts +8 -1
- package/src/mcp/mcp.module.ts +5 -1
- package/src/mcp/tools/core-ai.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-dashboard-items.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-dashboard.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-event-webhooks.mcp-tools.ts +1 -2
- package/src/mcp/tools/core-files.mcp-tools.ts +202 -22
- package/src/mcp/tools/core-integration-events.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-mail-sent.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-mail.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-menus.mcp-tools.ts +1 -2
- package/src/mcp/tools/core-notifications.mcp-tools.ts +0 -1
- package/src/mcp/tools/core-roles.mcp-tools.ts +1 -5
- package/src/mcp/tools/core-routes.mcp-tools.ts +1 -3
- package/src/mcp/tools/core-screens.mcp-tools.ts +1 -3
- package/src/mcp/tools/core-sessions.mcp-tools.ts +0 -2
- package/src/mcp/tools/core-settings.mcp-tools.ts +1 -2
- package/src/mcp/tools/core-users.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-webhooks.mcp-tools.ts +1 -2
- package/src/mcp/types/mcp-context.type.ts +15 -6
- package/src/mcp-chat/mcp-chat.service.ts +8 -0
- package/src/meeting/meeting-provider.registry.ts +121 -0
- package/src/meeting/meeting.constants.ts +74 -0
- package/src/menu/menu.service.spec.ts +89 -0
- package/src/menu/menu.service.ts +29 -11
- package/src/message-template/dto/update-message-template.dto.ts +22 -0
- package/src/message-template/message-template-admin.service.spec.ts +163 -0
- package/src/message-template/message-template-admin.service.ts +239 -0
- package/src/message-template/message-template.controller.ts +52 -0
- package/src/message-template/message-template.module.ts +21 -0
- package/src/message-template/message-template.registry.spec.ts +62 -0
- package/src/message-template/message-template.registry.ts +125 -0
- package/src/message-template/message-template.service.spec.ts +149 -0
- package/src/message-template/message-template.service.ts +149 -0
- package/src/notification/notification.constants.ts +10 -0
- package/src/notification/notification.module.ts +3 -0
- package/src/notification/notification.service.spec.ts +75 -1
- package/src/notification/notification.service.ts +39 -1
- package/src/oauth/oauth.controller.ts +0 -1
- package/src/oauth/oauth.errors.ts +7 -0
- package/src/oauth/oauth.module.ts +6 -1
- package/src/oauth/oauth.service.spec.ts +58 -7
- package/src/oauth/oauth.service.ts +71 -32
- package/src/oauth/providers/abstract.provider.spec.ts +192 -0
- package/src/oauth/providers/abstract.provider.ts +46 -14
- package/src/oauth/providers/github.provider.ts +57 -34
- package/src/oauth/providers/microsoft-entra-id.provider.ts +8 -1
- package/src/observability/monitored-cron.spec.ts +164 -31
- package/src/observability/monitored-cron.ts +154 -62
- package/src/profile/dto/change-password.dto.ts +25 -7
- package/src/profile/profile.service.spec.ts +97 -0
- package/src/profile/profile.service.ts +9 -3
- package/src/realtime/realtime-tick.coalescer.spec.ts +92 -0
- package/src/realtime/realtime-tick.coalescer.ts +60 -0
- package/src/realtime/realtime.service.spec.ts +33 -0
- package/src/realtime/realtime.service.ts +28 -2
- package/src/redis/redis-kv.service.ts +261 -0
- package/src/redis/redis-master.spec.ts +111 -0
- package/src/redis/redis-master.ts +86 -0
- package/src/redis/redis-pubsub.ts +27 -3
- package/src/redis/redis.module.ts +17 -0
- package/src/session/session.service.spec.ts +121 -42
- package/src/session/session.service.ts +279 -82
- package/src/setting/setting.service.ts +44 -3
- package/src/task/task.service.spec.ts +41 -0
- package/src/task/task.service.ts +53 -13
- package/src/token/token.service.spec.ts +90 -0
- package/src/token/token.service.ts +48 -2
- package/src/user/user-credential.util.ts +14 -5
- package/src/user/user.service.ts +2 -12
- package/src/user/user.sort.ts +25 -0
- package/src/utils/abbreviate-name.spec.ts +50 -0
- package/src/utils/abbreviate-name.ts +44 -0
- package/src/utils/date-range-query.dto.ts +56 -0
- package/src/utils/date-range.spec.ts +175 -0
- package/src/utils/date-range.ts +246 -0
- package/src/webhook-integration/webhook-utils.spec.ts +67 -0
- package/src/webhook-integration/webhook-utils.ts +26 -0
- package/src/whatsapp-sender/whatsapp-recipients.spec.ts +89 -0
- package/src/whatsapp-sender/whatsapp-recipients.ts +83 -0
- package/src/whatsapp-sender/whatsapp-sender.service.spec.ts +112 -0
- package/src/whatsapp-sender/whatsapp-sender.service.ts +58 -5
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var RedisKvService_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.RedisKvService = void 0;
|
|
11
|
+
const common_1 = require("@nestjs/common");
|
|
12
|
+
const redis_1 = require("redis");
|
|
13
|
+
const redis_pubsub_1 = require("./redis-pubsub");
|
|
14
|
+
const redis_master_1 = require("./redis-master");
|
|
15
|
+
/**
|
|
16
|
+
* Chave/valor com TTL sobre o Redis, para estado efêmero compartilhado entre as
|
|
17
|
+
* réplicas da API.
|
|
18
|
+
*
|
|
19
|
+
* Existe ao lado do `redis-pubsub.ts` — que só publica e assina — porque
|
|
20
|
+
* algumas features precisam GUARDAR estado por um tempo curto, não só avisar
|
|
21
|
+
* que algo mudou. O caso que motivou: o painel de visitantes ao vivo da loja,
|
|
22
|
+
* onde gravar cada navegação no Postgres colocaria carga de escrita no banco
|
|
23
|
+
* que serve a própria loja, exatamente o que o recurso não pode fazer. Aqui o
|
|
24
|
+
* dado vive na memória do Redis e expira sozinho, sem job de limpeza.
|
|
25
|
+
*
|
|
26
|
+
* **Toda falha degrada para inerte.** Mesma postura do pub/sub: sem
|
|
27
|
+
* `REDIS_URL`, ou com o Redis fora, cada método vira no-op (ou devolve vazio) e
|
|
28
|
+
* quem chamou segue seu caminho. Um recurso de observação nunca pode derrubar o
|
|
29
|
+
* fluxo que ele observa — daí nenhum método propagar erro.
|
|
30
|
+
*/
|
|
31
|
+
let RedisKvService = RedisKvService_1 = class RedisKvService {
|
|
32
|
+
constructor() {
|
|
33
|
+
this.logger = new common_1.Logger(RedisKvService_1.name);
|
|
34
|
+
this.url = String(process.env.REDIS_URL || '').trim();
|
|
35
|
+
this.connectTimeoutMs = Math.max(1000, Number(process.env.REDIS_CONNECT_TIMEOUT_MS || 3000));
|
|
36
|
+
/** Uma queda do Redis dispara `error` a cada tentativa de reconexão. */
|
|
37
|
+
this.errorLogCooldownMs = 30000;
|
|
38
|
+
this.lastErrorLogAt = 0;
|
|
39
|
+
this.client = null;
|
|
40
|
+
/** Reconexão em andamento, para não abrir uma por escrita durante o failover. */
|
|
41
|
+
this.reconnecting = null;
|
|
42
|
+
}
|
|
43
|
+
/** `false` = sem Redis; todo método é no-op e quem chama não precisa saber. */
|
|
44
|
+
get enabled() {
|
|
45
|
+
return this.client !== null;
|
|
46
|
+
}
|
|
47
|
+
async onModuleInit() {
|
|
48
|
+
if (!this.url) {
|
|
49
|
+
this.logger.log('Redis key-value disabled because REDIS_URL is not configured.');
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
this.client = await this.connectToMaster();
|
|
53
|
+
if (this.client)
|
|
54
|
+
this.logger.log('Redis key-value enabled.');
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Conecta no master, e não em quem o Service devolver.
|
|
58
|
+
*
|
|
59
|
+
* `REDIS_URL` aponta para um Service que balanceia entre master e réplica
|
|
60
|
+
* (veja `resolveMasterUrl`), então conectar direto na URL deixa metade dos
|
|
61
|
+
* processos escrevendo numa réplica e falhando com `READONLY`.
|
|
62
|
+
*/
|
|
63
|
+
async connectToMaster() {
|
|
64
|
+
try {
|
|
65
|
+
const url = await (0, redis_master_1.resolveMasterUrl)(this.url, this.logger, this.connectTimeoutMs);
|
|
66
|
+
const client = (0, redis_1.createClient)({
|
|
67
|
+
url,
|
|
68
|
+
socket: {
|
|
69
|
+
reconnectStrategy: (retries) => Math.min(retries * 250, 5000),
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
// Registrado antes do connect: uma falha no handshake vira erro tratado
|
|
73
|
+
// em vez de um evento 'error' sem dono derrubando o processo.
|
|
74
|
+
client.on('error', (error) => this.logClientError(error));
|
|
75
|
+
await (0, redis_pubsub_1.withConnectTimeout)(client.connect(), this.connectTimeoutMs);
|
|
76
|
+
return client;
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
this.logger.warn(`Redis key-value disabled: ${(0, redis_pubsub_1.extractRedisErrorMessage)(error)}`);
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Refaz a conexão depois de um `READONLY`.
|
|
85
|
+
*
|
|
86
|
+
* Um failover troca quem é o master, e o client fica preso no nó que virou
|
|
87
|
+
* réplica — daí em diante toda escrita falha. Reconectar redescobre o master.
|
|
88
|
+
* O guard serializa as tentativas: sem ele, um pico de escritas em cima do
|
|
89
|
+
* failover abriria uma conexão nova por requisição.
|
|
90
|
+
*/
|
|
91
|
+
async reconnectToMaster() {
|
|
92
|
+
if (this.reconnecting)
|
|
93
|
+
return this.reconnecting;
|
|
94
|
+
this.reconnecting = (async () => {
|
|
95
|
+
const stale = this.client;
|
|
96
|
+
this.client = null;
|
|
97
|
+
if (stale) {
|
|
98
|
+
try {
|
|
99
|
+
await stale.quit();
|
|
100
|
+
}
|
|
101
|
+
catch (_a) {
|
|
102
|
+
// O nó virou réplica ou caiu; encerrando de qualquer forma.
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
this.client = await this.connectToMaster();
|
|
106
|
+
})().finally(() => {
|
|
107
|
+
this.reconnecting = null;
|
|
108
|
+
});
|
|
109
|
+
return this.reconnecting;
|
|
110
|
+
}
|
|
111
|
+
async onModuleDestroy() {
|
|
112
|
+
const client = this.client;
|
|
113
|
+
this.client = null;
|
|
114
|
+
if (!client)
|
|
115
|
+
return;
|
|
116
|
+
try {
|
|
117
|
+
await client.quit();
|
|
118
|
+
}
|
|
119
|
+
catch (_a) {
|
|
120
|
+
// Encerrando de qualquer forma.
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/** Grava um objeto como JSON com expiração em segundos. */
|
|
124
|
+
async setJson(key, value, ttlSeconds) {
|
|
125
|
+
await this.run(async (client) => {
|
|
126
|
+
await client.set(key, JSON.stringify(value), { EX: Math.max(1, ttlSeconds) });
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
/** Lê e desserializa. Devolve `null` se não existe, expirou ou está corrompido. */
|
|
130
|
+
async getJson(key) {
|
|
131
|
+
var _a;
|
|
132
|
+
return ((_a = (await this.run(async (client) => {
|
|
133
|
+
const raw = await client.get(key);
|
|
134
|
+
if (raw == null)
|
|
135
|
+
return null;
|
|
136
|
+
try {
|
|
137
|
+
return JSON.parse(raw);
|
|
138
|
+
}
|
|
139
|
+
catch (_a) {
|
|
140
|
+
// Valor gravado por uma versão anterior com outro formato: tratar como
|
|
141
|
+
// ausente é melhor do que estourar na leitura do painel.
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
}))) !== null && _a !== void 0 ? _a : null);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Lê várias chaves numa ida só.
|
|
148
|
+
*
|
|
149
|
+
* `MGET` em vez de um `get` por chave: com dezenas de visitantes ao vivo, uma
|
|
150
|
+
* chamada por chave multiplicaria o round-trip pelo número de sessões a cada
|
|
151
|
+
* atualização do painel. Devolve na MESMA ordem das chaves pedidas, com `null`
|
|
152
|
+
* onde não havia valor.
|
|
153
|
+
*/
|
|
154
|
+
async getJsonMany(keys) {
|
|
155
|
+
if (!keys.length)
|
|
156
|
+
return [];
|
|
157
|
+
const values = await this.run(async (client) => client.mGet(keys));
|
|
158
|
+
if (!values)
|
|
159
|
+
return keys.map(() => null);
|
|
160
|
+
return values.map((raw) => {
|
|
161
|
+
if (raw == null)
|
|
162
|
+
return null;
|
|
163
|
+
try {
|
|
164
|
+
return JSON.parse(raw);
|
|
165
|
+
}
|
|
166
|
+
catch (_a) {
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
async delete(key) {
|
|
172
|
+
await this.run(async (client) => {
|
|
173
|
+
await client.del(key);
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
/** Põe (ou repontua) um membro no índice ordenado. */
|
|
177
|
+
async zadd(key, member, score) {
|
|
178
|
+
await this.run(async (client) => {
|
|
179
|
+
await client.zAdd(key, [{ value: member, score }]);
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
/** Membros com score dentro do intervalo, do mais antigo para o mais recente. */
|
|
183
|
+
async zrangeByScore(key, min, max) {
|
|
184
|
+
const rows = await this.run(async (client) => client.zRangeByScoreWithScores(key, min, max));
|
|
185
|
+
return (rows !== null && rows !== void 0 ? rows : []).map((row) => ({ member: row.value, score: row.score }));
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Remove do índice o que caiu fora da janela.
|
|
189
|
+
*
|
|
190
|
+
* O TTL cuida das chaves individuais, mas não do índice: sem esta poda o
|
|
191
|
+
* sorted set acumularia para sempre todo visitante que já passou pela loja, e
|
|
192
|
+
* cada leitura do painel ficaria mais cara que a anterior.
|
|
193
|
+
*/
|
|
194
|
+
async zremRangeByScore(key, min, max) {
|
|
195
|
+
await this.run(async (client) => {
|
|
196
|
+
await client.zRemRangeByScore(key, min, max);
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Executa contra o client, engolindo qualquer falha.
|
|
201
|
+
*
|
|
202
|
+
* É aqui que mora a promessa de degradar para inerte: quem chama recebe
|
|
203
|
+
* `undefined` e trata como "sem dado", em vez de precisar de try/catch em
|
|
204
|
+
* cada ponto de uso.
|
|
205
|
+
*/
|
|
206
|
+
async run(fn) {
|
|
207
|
+
const client = this.client;
|
|
208
|
+
if (!client)
|
|
209
|
+
return undefined;
|
|
210
|
+
try {
|
|
211
|
+
return await fn(client);
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
// `READONLY` quer dizer que este client está falando com uma réplica —
|
|
215
|
+
// um failover trocou o master debaixo dele. Reconectar redescobre quem é
|
|
216
|
+
// o master e a operação é refeita uma vez; qualquer outro erro segue a
|
|
217
|
+
// regra da casa e degrada para inerte.
|
|
218
|
+
if ((0, redis_master_1.isReadOnlyReplicaError)(error)) {
|
|
219
|
+
await this.reconnectToMaster();
|
|
220
|
+
const reconnected = this.client;
|
|
221
|
+
if (reconnected) {
|
|
222
|
+
try {
|
|
223
|
+
return await fn(reconnected);
|
|
224
|
+
}
|
|
225
|
+
catch (retryError) {
|
|
226
|
+
this.logClientError(retryError);
|
|
227
|
+
return undefined;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
this.logClientError(error);
|
|
232
|
+
return undefined;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
logClientError(error) {
|
|
236
|
+
const now = Date.now();
|
|
237
|
+
if (now - this.lastErrorLogAt < this.errorLogCooldownMs)
|
|
238
|
+
return;
|
|
239
|
+
this.lastErrorLogAt = now;
|
|
240
|
+
this.logger.warn(`Redis key-value error: ${(0, redis_pubsub_1.extractRedisErrorMessage)(error)}`);
|
|
241
|
+
}
|
|
242
|
+
};
|
|
243
|
+
exports.RedisKvService = RedisKvService;
|
|
244
|
+
exports.RedisKvService = RedisKvService = RedisKvService_1 = __decorate([
|
|
245
|
+
(0, common_1.Injectable)()
|
|
246
|
+
], RedisKvService);
|
|
247
|
+
//# sourceMappingURL=redis-kv.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-kv.service.js","sourceRoot":"","sources":["../../src/redis/redis-kv.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Logger } from '@nestjs/common';
|
|
2
|
+
/**
|
|
3
|
+
* Descobre qual nó do Redis é o master e devolve a URL dele.
|
|
4
|
+
*
|
|
5
|
+
* O `REDIS_URL` aponta para o Service `redis-hub`, e esse Service — o chart
|
|
6
|
+
* Bitnami em modo Sentinel — tem os DOIS pods como endpoint. Cada conexão nova
|
|
7
|
+
* faz round-robin entre master e réplica, então metade delas cai na réplica e
|
|
8
|
+
* toda escrita falha com `READONLY You can't write against a read only
|
|
9
|
+
* replica`. Não é falha intermitente do Redis: é o cliente conectando no nó
|
|
10
|
+
* errado.
|
|
11
|
+
*
|
|
12
|
+
* A descoberta não usa o protocolo do Sentinel de propósito. Um `INFO
|
|
13
|
+
* replication` já responde `role:` e, quando é réplica, `master_host` e
|
|
14
|
+
* `master_port` — que aqui é o DNS do headless service, resolvível de dentro do
|
|
15
|
+
* cluster. Isso dispensa configurar nome de master e porta de Sentinel, e
|
|
16
|
+
* continua valendo depois de um failover, porque a resposta é sempre a do nó
|
|
17
|
+
* que está no ar naquele momento.
|
|
18
|
+
*
|
|
19
|
+
* **Nunca lança.** Se o probe falhar, devolve a URL original: o comportamento
|
|
20
|
+
* passa a ser o de hoje, não pior.
|
|
21
|
+
*/
|
|
22
|
+
export declare function resolveMasterUrl(url: string, logger: Logger, connectTimeoutMs: number): Promise<string>;
|
|
23
|
+
/**
|
|
24
|
+
* `READONLY` é a resposta do Redis a uma escrita numa réplica. Distinguir esse
|
|
25
|
+
* erro dos demais é o que permite reagir a um failover reconectando, em vez de
|
|
26
|
+
* só registrar o erro e perder a escrita.
|
|
27
|
+
*/
|
|
28
|
+
export declare function isReadOnlyReplicaError(error: unknown): boolean;
|
|
29
|
+
//# sourceMappingURL=redis-master.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-master.d.ts","sourceRoot":"","sources":["../../src/redis/redis-master.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAIxC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,CAAC,CAgDjB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE9D"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveMasterUrl = resolveMasterUrl;
|
|
4
|
+
exports.isReadOnlyReplicaError = isReadOnlyReplicaError;
|
|
5
|
+
const redis_1 = require("redis");
|
|
6
|
+
const redis_pubsub_1 = require("./redis-pubsub");
|
|
7
|
+
/**
|
|
8
|
+
* Descobre qual nó do Redis é o master e devolve a URL dele.
|
|
9
|
+
*
|
|
10
|
+
* O `REDIS_URL` aponta para o Service `redis-hub`, e esse Service — o chart
|
|
11
|
+
* Bitnami em modo Sentinel — tem os DOIS pods como endpoint. Cada conexão nova
|
|
12
|
+
* faz round-robin entre master e réplica, então metade delas cai na réplica e
|
|
13
|
+
* toda escrita falha com `READONLY You can't write against a read only
|
|
14
|
+
* replica`. Não é falha intermitente do Redis: é o cliente conectando no nó
|
|
15
|
+
* errado.
|
|
16
|
+
*
|
|
17
|
+
* A descoberta não usa o protocolo do Sentinel de propósito. Um `INFO
|
|
18
|
+
* replication` já responde `role:` e, quando é réplica, `master_host` e
|
|
19
|
+
* `master_port` — que aqui é o DNS do headless service, resolvível de dentro do
|
|
20
|
+
* cluster. Isso dispensa configurar nome de master e porta de Sentinel, e
|
|
21
|
+
* continua valendo depois de um failover, porque a resposta é sempre a do nó
|
|
22
|
+
* que está no ar naquele momento.
|
|
23
|
+
*
|
|
24
|
+
* **Nunca lança.** Se o probe falhar, devolve a URL original: o comportamento
|
|
25
|
+
* passa a ser o de hoje, não pior.
|
|
26
|
+
*/
|
|
27
|
+
async function resolveMasterUrl(url, logger, connectTimeoutMs) {
|
|
28
|
+
var _a, _b, _c, _d;
|
|
29
|
+
if (!url)
|
|
30
|
+
return url;
|
|
31
|
+
let probe = null;
|
|
32
|
+
try {
|
|
33
|
+
probe = (0, redis_1.createClient)({
|
|
34
|
+
url,
|
|
35
|
+
// Uma tentativa só: este client existe para perguntar quem é o master, e
|
|
36
|
+
// insistir aqui atrasaria o boot sem melhorar a resposta.
|
|
37
|
+
socket: { reconnectStrategy: false },
|
|
38
|
+
});
|
|
39
|
+
probe.on('error', () => {
|
|
40
|
+
// Tratado pelo catch; sem listener o node-redis derruba o processo.
|
|
41
|
+
});
|
|
42
|
+
await (0, redis_pubsub_1.withConnectTimeout)(probe.connect(), connectTimeoutMs);
|
|
43
|
+
const info = String(await probe.info('replication'));
|
|
44
|
+
if (/^role:master/m.test(info))
|
|
45
|
+
return url;
|
|
46
|
+
const host = (_b = (_a = info.match(/^master_host:(.+)$/m)) === null || _a === void 0 ? void 0 : _a[1]) === null || _b === void 0 ? void 0 : _b.trim();
|
|
47
|
+
const port = (_d = (_c = info.match(/^master_port:(\d+)$/m)) === null || _c === void 0 ? void 0 : _c[1]) === null || _d === void 0 ? void 0 : _d.trim();
|
|
48
|
+
if (!host || !port) {
|
|
49
|
+
logger.warn('Redis conectou numa réplica mas o INFO não trouxe master_host/master_port; seguindo com a URL original.');
|
|
50
|
+
return url;
|
|
51
|
+
}
|
|
52
|
+
const masterUrl = new URL(url);
|
|
53
|
+
masterUrl.hostname = host;
|
|
54
|
+
masterUrl.port = port;
|
|
55
|
+
logger.log(`Redis: conectado numa réplica, redirecionando para o master ${host}:${port}.`);
|
|
56
|
+
return masterUrl.toString();
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
logger.warn(`Redis: não foi possível descobrir o master (${(0, redis_pubsub_1.extractRedisErrorMessage)(error)}); seguindo com a URL original.`);
|
|
60
|
+
return url;
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
if (probe) {
|
|
64
|
+
try {
|
|
65
|
+
await probe.quit();
|
|
66
|
+
}
|
|
67
|
+
catch (_e) {
|
|
68
|
+
// O probe já cumpriu seu papel.
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* `READONLY` é a resposta do Redis a uma escrita numa réplica. Distinguir esse
|
|
75
|
+
* erro dos demais é o que permite reagir a um failover reconectando, em vez de
|
|
76
|
+
* só registrar o erro e perder a escrita.
|
|
77
|
+
*/
|
|
78
|
+
function isReadOnlyReplicaError(error) {
|
|
79
|
+
return /READONLY/i.test((0, redis_pubsub_1.extractRedisErrorMessage)(error));
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=redis-master.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-master.js","sourceRoot":"","sources":["../../src/redis/redis-master.ts"],"names":[],"mappings":";;AAwBA,4CAoDC;AAOD,wDAEC;AApFD,iCAA2D;AAC3D,iDAA8E;AAE9E;;;;;;;;;;;;;;;;;;;GAmBG;AACI,KAAK,UAAU,gBAAgB,CACpC,GAAW,EACX,MAAc,EACd,gBAAwB;;IAExB,IAAI,CAAC,GAAG;QAAE,OAAO,GAAG,CAAC;IAErB,IAAI,KAAK,GAA2B,IAAI,CAAC;IACzC,IAAI,CAAC;QACH,KAAK,GAAG,IAAA,oBAAY,EAAC;YACnB,GAAG;YACH,yEAAyE;YACzE,0DAA0D;YAC1D,MAAM,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE;SACrC,CAAoB,CAAC;QACtB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACrB,oEAAoE;QACtE,CAAC,CAAC,CAAC;QAEH,MAAM,IAAA,iCAAkB,EAAC,KAAK,CAAC,OAAO,EAAE,EAAE,gBAAgB,CAAC,CAAC;QAC5D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QAErD,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,GAAG,CAAC;QAE3C,MAAM,IAAI,GAAG,MAAA,MAAA,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,0CAAG,CAAC,CAAC,0CAAE,IAAI,EAAE,CAAC;QAC5D,MAAM,IAAI,GAAG,MAAA,MAAA,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,0CAAG,CAAC,CAAC,0CAAE,IAAI,EAAE,CAAC;QAC7D,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACnB,MAAM,CAAC,IAAI,CACT,yGAAyG,CAC1G,CAAC;YACF,OAAO,GAAG,CAAC;QACb,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC;QAC1B,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC;QACtB,MAAM,CAAC,GAAG,CAAC,+DAA+D,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC;QAC3F,OAAO,SAAS,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CACT,+CAA+C,IAAA,uCAAwB,EAAC,KAAK,CAAC,iCAAiC,CAChH,CAAC;QACF,OAAO,GAAG,CAAC;IACb,CAAC;YAAS,CAAC;QACT,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;YACrB,CAAC;YAAC,WAAM,CAAC;gBACP,gCAAgC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,sBAAsB,CAAC,KAAc;IACnD,OAAO,WAAW,CAAC,IAAI,CAAC,IAAA,uCAAwB,EAAC,KAAK,CAAC,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -15,6 +15,18 @@ export type CreateRedisPubSubOptions = {
|
|
|
15
15
|
url?: string;
|
|
16
16
|
errorLogCooldownMs?: number;
|
|
17
17
|
};
|
|
18
|
+
/**
|
|
19
|
+
* `createClient` rejects with an `AggregateError` whose own `message` is empty,
|
|
20
|
+
* so logging it directly yields "Redis error: " with nothing after it.
|
|
21
|
+
*/
|
|
22
|
+
export declare function extractRedisErrorMessage(error: unknown): string;
|
|
23
|
+
/**
|
|
24
|
+
* `reconnectStrategy` never returning `false` makes `client.connect()` retry
|
|
25
|
+
* forever while Redis is down: the promise never settles, so an `await` on it
|
|
26
|
+
* inside `onModuleInit` hangs the whole app's boot. This bounds only the
|
|
27
|
+
* initial attempt; reconnection of an already-connected client stays infinite.
|
|
28
|
+
*/
|
|
29
|
+
export declare function withConnectTimeout<T>(promise: Promise<T>, timeoutMs: number): Promise<T>;
|
|
18
30
|
/**
|
|
19
31
|
* Publisher/subscriber pair on a single channel, mirroring the settings-sync
|
|
20
32
|
* pattern. Never throws: without a URL — or if the connection fails — it returns
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redis-pubsub.d.ts","sourceRoot":"","sources":["../../src/redis/redis-pubsub.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAGxC,MAAM,MAAM,WAAW,GAAG;IACxB,2FAA2F;IAC3F,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,0FAA0F;IAC1F,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,kFAAkF;IAClF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;
|
|
1
|
+
{"version":3,"file":"redis-pubsub.d.ts","sourceRoot":"","sources":["../../src/redis/redis-pubsub.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAGxC,MAAM,MAAM,WAAW,GAAG;IACxB,2FAA2F;IAC3F,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,0FAA0F;IAC1F,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,kFAAkF;IAClF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAmBF;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAU/D;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAe9F;AAkBD;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,WAAW,CAAC,CA6GtB"}
|
|
@@ -33,6 +33,8 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.extractRedisErrorMessage = extractRedisErrorMessage;
|
|
37
|
+
exports.withConnectTimeout = withConnectTimeout;
|
|
36
38
|
exports.createRedisPubSub = createRedisPubSub;
|
|
37
39
|
const Sentry = __importStar(require("@sentry/nestjs"));
|
|
38
40
|
const redis_1 = require("redis");
|
|
@@ -67,6 +69,26 @@ function extractRedisErrorMessage(error) {
|
|
|
67
69
|
}
|
|
68
70
|
return String(error);
|
|
69
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* `reconnectStrategy` never returning `false` makes `client.connect()` retry
|
|
74
|
+
* forever while Redis is down: the promise never settles, so an `await` on it
|
|
75
|
+
* inside `onModuleInit` hangs the whole app's boot. This bounds only the
|
|
76
|
+
* initial attempt; reconnection of an already-connected client stays infinite.
|
|
77
|
+
*/
|
|
78
|
+
async function withConnectTimeout(promise, timeoutMs) {
|
|
79
|
+
let timer;
|
|
80
|
+
try {
|
|
81
|
+
return await Promise.race([
|
|
82
|
+
promise,
|
|
83
|
+
new Promise((_, reject) => {
|
|
84
|
+
timer = setTimeout(() => reject(new Error(`Redis connection timed out after ${timeoutMs}ms`)), timeoutMs);
|
|
85
|
+
}),
|
|
86
|
+
]);
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
clearTimeout(timer);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
70
92
|
async function safeClose(client) {
|
|
71
93
|
if (!client || !client.isOpen) {
|
|
72
94
|
return;
|
|
@@ -100,6 +122,7 @@ async function createRedisPubSub(options) {
|
|
|
100
122
|
return INERT;
|
|
101
123
|
}
|
|
102
124
|
const cooldownMs = Math.max(1000, Number(options.errorLogCooldownMs || DEFAULT_ERROR_LOG_COOLDOWN_MS));
|
|
125
|
+
const connectTimeoutMs = Math.max(1000, Number(process.env.REDIS_CONNECT_TIMEOUT_MS || 3000));
|
|
103
126
|
// A Redis outage fires `error` on every reconnect attempt; unthrottled that
|
|
104
127
|
// buries every other log line in the pod.
|
|
105
128
|
const lastErrorLogAt = {
|
|
@@ -129,8 +152,8 @@ async function createRedisPubSub(options) {
|
|
|
129
152
|
// rather than thrown as an unhandled 'error' event.
|
|
130
153
|
subscriber.on('error', (error) => logClientError('subscriber', error));
|
|
131
154
|
publisher.on('error', (error) => logClientError('publisher', error));
|
|
132
|
-
await subscriber.connect();
|
|
133
|
-
await publisher.connect();
|
|
155
|
+
await withConnectTimeout(subscriber.connect(), connectTimeoutMs);
|
|
156
|
+
await withConnectTimeout(publisher.connect(), connectTimeoutMs);
|
|
134
157
|
await subscriber.subscribe(channel, async (message) => {
|
|
135
158
|
try {
|
|
136
159
|
await onMessage(message);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redis-pubsub.js","sourceRoot":"","sources":["../../src/redis/redis-pubsub.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"redis-pubsub.js","sourceRoot":"","sources":["../../src/redis/redis-pubsub.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Estado efêmero compartilhado entre as réplicas da API.
|
|
3
|
+
*
|
|
4
|
+
* `@Global` porque a conexão é um recurso de processo: cada módulo que
|
|
5
|
+
* importasse este abriria seu próprio client para o mesmo Redis, e com 4
|
|
6
|
+
* réplicas isso multiplica conexões sem ganho nenhum. Mesmo motivo de o
|
|
7
|
+
* `RealtimeService` ser um só.
|
|
8
|
+
*/
|
|
9
|
+
export declare class RedisModule {
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=redis.module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis.module.d.ts","sourceRoot":"","sources":["../../src/redis/redis.module.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,qBAKa,WAAW;CAAG"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.RedisModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const redis_kv_service_1 = require("./redis-kv.service");
|
|
12
|
+
/**
|
|
13
|
+
* Estado efêmero compartilhado entre as réplicas da API.
|
|
14
|
+
*
|
|
15
|
+
* `@Global` porque a conexão é um recurso de processo: cada módulo que
|
|
16
|
+
* importasse este abriria seu próprio client para o mesmo Redis, e com 4
|
|
17
|
+
* réplicas isso multiplica conexões sem ganho nenhum. Mesmo motivo de o
|
|
18
|
+
* `RealtimeService` ser um só.
|
|
19
|
+
*/
|
|
20
|
+
let RedisModule = class RedisModule {
|
|
21
|
+
};
|
|
22
|
+
exports.RedisModule = RedisModule;
|
|
23
|
+
exports.RedisModule = RedisModule = __decorate([
|
|
24
|
+
(0, common_1.Global)(),
|
|
25
|
+
(0, common_1.Module)({
|
|
26
|
+
providers: [redis_kv_service_1.RedisKvService],
|
|
27
|
+
exports: [redis_kv_service_1.RedisKvService],
|
|
28
|
+
})
|
|
29
|
+
], RedisModule);
|
|
30
|
+
//# sourceMappingURL=redis.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis.module.js","sourceRoot":"","sources":["../../src/redis/redis.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAgD;AAChD,yDAAoD;AAEpD;;;;;;;GAOG;AAMI,IAAM,WAAW,GAAjB,MAAM,WAAW;CAAG,CAAA;AAAd,kCAAW;sBAAX,WAAW;IALvB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,iCAAc,CAAC;QAC3B,OAAO,EAAE,CAAC,iCAAc,CAAC;KAC1B,CAAC;GACW,WAAW,CAAG"}
|
|
@@ -33,15 +33,19 @@ export declare class SessionController {
|
|
|
33
33
|
id: number;
|
|
34
34
|
user_id: number;
|
|
35
35
|
user_agent: string;
|
|
36
|
-
impersonator_user_id: number | null;
|
|
37
36
|
created_at: Date;
|
|
37
|
+
impersonator_user_id: number | null;
|
|
38
38
|
updated_at: Date;
|
|
39
39
|
hash: string;
|
|
40
|
-
browser_id: string | null;
|
|
41
40
|
ip_address: string;
|
|
42
41
|
revoked_at: Date | null;
|
|
43
42
|
expires_at: Date;
|
|
43
|
+
browser_id: string | null;
|
|
44
44
|
impersonation_reason: string | null;
|
|
45
|
+
previous_hash: string | null;
|
|
46
|
+
previous_hash_expires_at: Date | null;
|
|
47
|
+
audience: string | null;
|
|
48
|
+
oauth_client_id: string | null;
|
|
45
49
|
}>;
|
|
46
50
|
}
|
|
47
51
|
//# sourceMappingURL=session.controller.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.controller.d.ts","sourceRoot":"","sources":["../../src/session/session.controller.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,qBAEa,iBAAiB;IAEtB,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAAd,cAAc,EAAE,cAAc;IAI7C,qBAAqB,CACT,gBAAgB,EAAE,aAAa,EACrC,EAAE,EAAE,EAAE;;KAAA,EACJ,MAAM,EAAE,MAAM;;;;;;;IAMtB,eAAe,CACH,gBAAgB,EAAE,aAAa,EACrC,EAAE,EAAE,EAAE;;KAAA,EACJ,MAAM,EAAE,MAAM;;;;;;;IAMtB,sBAAsB,CAAS,EAAE,EAAE,EAAE;;KAAA,EAAa,SAAS,EAAE,MAAM;IAKnE,iBAAiB,CAAS,EAAE,EAAE,EAAE;;KAAA;IAKhC,aAAa,CACP,EAAE,EAAE,EAAE,MAAM,EAAE;;KAAA,EACY,SAAS,EAAE,MAAM,EACzC,MAAM,EAAE,MAAM
|
|
1
|
+
{"version":3,"file":"session.controller.d.ts","sourceRoot":"","sources":["../../src/session/session.controller.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,qBAEa,iBAAiB;IAEtB,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAAd,cAAc,EAAE,cAAc;IAI7C,qBAAqB,CACT,gBAAgB,EAAE,aAAa,EACrC,EAAE,EAAE,EAAE;;KAAA,EACJ,MAAM,EAAE,MAAM;;;;;;;IAMtB,eAAe,CACH,gBAAgB,EAAE,aAAa,EACrC,EAAE,EAAE,EAAE;;KAAA,EACJ,MAAM,EAAE,MAAM;;;;;;;IAMtB,sBAAsB,CAAS,EAAE,EAAE,EAAE;;KAAA,EAAa,SAAS,EAAE,MAAM;IAKnE,iBAAiB,CAAS,EAAE,EAAE,EAAE;;KAAA;IAKhC,aAAa,CACP,EAAE,EAAE,EAAE,MAAM,EAAE;;KAAA,EACY,SAAS,EAAE,MAAM,EACzC,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;;;;CAI/B"}
|