@twentyhq/call-recorder 1.0.1 → 1.0.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.
- package/manifest.json +297 -0
- package/package.json +2 -2
- package/src/front-components/calendar-event-recording.front-component.mjs +269 -0
- package/src/front-components/calendar-event-recording.front-component.mjs.map +7 -0
- package/src/logic-functions/process-recall-webhook.mjs +1744 -0
- package/src/logic-functions/process-recall-webhook.mjs.map +7 -0
- package/src/logic-functions/recall-webhook.mjs +391 -0
- package/src/logic-functions/recall-webhook.mjs.map +7 -0
- package/src/logic-functions/reconcile-call-recorder-calendar-event.mjs +1602 -0
- package/src/logic-functions/reconcile-call-recorder-calendar-event.mjs.map +7 -0
- package/src/logic-functions/reconcile-stale-bot-state.mjs +2268 -0
- package/src/logic-functions/reconcile-stale-bot-state.mjs.map +7 -0
- package/.env.example +0 -5
- package/.nvmrc +0 -1
- package/.oxlintrc.json +0 -20
- package/AGENTS.md +0 -67
- package/CLAUDE.md +0 -67
- package/README.md +0 -24
- package/SETUP.md +0 -95
- package/src/__tests__/global-setup.ts +0 -100
- package/src/__tests__/schema.integration-test.ts +0 -104
- package/src/application-config.ts +0 -96
- package/src/constants/__tests__/call-recording-field-universal-identifiers.test.ts +0 -19
- package/src/constants/app-description.ts +0 -2
- package/src/constants/app-display-name.ts +0 -1
- package/src/constants/application-universal-identifier.ts +0 -2
- package/src/constants/calendar-event-reconciliation-logic-function-universal-identifier.ts +0 -2
- package/src/constants/calendar-event-record-page-layout-universal-identifier.ts +0 -2
- package/src/constants/calendar-event-recording-front-component-universal-identifier.ts +0 -2
- package/src/constants/calendar-event-recording-page-layout-tab-universal-identifier.ts +0 -2
- package/src/constants/calendar-event-recording-page-layout-widget-universal-identifier.ts +0 -2
- package/src/constants/call-recorder-everyone-left-timeout-seconds-app-variable-universal-identifier.ts +0 -2
- package/src/constants/call-recorder-failure-reason-on-call-recording-field-universal-identifier.ts +0 -2
- package/src/constants/call-recorder-join-early-minutes-app-variable-universal-identifier.ts +0 -2
- package/src/constants/call-recorder-name-app-variable-universal-identifier.ts +0 -2
- package/src/constants/call-recorder-noone-joined-timeout-seconds-app-variable-universal-identifier.ts +0 -2
- package/src/constants/call-recorder-preference-off-option-id.ts +0 -2
- package/src/constants/call-recorder-preference-on-calendar-event-field-universal-identifier.ts +0 -2
- package/src/constants/call-recorder-preference-on-calendar-event-view-field-universal-identifier.ts +0 -2
- package/src/constants/call-recorder-preference-on-option-id.ts +0 -2
- package/src/constants/call-recorder-preference.ts +0 -4
- package/src/constants/call-recorder-waiting-room-timeout-seconds-app-variable-universal-identifier.ts +0 -2
- package/src/constants/call-recording-audio-field-universal-identifier.ts +0 -2
- package/src/constants/call-recording-video-field-universal-identifier.ts +0 -2
- package/src/constants/default-role-universal-identifier.ts +0 -2
- package/src/constants/process-recall-webhook-logic-function-universal-identifier.ts +0 -2
- package/src/constants/recall-webhook-logic-function-universal-identifier.ts +0 -2
- package/src/constants/stale-bot-state-logic-function-universal-identifier.ts +0 -2
- package/src/default-role.ts +0 -69
- package/src/fields/call-recorder-failure-reason-on-call-recording.field.ts +0 -22
- package/src/fields/call-recorder-preference-on-calendar-event.field.ts +0 -41
- package/src/front-components/calendar-event-recording.front-component.tsx +0 -13
- package/src/front-components/components/CalendarEventRecording.tsx +0 -39
- package/src/front-components/components/CalendarEventRecordingBody.tsx +0 -96
- package/src/front-components/components/CalendarEventRecordingContent.tsx +0 -111
- package/src/front-components/components/RecordingTranscript.tsx +0 -92
- package/src/front-components/components/RecordingVideoPlayer.tsx +0 -52
- package/src/front-components/components/TranscriptEntryList.tsx +0 -61
- package/src/front-components/components/TranscriptEntryListItem.tsx +0 -115
- package/src/front-components/components/TranscriptErrorBox.tsx +0 -48
- package/src/front-components/components/TranscriptSpeakerAvatar.tsx +0 -141
- package/src/front-components/components/TranscriptSpeakerChip.tsx +0 -51
- package/src/front-components/constants/recording-theme-css-variables.ts +0 -40
- package/src/front-components/hooks/use-calendar-event-participants.ts +0 -172
- package/src/front-components/hooks/use-calendar-event-recording.ts +0 -155
- package/src/front-components/types/calendar-event-participant-by-speaker-name.type.ts +0 -6
- package/src/front-components/types/calendar-event-recording-participant.type.ts +0 -7
- package/src/front-components/types/transcript-entry.type.ts +0 -13
- package/src/front-components/utils/__tests__/find-active-transcript-entry-index.test.ts +0 -66
- package/src/front-components/utils/__tests__/format-transcript-timestamp.test.ts +0 -29
- package/src/front-components/utils/__tests__/get-speaker-name-match-keys.test.ts +0 -22
- package/src/front-components/utils/__tests__/parse-transcript-entries.test.ts +0 -162
- package/src/front-components/utils/build-calendar-event-participant-by-speaker-name.util.ts +0 -45
- package/src/front-components/utils/find-active-transcript-entry-index.util.ts +0 -77
- package/src/front-components/utils/format-transcript-timestamp.util.ts +0 -16
- package/src/front-components/utils/get-absolute-avatar-url.util.ts +0 -48
- package/src/front-components/utils/get-calendar-event-participant-for-speaker-name.util.ts +0 -24
- package/src/front-components/utils/get-speaker-name-match-keys.util.ts +0 -64
- package/src/front-components/utils/get-video-file-extension.util.ts +0 -23
- package/src/front-components/utils/parse-transcript-entries.util.ts +0 -85
- package/src/logic-functions/__tests__/process-recall-webhook.test.ts +0 -62
- package/src/logic-functions/__tests__/recall-webhook.test.ts +0 -180
- package/src/logic-functions/constants/call-recorder-everyone-left-timeout-seconds-env-var-name.ts +0 -2
- package/src/logic-functions/constants/call-recorder-everyone-left-timeout-seconds.ts +0 -1
- package/src/logic-functions/constants/call-recorder-join-early-minutes-env-var-name.ts +0 -2
- package/src/logic-functions/constants/call-recorder-name-env-var-name.ts +0 -1
- package/src/logic-functions/constants/call-recorder-noone-joined-timeout-seconds-env-var-name.ts +0 -2
- package/src/logic-functions/constants/call-recorder-noone-joined-timeout-seconds.ts +0 -1
- package/src/logic-functions/constants/call-recorder-recording-retention-hours-env-var-name.ts +0 -2
- package/src/logic-functions/constants/call-recorder-waiting-room-timeout-seconds-env-var-name.ts +0 -2
- package/src/logic-functions/constants/call-recorder-waiting-room-timeout-seconds.ts +0 -1
- package/src/logic-functions/constants/call-recording-micro-credits-per-hour.ts +0 -1
- package/src/logic-functions/constants/call-recording-request-status.ts +0 -5
- package/src/logic-functions/constants/call-recording-status.ts +0 -9
- package/src/logic-functions/constants/default-call-recorder-join-early-minutes.ts +0 -1
- package/src/logic-functions/constants/default-call-recorder-name.ts +0 -1
- package/src/logic-functions/constants/default-call-recorder-recording-retention-hours.ts +0 -2
- package/src/logic-functions/constants/default-recall-region.ts +0 -1
- package/src/logic-functions/constants/milliseconds-per-minute.ts +0 -1
- package/src/logic-functions/constants/non-terminal-call-recording-statuses.ts +0 -8
- package/src/logic-functions/constants/recall-api-key-env-var-name.ts +0 -1
- package/src/logic-functions/constants/recall-api-max-attempts.ts +0 -1
- package/src/logic-functions/constants/recall-api-retry-delay-ms.ts +0 -1
- package/src/logic-functions/constants/recall-bot-automatic-leave.ts +0 -74
- package/src/logic-functions/constants/recall-bot-everyone-left-min-activate-after-seconds.ts +0 -1
- package/src/logic-functions/constants/recall-bot-recording-config.ts +0 -34
- package/src/logic-functions/constants/recall-region-env-var-name.ts +0 -1
- package/src/logic-functions/constants/recall-webhook-secret-env-var-name.ts +0 -1
- package/src/logic-functions/constants/restricted-field-placeholder.ts +0 -3
- package/src/logic-functions/constants/stale-bot-state-cron-pattern.ts +0 -1
- package/src/logic-functions/constants/twenty-page-size.ts +0 -1
- package/src/logic-functions/data/__tests__/complete-call-recording-ingestion.test.ts +0 -55
- package/src/logic-functions/data/__tests__/fetch-all-nodes.test.ts +0 -43
- package/src/logic-functions/data/__tests__/get-current-workspace-id.test.ts +0 -38
- package/src/logic-functions/data/__tests__/strip-restricted-field-value.test.ts +0 -22
- package/src/logic-functions/data/complete-call-recording-ingestion.util.ts +0 -24
- package/src/logic-functions/data/create-call-recording.util.ts +0 -41
- package/src/logic-functions/data/fetch-all-nodes.util.ts +0 -44
- package/src/logic-functions/data/fetch-calendar-events-by-filter.util.ts +0 -80
- package/src/logic-functions/data/fetch-calendar-events-by-ids.util.ts +0 -20
- package/src/logic-functions/data/fetch-calendar-events-by-starts-at-values.util.ts +0 -19
- package/src/logic-functions/data/find-call-recordings-by-calendar-event-ids.util.ts +0 -17
- package/src/logic-functions/data/find-call-recordings-by-filter.util.ts +0 -102
- package/src/logic-functions/data/find-call-recordings-by-ids.util.ts +0 -17
- package/src/logic-functions/data/find-open-scheduled-call-recordings.util.ts +0 -14
- package/src/logic-functions/data/get-current-workspace-id.util.ts +0 -36
- package/src/logic-functions/data/strip-restricted-field-value.util.ts +0 -6
- package/src/logic-functions/data/update-call-recording.util.ts +0 -24
- package/src/logic-functions/domain/__tests__/build-call-recorder-policy-result.test.ts +0 -47
- package/src/logic-functions/domain/__tests__/compute-call-recording-charge.test.ts +0 -71
- package/src/logic-functions/domain/__tests__/compute-call-recording-id-for-meeting.test.ts +0 -37
- package/src/logic-functions/domain/__tests__/compute-real-meeting-key.test.ts +0 -88
- package/src/logic-functions/domain/__tests__/is-call-recording-ingestion-complete.test.ts +0 -59
- package/src/logic-functions/domain/__tests__/is-call-recording-status-downgrade.test.ts +0 -37
- package/src/logic-functions/domain/__tests__/resolve-call-recorder-policy-result.test.ts +0 -120
- package/src/logic-functions/domain/__tests__/should-complete-call-recording-ingestion.test.ts +0 -102
- package/src/logic-functions/domain/aggregate-call-recorder-policy-results-by-meeting.util.ts +0 -42
- package/src/logic-functions/domain/build-call-recorder-policy-result.util.ts +0 -53
- package/src/logic-functions/domain/build-failed-transcript-marker.util.ts +0 -13
- package/src/logic-functions/domain/build-pending-transcript-marker.util.ts +0 -13
- package/src/logic-functions/domain/build-recall-routing-metadata.util.ts +0 -12
- package/src/logic-functions/domain/build-transcript-failure-reason.util.ts +0 -7
- package/src/logic-functions/domain/compute-call-recording-charge.util.ts +0 -41
- package/src/logic-functions/domain/compute-call-recording-id-for-meeting.util.ts +0 -16
- package/src/logic-functions/domain/compute-real-meeting-key.util.ts +0 -48
- package/src/logic-functions/domain/compute-recall-bot-join-at.util.ts +0 -34
- package/src/logic-functions/domain/is-call-recording-ingestion-complete.util.ts +0 -19
- package/src/logic-functions/domain/is-call-recording-status-downgrade.util.ts +0 -37
- package/src/logic-functions/domain/is-recall-recording-done-signal.util.ts +0 -13
- package/src/logic-functions/domain/map-recall-status-code-to-call-recording-status.util.ts +0 -26
- package/src/logic-functions/domain/parse-transcript-marker.util.ts +0 -29
- package/src/logic-functions/domain/resolve-call-recorder-policy-result.util.ts +0 -72
- package/src/logic-functions/domain/should-complete-call-recording-ingestion.util.ts +0 -32
- package/src/logic-functions/flows/__tests__/charge-completed-call-recording.test.ts +0 -45
- package/src/logic-functions/flows/__tests__/complete-and-charge-call-recording.test.ts +0 -61
- package/src/logic-functions/flows/__tests__/converge-diverged-call-recordings.test.ts +0 -727
- package/src/logic-functions/flows/__tests__/download-transcript.test.ts +0 -74
- package/src/logic-functions/flows/__tests__/handle-recall-webhook.test.ts +0 -1301
- package/src/logic-functions/flows/__tests__/heal-call-recordings-missing-bot.test.ts +0 -225
- package/src/logic-functions/flows/__tests__/ingest-call-recording-media.test.ts +0 -153
- package/src/logic-functions/flows/__tests__/reap-orphaned-call-recorders.test.ts +0 -425
- package/src/logic-functions/flows/__tests__/reconcile-call-recorder.test.ts +0 -1007
- package/src/logic-functions/flows/cancel-call-recording-request.util.ts +0 -46
- package/src/logic-functions/flows/charge-completed-call-recording.util.ts +0 -31
- package/src/logic-functions/flows/complete-and-charge-call-recording.util.ts +0 -29
- package/src/logic-functions/flows/converge-diverged-call-recordings-result.type.ts +0 -8
- package/src/logic-functions/flows/converge-diverged-call-recordings.util.ts +0 -447
- package/src/logic-functions/flows/download-transcript.util.ts +0 -67
- package/src/logic-functions/flows/ensure-call-recorder.util.ts +0 -73
- package/src/logic-functions/flows/handle-recall-webhook.util.ts +0 -672
- package/src/logic-functions/flows/heal-call-recordings-missing-bot.util.ts +0 -82
- package/src/logic-functions/flows/ingest-call-recording-media.util.ts +0 -128
- package/src/logic-functions/flows/persist-call-recording-progress.util.ts +0 -58
- package/src/logic-functions/flows/reap-orphaned-call-recorders.util.ts +0 -183
- package/src/logic-functions/flows/reconcile-call-recorder.util.ts +0 -495
- package/src/logic-functions/flows/reconcile-call-recording-transcript-artifact-result.type.ts +0 -11
- package/src/logic-functions/flows/reconcile-call-recording-transcript-artifact.util.ts +0 -182
- package/src/logic-functions/flows/reschedule-call-recording-bot.util.ts +0 -69
- package/src/logic-functions/process-recall-webhook.ts +0 -23
- package/src/logic-functions/recall-api/__tests__/extract-recall-bot-convergence.test.ts +0 -153
- package/src/logic-functions/recall-api/__tests__/extract-recall-media-urls.test.ts +0 -67
- package/src/logic-functions/recall-api/__tests__/recall-bot-api.test.ts +0 -744
- package/src/logic-functions/recall-api/__tests__/verify-recall-webhook-signature.test.ts +0 -122
- package/src/logic-functions/recall-api/cancel-recall-bot.util.ts +0 -28
- package/src/logic-functions/recall-api/create-async-recall-transcript.util.ts +0 -47
- package/src/logic-functions/recall-api/eject-recall-bot.util.ts +0 -28
- package/src/logic-functions/recall-api/extract-recall-bot-convergence.util.ts +0 -149
- package/src/logic-functions/recall-api/extract-recall-bot-id.util.ts +0 -10
- package/src/logic-functions/recall-api/extract-recall-media-urls.util.ts +0 -30
- package/src/logic-functions/recall-api/extract-twenty-workspace-id-from-recall-webhook.util.ts +0 -8
- package/src/logic-functions/recall-api/get-recall-api-config.util.ts +0 -59
- package/src/logic-functions/recall-api/get-recall-bot.util.ts +0 -42
- package/src/logic-functions/recall-api/get-recall-recording.util.ts +0 -31
- package/src/logic-functions/recall-api/get-recall-webhook-bot-metadata.util.ts +0 -18
- package/src/logic-functions/recall-api/list-recall-transcripts.util.ts +0 -141
- package/src/logic-functions/recall-api/list-scheduled-recall-bots.util.ts +0 -106
- package/src/logic-functions/recall-api/normalize-recall-timestamp.util.ts +0 -14
- package/src/logic-functions/recall-api/parse-recall-webhook-event.util.ts +0 -88
- package/src/logic-functions/recall-api/recall-bot-api-request.util.ts +0 -165
- package/src/logic-functions/recall-api/recall-transcript-summary.type.ts +0 -5
- package/src/logic-functions/recall-api/reschedule-recall-bot.util.ts +0 -56
- package/src/logic-functions/recall-api/retrieve-recall-transcript.util.ts +0 -71
- package/src/logic-functions/recall-api/schedule-recall-bot.util.ts +0 -68
- package/src/logic-functions/recall-api/verify-recall-webhook-signature.util.ts +0 -109
- package/src/logic-functions/recall-webhook.ts +0 -90
- package/src/logic-functions/reconcile-call-recorder-calendar-event.ts +0 -178
- package/src/logic-functions/reconcile-stale-bot-state.ts +0 -106
- package/src/logic-functions/types/calendar-event-record.type.ts +0 -5
- package/src/logic-functions/types/call-recorder-policy-calendar-event-input.type.ts +0 -10
- package/src/logic-functions/types/call-recorder-policy-input.type.ts +0 -9
- package/src/logic-functions/types/call-recorder-policy-not-required-reason.type.ts +0 -5
- package/src/logic-functions/types/call-recorder-policy-required-reason.type.ts +0 -1
- package/src/logic-functions/types/call-recorder-policy-result-for-calendar-event.type.ts +0 -9
- package/src/logic-functions/types/call-recorder-policy-result-for-meeting.type.ts +0 -6
- package/src/logic-functions/types/call-recorder-policy-result.type.ts +0 -12
- package/src/logic-functions/types/call-recorder-reconciliation-result.type.ts +0 -16
- package/src/logic-functions/types/call-recording-media-file.type.ts +0 -1
- package/src/logic-functions/types/call-recording-record.type.ts +0 -15
- package/src/logic-functions/types/call-recording-update-fields.type.ts +0 -20
- package/src/logic-functions/types/files-field-value.type.ts +0 -1
- package/src/logic-functions/types/meeting-recording.type.ts +0 -7
- package/src/logic-functions/types/recall-bot-operation-result.type.ts +0 -19
- package/src/logic-functions/types/recall-routing-metadata.type.ts +0 -4
- package/src/logic-functions/types/removed-call-recorder-occurrence.type.ts +0 -6
- package/src/logic-functions/types/transcript-marker.type.ts +0 -6
- package/src/logic-functions/utils/as-record.util.ts +0 -6
- package/src/logic-functions/utils/get-application-variable-value.util.ts +0 -3
- package/src/logic-functions/utils/get-record-at-path.util.ts +0 -10
- package/src/logic-functions/utils/get-string.util.ts +0 -4
- package/src/logic-functions/utils/get-unique-sorted-ids.util.ts +0 -8
- package/src/logic-functions/utils/is-non-empty-string.util.ts +0 -5
- package/src/page-layouts/calendar-event-recording-tab.ts +0 -33
- package/src/view-fields/call-recorder-preference-on-calendar-event.view-field.ts +0 -27
- package/tsconfig.json +0 -42
- package/tsconfig.spec.json +0 -9
- package/vitest.config.ts +0 -31
- package/vitest.unit.config.ts +0 -14
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
import { createRequire as __createRequire } from 'module';
|
|
2
|
+
const require = __createRequire(import.meta.url);
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __commonJS = (cb, mod) => function __require() {
|
|
10
|
+
try {
|
|
11
|
+
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
12
|
+
} catch (e) {
|
|
13
|
+
throw mod = 0, e;
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
var __copyProps = (to, from, except, desc) => {
|
|
17
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
18
|
+
for (let key of __getOwnPropNames(from))
|
|
19
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
20
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
21
|
+
}
|
|
22
|
+
return to;
|
|
23
|
+
};
|
|
24
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
25
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
26
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
27
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
28
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
29
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
30
|
+
mod
|
|
31
|
+
));
|
|
32
|
+
|
|
33
|
+
// node_modules/@sniptt/guards/build/guards/primitives.js
|
|
34
|
+
var require_primitives = __commonJS({
|
|
35
|
+
"node_modules/@sniptt/guards/build/guards/primitives.js"(exports) {
|
|
36
|
+
"use strict";
|
|
37
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
+
exports.isSymbol = exports.isBigInt = exports.isString = exports.isNumber = exports.isBoolean = exports.isUndefined = void 0;
|
|
39
|
+
var isUndefined3 = (term) => {
|
|
40
|
+
return typeof term === "undefined";
|
|
41
|
+
};
|
|
42
|
+
exports.isUndefined = isUndefined3;
|
|
43
|
+
var isBoolean = (term) => {
|
|
44
|
+
return typeof term === "boolean";
|
|
45
|
+
};
|
|
46
|
+
exports.isBoolean = isBoolean;
|
|
47
|
+
var isNumber = (term) => {
|
|
48
|
+
return typeof term === "number" && !Number.isNaN(term);
|
|
49
|
+
};
|
|
50
|
+
exports.isNumber = isNumber;
|
|
51
|
+
var isString2 = (term) => {
|
|
52
|
+
return typeof term === "string";
|
|
53
|
+
};
|
|
54
|
+
exports.isString = isString2;
|
|
55
|
+
var isBigInt = (term) => {
|
|
56
|
+
return typeof term === "bigint";
|
|
57
|
+
};
|
|
58
|
+
exports.isBigInt = isBigInt;
|
|
59
|
+
var isSymbol = (term) => {
|
|
60
|
+
return typeof term === "symbol";
|
|
61
|
+
};
|
|
62
|
+
exports.isSymbol = isSymbol;
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// node_modules/@sniptt/guards/build/guards/structural.js
|
|
67
|
+
var require_structural = __commonJS({
|
|
68
|
+
"node_modules/@sniptt/guards/build/guards/structural.js"(exports) {
|
|
69
|
+
"use strict";
|
|
70
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
71
|
+
exports.isDate = exports.isWeakSet = exports.isWeakMap = exports.isSet = exports.isMap = exports.isArray = exports.isObject = exports.isFunction = exports.isNull = void 0;
|
|
72
|
+
var isNull2 = (term) => {
|
|
73
|
+
return term === null;
|
|
74
|
+
};
|
|
75
|
+
exports.isNull = isNull2;
|
|
76
|
+
var isFunction = (term) => {
|
|
77
|
+
return typeof term === "function";
|
|
78
|
+
};
|
|
79
|
+
exports.isFunction = isFunction;
|
|
80
|
+
var isObject2 = (term) => {
|
|
81
|
+
return !exports.isNull(term) && typeof term === "object";
|
|
82
|
+
};
|
|
83
|
+
exports.isObject = isObject2;
|
|
84
|
+
var isArray2 = (term) => {
|
|
85
|
+
return Array.isArray(term);
|
|
86
|
+
};
|
|
87
|
+
exports.isArray = isArray2;
|
|
88
|
+
var isMap = (term) => {
|
|
89
|
+
return term instanceof Map;
|
|
90
|
+
};
|
|
91
|
+
exports.isMap = isMap;
|
|
92
|
+
var isSet = (term) => {
|
|
93
|
+
return term instanceof Set;
|
|
94
|
+
};
|
|
95
|
+
exports.isSet = isSet;
|
|
96
|
+
var isWeakMap = (term) => {
|
|
97
|
+
return term instanceof WeakMap;
|
|
98
|
+
};
|
|
99
|
+
exports.isWeakMap = isWeakMap;
|
|
100
|
+
var isWeakSet = (term) => {
|
|
101
|
+
return term instanceof WeakSet;
|
|
102
|
+
};
|
|
103
|
+
exports.isWeakSet = isWeakSet;
|
|
104
|
+
var isDate = (term) => {
|
|
105
|
+
return term instanceof Date;
|
|
106
|
+
};
|
|
107
|
+
exports.isDate = isDate;
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
// node_modules/@sniptt/guards/build/guards/convenience.js
|
|
112
|
+
var require_convenience = __commonJS({
|
|
113
|
+
"node_modules/@sniptt/guards/build/guards/convenience.js"(exports) {
|
|
114
|
+
"use strict";
|
|
115
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
116
|
+
exports.isNegativeInteger = exports.isNonNegativeInteger = exports.isPositiveInteger = exports.isInteger = exports.isNumberOrNaN = exports.isNonEmptyString = exports.isNonEmptyArray = exports.isObjectOrNull = void 0;
|
|
117
|
+
var primitives_1 = require_primitives();
|
|
118
|
+
var structural_1 = require_structural();
|
|
119
|
+
var isObjectOrNull = (term) => {
|
|
120
|
+
return typeof term === "object";
|
|
121
|
+
};
|
|
122
|
+
exports.isObjectOrNull = isObjectOrNull;
|
|
123
|
+
var isNonEmptyArray = (term) => {
|
|
124
|
+
return structural_1.isArray(term) && term.length > 0;
|
|
125
|
+
};
|
|
126
|
+
exports.isNonEmptyArray = isNonEmptyArray;
|
|
127
|
+
var isNonEmptyString2 = (term) => {
|
|
128
|
+
return primitives_1.isString(term) && term.length > 0;
|
|
129
|
+
};
|
|
130
|
+
exports.isNonEmptyString = isNonEmptyString2;
|
|
131
|
+
var isNumberOrNaN = (term) => {
|
|
132
|
+
return typeof term === "number";
|
|
133
|
+
};
|
|
134
|
+
exports.isNumberOrNaN = isNumberOrNaN;
|
|
135
|
+
var isInteger = (term) => {
|
|
136
|
+
return primitives_1.isNumber(term) && Number.isInteger(term);
|
|
137
|
+
};
|
|
138
|
+
exports.isInteger = isInteger;
|
|
139
|
+
var isPositiveInteger = (term) => {
|
|
140
|
+
return exports.isInteger(term) && term > 0;
|
|
141
|
+
};
|
|
142
|
+
exports.isPositiveInteger = isPositiveInteger;
|
|
143
|
+
var isNonNegativeInteger = (term) => {
|
|
144
|
+
return exports.isInteger(term) && term >= 0;
|
|
145
|
+
};
|
|
146
|
+
exports.isNonNegativeInteger = isNonNegativeInteger;
|
|
147
|
+
var isNegativeInteger = (term) => {
|
|
148
|
+
return exports.isInteger(term) && term < 0;
|
|
149
|
+
};
|
|
150
|
+
exports.isNegativeInteger = isNegativeInteger;
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
// node_modules/@sniptt/guards/build/index.js
|
|
155
|
+
var require_build = __commonJS({
|
|
156
|
+
"node_modules/@sniptt/guards/build/index.js"(exports) {
|
|
157
|
+
"use strict";
|
|
158
|
+
var __createBinding = exports && exports.__createBinding || (Object.create ? (function(o, m, k, k2) {
|
|
159
|
+
if (k2 === void 0) k2 = k;
|
|
160
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() {
|
|
161
|
+
return m[k];
|
|
162
|
+
} });
|
|
163
|
+
}) : (function(o, m, k, k2) {
|
|
164
|
+
if (k2 === void 0) k2 = k;
|
|
165
|
+
o[k2] = m[k];
|
|
166
|
+
}));
|
|
167
|
+
var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? (function(o, v) {
|
|
168
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
169
|
+
}) : function(o, v) {
|
|
170
|
+
o["default"] = v;
|
|
171
|
+
});
|
|
172
|
+
var __importStar = exports && exports.__importStar || function(mod) {
|
|
173
|
+
if (mod && mod.__esModule) return mod;
|
|
174
|
+
var result = {};
|
|
175
|
+
if (mod != null) {
|
|
176
|
+
for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
177
|
+
}
|
|
178
|
+
__setModuleDefault(result, mod);
|
|
179
|
+
return result;
|
|
180
|
+
};
|
|
181
|
+
var __exportStar = exports && exports.__exportStar || function(m, exports2) {
|
|
182
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports2, p)) __createBinding(exports2, m, p);
|
|
183
|
+
};
|
|
184
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
185
|
+
exports.structural = exports.primitives = exports.convenience = void 0;
|
|
186
|
+
exports.convenience = __importStar(require_convenience());
|
|
187
|
+
__exportStar(require_convenience(), exports);
|
|
188
|
+
exports.primitives = __importStar(require_primitives());
|
|
189
|
+
__exportStar(require_primitives(), exports);
|
|
190
|
+
exports.structural = __importStar(require_structural());
|
|
191
|
+
__exportStar(require_structural(), exports);
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
// src/logic-functions/recall-webhook.ts
|
|
196
|
+
var import_guards4 = __toESM(require_build());
|
|
197
|
+
|
|
198
|
+
// twenty-sdk-define-stub:__twenty-sdk-define-stub__
|
|
199
|
+
var __defineFactoryStub = (config) => ({
|
|
200
|
+
success: true,
|
|
201
|
+
config,
|
|
202
|
+
errors: []
|
|
203
|
+
});
|
|
204
|
+
var __anyHandler = {
|
|
205
|
+
get(_target, prop) {
|
|
206
|
+
if (prop === "__esModule") return true;
|
|
207
|
+
if (prop === Symbol.toPrimitive) return () => "";
|
|
208
|
+
if (typeof prop === "symbol") return void 0;
|
|
209
|
+
return new Proxy(() => void 0, __anyHandler);
|
|
210
|
+
},
|
|
211
|
+
apply() {
|
|
212
|
+
return new Proxy(() => void 0, __anyHandler);
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
var __anyStub = new Proxy(() => void 0, __anyHandler);
|
|
216
|
+
var defineLogicFunction = __defineFactoryStub;
|
|
217
|
+
|
|
218
|
+
// src/constants/process-recall-webhook-logic-function-universal-identifier.ts
|
|
219
|
+
var PROCESS_RECALL_WEBHOOK_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER = "13d9c427-447e-494a-8d3c-1af5d0bacb82";
|
|
220
|
+
|
|
221
|
+
// src/constants/recall-webhook-logic-function-universal-identifier.ts
|
|
222
|
+
var RECALL_WEBHOOK_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER = "9215afe6-1497-4149-a49d-e608e239bbaf";
|
|
223
|
+
|
|
224
|
+
// src/logic-functions/constants/recall-webhook-secret-env-var-name.ts
|
|
225
|
+
var RECALL_WEBHOOK_SECRET_ENV_VAR_NAME = "RECALL_WEBHOOK_SECRET";
|
|
226
|
+
|
|
227
|
+
// src/logic-functions/utils/as-record.util.ts
|
|
228
|
+
var import_guards = __toESM(require_build());
|
|
229
|
+
var asRecord = (value) => (0, import_guards.isObject)(value) && !(0, import_guards.isArray)(value) ? value : void 0;
|
|
230
|
+
|
|
231
|
+
// src/logic-functions/utils/get-record-at-path.util.ts
|
|
232
|
+
var getRecordAtPath = (record, path) => path.reduce(
|
|
233
|
+
(currentValue, pathPart) => asRecord(currentValue)?.[pathPart],
|
|
234
|
+
record
|
|
235
|
+
);
|
|
236
|
+
|
|
237
|
+
// src/logic-functions/recall-api/get-recall-webhook-bot-metadata.util.ts
|
|
238
|
+
var getRecallWebhookBotMetadata = (body) => {
|
|
239
|
+
const data = asRecord(body.data);
|
|
240
|
+
const bot = asRecord(body.bot);
|
|
241
|
+
return asRecord(bot?.metadata) ?? asRecord(getRecordAtPath(data, ["bot", "metadata"])) ?? asRecord(getRecordAtPath(data, ["recording", "metadata"])) ?? asRecord(data?.metadata);
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
// src/logic-functions/utils/is-non-empty-string.util.ts
|
|
245
|
+
var import_guards2 = __toESM(require_build());
|
|
246
|
+
var isNonEmptyString = (value) => (0, import_guards2.isString)(value) && value.trim() !== "";
|
|
247
|
+
|
|
248
|
+
// src/logic-functions/utils/get-string.util.ts
|
|
249
|
+
var getString = (value) => isNonEmptyString(value) ? value : void 0;
|
|
250
|
+
|
|
251
|
+
// src/logic-functions/recall-api/extract-twenty-workspace-id-from-recall-webhook.util.ts
|
|
252
|
+
var extractTwentyWorkspaceIdFromRecallWebhook = (body) => getString(getRecallWebhookBotMetadata(body)?.twentyWorkspaceId);
|
|
253
|
+
|
|
254
|
+
// src/logic-functions/recall-api/verify-recall-webhook-signature.util.ts
|
|
255
|
+
var import_guards3 = __toESM(require_build());
|
|
256
|
+
import { createHmac, timingSafeEqual } from "crypto";
|
|
257
|
+
var RECALL_WEBHOOK_SECRET_PREFIX = "whsec_";
|
|
258
|
+
var RECALL_WEBHOOK_TIMESTAMP_TOLERANCE_SECONDS = 5 * 60;
|
|
259
|
+
var verifyRecallWebhookSignature = ({
|
|
260
|
+
rawBody,
|
|
261
|
+
headers,
|
|
262
|
+
secret,
|
|
263
|
+
now = /* @__PURE__ */ new Date()
|
|
264
|
+
}) => {
|
|
265
|
+
if (!secret.startsWith(RECALL_WEBHOOK_SECRET_PREFIX)) {
|
|
266
|
+
return {
|
|
267
|
+
valid: false,
|
|
268
|
+
error: "Webhook secret must start with whsec_"
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
const webhookId = headers["webhook-id"] ?? headers["svix-id"];
|
|
272
|
+
const webhookTimestamp = headers["webhook-timestamp"] ?? headers["svix-timestamp"];
|
|
273
|
+
const webhookSignature = headers["webhook-signature"] ?? headers["svix-signature"];
|
|
274
|
+
if ((0, import_guards3.isUndefined)(webhookId) || (0, import_guards3.isUndefined)(webhookTimestamp) || (0, import_guards3.isUndefined)(webhookSignature)) {
|
|
275
|
+
return {
|
|
276
|
+
valid: false,
|
|
277
|
+
error: "Missing webhook signature headers"
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
const webhookTimestampSeconds = Number(webhookTimestamp);
|
|
281
|
+
if (!Number.isInteger(webhookTimestampSeconds)) {
|
|
282
|
+
return {
|
|
283
|
+
valid: false,
|
|
284
|
+
error: "Invalid webhook timestamp"
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
const nowSeconds = Math.floor(now.getTime() / 1e3);
|
|
288
|
+
if (Math.abs(nowSeconds - webhookTimestampSeconds) > RECALL_WEBHOOK_TIMESTAMP_TOLERANCE_SECONDS) {
|
|
289
|
+
return {
|
|
290
|
+
valid: false,
|
|
291
|
+
error: "Webhook timestamp is outside of the allowed tolerance"
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
const secretBytes = Buffer.from(
|
|
295
|
+
secret.slice(RECALL_WEBHOOK_SECRET_PREFIX.length),
|
|
296
|
+
"base64"
|
|
297
|
+
);
|
|
298
|
+
const expectedSignature = createHmac("sha256", secretBytes).update(`${webhookId}.${webhookTimestamp}.${rawBody}`).digest("base64");
|
|
299
|
+
const providedSignatures = webhookSignature.split(" ").map((signaturePart) => signaturePart.trim()).filter((signaturePart) => signaturePart !== "").flatMap((signaturePart) => {
|
|
300
|
+
if (signaturePart.startsWith("v1,") || signaturePart.startsWith("v1=")) {
|
|
301
|
+
return [signaturePart.slice(3).trim()];
|
|
302
|
+
}
|
|
303
|
+
return [];
|
|
304
|
+
}).filter((signaturePart) => signaturePart !== "");
|
|
305
|
+
if (providedSignatures.length === 0) {
|
|
306
|
+
return {
|
|
307
|
+
valid: false,
|
|
308
|
+
error: "Missing v1 signature"
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
const expectedSignatureBuffer = Buffer.from(expectedSignature, "base64");
|
|
312
|
+
for (const providedSignature of providedSignatures) {
|
|
313
|
+
const providedSignatureBuffer = Buffer.from(providedSignature, "base64");
|
|
314
|
+
if (providedSignatureBuffer.length !== expectedSignatureBuffer.length) {
|
|
315
|
+
continue;
|
|
316
|
+
}
|
|
317
|
+
if (timingSafeEqual(providedSignatureBuffer, expectedSignatureBuffer)) {
|
|
318
|
+
return { valid: true };
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
return {
|
|
322
|
+
valid: false,
|
|
323
|
+
error: "Signature verification failed"
|
|
324
|
+
};
|
|
325
|
+
};
|
|
326
|
+
|
|
327
|
+
// src/logic-functions/utils/get-application-variable-value.util.ts
|
|
328
|
+
var getApplicationVariableValue = (key) => process.env[key];
|
|
329
|
+
|
|
330
|
+
// src/logic-functions/recall-webhook.ts
|
|
331
|
+
var recallWebhookRouteHandler = (routePayload) => {
|
|
332
|
+
const webhookSecret = getApplicationVariableValue(
|
|
333
|
+
RECALL_WEBHOOK_SECRET_ENV_VAR_NAME
|
|
334
|
+
);
|
|
335
|
+
if (!isNonEmptyString(webhookSecret)) {
|
|
336
|
+
throw new Error(
|
|
337
|
+
"RECALL_WEBHOOK_SECRET server variable is not set. A server admin must copy it from the Recall webhook endpoint settings and set it on the Call Recorder application registration."
|
|
338
|
+
);
|
|
339
|
+
}
|
|
340
|
+
const { rawBody } = routePayload;
|
|
341
|
+
if ((0, import_guards4.isUndefined)(rawBody)) {
|
|
342
|
+
throw new Error(
|
|
343
|
+
"Raw request body was not forwarded by the server; cannot verify the webhook signature"
|
|
344
|
+
);
|
|
345
|
+
}
|
|
346
|
+
const signatureCheck = verifyRecallWebhookSignature({
|
|
347
|
+
rawBody,
|
|
348
|
+
headers: routePayload.headers,
|
|
349
|
+
secret: webhookSecret
|
|
350
|
+
});
|
|
351
|
+
if (!signatureCheck.valid) {
|
|
352
|
+
throw new Error(`Invalid webhook signature: ${signatureCheck.error}`);
|
|
353
|
+
}
|
|
354
|
+
const body = routePayload.body;
|
|
355
|
+
if ((0, import_guards4.isUndefined)(body) || (0, import_guards4.isNull)(body)) {
|
|
356
|
+
throw new Error("Webhook payload was empty");
|
|
357
|
+
}
|
|
358
|
+
const workspaceId = extractTwentyWorkspaceIdFromRecallWebhook(body);
|
|
359
|
+
if (!isNonEmptyString(workspaceId)) {
|
|
360
|
+
throw new Error(
|
|
361
|
+
"Webhook payload is missing the Twenty workspace id in the Recall bot metadata"
|
|
362
|
+
);
|
|
363
|
+
}
|
|
364
|
+
return {
|
|
365
|
+
workspaceId,
|
|
366
|
+
targetLogicFunctionUniversalIdentifier: PROCESS_RECALL_WEBHOOK_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER,
|
|
367
|
+
payload: body
|
|
368
|
+
};
|
|
369
|
+
};
|
|
370
|
+
var recall_webhook_default = defineLogicFunction({
|
|
371
|
+
universalIdentifier: RECALL_WEBHOOK_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER,
|
|
372
|
+
name: "recall-webhook",
|
|
373
|
+
description: "Verifies Recall.ai webhook signatures and resolves the target workspace for the matching CallRecording update.",
|
|
374
|
+
timeoutSeconds: 30,
|
|
375
|
+
handler: recallWebhookRouteHandler,
|
|
376
|
+
serverRouteTriggerSettings: {
|
|
377
|
+
forwardedRequestHeaders: [
|
|
378
|
+
"webhook-id",
|
|
379
|
+
"webhook-timestamp",
|
|
380
|
+
"webhook-signature",
|
|
381
|
+
"svix-id",
|
|
382
|
+
"svix-timestamp",
|
|
383
|
+
"svix-signature"
|
|
384
|
+
]
|
|
385
|
+
}
|
|
386
|
+
});
|
|
387
|
+
export {
|
|
388
|
+
recall_webhook_default as default,
|
|
389
|
+
recallWebhookRouteHandler
|
|
390
|
+
};
|
|
391
|
+
//# sourceMappingURL=recall-webhook.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../node_modules/@sniptt/guards/lib/guards/primitives.ts", "../../../../node_modules/@sniptt/guards/lib/guards/structural.ts", "../../../../node_modules/@sniptt/guards/lib/guards/convenience.ts", "../../../../node_modules/@sniptt/guards/lib/index.ts", "../../../../src/logic-functions/recall-webhook.ts", "twenty-sdk-define-stub:__twenty-sdk-define-stub__", "../../../../src/constants/process-recall-webhook-logic-function-universal-identifier.ts", "../../../../src/constants/recall-webhook-logic-function-universal-identifier.ts", "../../../../src/logic-functions/constants/recall-webhook-secret-env-var-name.ts", "../../../../src/logic-functions/utils/as-record.util.ts", "../../../../src/logic-functions/utils/get-record-at-path.util.ts", "../../../../src/logic-functions/recall-api/get-recall-webhook-bot-metadata.util.ts", "../../../../src/logic-functions/utils/is-non-empty-string.util.ts", "../../../../src/logic-functions/utils/get-string.util.ts", "../../../../src/logic-functions/recall-api/extract-twenty-workspace-id-from-recall-webhook.util.ts", "../../../../src/logic-functions/recall-api/verify-recall-webhook-signature.util.ts", "../../../../src/logic-functions/utils/get-application-variable-value.util.ts"],
|
|
4
|
+
"sourcesContent": [null, null, null, null, "import { isNull, isUndefined } from '@sniptt/guards';\nimport { defineLogicFunction, type RoutePayload } from 'twenty-sdk/define';\n\nimport { PROCESS_RECALL_WEBHOOK_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER } from 'src/constants/process-recall-webhook-logic-function-universal-identifier';\nimport { RECALL_WEBHOOK_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER } from 'src/constants/recall-webhook-logic-function-universal-identifier';\nimport { RECALL_WEBHOOK_SECRET_ENV_VAR_NAME } from 'src/logic-functions/constants/recall-webhook-secret-env-var-name';\nimport { extractTwentyWorkspaceIdFromRecallWebhook } from 'src/logic-functions/recall-api/extract-twenty-workspace-id-from-recall-webhook.util';\nimport { type RecallWebhookBody } from 'src/logic-functions/recall-api/parse-recall-webhook-event.util';\nimport { verifyRecallWebhookSignature } from 'src/logic-functions/recall-api/verify-recall-webhook-signature.util';\nimport { getApplicationVariableValue } from 'src/logic-functions/utils/get-application-variable-value.util';\nimport { isNonEmptyString } from 'src/logic-functions/utils/is-non-empty-string.util';\n\ntype RecallWebhookResolverResult = {\n workspaceId: string;\n targetLogicFunctionUniversalIdentifier: string;\n payload: RecallWebhookBody;\n};\n\n// A thrown error becomes a non-2xx, which makes Svix retry; a returned result dispatches to the target.\nexport const recallWebhookRouteHandler = (\n routePayload: RoutePayload<RecallWebhookBody>,\n): RecallWebhookResolverResult => {\n const webhookSecret = getApplicationVariableValue(\n RECALL_WEBHOOK_SECRET_ENV_VAR_NAME,\n );\n\n if (!isNonEmptyString(webhookSecret)) {\n throw new Error(\n 'RECALL_WEBHOOK_SECRET server variable is not set. A server admin must copy it from the Recall webhook endpoint settings and set it on the Call Recorder application registration.',\n );\n }\n\n const { rawBody } = routePayload;\n\n if (isUndefined(rawBody)) {\n throw new Error(\n 'Raw request body was not forwarded by the server; cannot verify the webhook signature',\n );\n }\n\n const signatureCheck = verifyRecallWebhookSignature({\n rawBody,\n headers: routePayload.headers,\n secret: webhookSecret,\n });\n\n if (!signatureCheck.valid) {\n throw new Error(`Invalid webhook signature: ${signatureCheck.error}`);\n }\n\n const body = routePayload.body;\n\n if (isUndefined(body) || isNull(body)) {\n throw new Error('Webhook payload was empty');\n }\n\n const workspaceId = extractTwentyWorkspaceIdFromRecallWebhook(body);\n\n if (!isNonEmptyString(workspaceId)) {\n throw new Error(\n 'Webhook payload is missing the Twenty workspace id in the Recall bot metadata',\n );\n }\n\n return {\n workspaceId,\n targetLogicFunctionUniversalIdentifier:\n PROCESS_RECALL_WEBHOOK_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER,\n payload: body,\n };\n};\n\nexport default defineLogicFunction({\n universalIdentifier: RECALL_WEBHOOK_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER,\n name: 'recall-webhook',\n description:\n 'Verifies Recall.ai webhook signatures and resolves the target workspace for the matching CallRecording update.',\n timeoutSeconds: 30,\n handler: recallWebhookRouteHandler,\n serverRouteTriggerSettings: {\n forwardedRequestHeaders: [\n 'webhook-id',\n 'webhook-timestamp',\n 'webhook-signature',\n 'svix-id',\n 'svix-timestamp',\n 'svix-signature',\n ],\n },\n});\n", "\n// Auto-generated stub for twenty-sdk/define injected by the SDK CLI build.\n// Real implementations would pull in zod, twenty-shared and ~1MB of code; at\n// runtime only `default.config.handler` is consumed, so tiny no-ops suffice.\nconst __defineFactoryStub = (config) => ({\n success: true,\n config,\n errors: [],\n});\n\nconst __anyHandler = {\n get(_target, prop) {\n if (prop === '__esModule') return true;\n if (prop === Symbol.toPrimitive) return () => '';\n if (typeof prop === 'symbol') return undefined;\n return new Proxy(() => undefined, __anyHandler);\n },\n apply() {\n return new Proxy(() => undefined, __anyHandler);\n },\n};\nconst __anyStub = new Proxy(() => undefined, __anyHandler);\n\nexport const createValidationResult = __defineFactoryStub;\nexport const defineAgent = __defineFactoryStub;\nexport const defineApplication = __defineFactoryStub;\nexport const defineApplicationRole = __defineFactoryStub;\nexport const defineCommandMenuItem = __defineFactoryStub;\nexport const defineConnectionProvider = __defineFactoryStub;\nexport const defineField = __defineFactoryStub;\nexport const defineFrontComponent = __defineFactoryStub;\nexport const defineIndex = __defineFactoryStub;\nexport const defineLogicFunction = __defineFactoryStub;\nexport const defineNavigationMenuItem = __defineFactoryStub;\nexport const defineObject = __defineFactoryStub;\nexport const definePageLayout = __defineFactoryStub;\nexport const definePageLayoutTab = __defineFactoryStub;\nexport const definePermissionFlag = __defineFactoryStub;\nexport const definePostInstallLogicFunction = __defineFactoryStub;\nexport const definePreInstallLogicFunction = __defineFactoryStub;\nexport const defineRole = __defineFactoryStub;\nexport const defineSkill = __defineFactoryStub;\nexport const defineView = __defineFactoryStub;\nexport const defineViewField = __defineFactoryStub;\nexport const AggregateOperations = __anyStub;\nexport const DateDisplayFormat = __anyStub;\nexport const FieldMetadataSettingsOnClickAction = __anyStub;\nexport const FieldType = __anyStub;\nexport const HTTPMethod = __anyStub;\nexport const NavigationMenuItemType = __anyStub;\nexport const NumberDataType = __anyStub;\nexport const ObjectRecordGroupByDateGranularity = __anyStub;\nexport const OnDeleteAction = __anyStub;\nexport const PageLayoutTabLayoutMode = __anyStub;\nexport const RelationType = __anyStub;\nexport const RowLevelPermissionPredicateGroupLogicalOperator = __anyStub;\nexport const RowLevelPermissionPredicateOperand = __anyStub;\nexport const STANDARD_OBJECT = __anyStub;\nexport const STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS = __anyStub;\nexport const STANDARD_PAGE_LAYOUT = __anyStub;\nexport const STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS = __anyStub;\nexport const SystemPermissionFlag = __anyStub;\nexport const ViewCalendarLayout = __anyStub;\nexport const ViewFilterGroupLogicalOperator = __anyStub;\nexport const ViewFilterOperand = __anyStub;\nexport const ViewKey = __anyStub;\nexport const ViewOpenRecordIn = __anyStub;\nexport const ViewSortDirection = __anyStub;\nexport const ViewType = __anyStub;\nexport const ViewVisibility = __anyStub;\nexport const canAccessFullAdminPanel = __anyStub;\nexport const canImpersonate = __anyStub;\nexport const every = __anyStub;\nexport const everyDefined = __anyStub;\nexport const everyEquals = __anyStub;\nexport const favoriteRecordIds = __anyStub;\nexport const featureFlags = __anyStub;\nexport const generateDefaultFieldUniversalIdentifier = __anyStub;\nexport const hasAnySoftDeleteFilterOnView = __anyStub;\nexport const includes = __anyStub;\nexport const includesEvery = __anyStub;\nexport const isDashboardPageLayoutInEditMode = __anyStub;\nexport const isDefined = __anyStub;\nexport const isInSidePanel = __anyStub;\nexport const isLayoutCustomizationModeEnabled = __anyStub;\nexport const isNonEmptyString = __anyStub;\nexport const isSelectAll = __anyStub;\nexport const none = __anyStub;\nexport const noneDefined = __anyStub;\nexport const noneEquals = __anyStub;\nexport const numberOfSelectedRecords = __anyStub;\nexport const objectMetadataItem = __anyStub;\nexport const objectMetadataLabel = __anyStub;\nexport const objectPermissions = __anyStub;\nexport const pageType = __anyStub;\nexport const selectedRecords = __anyStub;\nexport const some = __anyStub;\nexport const someDefined = __anyStub;\nexport const someEquals = __anyStub;\nexport const someNonEmptyString = __anyStub;\nexport const targetObjectReadPermissions = __anyStub;\nexport const targetObjectWritePermissions = __anyStub;\nexport const validateFields = __anyStub;\n", "export const PROCESS_RECALL_WEBHOOK_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER =\n '13d9c427-447e-494a-8d3c-1af5d0bacb82';\n", "export const RECALL_WEBHOOK_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER =\n '9215afe6-1497-4149-a49d-e608e239bbaf';\n", "export const RECALL_WEBHOOK_SECRET_ENV_VAR_NAME = 'RECALL_WEBHOOK_SECRET';\n", "import { isArray, isObject } from '@sniptt/guards';\n\nexport const asRecord = (value: unknown): Record<string, unknown> | undefined =>\n isObject(value) && !isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n", "import { asRecord } from 'src/logic-functions/utils/as-record.util';\n\nexport const getRecordAtPath = (\n record: Record<string, unknown> | undefined,\n path: string[],\n): unknown =>\n path.reduce<unknown>(\n (currentValue, pathPart) => asRecord(currentValue)?.[pathPart],\n record,\n );\n", "import { type RecallWebhookBody } from 'src/logic-functions/recall-api/parse-recall-webhook-event.util';\nimport { asRecord } from 'src/logic-functions/utils/as-record.util';\nimport { getRecordAtPath } from 'src/logic-functions/utils/get-record-at-path.util';\n\n// Recall delivers bot metadata under several body shapes per event family; this is the single reader of all of them.\nexport const getRecallWebhookBotMetadata = (\n body: RecallWebhookBody,\n): Record<string, unknown> | undefined => {\n const data = asRecord(body.data);\n const bot = asRecord(body.bot);\n\n return (\n asRecord(bot?.metadata) ??\n asRecord(getRecordAtPath(data, ['bot', 'metadata'])) ??\n asRecord(getRecordAtPath(data, ['recording', 'metadata'])) ??\n asRecord(data?.metadata)\n );\n};\n", "import { isString } from '@sniptt/guards';\n\n// Trimming variant of @sniptt/guards isNonEmptyString, for normalizing at read boundaries.\nexport const isNonEmptyString = (value: unknown): value is string =>\n isString(value) && value.trim() !== '';\n", "import { isNonEmptyString } from 'src/logic-functions/utils/is-non-empty-string.util';\n\nexport const getString = (value: unknown): string | undefined =>\n isNonEmptyString(value) ? value : undefined;\n", "import { getRecallWebhookBotMetadata } from 'src/logic-functions/recall-api/get-recall-webhook-bot-metadata.util';\nimport { type RecallWebhookBody } from 'src/logic-functions/recall-api/parse-recall-webhook-event.util';\nimport { getString } from 'src/logic-functions/utils/get-string.util';\n\nexport const extractTwentyWorkspaceIdFromRecallWebhook = (\n body: RecallWebhookBody,\n): string | undefined =>\n getString(getRecallWebhookBotMetadata(body)?.twentyWorkspaceId);\n", "import { createHmac, timingSafeEqual } from 'crypto';\n\nimport { isUndefined } from '@sniptt/guards';\n\nconst RECALL_WEBHOOK_SECRET_PREFIX = 'whsec_';\nconst RECALL_WEBHOOK_TIMESTAMP_TOLERANCE_SECONDS = 5 * 60;\n\nexport const verifyRecallWebhookSignature = ({\n rawBody,\n headers,\n secret,\n now = new Date(),\n}: {\n rawBody: string;\n headers: Record<string, string | undefined>;\n secret: string;\n now?: Date;\n}): { valid: true } | { valid: false; error: string } => {\n if (!secret.startsWith(RECALL_WEBHOOK_SECRET_PREFIX)) {\n return {\n valid: false,\n error: 'Webhook secret must start with whsec_',\n };\n }\n\n const webhookId = headers['webhook-id'] ?? headers['svix-id'];\n const webhookTimestamp =\n headers['webhook-timestamp'] ?? headers['svix-timestamp'];\n const webhookSignature =\n headers['webhook-signature'] ?? headers['svix-signature'];\n\n if (\n isUndefined(webhookId) ||\n isUndefined(webhookTimestamp) ||\n isUndefined(webhookSignature)\n ) {\n return {\n valid: false,\n error: 'Missing webhook signature headers',\n };\n }\n\n const webhookTimestampSeconds = Number(webhookTimestamp);\n\n if (!Number.isInteger(webhookTimestampSeconds)) {\n return {\n valid: false,\n error: 'Invalid webhook timestamp',\n };\n }\n\n const nowSeconds = Math.floor(now.getTime() / 1000);\n\n if (\n Math.abs(nowSeconds - webhookTimestampSeconds) >\n RECALL_WEBHOOK_TIMESTAMP_TOLERANCE_SECONDS\n ) {\n return {\n valid: false,\n error: 'Webhook timestamp is outside of the allowed tolerance',\n };\n }\n\n const secretBytes = Buffer.from(\n secret.slice(RECALL_WEBHOOK_SECRET_PREFIX.length),\n 'base64',\n );\n const expectedSignature = createHmac('sha256', secretBytes)\n .update(`${webhookId}.${webhookTimestamp}.${rawBody}`)\n .digest('base64');\n const providedSignatures = webhookSignature\n .split(' ')\n .map((signaturePart) => signaturePart.trim())\n .filter((signaturePart) => signaturePart !== '')\n .flatMap((signaturePart) => {\n if (signaturePart.startsWith('v1,') || signaturePart.startsWith('v1=')) {\n return [signaturePart.slice(3).trim()];\n }\n\n return [];\n })\n .filter((signaturePart) => signaturePart !== '');\n\n if (providedSignatures.length === 0) {\n return {\n valid: false,\n error: 'Missing v1 signature',\n };\n }\n\n const expectedSignatureBuffer = Buffer.from(expectedSignature, 'base64');\n\n for (const providedSignature of providedSignatures) {\n const providedSignatureBuffer = Buffer.from(providedSignature, 'base64');\n\n if (providedSignatureBuffer.length !== expectedSignatureBuffer.length) {\n continue;\n }\n\n if (timingSafeEqual(providedSignatureBuffer, expectedSignatureBuffer)) {\n return { valid: true };\n }\n }\n\n return {\n valid: false,\n error: 'Signature verification failed',\n };\n};\n", "// Application and server variables are injected into process.env on every execution.\nexport const getApplicationVariableValue = (key: string): string | undefined =>\n process.env[key];\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["isUndefined", "isString", "isNull", "isObject", "isArray", "isNonEmptyString", "import_guards", "import_guards", "import_guards"]
|
|
7
|
+
}
|