@mailoo/chat 0.0.0-stage → 1.32.2

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 (58) hide show
  1. package/LICENSE +16 -0
  2. package/README.md +150 -2
  3. package/dist/chat-message-Dw6tKBEb.d.cts +10 -0
  4. package/dist/chat-message-Dw6tKBEb.d.ts +10 -0
  5. package/dist/chunk-2Y37RYEL.js +141 -0
  6. package/dist/chunk-2Y37RYEL.js.map +1 -0
  7. package/dist/chunk-4TNHJERE.js +19 -0
  8. package/dist/chunk-4TNHJERE.js.map +1 -0
  9. package/dist/chunk-77E6HUHY.js +41 -0
  10. package/dist/chunk-77E6HUHY.js.map +1 -0
  11. package/dist/chunk-AU6EFFLV.js +431 -0
  12. package/dist/chunk-AU6EFFLV.js.map +1 -0
  13. package/dist/chunk-QZ7HWQDO.js +839 -0
  14. package/dist/chunk-QZ7HWQDO.js.map +1 -0
  15. package/dist/client/index.cjs +1658 -0
  16. package/dist/client/index.cjs.map +1 -0
  17. package/dist/client/index.d.cts +33 -0
  18. package/dist/client/index.d.ts +33 -0
  19. package/dist/client/index.js +597 -0
  20. package/dist/client/index.js.map +1 -0
  21. package/dist/hooks/index.cjs +751 -0
  22. package/dist/hooks/index.cjs.map +1 -0
  23. package/dist/hooks/index.d.cts +79 -0
  24. package/dist/hooks/index.d.ts +79 -0
  25. package/dist/hooks/index.js +32 -0
  26. package/dist/hooks/index.js.map +1 -0
  27. package/dist/index.cjs +213 -0
  28. package/dist/index.cjs.map +1 -0
  29. package/dist/index.d.cts +53 -0
  30. package/dist/index.d.ts +53 -0
  31. package/dist/index.js +27 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/mailoo-site-chat-widget-C7B797Lu.d.ts +130 -0
  34. package/dist/mailoo-site-chat-widget-h_cBqsJw.d.cts +130 -0
  35. package/dist/routes/index.cjs +204 -0
  36. package/dist/routes/index.cjs.map +1 -0
  37. package/dist/routes/index.d.cts +30 -0
  38. package/dist/routes/index.d.ts +30 -0
  39. package/dist/routes/index.js +174 -0
  40. package/dist/routes/index.js.map +1 -0
  41. package/dist/shared-glVmghqk.d.cts +40 -0
  42. package/dist/shared-glVmghqk.d.ts +40 -0
  43. package/dist/styles/widget.css +122 -0
  44. package/dist/welcome-presets/index.cjs +479 -0
  45. package/dist/welcome-presets/index.cjs.map +1 -0
  46. package/dist/welcome-presets/index.d.cts +53 -0
  47. package/dist/welcome-presets/index.d.ts +53 -0
  48. package/dist/welcome-presets/index.js +38 -0
  49. package/dist/welcome-presets/index.js.map +1 -0
  50. package/dist/welcome-presets/parse.cjs +44 -0
  51. package/dist/welcome-presets/parse.cjs.map +1 -0
  52. package/dist/welcome-presets/parse.d.cts +11 -0
  53. package/dist/welcome-presets/parse.d.ts +11 -0
  54. package/dist/welcome-presets/parse.js +9 -0
  55. package/dist/welcome-presets/parse.js.map +1 -0
  56. package/dist/widget-config-B5Tf7gqn.d.cts +32 -0
  57. package/dist/widget-config-B5Tf7gqn.d.ts +32 -0
  58. package/package.json +85 -3
