@memberjunction/esignature-pandadoc 0.0.1 → 5.40.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/PandaDocSignatureProvider.d.ts +59 -0
- package/dist/PandaDocSignatureProvider.d.ts.map +1 -0
- package/dist/PandaDocSignatureProvider.js +376 -0
- package/dist/PandaDocSignatureProvider.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/package.json +24 -7
- package/README.md +0 -45
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { BaseSignatureProvider, CreateEnvelopeRequest, EnvelopeResult, EnvelopeStatus, EnvelopeStatusResult, NormalizedSignatureEvent, OperationResult, SignatureOperation, SignatureProviderConfig, SignedDocumentResult, WebhookVerificationResult } from '@memberjunction/esignature';
|
|
2
|
+
/** Maps a PandaDoc document status onto our normalized lifecycle. */
|
|
3
|
+
export declare function mapPandaDocStatus(status: string): EnvelopeStatus;
|
|
4
|
+
/**
|
|
5
|
+
* PandaDoc driver for the MemberJunction eSignature primitive — public v1 REST integration with
|
|
6
|
+
* API-key authentication. Resolved by the engine through `MJGlobal.ClassFactory` by the key
|
|
7
|
+
* `'PandaDoc'`.
|
|
8
|
+
*
|
|
9
|
+
* PandaDoc is document-centric: creating an envelope uploads a document, and (when sending
|
|
10
|
+
* immediately) transitions it to `sent`. Credentials are injected by the engine via
|
|
11
|
+
* {@link initialize}; this provider does not read environment variables.
|
|
12
|
+
*/
|
|
13
|
+
export declare class PandaDocSignatureProvider extends BaseSignatureProvider {
|
|
14
|
+
protected readonly providerKey = "PandaDoc";
|
|
15
|
+
private config;
|
|
16
|
+
initialize(config: SignatureProviderConfig): Promise<void>;
|
|
17
|
+
get IsConfigured(): boolean;
|
|
18
|
+
getSupportedOperations(): SignatureOperation[];
|
|
19
|
+
CreateEnvelope(req: CreateEnvelopeRequest): Promise<EnvelopeResult>;
|
|
20
|
+
GetEnvelopeStatus(externalEnvelopeId: string): Promise<EnvelopeStatusResult>;
|
|
21
|
+
DownloadSignedDocument(externalEnvelopeId: string): Promise<SignedDocumentResult>;
|
|
22
|
+
VoidEnvelope(externalEnvelopeId: string, _reason: string): Promise<OperationResult>;
|
|
23
|
+
/**
|
|
24
|
+
* Normalize a PandaDoc webhook. PandaDoc posts an array of events, each `{ event, data: { id,
|
|
25
|
+
* status, recipients } }`. We take the first document-bearing entry. Returns null if none.
|
|
26
|
+
*/
|
|
27
|
+
ParseWebhookEvent(payload: unknown, _headers: Record<string, string>): NormalizedSignatureEvent | null;
|
|
28
|
+
/**
|
|
29
|
+
* Verify a PandaDoc webhook HMAC. PandaDoc signs the raw request body with HMAC-SHA256 using the
|
|
30
|
+
* webhook's shared key and provides the hex digest in the `signature` query param (mirrored to a
|
|
31
|
+
* header here for transport convenience). Fails closed without a key or raw body.
|
|
32
|
+
*/
|
|
33
|
+
VerifyWebhookSignature(rawBody: Buffer | undefined, headers: Record<string, string>, _payload?: unknown): WebhookVerificationResult;
|
|
34
|
+
private uploadDocument;
|
|
35
|
+
/**
|
|
36
|
+
* Poll until an uploaded document finishes async processing and reaches 'document.draft' (the
|
|
37
|
+
* state from which it can be sent). Bounded by maxAttempts; returns failure on timeout, a hard
|
|
38
|
+
* error status, or a fetch error. PandaDoc recommends polling or webhooks for this transition.
|
|
39
|
+
*/
|
|
40
|
+
private waitForDocumentDraft;
|
|
41
|
+
private delay;
|
|
42
|
+
private sendDocument;
|
|
43
|
+
private mapRecipients;
|
|
44
|
+
private authHeaders;
|
|
45
|
+
private jsonAuthHeaders;
|
|
46
|
+
private firstDocumentEntry;
|
|
47
|
+
private errorText;
|
|
48
|
+
private errorMessage;
|
|
49
|
+
private notConfiguredMessage;
|
|
50
|
+
/** Constant-time hex comparison; false on length mismatch. `Uint8Array.from` strips the
|
|
51
|
+
* Buffer→ArrayBufferLike narrowing TS 5.9's node:crypto typings reject. */
|
|
52
|
+
private safeEqualHex;
|
|
53
|
+
private headerValue;
|
|
54
|
+
private asRecord;
|
|
55
|
+
private readField;
|
|
56
|
+
private readString;
|
|
57
|
+
private readNumber;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=PandaDocSignatureProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PandaDocSignatureProvider.d.ts","sourceRoot":"","sources":["../src/PandaDocSignatureProvider.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,qBAAqB,EACrB,qBAAqB,EACrB,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,wBAAwB,EACxB,eAAe,EAEf,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,yBAAyB,EAC5B,MAAM,4BAA4B,CAAC;AAiBpC,qEAAqE;AACrE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAwBhE;AAMD;;;;;;;;GAQG;AACH,qBACa,yBAA0B,SAAQ,qBAAqB;IAChE,SAAS,CAAC,QAAQ,CAAC,WAAW,cAAc;IAE5C,OAAO,CAAC,MAAM,CAA+B;IAEhC,UAAU,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;IAcvE,IAAW,YAAY,IAAI,OAAO,CAEjC;IAEM,sBAAsB,IAAI,kBAAkB,EAAE;IAaxC,cAAc,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,cAAc,CAAC;IAuCnE,iBAAiB,CAAC,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAuB5E,sBAAsB,CAAC,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAsBjF,YAAY,CAAC,kBAAkB,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAsBhG;;;OAGG;IACI,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,wBAAwB,GAAG,IAAI;IAe7G;;;;OAIG;IACI,sBAAsB,CACzB,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,QAAQ,CAAC,EAAE,OAAO,GACnB,yBAAyB;YAmBd,cAAc;IAuC5B;;;;OAIG;YACW,oBAAoB;IA2BlC,OAAO,CAAC,KAAK;YAIC,YAAY;IAY1B,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,kBAAkB;YAWZ,SAAS;IAKvB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,oBAAoB;IAI5B;gFAC4E;IAC5E,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,UAAU;CAMrB"}
|
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { createHmac, timingSafeEqual } from 'node:crypto';
|
|
8
|
+
import { RegisterClass } from '@memberjunction/global';
|
|
9
|
+
import { BaseSignatureProvider, } from '@memberjunction/esignature';
|
|
10
|
+
/** Maps a PandaDoc document status onto our normalized lifecycle. */
|
|
11
|
+
export function mapPandaDocStatus(status) {
|
|
12
|
+
switch ((status || '').toLowerCase()) {
|
|
13
|
+
case 'document.uploaded':
|
|
14
|
+
case 'document.draft':
|
|
15
|
+
return 'Draft';
|
|
16
|
+
case 'document.sent':
|
|
17
|
+
return 'Sent';
|
|
18
|
+
case 'document.viewed':
|
|
19
|
+
return 'Delivered';
|
|
20
|
+
case 'document.waiting_approval':
|
|
21
|
+
case 'document.approved':
|
|
22
|
+
case 'document.waiting_pay':
|
|
23
|
+
return 'Sent';
|
|
24
|
+
case 'document.completed':
|
|
25
|
+
case 'document.paid':
|
|
26
|
+
return 'Completed';
|
|
27
|
+
case 'document.declined':
|
|
28
|
+
return 'Declined';
|
|
29
|
+
case 'document.voided':
|
|
30
|
+
case 'document.cancelled':
|
|
31
|
+
return 'Voided';
|
|
32
|
+
default:
|
|
33
|
+
return 'Unknown';
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/** PandaDoc sends the body HMAC in this query param (and mirrors it in a header on some setups). */
|
|
37
|
+
const PANDADOC_SIGNATURE_PARAM = 'signature';
|
|
38
|
+
const PANDADOC_SIGNATURE_HEADER = 'x-pandadoc-signature';
|
|
39
|
+
/**
|
|
40
|
+
* PandaDoc driver for the MemberJunction eSignature primitive — public v1 REST integration with
|
|
41
|
+
* API-key authentication. Resolved by the engine through `MJGlobal.ClassFactory` by the key
|
|
42
|
+
* `'PandaDoc'`.
|
|
43
|
+
*
|
|
44
|
+
* PandaDoc is document-centric: creating an envelope uploads a document, and (when sending
|
|
45
|
+
* immediately) transitions it to `sent`. Credentials are injected by the engine via
|
|
46
|
+
* {@link initialize}; this provider does not read environment variables.
|
|
47
|
+
*/
|
|
48
|
+
let PandaDocSignatureProvider = class PandaDocSignatureProvider extends BaseSignatureProvider {
|
|
49
|
+
constructor() {
|
|
50
|
+
super(...arguments);
|
|
51
|
+
this.providerKey = 'PandaDoc';
|
|
52
|
+
this.config = null;
|
|
53
|
+
}
|
|
54
|
+
async initialize(config) {
|
|
55
|
+
const apiKey = this.readString(config, 'apiKey');
|
|
56
|
+
if (!apiKey) {
|
|
57
|
+
this.config = null;
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
this.config = {
|
|
61
|
+
apiKey,
|
|
62
|
+
restBase: this.readString(config, 'restBase') || 'https://api.pandadoc.com/public/v1',
|
|
63
|
+
connectHmacKey: this.readString(config, 'connectHmacKey'),
|
|
64
|
+
readinessIntervalMs: this.readNumber(config, 'readinessIntervalMs') ?? 1500,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
get IsConfigured() {
|
|
68
|
+
return this.config !== null;
|
|
69
|
+
}
|
|
70
|
+
getSupportedOperations() {
|
|
71
|
+
return [
|
|
72
|
+
'CreateEnvelope',
|
|
73
|
+
'GetEnvelopeStatus',
|
|
74
|
+
'DownloadSignedDocument',
|
|
75
|
+
'VoidEnvelope',
|
|
76
|
+
'ParseWebhookEvent',
|
|
77
|
+
'VerifyWebhookSignature',
|
|
78
|
+
];
|
|
79
|
+
}
|
|
80
|
+
// ---- Core operations -------------------------------------------------------------------------
|
|
81
|
+
async CreateEnvelope(req) {
|
|
82
|
+
const config = this.config;
|
|
83
|
+
if (!config) {
|
|
84
|
+
return { Success: false, ErrorMessage: this.notConfiguredMessage() };
|
|
85
|
+
}
|
|
86
|
+
if (!req.documents?.length) {
|
|
87
|
+
return { Success: false, ErrorMessage: 'No documents were provided to sign.' };
|
|
88
|
+
}
|
|
89
|
+
if (!req.recipients?.length) {
|
|
90
|
+
return { Success: false, ErrorMessage: 'No recipients were provided.' };
|
|
91
|
+
}
|
|
92
|
+
try {
|
|
93
|
+
const created = await this.uploadDocument(req, config);
|
|
94
|
+
if (!created.Success || !created.documentId) {
|
|
95
|
+
return created;
|
|
96
|
+
}
|
|
97
|
+
// PandaDoc processing is asynchronous: an uploaded document sits in 'document.uploaded'
|
|
98
|
+
// and can't be sent until it reaches 'document.draft'. Wait for readiness before sending.
|
|
99
|
+
const ready = await this.waitForDocumentDraft(created.documentId, config, 20, config.readinessIntervalMs);
|
|
100
|
+
if (!ready.Success) {
|
|
101
|
+
return { Success: false, externalEnvelopeId: created.documentId, ErrorMessage: ready.ErrorMessage };
|
|
102
|
+
}
|
|
103
|
+
if (req.sendImmediately !== false) {
|
|
104
|
+
const sent = await this.sendDocument(created.documentId, req, config);
|
|
105
|
+
if (!sent.Success) {
|
|
106
|
+
// The document exists as a draft; surface the id so the caller can retry sending.
|
|
107
|
+
return { Success: false, externalEnvelopeId: created.documentId, ErrorMessage: sent.ErrorMessage };
|
|
108
|
+
}
|
|
109
|
+
return { Success: true, externalEnvelopeId: created.documentId, status: 'Sent' };
|
|
110
|
+
}
|
|
111
|
+
return { Success: true, externalEnvelopeId: created.documentId, status: 'Draft' };
|
|
112
|
+
}
|
|
113
|
+
catch (e) {
|
|
114
|
+
return { Success: false, ErrorMessage: this.errorMessage(e) };
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async GetEnvelopeStatus(externalEnvelopeId) {
|
|
118
|
+
const config = this.config;
|
|
119
|
+
if (!config) {
|
|
120
|
+
return { Success: false, status: 'Unknown', ErrorMessage: this.notConfiguredMessage() };
|
|
121
|
+
}
|
|
122
|
+
try {
|
|
123
|
+
const resp = await fetch(`${config.restBase}/documents/${encodeURIComponent(externalEnvelopeId)}`, {
|
|
124
|
+
headers: this.authHeaders(config),
|
|
125
|
+
});
|
|
126
|
+
if (!resp.ok) {
|
|
127
|
+
return { Success: false, status: 'Unknown', ErrorMessage: await this.errorText('status check', resp) };
|
|
128
|
+
}
|
|
129
|
+
const json = (await resp.json());
|
|
130
|
+
return {
|
|
131
|
+
Success: true,
|
|
132
|
+
status: mapPandaDocStatus(json.status || ''),
|
|
133
|
+
recipients: this.mapRecipients(json),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
catch (e) {
|
|
137
|
+
return { Success: false, status: 'Unknown', ErrorMessage: this.errorMessage(e) };
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
async DownloadSignedDocument(externalEnvelopeId) {
|
|
141
|
+
const config = this.config;
|
|
142
|
+
if (!config) {
|
|
143
|
+
return { Success: false, ErrorMessage: this.notConfiguredMessage() };
|
|
144
|
+
}
|
|
145
|
+
try {
|
|
146
|
+
const resp = await fetch(`${config.restBase}/documents/${encodeURIComponent(externalEnvelopeId)}/download`, {
|
|
147
|
+
headers: this.authHeaders(config),
|
|
148
|
+
});
|
|
149
|
+
if (!resp.ok) {
|
|
150
|
+
return { Success: false, ErrorMessage: await this.errorText('document download', resp) };
|
|
151
|
+
}
|
|
152
|
+
const bytes = Buffer.from(await resp.arrayBuffer());
|
|
153
|
+
return {
|
|
154
|
+
Success: true,
|
|
155
|
+
document: { bytes, filename: `${externalEnvelopeId}.pdf`, contentType: 'application/pdf' },
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
catch (e) {
|
|
159
|
+
return { Success: false, ErrorMessage: this.errorMessage(e) };
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
async VoidEnvelope(externalEnvelopeId, _reason) {
|
|
163
|
+
const config = this.config;
|
|
164
|
+
if (!config) {
|
|
165
|
+
return { Success: false, ErrorMessage: this.notConfiguredMessage() };
|
|
166
|
+
}
|
|
167
|
+
try {
|
|
168
|
+
// PandaDoc has no "void" verb; deleting the document moves it to a cancelled/voided state.
|
|
169
|
+
const resp = await fetch(`${config.restBase}/documents/${encodeURIComponent(externalEnvelopeId)}`, {
|
|
170
|
+
method: 'DELETE',
|
|
171
|
+
headers: this.authHeaders(config),
|
|
172
|
+
});
|
|
173
|
+
if (!resp.ok) {
|
|
174
|
+
return { Success: false, ErrorMessage: await this.errorText('void (delete)', resp) };
|
|
175
|
+
}
|
|
176
|
+
return { Success: true };
|
|
177
|
+
}
|
|
178
|
+
catch (e) {
|
|
179
|
+
return { Success: false, ErrorMessage: this.errorMessage(e) };
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// ---- Inbound webhook -------------------------------------------------------------------------
|
|
183
|
+
/**
|
|
184
|
+
* Normalize a PandaDoc webhook. PandaDoc posts an array of events, each `{ event, data: { id,
|
|
185
|
+
* status, recipients } }`. We take the first document-bearing entry. Returns null if none.
|
|
186
|
+
*/
|
|
187
|
+
ParseWebhookEvent(payload, _headers) {
|
|
188
|
+
const entry = this.firstDocumentEntry(payload);
|
|
189
|
+
const data = this.asRecord(entry?.data);
|
|
190
|
+
const documentId = this.readField(data, 'id');
|
|
191
|
+
if (!documentId) {
|
|
192
|
+
return null;
|
|
193
|
+
}
|
|
194
|
+
return {
|
|
195
|
+
externalEnvelopeId: documentId,
|
|
196
|
+
status: mapPandaDocStatus(this.readField(data, 'status') ?? ''),
|
|
197
|
+
occurredAt: this.readField(entry, 'event_time') ?? new Date().toISOString(),
|
|
198
|
+
raw: payload,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Verify a PandaDoc webhook HMAC. PandaDoc signs the raw request body with HMAC-SHA256 using the
|
|
203
|
+
* webhook's shared key and provides the hex digest in the `signature` query param (mirrored to a
|
|
204
|
+
* header here for transport convenience). Fails closed without a key or raw body.
|
|
205
|
+
*/
|
|
206
|
+
VerifyWebhookSignature(rawBody, headers, _payload) {
|
|
207
|
+
const secret = this.config?.connectHmacKey;
|
|
208
|
+
if (!secret) {
|
|
209
|
+
return 'NotConfigured';
|
|
210
|
+
}
|
|
211
|
+
// A secret IS configured, so any failure to match below is a hard reject.
|
|
212
|
+
if (!rawBody) {
|
|
213
|
+
return 'Failed';
|
|
214
|
+
}
|
|
215
|
+
const provided = this.headerValue(headers, PANDADOC_SIGNATURE_HEADER) ?? this.headerValue(headers, PANDADOC_SIGNATURE_PARAM);
|
|
216
|
+
if (!provided) {
|
|
217
|
+
return 'Failed';
|
|
218
|
+
}
|
|
219
|
+
const expected = createHmac('sha256', secret).update(new Uint8Array(rawBody)).digest('hex');
|
|
220
|
+
return this.safeEqualHex(provided, expected) ? 'Verified' : 'Failed';
|
|
221
|
+
}
|
|
222
|
+
// ---- PandaDoc request construction -----------------------------------------------------------
|
|
223
|
+
async uploadDocument(req, config) {
|
|
224
|
+
const form = new FormData();
|
|
225
|
+
const firstDoc = req.documents[0];
|
|
226
|
+
const blob = new Blob([new Uint8Array(firstDoc.bytes)], { type: firstDoc.contentType || 'application/pdf' });
|
|
227
|
+
form.append('file', blob, firstDoc.filename);
|
|
228
|
+
form.append('data', JSON.stringify({
|
|
229
|
+
name: req.title || 'Please sign this document',
|
|
230
|
+
recipients: req.recipients.map((r, i) => ({
|
|
231
|
+
email: r.email,
|
|
232
|
+
first_name: (r.name || r.email).split(' ')[0],
|
|
233
|
+
last_name: (r.name || '').split(' ').slice(1).join(' ') || undefined,
|
|
234
|
+
role: r.role,
|
|
235
|
+
signing_order: r.routingOrder ?? i + 1,
|
|
236
|
+
})),
|
|
237
|
+
parse_form_fields: false,
|
|
238
|
+
metadata: req.metadata,
|
|
239
|
+
}));
|
|
240
|
+
const resp = await fetch(`${config.restBase}/documents`, {
|
|
241
|
+
method: 'POST',
|
|
242
|
+
headers: this.authHeaders(config),
|
|
243
|
+
body: form,
|
|
244
|
+
});
|
|
245
|
+
if (!resp.ok) {
|
|
246
|
+
return { Success: false, ErrorMessage: await this.errorText('document upload', resp) };
|
|
247
|
+
}
|
|
248
|
+
const json = (await resp.json());
|
|
249
|
+
if (!json.id) {
|
|
250
|
+
return { Success: false, ErrorMessage: 'PandaDoc did not return a document id.' };
|
|
251
|
+
}
|
|
252
|
+
return { Success: true, documentId: json.id, status: mapPandaDocStatus(json.status || 'document.uploaded') };
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Poll until an uploaded document finishes async processing and reaches 'document.draft' (the
|
|
256
|
+
* state from which it can be sent). Bounded by maxAttempts; returns failure on timeout, a hard
|
|
257
|
+
* error status, or a fetch error. PandaDoc recommends polling or webhooks for this transition.
|
|
258
|
+
*/
|
|
259
|
+
async waitForDocumentDraft(documentId, config, maxAttempts = 20, intervalMs = 1500) {
|
|
260
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
261
|
+
const resp = await fetch(`${config.restBase}/documents/${encodeURIComponent(documentId)}`, {
|
|
262
|
+
headers: this.authHeaders(config),
|
|
263
|
+
});
|
|
264
|
+
if (!resp.ok) {
|
|
265
|
+
return { Success: false, ErrorMessage: await this.errorText('readiness check', resp) };
|
|
266
|
+
}
|
|
267
|
+
const json = (await resp.json());
|
|
268
|
+
const status = (json.status || '').toLowerCase();
|
|
269
|
+
if (status === 'document.draft') {
|
|
270
|
+
return { Success: true };
|
|
271
|
+
}
|
|
272
|
+
if (status && status !== 'document.uploaded') {
|
|
273
|
+
// Any non-uploaded, non-draft status here is unexpected during processing (e.g. error).
|
|
274
|
+
return { Success: false, ErrorMessage: `Document reached unexpected status '${json.status}' during processing.` };
|
|
275
|
+
}
|
|
276
|
+
await this.delay(intervalMs);
|
|
277
|
+
}
|
|
278
|
+
return { Success: false, ErrorMessage: `Document did not reach 'document.draft' within ${maxAttempts} attempts.` };
|
|
279
|
+
}
|
|
280
|
+
delay(ms) {
|
|
281
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
282
|
+
}
|
|
283
|
+
async sendDocument(documentId, req, config) {
|
|
284
|
+
const resp = await fetch(`${config.restBase}/documents/${encodeURIComponent(documentId)}/send`, {
|
|
285
|
+
method: 'POST',
|
|
286
|
+
headers: this.jsonAuthHeaders(config),
|
|
287
|
+
body: JSON.stringify({ subject: req.title, message: req.message, silent: false }),
|
|
288
|
+
});
|
|
289
|
+
if (!resp.ok) {
|
|
290
|
+
return { Success: false, ErrorMessage: await this.errorText('send', resp) };
|
|
291
|
+
}
|
|
292
|
+
return { Success: true };
|
|
293
|
+
}
|
|
294
|
+
mapRecipients(doc) {
|
|
295
|
+
if (!doc.recipients?.length) {
|
|
296
|
+
return undefined;
|
|
297
|
+
}
|
|
298
|
+
return doc.recipients.map((r) => ({
|
|
299
|
+
email: r.email,
|
|
300
|
+
name: [r.first_name, r.last_name].filter(Boolean).join(' ') || undefined,
|
|
301
|
+
status: r.has_completed ? 'Signed' : 'Sent',
|
|
302
|
+
externalRecipientId: r.id,
|
|
303
|
+
}));
|
|
304
|
+
}
|
|
305
|
+
// ---- HTTP + small helpers --------------------------------------------------------------------
|
|
306
|
+
authHeaders(config) {
|
|
307
|
+
return { Authorization: `API-Key ${config.apiKey}` };
|
|
308
|
+
}
|
|
309
|
+
jsonAuthHeaders(config) {
|
|
310
|
+
return { Authorization: `API-Key ${config.apiKey}`, 'Content-Type': 'application/json' };
|
|
311
|
+
}
|
|
312
|
+
firstDocumentEntry(payload) {
|
|
313
|
+
const events = Array.isArray(payload) ? payload : [payload];
|
|
314
|
+
for (const e of events) {
|
|
315
|
+
const rec = this.asRecord(e);
|
|
316
|
+
if (rec && this.asRecord(rec.data)) {
|
|
317
|
+
return rec;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
return undefined;
|
|
321
|
+
}
|
|
322
|
+
async errorText(operation, resp) {
|
|
323
|
+
const text = await resp.text().catch(() => '');
|
|
324
|
+
return `PandaDoc ${operation} failed (${resp.status}): ${text}`;
|
|
325
|
+
}
|
|
326
|
+
errorMessage(e) {
|
|
327
|
+
return e instanceof Error ? e.message : String(e);
|
|
328
|
+
}
|
|
329
|
+
notConfiguredMessage() {
|
|
330
|
+
return 'PandaDoc is not configured. Provide an apiKey via the Credential Engine.';
|
|
331
|
+
}
|
|
332
|
+
/** Constant-time hex comparison; false on length mismatch. `Uint8Array.from` strips the
|
|
333
|
+
* Buffer→ArrayBufferLike narrowing TS 5.9's node:crypto typings reject. */
|
|
334
|
+
safeEqualHex(a, b) {
|
|
335
|
+
const bufA = Buffer.from(a, 'hex');
|
|
336
|
+
const bufB = Buffer.from(b, 'hex');
|
|
337
|
+
return bufA.length === bufB.length && timingSafeEqual(Uint8Array.from(bufA), Uint8Array.from(bufB));
|
|
338
|
+
}
|
|
339
|
+
headerValue(headers, name) {
|
|
340
|
+
const direct = headers[name];
|
|
341
|
+
if (direct) {
|
|
342
|
+
return direct;
|
|
343
|
+
}
|
|
344
|
+
const lower = name.toLowerCase();
|
|
345
|
+
for (const [k, v] of Object.entries(headers)) {
|
|
346
|
+
if (k.toLowerCase() === lower) {
|
|
347
|
+
return v;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
return undefined;
|
|
351
|
+
}
|
|
352
|
+
asRecord(value) {
|
|
353
|
+
return value && typeof value === 'object' ? value : undefined;
|
|
354
|
+
}
|
|
355
|
+
readField(obj, key) {
|
|
356
|
+
const v = obj?.[key];
|
|
357
|
+
return typeof v === 'string' && v.length > 0 ? v : undefined;
|
|
358
|
+
}
|
|
359
|
+
readString(config, key) {
|
|
360
|
+
const value = config[key];
|
|
361
|
+
return typeof value === 'string' ? value : undefined;
|
|
362
|
+
}
|
|
363
|
+
readNumber(config, key) {
|
|
364
|
+
const value = config[key];
|
|
365
|
+
if (typeof value === 'number')
|
|
366
|
+
return value;
|
|
367
|
+
if (typeof value === 'string' && value.trim() !== '' && !Number.isNaN(Number(value)))
|
|
368
|
+
return Number(value);
|
|
369
|
+
return undefined;
|
|
370
|
+
}
|
|
371
|
+
};
|
|
372
|
+
PandaDocSignatureProvider = __decorate([
|
|
373
|
+
RegisterClass(BaseSignatureProvider, 'PandaDoc')
|
|
374
|
+
], PandaDocSignatureProvider);
|
|
375
|
+
export { PandaDocSignatureProvider };
|
|
376
|
+
//# sourceMappingURL=PandaDocSignatureProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PandaDocSignatureProvider.js","sourceRoot":"","sources":["../src/PandaDocSignatureProvider.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,6BAA6B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// PUBLIC API SURFACE AREA
|
|
2
|
+
// Side-effect: importing this barrel registers the PandaDoc driver with MJGlobal.ClassFactory
|
|
3
|
+
// via the @RegisterClass decorator on PandaDocSignatureProvider.
|
|
4
|
+
export * from './PandaDocSignatureProvider.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,8FAA8F;AAC9F,iEAAiE;AACjE,cAAc,6BAA6B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,27 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/esignature-pandadoc",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
5
|
-
"
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
"version": "5.40.1",
|
|
4
|
+
"description": "PandaDoc driver for the MemberJunction eSignature primitive. Registers a BaseSignatureProvider implementation via @RegisterClass(BaseSignatureProvider, 'PandaDoc') using the PandaDoc public v1 REST API and API-key authentication.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"/dist"
|
|
10
|
+
],
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc && tsc-alias -f",
|
|
13
|
+
"watch": "tsc -w",
|
|
14
|
+
"test": "vitest run",
|
|
15
|
+
"test:watch": "vitest",
|
|
16
|
+
"test:coverage": "vitest run --coverage"
|
|
17
|
+
},
|
|
18
|
+
"license": "ISC",
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "https://github.com/MemberJunction/MJ"
|
|
22
|
+
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"@memberjunction/esignature": "5.40.1",
|
|
25
|
+
"@memberjunction/global": "5.40.1"
|
|
26
|
+
}
|
|
10
27
|
}
|
package/README.md
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
# @memberjunction/esignature-pandadoc
|
|
2
|
-
|
|
3
|
-
## ⚠️ IMPORTANT NOTICE ⚠️
|
|
4
|
-
|
|
5
|
-
**This package is created solely for the purpose of setting up OIDC (OpenID Connect) trusted publishing with npm.**
|
|
6
|
-
|
|
7
|
-
This is **NOT** a functional package and contains **NO** code or functionality beyond the OIDC setup configuration.
|
|
8
|
-
|
|
9
|
-
## Purpose
|
|
10
|
-
|
|
11
|
-
This package exists to:
|
|
12
|
-
1. Configure OIDC trusted publishing for the package name `@memberjunction/esignature-pandadoc`
|
|
13
|
-
2. Enable secure, token-less publishing from CI/CD workflows
|
|
14
|
-
3. Establish provenance for packages published under this name
|
|
15
|
-
|
|
16
|
-
## What is OIDC Trusted Publishing?
|
|
17
|
-
|
|
18
|
-
OIDC trusted publishing allows package maintainers to publish packages directly from their CI/CD workflows without needing to manage npm access tokens. Instead, it uses OpenID Connect to establish trust between the CI/CD provider (like GitHub Actions) and npm.
|
|
19
|
-
|
|
20
|
-
## Setup Instructions
|
|
21
|
-
|
|
22
|
-
To properly configure OIDC trusted publishing for this package:
|
|
23
|
-
|
|
24
|
-
1. Go to [npmjs.com](https://www.npmjs.com/) and navigate to your package settings
|
|
25
|
-
2. Configure the trusted publisher (e.g., GitHub Actions)
|
|
26
|
-
3. Specify the repository and workflow that should be allowed to publish
|
|
27
|
-
4. Use the configured workflow to publish your actual package
|
|
28
|
-
|
|
29
|
-
## DO NOT USE THIS PACKAGE
|
|
30
|
-
|
|
31
|
-
This package is a placeholder for OIDC configuration only. It:
|
|
32
|
-
- Contains no executable code
|
|
33
|
-
- Provides no functionality
|
|
34
|
-
- Should not be installed as a dependency
|
|
35
|
-
- Exists only for administrative purposes
|
|
36
|
-
|
|
37
|
-
## More Information
|
|
38
|
-
|
|
39
|
-
For more details about npm's trusted publishing feature, see:
|
|
40
|
-
- [npm Trusted Publishing Documentation](https://docs.npmjs.com/generating-provenance-statements)
|
|
41
|
-
- [GitHub Actions OIDC Documentation](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect)
|
|
42
|
-
|
|
43
|
-
---
|
|
44
|
-
|
|
45
|
-
**Maintained for OIDC setup purposes only**
|