@memberjunction/integration-engine 5.40.2 → 5.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -0
- package/dist/BaseIntegrationConnector.d.ts +109 -0
- package/dist/BaseIntegrationConnector.d.ts.map +1 -1
- package/dist/BaseIntegrationConnector.js +308 -93
- package/dist/BaseIntegrationConnector.js.map +1 -1
- package/dist/BaseRESTIntegrationConnector.d.ts +32 -0
- package/dist/BaseRESTIntegrationConnector.d.ts.map +1 -1
- package/dist/BaseRESTIntegrationConnector.js +182 -28
- package/dist/BaseRESTIntegrationConnector.js.map +1 -1
- package/dist/ContentHash.d.ts +22 -0
- package/dist/ContentHash.d.ts.map +1 -1
- package/dist/ContentHash.js +35 -0
- package/dist/ContentHash.js.map +1 -1
- package/dist/CustomColumnPromotion.d.ts +108 -0
- package/dist/CustomColumnPromotion.d.ts.map +1 -0
- package/dist/CustomColumnPromotion.js +202 -0
- package/dist/CustomColumnPromotion.js.map +1 -0
- package/dist/CustomOverflow.d.ts +64 -0
- package/dist/CustomOverflow.d.ts.map +1 -0
- package/dist/CustomOverflow.js +74 -0
- package/dist/CustomOverflow.js.map +1 -0
- package/dist/FieldMappingEngine.d.ts.map +1 -1
- package/dist/FieldMappingEngine.js +22 -3
- package/dist/FieldMappingEngine.js.map +1 -1
- package/dist/IntegrationConnectorCreationPipeline.d.ts +33 -0
- package/dist/IntegrationConnectorCreationPipeline.d.ts.map +1 -1
- package/dist/IntegrationConnectorCreationPipeline.js +157 -0
- package/dist/IntegrationConnectorCreationPipeline.js.map +1 -1
- package/dist/IntegrationEngine.d.ts +106 -6
- package/dist/IntegrationEngine.d.ts.map +1 -1
- package/dist/IntegrationEngine.js +874 -170
- package/dist/IntegrationEngine.js.map +1 -1
- package/dist/IntegrationSchemaSync.d.ts +84 -13
- package/dist/IntegrationSchemaSync.d.ts.map +1 -1
- package/dist/IntegrationSchemaSync.js +198 -36
- package/dist/IntegrationSchemaSync.js.map +1 -1
- package/dist/KeySerialization.d.ts +21 -0
- package/dist/KeySerialization.d.ts.map +1 -0
- package/dist/KeySerialization.js +29 -0
- package/dist/KeySerialization.js.map +1 -0
- package/dist/MatchEngine.d.ts.map +1 -1
- package/dist/MatchEngine.js +12 -4
- package/dist/MatchEngine.js.map +1 -1
- package/dist/RecordFlatten.d.ts +49 -0
- package/dist/RecordFlatten.d.ts.map +1 -0
- package/dist/RecordFlatten.js +50 -0
- package/dist/RecordFlatten.js.map +1 -0
- package/dist/StreamingDiscovery.d.ts +145 -0
- package/dist/StreamingDiscovery.d.ts.map +1 -0
- package/dist/StreamingDiscovery.js +306 -0
- package/dist/StreamingDiscovery.js.map +1 -0
- package/dist/SyncLogger.d.ts +1 -1
- package/dist/SyncLogger.d.ts.map +1 -1
- package/dist/SyncLogger.js +19 -1
- package/dist/SyncLogger.js.map +1 -1
- package/dist/auth-helpers/BasicAuthHeaderBuilder.d.ts +36 -0
- package/dist/auth-helpers/BasicAuthHeaderBuilder.d.ts.map +1 -0
- package/dist/auth-helpers/BasicAuthHeaderBuilder.js +38 -0
- package/dist/auth-helpers/BasicAuthHeaderBuilder.js.map +1 -0
- package/dist/auth-helpers/OAuth1aSigner.d.ts +56 -0
- package/dist/auth-helpers/OAuth1aSigner.d.ts.map +1 -0
- package/dist/auth-helpers/OAuth1aSigner.js +91 -0
- package/dist/auth-helpers/OAuth1aSigner.js.map +1 -0
- package/dist/auth-helpers/OAuth2TokenManager.d.ts +103 -0
- package/dist/auth-helpers/OAuth2TokenManager.d.ts.map +1 -0
- package/dist/auth-helpers/OAuth2TokenManager.js +143 -0
- package/dist/auth-helpers/OAuth2TokenManager.js.map +1 -0
- package/dist/auth-helpers/index.d.ts +11 -0
- package/dist/auth-helpers/index.d.ts.map +1 -0
- package/dist/auth-helpers/index.js +8 -0
- package/dist/auth-helpers/index.js.map +1 -0
- package/dist/index.d.ts +15 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +73 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +7 -7
package/README.md
CHANGED
|
@@ -157,3 +157,37 @@ const result = await orchestrator.RunSync(
|
|
|
157
157
|
- `DiscoverFields(companyIntegration, objectName, contextUser)` — Lists fields on an object
|
|
158
158
|
- `FetchChanges(ctx)` — Fetches a batch of changed records
|
|
159
159
|
- `GetDefaultFieldMappings(objectName, entityName)` — Suggests default mappings
|
|
160
|
+
|
|
161
|
+
## Environment Variables
|
|
162
|
+
|
|
163
|
+
Operator-tunable knobs read from the process environment. All are optional with safe defaults.
|
|
164
|
+
|
|
165
|
+
### Schema materialization caps (operator guardrails)
|
|
166
|
+
|
|
167
|
+
These bound what a `create-tables` / RSU apply (`IntegrationApplyAll` / `ApplyAllBatch` / `ApplySchemaBatch`) may materialize. They are **deliberately env-only — NOT per-connection or GraphQL-settable** — because a cap a user could raise via the same API they apply with would be no guardrail. An over-limit selection is **rejected with a clear error (never truncated)**; discovery still surfaces every object/field, only materialization is capped.
|
|
168
|
+
|
|
169
|
+
| Var | Default | Effect |
|
|
170
|
+
|---|---|---|
|
|
171
|
+
| `MJ_INTEGRATION_MAX_TABLES` | unset = unbounded | Max tables a single apply may select; over-limit → apply rejected. |
|
|
172
|
+
| `MJ_INTEGRATION_MAX_COLUMNS_PER_TABLE` | unset = unbounded | Max columns any one selected table may have; over-limit → apply rejected. |
|
|
173
|
+
|
|
174
|
+
### Discovery (stage-2 streaming field discovery — no-describe / file-feed sources only)
|
|
175
|
+
|
|
176
|
+
Bound the data sample used to build a column corpus + lightweight PK guess (NOT a full scan). Also overridable **per-connection** via `IntegrationSetSyncConfig` (`discoveryBatchSize` / `discoveryMaxRecords` / `discoveryTimeBudgetMs`); precedence is explicit-opts > per-connection Configuration > env > default.
|
|
177
|
+
|
|
178
|
+
| Var | Default | Effect |
|
|
179
|
+
|---|---|---|
|
|
180
|
+
| `MJ_INTEGRATION_DISCOVERY_MAX_RECORDS` | 500 | Max records sampled before discovery stops and uses what it gathered. |
|
|
181
|
+
| `MJ_INTEGRATION_DISCOVERY_BATCH_SIZE` | 500 | Records per `FetchChanges` page during discovery. |
|
|
182
|
+
| `MJ_INTEGRATION_DISCOVERY_TIME_BUDGET_MS` | 300000 (5 min) | Wall-clock budget for the read-path discovery sweep. |
|
|
183
|
+
| `MJ_INTEGRATION_DISCOVERY_COMPOSITE_ROW_CAP` | 2000 | Row cap for composite-PK uniqueness checking. |
|
|
184
|
+
| `MJ_INTEGRATION_DISCOVERY_MAX_DISTINCT` | 100000 | Cap on distinct values tracked per field for uniqueness inference. |
|
|
185
|
+
| `MJ_INTEGRATION_DISCOVERY_SAMPLE_VALUE_CAP` | 10 | Sample values retained per field (for type/shape inference). |
|
|
186
|
+
|
|
187
|
+
### Sync / runtime
|
|
188
|
+
|
|
189
|
+
| Var | Default | Effect |
|
|
190
|
+
|---|---|---|
|
|
191
|
+
| `MJ_INTEGRATION_FULL_PUSH_MAX_RECORDS` | unset = unbounded | Cap on records pushed in a single full push. |
|
|
192
|
+
| `MJ_INTEGRATION_MAX_RUNS_PER_CI` | 100 | Run-history rows retained per CompanyIntegration (≤0 disables pruning). |
|
|
193
|
+
| `MJ_INTEGRATION_VERBOSE_RECORD_LOGS` | off | When `true`, emits per-record console logs (structured artifacts are unaffected either way). |
|
|
@@ -2,6 +2,7 @@ import type { UserInfo } from '@memberjunction/core';
|
|
|
2
2
|
import type { MJCompanyIntegrationEntity } from '@memberjunction/core-entities';
|
|
3
3
|
import type { IntegrationObjectInfo, ActionGeneratorConfig } from './ActionMetadataGenerator.js';
|
|
4
4
|
import type { ExternalRecord, DefaultFieldMapping, SourceSchemaInfo, IntrospectSchemaOptions, CreateRecordContext, UpdateRecordContext, UpsertRecordContext, DeleteRecordContext, GetRecordContext, CRUDResult, SearchContext, SearchResult, ListContext, ListResult } from './types.js';
|
|
5
|
+
import { type StreamDiscoveryOptions, type PkPickOptions } from './StreamingDiscovery.js';
|
|
5
6
|
/** Result of testing a connection to an external system */
|
|
6
7
|
export interface ConnectionTestResult {
|
|
7
8
|
/** Whether the connection was successful */
|
|
@@ -105,6 +106,20 @@ export interface FetchContext {
|
|
|
105
106
|
AfterKeyValue?: string | null;
|
|
106
107
|
/** Optional list of source field names to request from the external API. When provided, the connector should limit the returned fields to this set. */
|
|
107
108
|
RequestedSourceFields?: string[];
|
|
109
|
+
/**
|
|
110
|
+
* Adaptive rate-limit hooks (plan.md §7), supplied by the engine so a connector's INNER request
|
|
111
|
+
* loop (e.g. a second-layer/parent-iterated object that fires one request per parent) is governed
|
|
112
|
+
* by the SAME per-credential AIMD token bucket that paces the outer object level — instead of a
|
|
113
|
+
* fixed self-throttle that defeats concurrency and ignores 429 back-off. Optional + back-compat: a
|
|
114
|
+
* connector that ignores them behaves exactly as before; the engine omits them when unavailable.
|
|
115
|
+
*
|
|
116
|
+
* - `RateLimitAcquire()` — await one token from the adaptive bucket before each inner request.
|
|
117
|
+
* - `RateLimitReport(err?)` — feed the outcome back so the rate auto-tunes (clean → ramp up, 429 → back off).
|
|
118
|
+
* - `MaxConcurrency` — the engine's resolved in-flight cap for inner requests (>=1).
|
|
119
|
+
*/
|
|
120
|
+
RateLimitAcquire?: () => Promise<void>;
|
|
121
|
+
RateLimitReport?: (throttledErr?: unknown) => void;
|
|
122
|
+
MaxConcurrency?: number;
|
|
108
123
|
}
|
|
109
124
|
/**
|
|
110
125
|
* A non-fatal diagnostic a connector attaches to a fetch result so the engine surfaces it in the
|
|
@@ -208,6 +223,17 @@ export interface RateLimitPolicy {
|
|
|
208
223
|
Burst?: number;
|
|
209
224
|
/** Multiplicative-decrease factor applied on a throttle signal (0 < f < 1). */
|
|
210
225
|
ThrottleBackoffFactor?: number;
|
|
226
|
+
/**
|
|
227
|
+
* How fast the effective rate ramps back up per successful call after a throttle (additive
|
|
228
|
+
* increase). Lower = more conservative recovery. Default: TokensPerSec/10 (≈10 successes to
|
|
229
|
+
* fully recover). Set low for an API that stays throttled for a while after a 429.
|
|
230
|
+
*/
|
|
231
|
+
SuccessRampPerCall?: number;
|
|
232
|
+
/**
|
|
233
|
+
* Floor the effective rate never drops below, even after repeated throttles (tokens/sec).
|
|
234
|
+
* Default: TokensPerSec/20. Set when the vendor guarantees a minimum service rate.
|
|
235
|
+
*/
|
|
236
|
+
MinTokensPerSec?: number;
|
|
211
237
|
}
|
|
212
238
|
export declare abstract class BaseIntegrationConnector {
|
|
213
239
|
/** Whether this connector supports reading/fetching records. Always true. */
|
|
@@ -283,6 +309,20 @@ export declare abstract class BaseIntegrationConnector {
|
|
|
283
309
|
* Override to push to the source's real limits.
|
|
284
310
|
*/
|
|
285
311
|
get RateLimitPolicy(): RateLimitPolicy | null;
|
|
312
|
+
/**
|
|
313
|
+
* Whether the watermark this connector returns (`FetchBatchResult.NewWatermarkValue`) is a
|
|
314
|
+
* RELIABLE, monotonically-increasing global maximum — i.e. the connector fetches in watermark
|
|
315
|
+
* order so the last batch's value IS the true high-water mark, and an updated record always
|
|
316
|
+
* re-surfaces at a NEW (higher) watermark. When `true`, the engine uses that watermark to NARROW
|
|
317
|
+
* the next incremental (instead of advancing a full sync to wall-clock "now", and instead of the
|
|
318
|
+
* keyset clear-and-re-scan), so incrementals fetch only what's new.
|
|
319
|
+
*
|
|
320
|
+
* Default `false` — the safe, backwards-compatible choice: a connector whose source returns
|
|
321
|
+
* records out of watermark order (e.g. HubSpot's creation-ordered list API, where the last batch
|
|
322
|
+
* can carry old modstamps) MUST stay false so the engine keeps advancing to "now" and never saves
|
|
323
|
+
* a stale watermark. Override to `true` ONLY when the source guarantees monotonic ordering.
|
|
324
|
+
*/
|
|
325
|
+
get MonotonicWatermark(): boolean;
|
|
286
326
|
/**
|
|
287
327
|
* Parse a Retry-After / rate-limit signal out of a failed response or thrown error into
|
|
288
328
|
* milliseconds so the engine can back off precisely. Return `undefined` when the error is not a
|
|
@@ -316,6 +356,65 @@ export declare abstract class BaseIntegrationConnector {
|
|
|
316
356
|
* applies target-type constraint enforcement; this is the connector-side complement.
|
|
317
357
|
*/
|
|
318
358
|
PostProcessRecord(record: ExternalRecord): ExternalRecord;
|
|
359
|
+
/**
|
|
360
|
+
* Stage-2 field discovery for sources WITHOUT a describe/introspection endpoint (file feeds,
|
|
361
|
+
* undocumented JSON list endpoints): stream the source's actual records — READ-ONLY, no save,
|
|
362
|
+
* no ack — and derive the full field set + data-informed PK/uniqueness/nullability from the
|
|
363
|
+
* gathered statistics. The connector supplies whatever read-only fetch yields the records; this
|
|
364
|
+
* helper turns that stream into `ExternalFieldSchema[]`.
|
|
365
|
+
*
|
|
366
|
+
* Why data-informed: streaming the real values lets `pickPrimaryKeyFromStats` pick the PK from
|
|
367
|
+
* evidence (uniqueness/non-null statistics) COMBINED with the naming convention, rather than a
|
|
368
|
+
* name guess alone. The PK is a SOFT key, so the pick is best-available, not strict-significance:
|
|
369
|
+
* a confident unique+non-null column wins outright; otherwise a near-unique / convention-named
|
|
370
|
+
* column is taken as a soft key (a PK-less object would stall CodeGen). The scan is time-bounded —
|
|
371
|
+
* it stops on exhaustion OR `opts.Discovery.TimeBudgetMs`; more rows simply mean stronger claims.
|
|
372
|
+
*
|
|
373
|
+
* Provable-only encoding into the standard flags:
|
|
374
|
+
* - `IsPrimaryKey` — set ONLY on the single statistics-first pick. Multiple equally-ranked unique
|
|
375
|
+
* columns leave PK unset here (ambiguous → the pipeline's `SoftPKClassifier` LLM tiebreaker
|
|
376
|
+
* decides, fed these same stats). Zero unique columns → no PK is fabricated.
|
|
377
|
+
* - `IsUniqueKey` — set when the column was all-distinct over the scan AND uniqueness was provable
|
|
378
|
+
* (the distinct-cap wasn't hit).
|
|
379
|
+
* - `AllowsNull` — asserted `true` ONLY when a null/absent value was actually observed; otherwise
|
|
380
|
+
* left undefined (permissive default). Never fabricates NOT NULL — critical under a time-capped
|
|
381
|
+
* partial scan where unseen rows could still be null.
|
|
382
|
+
*
|
|
383
|
+
* The PK emitted here is SOFT (it rides additionalSchemaInfo via the persist + DDL path; it is
|
|
384
|
+
* NEVER a hard DB key), so a wrong inference can never reject a valid row — the engine dedupes via
|
|
385
|
+
* the record-map. `IsReadOnly` defaults to true (stream discovery targets read feeds); a writable
|
|
386
|
+
* source overrides via `opts.ReadOnly`.
|
|
387
|
+
*
|
|
388
|
+
* @param records - A read-only sync/async iterable of source records (the caller's fetch yields them).
|
|
389
|
+
* @param opts.Discovery - Time budget / sample caps for the scan (see {@link StreamDiscoveryOptions}).
|
|
390
|
+
* @param opts.Pk - Significance threshold + naming-rank tiebreaker (see {@link PkPickOptions}).
|
|
391
|
+
* @param opts.ReadOnly - Whether discovered fields are read-only. Default true.
|
|
392
|
+
*/
|
|
393
|
+
protected DiscoverFieldsViaStream(records: AsyncIterable<Record<string, unknown>> | Iterable<Record<string, unknown>>, opts?: {
|
|
394
|
+
Discovery?: StreamDiscoveryOptions;
|
|
395
|
+
Pk?: PkPickOptions;
|
|
396
|
+
ReadOnly?: boolean;
|
|
397
|
+
}): Promise<ExternalFieldSchema[]>;
|
|
398
|
+
/**
|
|
399
|
+
* Discovery via the connector's READ PATH ({@link FetchChanges}), TIME-BOUNDED — the way to gather
|
|
400
|
+
* a statistically-significant sample when a single {@link DiscoverFields} sample is too small to
|
|
401
|
+
* PROVE a key. "Discovery is the sync read path with the save removed."
|
|
402
|
+
*
|
|
403
|
+
* Loops FetchChanges as a read-only FULL fetch (WatermarkValue=null, nothing persisted), threading
|
|
404
|
+
* pagination/keyset cursors across batches, and streams every record through the data-informed
|
|
405
|
+
* field + provable-PK inference. It stops at the discovery TIME BUDGET (default 5 min), or a record
|
|
406
|
+
* cap, or source exhaustion — whichever comes first — so the provable-PK decision is made on as much
|
|
407
|
+
* real data as the budget allows. It NEVER fabricates a key: if even this larger sample yields no
|
|
408
|
+
* provable single/composite PK, the field set comes back PK-less and the object is honestly not added.
|
|
409
|
+
*
|
|
410
|
+
* Falls back to the single-sample {@link DiscoverFields} if the read path can't run for this object
|
|
411
|
+
* (e.g. a connector whose FetchChanges needs an already-persisted IO row that doesn't exist yet).
|
|
412
|
+
*/
|
|
413
|
+
DiscoverFieldsViaFetch(companyIntegration: MJCompanyIntegrationEntity, objectName: string, contextUser: UserInfo, opts?: {
|
|
414
|
+
TimeBudgetMs?: number;
|
|
415
|
+
BatchSize?: number;
|
|
416
|
+
MaxRecords?: number;
|
|
417
|
+
}): Promise<ExternalFieldSchema[]>;
|
|
319
418
|
/**
|
|
320
419
|
* Tests connectivity to the external system.
|
|
321
420
|
* @param companyIntegration - The company integration entity with connection credentials
|
|
@@ -400,6 +499,16 @@ export declare abstract class BaseIntegrationConnector {
|
|
|
400
499
|
* @param options - Optional filter to restrict introspection to a subset of objects
|
|
401
500
|
* @returns Full schema info for all (or the requested subset of) source objects
|
|
402
501
|
*/
|
|
502
|
+
/**
|
|
503
|
+
* §7 — does this connector's discovery (DiscoverObjects/DiscoverFields → IntrospectSchema) return the
|
|
504
|
+
* AUTHORITATIVE, COMPLETE gamut of objects/fields the credentials expose? Default **false** (safe):
|
|
505
|
+
* a connector must explicitly affirm this. Override to `true` ONLY when DiscoverObjects hits a real
|
|
506
|
+
* list/describe endpoint that returns EVERYTHING accessible — so an object/field absent from a refresh
|
|
507
|
+
* genuinely means the source dropped it (and may be deactivated). Leave false for stubbed discovery
|
|
508
|
+
* (returns nothing → static metadata is all we have), a cache-driven IntrospectSchema, or any
|
|
509
|
+
* partial/scoped enumeration — there, absence proves nothing and MUST NOT deactivate.
|
|
510
|
+
*/
|
|
511
|
+
get DiscoveryIsAuthoritative(): boolean;
|
|
403
512
|
IntrospectSchema(companyIntegration: MJCompanyIntegrationEntity, contextUser: UserInfo, options?: IntrospectSchemaOptions): Promise<SourceSchemaInfo>;
|
|
404
513
|
}
|
|
405
514
|
//# sourceMappingURL=BaseIntegrationConnector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseIntegrationConnector.d.ts","sourceRoot":"","sources":["../src/BaseIntegrationConnector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,KAAK,EACR,qBAAqB,EACrB,qBAAqB,EACxB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EACR,cAAc,EACd,mBAAmB,EACnB,gBAAgB,EAChB,uBAAuB,EACvB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,UAAU,EACV,aAAa,EACb,YAAY,EACZ,WAAW,EACX,UAAU,EACb,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"BaseIntegrationConnector.d.ts","sourceRoot":"","sources":["../src/BaseIntegrationConnector.ts"],"names":[],"mappings":"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"}
|