@@ -0,0 +1,53 @@
1
+ import { MailooIntegrationConfig } from '@mailoo/next-core';
2
+ import { M as MailooChatWidgetConfig } from './widget-config-B5Tf7gqn.js';
3
+ export { b as MAILOO_CHAT_LAUNCHER_POSITIONS, a as MailooChatLauncherPosition, d as MailooChatWidgetOperator, e as MailooChatWidgetTopic, c as chatWidgetCssVariables, i as isMailooChatLauncherPosition, m as mailooChatLauncherRootClassNames, r as resolveMailooChatLauncherPosition } from './widget-config-B5Tf7gqn.js';
4
+ import 'react';
5
+
6
+ type MailooChatIntegrationConfig = MailooIntegrationConfig;
7
+ declare function getMailooChatIntegrationConfig(): MailooChatIntegrationConfig | null;
8
+ /**
9
+ * Base URL the browser uses for Mailoo chat WebSockets (ws/wss).
10
+ * Precedence: MAILOO_CHAT_WS_ORIGIN → chat API base → API_BASE_URL.
11
+ * The host must expose WebSocket upgrade on the public API hostname.
12
+ */
13
+ declare function getMailooChatWebSocketOrigin(): string | null;
14
+ type MailooChatIntegrationStatus = {
15
+ status: string;
16
+ name: string;
17
+ type: string;
18
+ lastActivity: string;
19
+ };
20
+
21
+ /**
22
+ * Server-side status check against Mailoo (API key from env).
23
+ * Returns null when chat is not configured or the request fails.
24
+ */
25
+ declare function fetchMailooChatIntegrationStatus(): Promise<MailooChatIntegrationStatus | null>;
26
+ /**
27
+ * Server-side widget config from Mailoo API (brand, operators, topics, privacy).
28
+ * Returns null when env is missing, the request fails, or the payload is invalid.
29
+ * Never throws — hosts must not 500 the page when chat bootstrap fails.
30
+ */
31
+ declare function fetchMailooChatWidgetConfig(locale: string): Promise<MailooChatWidgetConfig | null>;
32
+ /** Props for {@link MailooSiteChatShell} / floating widget host. */
33
+ type MailooChatHostConfig = {
34
+ apiOrigin: string;
35
+ projectUid: string;
36
+ integrationId: string;
37
+ welcomeMessage: string;
38
+ locale: string;
39
+ isAuthenticated: boolean;
40
+ /** Always present when resolve succeeds — brand, topics, position, etc. */
41
+ widgetConfig: MailooChatWidgetConfig;
42
+ };
43
+ /**
44
+ * Default host resolve: env + public JSBOX widget-config.
45
+ * Returns null when chat env is incomplete or widget-config cannot load
46
+ * (do not mount the widget). Never throws — page hosts must stay HTTP 200.
47
+ */
48
+ declare function resolveMailooChatHostConfig(opts: {
49
+ locale: string;
50
+ isAuthenticated?: boolean;
51
+ }): Promise<MailooChatHostConfig | null>;
52
+
53
+ export { type MailooChatHostConfig, type MailooChatIntegrationConfig, type MailooChatIntegrationStatus, MailooChatWidgetConfig, fetchMailooChatIntegrationStatus, fetchMailooChatWidgetConfig, getMailooChatIntegrationConfig, getMailooChatWebSocketOrigin, resolveMailooChatHostConfig };
package/dist/index.js ADDED
@@ -0,0 +1,27 @@
1
+ import {
2
+ fetchMailooChatIntegrationStatus,
3
+ fetchMailooChatWidgetConfig,
4
+ getMailooChatIntegrationConfig,
5
+ getMailooChatWebSocketOrigin,
6
+ resolveMailooChatHostConfig
7
+ } from "./chunk-2Y37RYEL.js";
8
+ import {
9
+ MAILOO_CHAT_LAUNCHER_POSITIONS,
10
+ chatWidgetCssVariables,
11
+ isMailooChatLauncherPosition,
12
+ mailooChatLauncherRootClassNames,
13
+ resolveMailooChatLauncherPosition
14
+ } from "./chunk-77E6HUHY.js";
15
+ export {
16
+ MAILOO_CHAT_LAUNCHER_POSITIONS,
17
+ chatWidgetCssVariables,
18
+ fetchMailooChatIntegrationStatus,
19
+ fetchMailooChatWidgetConfig,
20
+ getMailooChatIntegrationConfig,
21
+ getMailooChatWebSocketOrigin,
22
+ isMailooChatLauncherPosition,
23
+ mailooChatLauncherRootClassNames,
24
+ resolveMailooChatHostConfig,
25
+ resolveMailooChatLauncherPosition
26
+ };
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,130 @@
1
+ import * as react from 'react';
2
+ import { ReactNode } from 'react';
3
+ import { M as MailooChatFault } from './shared-glVmghqk.js';
4
+ import { M as MailooChatWidgetConfig, a as MailooChatLauncherPosition } from './widget-config-B5Tf7gqn.js';
5
+
6
+ type GuestUiCopy = {
7
+ intro: string;
8
+ emailLabel: string;
9
+ nameLabel: string;
10
+ emailPlaceholder: string;
11
+ namePlaceholder: string;
12
+ continueCta: string;
13
+ changeContact: string;
14
+ backToTopics: string;
15
+ emailInvalid: string;
16
+ threadHint: string;
17
+ threadHintIconLabel: string;
18
+ threadHintCollapse: string;
19
+ emptyThreadGuest: string;
20
+ loadingProfile: string;
21
+ };
22
+ type MailooChatUnavailableCopy = {
23
+ rateLimitedTitle: string;
24
+ rateLimitedBody: string;
25
+ unavailableTitle: string;
26
+ unavailableBody: string;
27
+ retryCta: string;
28
+ contactCta: string;
29
+ };
30
+ type MailooChatUiLabels = GuestUiCopy & MailooChatUnavailableCopy & {
31
+ title: string;
32
+ launcherOpen: string;
33
+ launcherClose: string;
34
+ send: string;
35
+ composerPlaceholder: string;
36
+ emptyThreadAuthenticated: string;
37
+ };
38
+
39
+ type MailooChatUnavailableAction = {
40
+ type: 'link';
41
+ href: string;
42
+ label: string;
43
+ } | {
44
+ type: 'mailto';
45
+ email: string;
46
+ label?: string;
47
+ };
48
+ type MailooChatUnavailableRenderArgs = {
49
+ fault: MailooChatFault;
50
+ labels: MailooChatUiLabels;
51
+ retry: () => void;
52
+ unavailableAction?: MailooChatUnavailableAction;
53
+ brandBtnClass: string;
54
+ };
55
+ /**
56
+ * Built-in panel when chat hits rate limit or service/network unavailability.
57
+ * Integrators may replace this via `renderUnavailable`.
58
+ */
59
+ declare function MailooChatUnavailablePanel({ fault, labels, retry, unavailableAction, brandBtnClass, }: MailooChatUnavailableRenderArgs): ReactNode;
60
+
61
+ type MailooChatWidgetProps = {
62
+ apiOrigin: string;
63
+ projectUid: string;
64
+ integrationId: string;
65
+ welcomeMessage: string;
66
+ locale: string;
67
+ isAuthenticated: boolean;
68
+ widgetConfig?: MailooChatWidgetConfig | null;
69
+ className?: string;
70
+ panelClassName?: string;
71
+ launcherClassName?: string;
72
+ open?: boolean;
73
+ defaultOpen?: boolean;
74
+ onOpenChange?: (open: boolean) => void;
75
+ title?: string;
76
+ launcherLabel?: string;
77
+ labels?: Partial<MailooChatUiLabels>;
78
+ submitEndpoint?: string;
79
+ messagesEndpoint?: string;
80
+ pollIntervalMs?: number;
81
+ enablePolling?: boolean;
82
+ enableWebSocket?: boolean;
83
+ position?: MailooChatLauncherPosition;
84
+ zIndex?: number;
85
+ onSessionCreated?: (sessionPublicId: string) => void;
86
+ onMessageSent?: (content: string) => void;
87
+ onError?: (error: string) => void;
88
+ onFault?: (fault: MailooChatFault) => void;
89
+ /** Integrator-chosen contact/link when chat is rate-limited or unavailable. */
90
+ unavailableAction?: MailooChatUnavailableAction;
91
+ renderLauncher?: (args: {
92
+ open: boolean;
93
+ toggle: () => void;
94
+ }) => ReactNode;
95
+ renderHeader?: (args: {
96
+ welcomeMessage: string;
97
+ title: string;
98
+ }) => ReactNode;
99
+ renderEmpty?: (args: {
100
+ isAuthenticated: boolean;
101
+ }) => ReactNode;
102
+ renderWelcome?: (args: MailooChatWelcomeRenderArgs) => ReactNode;
103
+ /** Replace the built-in unavailable panel; package still classifies the fault. */
104
+ renderUnavailable?: (args: MailooChatUnavailableRenderArgs) => ReactNode;
105
+ };
106
+ type MailooChatWelcomeRenderArgs = {
107
+ widgetConfig: MailooChatWidgetConfig | null | undefined;
108
+ welcomeMessage: string;
109
+ title: string;
110
+ locale: string;
111
+ labels: MailooChatUiLabels;
112
+ brandBtnClass: string;
113
+ brandStyle?: React.CSSProperties;
114
+ topics: MailooChatWidgetConfig['topics'];
115
+ selectedTopicId: string | null;
116
+ setSelectedTopicId: (id: string | null) => void;
117
+ /** When false, identity comes from session / saved guest profile — no email form. */
118
+ needsGuestFields: boolean;
119
+ isAuthenticated: boolean;
120
+ guestEmail: string;
121
+ setGuestEmail: (value: string) => void;
122
+ guestName: string;
123
+ setGuestName: (value: string) => void;
124
+ error: string | null;
125
+ /** Continue from welcome: validates guest email when needed, then enters composer. */
126
+ confirmGuestContact: (invalidEmailMessage?: string) => boolean;
127
+ };
128
+ declare function MailooSiteChatWidget(props: MailooChatWidgetProps): react.JSX.Element;
129
+
130
+ export { type MailooChatUnavailableAction as M, type MailooChatUnavailableRenderArgs as a, MailooSiteChatWidget as b, type MailooChatWidgetProps as c, type MailooChatUiLabels as d, type MailooChatWelcomeRenderArgs as e, MailooChatUnavailablePanel as f };
@@ -0,0 +1,130 @@
1
+ import * as react from 'react';
2
+ import { ReactNode } from 'react';
3
+ import { M as MailooChatFault } from './shared-glVmghqk.cjs';
4
+ import { M as MailooChatWidgetConfig, a as MailooChatLauncherPosition } from './widget-config-B5Tf7gqn.cjs';
5
+
6
+ type GuestUiCopy = {
7
+ intro: string;
8
+ emailLabel: string;
9
+ nameLabel: string;
10
+ emailPlaceholder: string;
11
+ namePlaceholder: string;
12
+ continueCta: string;
13
+ changeContact: string;
14
+ backToTopics: string;
15
+ emailInvalid: string;
16
+ threadHint: string;
17
+ threadHintIconLabel: string;
18
+ threadHintCollapse: string;
19
+ emptyThreadGuest: string;
20
+ loadingProfile: string;
21
+ };
22
+ type MailooChatUnavailableCopy = {
23
+ rateLimitedTitle: string;
24
+ rateLimitedBody: string;
25
+ unavailableTitle: string;
26
+ unavailableBody: string;
27
+ retryCta: string;
28
+ contactCta: string;
29
+ };
30
+ type MailooChatUiLabels = GuestUiCopy & MailooChatUnavailableCopy & {
31
+ title: string;
32
+ launcherOpen: string;
33
+ launcherClose: string;
34
+ send: string;
35
+ composerPlaceholder: string;
36
+ emptyThreadAuthenticated: string;
37
+ };
38
+
39
+ type MailooChatUnavailableAction = {
40
+ type: 'link';
41
+ href: string;
42
+ label: string;
43
+ } | {
44
+ type: 'mailto';
45
+ email: string;
46
+ label?: string;
47
+ };
48
+ type MailooChatUnavailableRenderArgs = {
49
+ fault: MailooChatFault;
50
+ labels: MailooChatUiLabels;
51
+ retry: () => void;
52
+ unavailableAction?: MailooChatUnavailableAction;
53
+ brandBtnClass: string;
54
+ };
55
+ /**
56
+ * Built-in panel when chat hits rate limit or service/network unavailability.
57
+ * Integrators may replace this via `renderUnavailable`.
58
+ */
59
+ declare function MailooChatUnavailablePanel({ fault, labels, retry, unavailableAction, brandBtnClass, }: MailooChatUnavailableRenderArgs): ReactNode;
60
+
61
+ type MailooChatWidgetProps = {
62
+ apiOrigin: string;
63
+ projectUid: string;
64
+ integrationId: string;
65
+ welcomeMessage: string;
66
+ locale: string;
67
+ isAuthenticated: boolean;
68
+ widgetConfig?: MailooChatWidgetConfig | null;
69
+ className?: string;
70
+ panelClassName?: string;
71
+ launcherClassName?: string;
72
+ open?: boolean;
73
+ defaultOpen?: boolean;
74
+ onOpenChange?: (open: boolean) => void;
75
+ title?: string;
76
+ launcherLabel?: string;
77
+ labels?: Partial<MailooChatUiLabels>;
78
+ submitEndpoint?: string;
79
+ messagesEndpoint?: string;
80
+ pollIntervalMs?: number;
81
+ enablePolling?: boolean;
82
+ enableWebSocket?: boolean;
83
+ position?: MailooChatLauncherPosition;
84
+ zIndex?: number;
85
+ onSessionCreated?: (sessionPublicId: string) => void;
86
+ onMessageSent?: (content: string) => void;
87
+ onError?: (error: string) => void;
88
+ onFault?: (fault: MailooChatFault) => void;
89
+ /** Integrator-chosen contact/link when chat is rate-limited or unavailable. */
90
+ unavailableAction?: MailooChatUnavailableAction;
91
+ renderLauncher?: (args: {
92
+ open: boolean;
93
+ toggle: () => void;
94
+ }) => ReactNode;
95
+ renderHeader?: (args: {
96
+ welcomeMessage: string;
97
+ title: string;
98
+ }) => ReactNode;
99
+ renderEmpty?: (args: {
100
+ isAuthenticated: boolean;
101
+ }) => ReactNode;
102
+ renderWelcome?: (args: MailooChatWelcomeRenderArgs) => ReactNode;
103
+ /** Replace the built-in unavailable panel; package still classifies the fault. */
104
+ renderUnavailable?: (args: MailooChatUnavailableRenderArgs) => ReactNode;
105
+ };
106
+ type MailooChatWelcomeRenderArgs = {
107
+ widgetConfig: MailooChatWidgetConfig | null | undefined;
108
+ welcomeMessage: string;
109
+ title: string;
110
+ locale: string;
111
+ labels: MailooChatUiLabels;
112
+ brandBtnClass: string;
113
+ brandStyle?: React.CSSProperties;
114
+ topics: MailooChatWidgetConfig['topics'];
115
+ selectedTopicId: string | null;
116
+ setSelectedTopicId: (id: string | null) => void;
117
+ /** When false, identity comes from session / saved guest profile — no email form. */
118
+ needsGuestFields: boolean;
119
+ isAuthenticated: boolean;
120
+ guestEmail: string;
121
+ setGuestEmail: (value: string) => void;
122
+ guestName: string;
123
+ setGuestName: (value: string) => void;
124
+ error: string | null;
125
+ /** Continue from welcome: validates guest email when needed, then enters composer. */
126
+ confirmGuestContact: (invalidEmailMessage?: string) => boolean;
127
+ };
128
+ declare function MailooSiteChatWidget(props: MailooChatWidgetProps): react.JSX.Element;
129
+
130
+ export { type MailooChatUnavailableAction as M, type MailooChatUnavailableRenderArgs as a, MailooSiteChatWidget as b, type MailooChatWidgetProps as c, type MailooChatUiLabels as d, type MailooChatWelcomeRenderArgs as e, MailooChatUnavailablePanel as f };
@@ -0,0 +1,204 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/routes/index.ts
21
+ var routes_exports = {};
22
+ __export(routes_exports, {
23
+ createChatMessagesHandler: () => createChatMessagesHandler,
24
+ createChatStatusHandler: () => createChatStatusHandler,
25
+ createChatSubmitHandler: () => createChatSubmitHandler,
26
+ createChatWidgetConfigHandler: () => createChatWidgetConfigHandler
27
+ });
28
+ module.exports = __toCommonJS(routes_exports);
29
+ var import_next_core2 = require("@mailoo/next-core");
30
+
31
+ // src/config.ts
32
+ var import_navigation = require("next/navigation");
33
+ var import_next_core = require("@mailoo/next-core");
34
+ function getMailooChatIntegrationConfig() {
35
+ return (0, import_next_core.readMailooIntegrationConfig)({
36
+ prefix: "MAILOO_CHAT_INTEGRATION",
37
+ allowApiBaseUrlFallback: true
38
+ });
39
+ }
40
+
41
+ // src/routes/index.ts
42
+ function upstreamGetHeaders(request, apiKey) {
43
+ const headers = {
44
+ "Content-Type": "application/json",
45
+ "X-API-Key": apiKey
46
+ };
47
+ const origin = (0, import_next_core2.mailooUpstreamOrigin)(request);
48
+ if (origin) headers.Origin = origin;
49
+ return headers;
50
+ }
51
+ function createChatSubmitHandler(options) {
52
+ const logger = options?.logger ?? import_next_core2.defaultMailooLogger;
53
+ return async function POST(request) {
54
+ const cfg = getMailooChatIntegrationConfig();
55
+ if (!cfg) {
56
+ return (0, import_next_core2.jsonError)(
57
+ {
58
+ error: "NOT_CONFIGURED",
59
+ message: "Chat BFF is not configured. Set MAILOO_CHAT_INTEGRATION_* env."
60
+ },
61
+ 503
62
+ );
63
+ }
64
+ let body;
65
+ try {
66
+ body = await request.json();
67
+ } catch {
68
+ return (0, import_next_core2.jsonError)({ error: "Invalid JSON body" }, 400);
69
+ }
70
+ const o = body && typeof body === "object" && !Array.isArray(body) ? body : {};
71
+ const content = typeof o.content === "string" ? o.content.trim() : "";
72
+ if (!content) {
73
+ return (0, import_next_core2.jsonError)({ error: "content is required" }, 400);
74
+ }
75
+ const payload = { content };
76
+ if (typeof o.sessionPublicId === "string" && o.sessionPublicId.trim()) {
77
+ payload.sessionPublicId = o.sessionPublicId.trim();
78
+ }
79
+ const fromSession = options?.resolveSender ? await options.resolveSender(request) : null;
80
+ if (fromSession?.email) {
81
+ payload.senderEmail = fromSession.email;
82
+ const name = fromSession.name?.trim();
83
+ if (name) payload.senderName = name;
84
+ } else {
85
+ if (typeof o.senderEmail === "string" && o.senderEmail.trim()) {
86
+ payload.senderEmail = o.senderEmail.trim();
87
+ }
88
+ if (typeof o.senderName === "string" && o.senderName.trim()) {
89
+ payload.senderName = o.senderName.trim();
90
+ }
91
+ }
92
+ if (typeof o.pageUrl === "string" && o.pageUrl.trim()) {
93
+ const pageUrl = o.pageUrl.trim();
94
+ if (pageUrl.length <= 2048 && !/[\r\n\0]/.test(pageUrl)) {
95
+ payload.pageUrl = pageUrl;
96
+ }
97
+ }
98
+ if (typeof o.topicId === "string" && o.topicId.trim()) {
99
+ payload.topicId = o.topicId.trim();
100
+ }
101
+ const url = `${cfg.apiBaseUrl}/api/v1/webhooks/chat/${cfg.projectUid}/${cfg.integrationId}/messages`;
102
+ try {
103
+ return await (0, import_next_core2.proxyMailooWebhookJsonPost)({
104
+ request,
105
+ url,
106
+ apiKey: cfg.apiKey,
107
+ body: payload
108
+ });
109
+ } catch (error) {
110
+ logger.logException?.(error, "chat submit proxy failed");
111
+ return (0, import_next_core2.jsonError)({ error: "Upstream request failed" }, 502);
112
+ }
113
+ };
114
+ }
115
+ function createChatMessagesHandler(options) {
116
+ const logger = options?.logger ?? import_next_core2.defaultMailooLogger;
117
+ return async function GET(request) {
118
+ const cfg = getMailooChatIntegrationConfig();
119
+ if (!cfg) {
120
+ return (0, import_next_core2.jsonError)({ error: "Chat BFF not configured" }, 503);
121
+ }
122
+ const sessionPublicId = request.nextUrl.searchParams.get("sessionPublicId")?.trim();
123
+ if (!sessionPublicId) {
124
+ return (0, import_next_core2.jsonError)({ error: "sessionPublicId is required" }, 400);
125
+ }
126
+ const since = request.nextUrl.searchParams.get("since")?.trim();
127
+ const path = `${cfg.apiBaseUrl}/api/v1/webhooks/chat/${cfg.projectUid}/${cfg.integrationId}/sessions/${encodeURIComponent(sessionPublicId)}/messages`;
128
+ const url = new URL(path);
129
+ if (since) url.searchParams.set("since", since);
130
+ try {
131
+ const response = await fetch(url.toString(), {
132
+ method: "GET",
133
+ headers: upstreamGetHeaders(request, cfg.apiKey)
134
+ });
135
+ const data = await response.json();
136
+ return new Response(JSON.stringify(data), {
137
+ status: response.status,
138
+ headers: { "Content-Type": "application/json" }
139
+ });
140
+ } catch (error) {
141
+ logger.logException?.(error, "chat messages proxy failed");
142
+ return (0, import_next_core2.jsonError)({ error: "Upstream request failed" }, 502);
143
+ }
144
+ };
145
+ }
146
+ function createChatStatusHandler(options) {
147
+ const logger = options?.logger ?? import_next_core2.defaultMailooLogger;
148
+ return async function GET(request) {
149
+ const cfg = getMailooChatIntegrationConfig();
150
+ if (!cfg) {
151
+ return (0, import_next_core2.jsonError)({ error: "Chat BFF not configured" }, 503);
152
+ }
153
+ const url = `${cfg.apiBaseUrl}/api/v1/webhooks/chat/${cfg.projectUid}/${cfg.integrationId}/status`;
154
+ try {
155
+ const response = await fetch(url, {
156
+ method: "GET",
157
+ headers: upstreamGetHeaders(request, cfg.apiKey)
158
+ });
159
+ const data = await response.json();
160
+ return new Response(JSON.stringify(data), {
161
+ status: response.status,
162
+ headers: { "Content-Type": "application/json" }
163
+ });
164
+ } catch (error) {
165
+ logger.logException?.(error, "chat status proxy failed");
166
+ return (0, import_next_core2.jsonError)({ error: "Upstream request failed" }, 502);
167
+ }
168
+ };
169
+ }
170
+ function createChatWidgetConfigHandler(options) {
171
+ const logger = options?.logger ?? import_next_core2.defaultMailooLogger;
172
+ return async function GET(request) {
173
+ const cfg = getMailooChatIntegrationConfig();
174
+ if (!cfg) {
175
+ return (0, import_next_core2.jsonError)({ error: "Chat BFF not configured" }, 503);
176
+ }
177
+ const locale = request.nextUrl.searchParams.get("locale")?.trim() || "en";
178
+ const path = `${cfg.apiBaseUrl}/api/v1/webhooks/chat/${cfg.projectUid}/${cfg.integrationId}/widget-config`;
179
+ const url = new URL(path);
180
+ url.searchParams.set("locale", locale);
181
+ try {
182
+ const response = await fetch(url.toString(), {
183
+ method: "GET",
184
+ headers: upstreamGetHeaders(request, cfg.apiKey)
185
+ });
186
+ const data = await response.json();
187
+ return new Response(JSON.stringify(data), {
188
+ status: response.status,
189
+ headers: { "Content-Type": "application/json" }
190
+ });
191
+ } catch (error) {
192
+ logger.logException?.(error, "chat widget-config proxy failed");
193
+ return (0, import_next_core2.jsonError)({ error: "Upstream request failed" }, 502);
194
+ }
195
+ };
196
+ }
197
+ // Annotate the CommonJS export names for ESM import in node:
198
+ 0 && (module.exports = {
199
+ createChatMessagesHandler,
200
+ createChatStatusHandler,
201
+ createChatSubmitHandler,
202
+ createChatWidgetConfigHandler
203
+ });
204
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/routes/index.ts","../../src/config.ts"],"sourcesContent":["import type { NextRequest } from 'next/server'\nimport {\n defaultMailooLogger,\n jsonError,\n mailooUpstreamOrigin,\n proxyMailooWebhookJsonPost,\n type MailooLogger,\n} from '@mailoo/next-core'\nimport { getMailooChatIntegrationConfig } from '../config.js'\n\nexport type ChatSubmitSender = {\n email?: string\n name?: string\n}\n\nfunction upstreamGetHeaders(\n request: NextRequest,\n apiKey: string\n): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-API-Key': apiKey,\n }\n const origin = mailooUpstreamOrigin(request)\n if (origin) headers.Origin = origin\n return headers\n}\n\n/**\n * Create chat message submit handler.\n * Optional `resolveSender` lets hosts inject Auth.js/session email without\n * coupling this package to Auth.js.\n */\nexport function createChatSubmitHandler(options?: {\n logger?: MailooLogger\n resolveSender?: (\n request: NextRequest\n ) => Promise<ChatSubmitSender | null> | ChatSubmitSender | null\n}) {\n const logger = options?.logger ?? defaultMailooLogger\n return async function POST(request: NextRequest): Promise<Response> {\n const cfg = getMailooChatIntegrationConfig()\n if (!cfg) {\n return jsonError(\n {\n error: 'NOT_CONFIGURED',\n message:\n 'Chat BFF is not configured. Set MAILOO_CHAT_INTEGRATION_* env.',\n },\n 503\n )\n }\n\n let body: unknown\n try {\n body = await request.json()\n } catch {\n return jsonError({ error: 'Invalid JSON body' }, 400)\n }\n\n const o =\n body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {}\n\n const content = typeof o.content === 'string' ? o.content.trim() : ''\n if (!content) {\n return jsonError({ error: 'content is required' }, 400)\n }\n\n const payload: Record<string, string> = { content }\n\n if (typeof o.sessionPublicId === 'string' && o.sessionPublicId.trim()) {\n payload.sessionPublicId = o.sessionPublicId.trim()\n }\n\n const fromSession = options?.resolveSender\n ? await options.resolveSender(request)\n : null\n\n if (fromSession?.email) {\n payload.senderEmail = fromSession.email\n const name = fromSession.name?.trim()\n if (name) payload.senderName = name\n } else {\n if (typeof o.senderEmail === 'string' && o.senderEmail.trim()) {\n payload.senderEmail = o.senderEmail.trim()\n }\n if (typeof o.senderName === 'string' && o.senderName.trim()) {\n payload.senderName = o.senderName.trim()\n }\n }\n\n if (typeof o.pageUrl === 'string' && o.pageUrl.trim()) {\n const pageUrl = o.pageUrl.trim()\n if (pageUrl.length <= 2048 && !/[\\r\\n\\0]/.test(pageUrl)) {\n payload.pageUrl = pageUrl\n }\n }\n\n if (typeof o.topicId === 'string' && o.topicId.trim()) {\n payload.topicId = o.topicId.trim()\n }\n\n const url = `${cfg.apiBaseUrl}/api/v1/webhooks/chat/${cfg.projectUid}/${cfg.integrationId}/messages`\n\n try {\n return await proxyMailooWebhookJsonPost({\n request,\n url,\n apiKey: cfg.apiKey,\n body: payload,\n })\n } catch (error) {\n logger.logException?.(error, 'chat submit proxy failed')\n return jsonError({ error: 'Upstream request failed' }, 502)\n }\n }\n}\n\n/** Visitor polling: list session messages via server-held API key. */\nexport function createChatMessagesHandler(options?: { logger?: MailooLogger }) {\n const logger = options?.logger ?? defaultMailooLogger\n return async function GET(request: NextRequest): Promise<Response> {\n const cfg = getMailooChatIntegrationConfig()\n if (!cfg) {\n return jsonError({ error: 'Chat BFF not configured' }, 503)\n }\n\n const sessionPublicId = request.nextUrl.searchParams\n .get('sessionPublicId')\n ?.trim()\n if (!sessionPublicId) {\n return jsonError({ error: 'sessionPublicId is required' }, 400)\n }\n\n const since = request.nextUrl.searchParams.get('since')?.trim()\n const path = `${cfg.apiBaseUrl}/api/v1/webhooks/chat/${cfg.projectUid}/${cfg.integrationId}/sessions/${encodeURIComponent(sessionPublicId)}/messages`\n const url = new URL(path)\n if (since) url.searchParams.set('since', since)\n\n try {\n const response = await fetch(url.toString(), {\n method: 'GET',\n headers: upstreamGetHeaders(request, cfg.apiKey),\n })\n const data = await response.json()\n return new Response(JSON.stringify(data), {\n status: response.status,\n headers: { 'Content-Type': 'application/json' },\n })\n } catch (error) {\n logger.logException?.(error, 'chat messages proxy failed')\n return jsonError({ error: 'Upstream request failed' }, 502)\n }\n }\n}\n\n/** Chat integration status via server-held API key. */\nexport function createChatStatusHandler(options?: { logger?: MailooLogger }) {\n const logger = options?.logger ?? defaultMailooLogger\n return async function GET(request: NextRequest): Promise<Response> {\n const cfg = getMailooChatIntegrationConfig()\n if (!cfg) {\n return jsonError({ error: 'Chat BFF not configured' }, 503)\n }\n\n const url = `${cfg.apiBaseUrl}/api/v1/webhooks/chat/${cfg.projectUid}/${cfg.integrationId}/status`\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: upstreamGetHeaders(request, cfg.apiKey),\n })\n const data = await response.json()\n return new Response(JSON.stringify(data), {\n status: response.status,\n headers: { 'Content-Type': 'application/json' },\n })\n } catch (error) {\n logger.logException?.(error, 'chat status proxy failed')\n return jsonError({ error: 'Upstream request failed' }, 502)\n }\n }\n}\n\n/** Public widget config (brand, operators, topics, privacy URL). */\nexport function createChatWidgetConfigHandler(options?: {\n logger?: MailooLogger\n}) {\n const logger = options?.logger ?? defaultMailooLogger\n return async function GET(request: NextRequest): Promise<Response> {\n const cfg = getMailooChatIntegrationConfig()\n if (!cfg) {\n return jsonError({ error: 'Chat BFF not configured' }, 503)\n }\n\n const locale = request.nextUrl.searchParams.get('locale')?.trim() || 'en'\n const path = `${cfg.apiBaseUrl}/api/v1/webhooks/chat/${cfg.projectUid}/${cfg.integrationId}/widget-config`\n const url = new URL(path)\n url.searchParams.set('locale', locale)\n\n try {\n const response = await fetch(url.toString(), {\n method: 'GET',\n headers: upstreamGetHeaders(request, cfg.apiKey),\n })\n const data = await response.json()\n return new Response(JSON.stringify(data), {\n status: response.status,\n headers: { 'Content-Type': 'application/json' },\n })\n } catch (error) {\n logger.logException?.(error, 'chat widget-config proxy failed')\n return jsonError({ error: 'Upstream request failed' }, 502)\n }\n }\n}\n","import { unstable_rethrow } from 'next/navigation'\nimport {\n defaultMailooLogger,\n readMailooIntegrationConfig,\n type MailooIntegrationConfig,\n} from '@mailoo/next-core'\nimport type { MailooChatWidgetConfig } from './lib/widget-config.js'\n\nexport type MailooChatIntegrationConfig = MailooIntegrationConfig\n\nexport function getMailooChatIntegrationConfig(): MailooChatIntegrationConfig | null {\n return readMailooIntegrationConfig({\n prefix: 'MAILOO_CHAT_INTEGRATION',\n allowApiBaseUrlFallback: true,\n })\n}\n\n/**\n * Base URL the browser uses for Mailoo chat WebSockets (ws/wss).\n * Precedence: MAILOO_CHAT_WS_ORIGIN → chat API base → API_BASE_URL.\n * The host must expose WebSocket upgrade on the public API hostname.\n */\nexport function getMailooChatWebSocketOrigin(): string | null {\n const explicit = process.env.MAILOO_CHAT_WS_ORIGIN?.trim()\n if (explicit) {\n return explicit.replace(/\\/$/, '')\n }\n const chatCfg = getMailooChatIntegrationConfig()\n if (chatCfg?.apiBaseUrl) {\n return chatCfg.apiBaseUrl.replace(/\\/$/, '')\n }\n const chatApi = process.env.MAILOO_CHAT_INTEGRATION_API?.trim()\n if (chatApi) {\n return chatApi.replace(/\\/$/, '')\n }\n const api = process.env.API_BASE_URL?.trim()\n if (api) {\n return api.replace(/\\/$/, '')\n }\n return null\n}\n\nexport type MailooChatIntegrationStatus = {\n status: string\n name: string\n type: string\n lastActivity: string\n}\n\nexport type { MailooChatWidgetConfig } from './lib/widget-config.js'\nexport {\n chatWidgetCssVariables,\n isMailooChatLauncherPosition,\n mailooChatLauncherRootClassNames,\n resolveMailooChatLauncherPosition,\n MAILOO_CHAT_LAUNCHER_POSITIONS,\n type MailooChatLauncherPosition,\n type MailooChatWidgetOperator,\n type MailooChatWidgetTopic,\n} from './lib/widget-config.js'\n\n/**\n * Server-side status check against Mailoo (API key from env).\n * Returns null when chat is not configured or the request fails.\n */\nexport async function fetchMailooChatIntegrationStatus(): Promise<MailooChatIntegrationStatus | null> {\n const cfg = getMailooChatIntegrationConfig()\n if (!cfg) return null\n try {\n const url = `${cfg.apiBaseUrl}/api/v1/webhooks/chat/${cfg.projectUid}/${cfg.integrationId}/status`\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': cfg.apiKey,\n },\n })\n if (!response.ok) return null\n const data = (await response.json()) as Partial<MailooChatIntegrationStatus>\n if (\n typeof data.status !== 'string' ||\n typeof data.name !== 'string' ||\n typeof data.type !== 'string' ||\n typeof data.lastActivity !== 'string'\n ) {\n return null\n }\n return {\n status: data.status,\n name: data.name,\n type: data.type,\n lastActivity: data.lastActivity,\n }\n } catch (error) {\n unstable_rethrow(error)\n return null\n }\n}\n\n/**\n * Server-side widget config from Mailoo API (brand, operators, topics, privacy).\n * Returns null when env is missing, the request fails, or the payload is invalid.\n * Never throws — hosts must not 500 the page when chat bootstrap fails.\n */\nexport async function fetchMailooChatWidgetConfig(\n locale: string\n): Promise<MailooChatWidgetConfig | null> {\n const cfg = getMailooChatIntegrationConfig()\n if (!cfg) {\n return null\n }\n try {\n const url = new URL(\n `${cfg.apiBaseUrl}/api/v1/webhooks/chat/${cfg.projectUid}/${cfg.integrationId}/widget-config`\n )\n url.searchParams.set('locale', locale)\n const response = await fetch(url.toString(), {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': cfg.apiKey,\n },\n })\n if (!response.ok) {\n defaultMailooLogger.warn?.(\n `Failed to fetch chat widget config: HTTP ${response.status}`\n )\n return null\n }\n const data = (await response.json()) as {\n widget?: MailooChatWidgetConfig\n }\n if (!data.widget || !Array.isArray(data.widget.topics)) {\n defaultMailooLogger.warn?.(\n 'Failed to fetch chat widget config: invalid response (missing widget.topics)'\n )\n return null\n }\n return {\n ...data.widget,\n topics: data.widget.topics,\n operators: Array.isArray(data.widget.operators)\n ? data.widget.operators\n : [],\n }\n } catch (error) {\n unstable_rethrow(error)\n defaultMailooLogger.logException?.(\n error,\n 'Failed to fetch chat widget config'\n )\n return null\n }\n}\n\n/** Props for {@link MailooSiteChatShell} / floating widget host. */\nexport type MailooChatHostConfig = {\n apiOrigin: string\n projectUid: string\n integrationId: string\n welcomeMessage: string\n locale: string\n isAuthenticated: boolean\n /** Always present when resolve succeeds — brand, topics, position, etc. */\n widgetConfig: MailooChatWidgetConfig\n}\n\n/**\n * Default host resolve: env + public JSBOX widget-config.\n * Returns null when chat env is incomplete or widget-config cannot load\n * (do not mount the widget). Never throws — page hosts must stay HTTP 200.\n */\nexport async function resolveMailooChatHostConfig(opts: {\n locale: string\n isAuthenticated?: boolean\n}): Promise<MailooChatHostConfig | null> {\n try {\n const server = getMailooChatIntegrationConfig()\n if (!server) return null\n\n const apiOrigin = getMailooChatWebSocketOrigin()\n if (!apiOrigin) return null\n\n const locale = opts.locale.trim() || 'en'\n const widgetConfig = await fetchMailooChatWidgetConfig(locale)\n if (!widgetConfig) return null\n\n const welcomeOverride = process.env.MAILOO_CHAT_WELCOME_MESSAGE?.trim()\n const welcomeMessage =\n welcomeOverride || widgetConfig.welcomeTagline?.trim() || ''\n\n return {\n apiOrigin,\n projectUid: server.projectUid,\n integrationId: server.integrationId,\n welcomeMessage,\n locale,\n isAuthenticated: Boolean(opts.isAuthenticated),\n widgetConfig,\n }\n } catch (error) {\n unstable_rethrow(error)\n defaultMailooLogger.logException?.(\n error,\n 'resolveMailooChatHostConfig failed'\n )\n return null\n }\n}\n"],"mappings":"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","names":["import_next_core"]}
@@ -0,0 +1,30 @@
1
+ import { NextRequest } from 'next/server';
2
+ import { MailooLogger } from '@mailoo/next-core';
3
+
4
+ type ChatSubmitSender = {
5
+ email?: string;
6
+ name?: string;
7
+ };
8
+ /**
9
+ * Create chat message submit handler.
10
+ * Optional `resolveSender` lets hosts inject Auth.js/session email without
11
+ * coupling this package to Auth.js.
12
+ */
13
+ declare function createChatSubmitHandler(options?: {
14
+ logger?: MailooLogger;
15
+ resolveSender?: (request: NextRequest) => Promise<ChatSubmitSender | null> | ChatSubmitSender | null;
16
+ }): (request: NextRequest) => Promise<Response>;
17
+ /** Visitor polling: list session messages via server-held API key. */
18
+ declare function createChatMessagesHandler(options?: {
19
+ logger?: MailooLogger;
20
+ }): (request: NextRequest) => Promise<Response>;
21
+ /** Chat integration status via server-held API key. */
22
+ declare function createChatStatusHandler(options?: {
23
+ logger?: MailooLogger;
24
+ }): (request: NextRequest) => Promise<Response>;
25
+ /** Public widget config (brand, operators, topics, privacy URL). */
26
+ declare function createChatWidgetConfigHandler(options?: {
27
+ logger?: MailooLogger;
28
+ }): (request: NextRequest) => Promise<Response>;
29
+
30
+ export { type ChatSubmitSender, createChatMessagesHandler, createChatStatusHandler, createChatSubmitHandler, createChatWidgetConfigHandler };
@@ -0,0 +1,30 @@
1
+ import { NextRequest } from 'next/server';
2
+ import { MailooLogger } from '@mailoo/next-core';
3
+
4
+ type ChatSubmitSender = {
5
+ email?: string;
6
+ name?: string;
7
+ };
8
+ /**
9
+ * Create chat message submit handler.
10
+ * Optional `resolveSender` lets hosts inject Auth.js/session email without
11
+ * coupling this package to Auth.js.
12
+ */
13
+ declare function createChatSubmitHandler(options?: {
14
+ logger?: MailooLogger;
15
+ resolveSender?: (request: NextRequest) => Promise<ChatSubmitSender | null> | ChatSubmitSender | null;
16
+ }): (request: NextRequest) => Promise<Response>;
17
+ /** Visitor polling: list session messages via server-held API key. */
18
+ declare function createChatMessagesHandler(options?: {
19
+ logger?: MailooLogger;
20
+ }): (request: NextRequest) => Promise<Response>;
21
+ /** Chat integration status via server-held API key. */
22
+ declare function createChatStatusHandler(options?: {
23
+ logger?: MailooLogger;
24
+ }): (request: NextRequest) => Promise<Response>;
25
+ /** Public widget config (brand, operators, topics, privacy URL). */
26
+ declare function createChatWidgetConfigHandler(options?: {
27
+ logger?: MailooLogger;
28
+ }): (request: NextRequest) => Promise<Response>;
29
+
30
+ export { type ChatSubmitSender, createChatMessagesHandler, createChatStatusHandler, createChatSubmitHandler, createChatWidgetConfigHandler };