@memberjunction/testing-integration 6.2.0-edge.3 → 6.2.0-edge.4
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/bootstrap-shared.d.ts +7 -1
- package/dist/bootstrap-shared.d.ts.map +1 -1
- package/dist/bootstrap-shared.js.map +1 -1
- package/dist/bootstrap.js +14 -3
- package/dist/bootstrap.js.map +1 -1
- package/dist/check-registry.d.ts +13 -1
- package/dist/check-registry.d.ts.map +1 -1
- package/dist/check-registry.js +38 -1
- package/dist/check-registry.js.map +1 -1
- package/dist/instrumented-cache.d.ts +22 -6
- package/dist/instrumented-cache.d.ts.map +1 -1
- package/dist/instrumented-cache.js +33 -6
- package/dist/instrumented-cache.js.map +1 -1
- package/package.json +12 -12
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* `getActiveIntegrationStorage()` reader — observe the same install.
|
|
15
15
|
*/
|
|
16
16
|
import type * as sql from 'mssql';
|
|
17
|
-
import type { UserInfo, IMetadataProvider } from '@memberjunction/core';
|
|
17
|
+
import type { UserInfo, IMetadataProvider, ILocalStorageProvider } from '@memberjunction/core';
|
|
18
18
|
import { InstrumentedLocalStorageProvider } from './instrumented-cache.js';
|
|
19
19
|
import type { DbConfig, ClientConfig } from './config.js';
|
|
20
20
|
/** Everything a server-side check/driver needs about the owned process. */
|
|
@@ -44,6 +44,12 @@ export interface BootstrapServerOptions {
|
|
|
44
44
|
ContextUserEmail?: string;
|
|
45
45
|
/** Verbose cache logging (default false). */
|
|
46
46
|
VerboseCacheLogging?: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* A store shared with other processes (e.g. Redis) to use as the cache from the first read,
|
|
49
|
+
* the way MJAPI boots with REDIS_URL. It is wrapped in the instrumented provider and
|
|
50
|
+
* also handed to the database provider. Omitted: a process-local in-memory store.
|
|
51
|
+
*/
|
|
52
|
+
SharedStorage?: ILocalStorageProvider;
|
|
47
53
|
}
|
|
48
54
|
/** @internal Setters used by the server/client bootstrap modules to publish process state. */
|
|
49
55
|
export declare function SetActiveStorage(s: InstrumentedLocalStorageProvider): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap-shared.d.ts","sourceRoot":"","sources":["../src/bootstrap-shared.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,KAAK,GAAG,MAAM,OAAO,CAAC;AAElC,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"bootstrap-shared.d.ts","sourceRoot":"","sources":["../src/bootstrap-shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap-shared.js","sourceRoot":"","sources":["../src/bootstrap-shared.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,iBAAiB,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AAEvF,OAAO,EAAE,gCAAgC,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"bootstrap-shared.js","sourceRoot":"","sources":["../src/bootstrap-shared.ts"],"names":[],"mappings":"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"}
|
package/dist/bootstrap.js
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* so both this module and the client bootstrap publish/read the same install.
|
|
18
18
|
*/
|
|
19
19
|
import sql from 'mssql';
|
|
20
|
-
import { LocalCacheManager, InMemoryLocalStorageProvider, Metadata, SetProvider } from '@memberjunction/core';
|
|
20
|
+
import { LocalCacheManager, InMemoryLocalStorageProvider, Metadata, SetProvider, StartupManager } from '@memberjunction/core';
|
|
21
21
|
import { setupSQLServerClient, SQLServerProviderConfigData } from '@memberjunction/sqlserver-dataprovider';
|
|
22
22
|
import { DiscoverMJConfig, LoadDynamicPackages } from '@memberjunction/dynamic-packages';
|
|
23
23
|
import { UserCache } from '@memberjunction/generic-database-provider';
|
|
@@ -67,7 +67,7 @@ export async function BootstrapIntegrationServer(opts = {}) {
|
|
|
67
67
|
const raw = DiscoverMJConfig(undefined, { searchStrategy: 'none' }); // same cwd-only search as LoadDbConfig()
|
|
68
68
|
await LoadDynamicPackages({ processId: INTEGRATION_TESTS_PROCESS_ID, tier: 'server', config: raw.config, configFilePath: raw.configFilePath });
|
|
69
69
|
// FIRST-CALLER cache init — MUST precede any provider setup (load-bearing on both backends).
|
|
70
|
-
const storage = new InstrumentedLocalStorageProvider(new InMemoryLocalStorageProvider());
|
|
70
|
+
const storage = new InstrumentedLocalStorageProvider(opts.SharedStorage ?? new InMemoryLocalStorageProvider());
|
|
71
71
|
await LocalCacheManager.Instance.Initialize(storage, { verboseLogging: opts.VerboseCacheLogging ?? false });
|
|
72
72
|
SetActiveStorage(storage);
|
|
73
73
|
const ctx = db.Platform === 'postgresql'
|
|
@@ -91,7 +91,11 @@ async function setupSqlServerProvider(db, storage, opts) {
|
|
|
91
91
|
database: db.Database,
|
|
92
92
|
options: { encrypt: false, trustServerCertificate: true }
|
|
93
93
|
}).connect();
|
|
94
|
-
const
|
|
94
|
+
const config = new SQLServerProviderConfigData(pool, db.Schema);
|
|
95
|
+
if (opts.SharedStorage) {
|
|
96
|
+
config.LocalStorageProvider = storage; // shared store from the first read
|
|
97
|
+
}
|
|
98
|
+
const provider = await setupSQLServerClient(config);
|
|
95
99
|
await UserCache.Instance.Refresh(provider);
|
|
96
100
|
const user = resolveContextUser(opts.ContextUserEmail);
|
|
97
101
|
return {
|
|
@@ -113,9 +117,16 @@ async function setupPostgreSQLProvider(db, storage, opts) {
|
|
|
113
117
|
const provider = new PostgreSQLDataProvider();
|
|
114
118
|
const pgConfig = new PostgreSQLProviderConfigData({ Host: db.Host, Port: db.Port, Database: db.Database, User: db.User, Password: db.Password }, db.Schema, 1 // checkRefreshIntervalSeconds > 0 → load metadata on Config
|
|
115
119
|
);
|
|
120
|
+
if (opts.SharedStorage) {
|
|
121
|
+
pgConfig.LocalStorageProvider = storage; // shared store from the first read
|
|
122
|
+
}
|
|
116
123
|
await provider.Config(pgConfig);
|
|
117
124
|
SetProvider(provider);
|
|
118
125
|
await UserCache.Instance.Refresh(provider);
|
|
126
|
+
// setupSQLServerClient runs the startup engines itself; the PostgreSQL provider does not, so
|
|
127
|
+
// run them here as MJAPI does. Without this, engine-backed checks ran against unloaded engines.
|
|
128
|
+
const systemUser = UserCache.Instance.GetSystemUser() ?? UserCache.Instance.Users.find(u => u.IsActive && u.Type === 'Owner');
|
|
129
|
+
await StartupManager.Instance.Startup(false, systemUser, provider);
|
|
119
130
|
const user = resolveContextUser(opts.ContextUserEmail);
|
|
120
131
|
return {
|
|
121
132
|
Pool: undefined, User: user, Storage: storage, Provider: Metadata.Provider, Db: db, // global-provider-ok: this dedicated-process bootstrap just installed the one global provider (SetProvider above) — it IS the single provider for this run (D1)
|
package/dist/bootstrap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,GAAG,MAAM,OAAO,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,4BAA4B,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"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"}
|
package/dist/check-registry.d.ts
CHANGED
|
@@ -15,7 +15,15 @@ export declare class IntegrationCheckRegistry extends BaseSingleton<IntegrationC
|
|
|
15
15
|
private lifecycles;
|
|
16
16
|
protected constructor();
|
|
17
17
|
static get Instance(): IntegrationCheckRegistry;
|
|
18
|
-
/**
|
|
18
|
+
/**
|
|
19
|
+
* Register a check by its Id. Throws when the Id already belongs to a different check:
|
|
20
|
+
* the earlier check would otherwise stop running without any failure to show for it.
|
|
21
|
+
*
|
|
22
|
+
* Registering the same check again is allowed. That covers the same object and an
|
|
23
|
+
* equivalent copy (same Id, Name, tier flags and function source), which is what a
|
|
24
|
+
* second evaluation of the same check module produces when a bundler duplicates it. An
|
|
25
|
+
* equivalent copy replaces the stored one so the newest closure is the one that runs.
|
|
26
|
+
*/
|
|
19
27
|
Register(check: NamedCheck): void;
|
|
20
28
|
/** Resolve a single check by Id; returns undefined for unknown ids (tolerant, by design). */
|
|
21
29
|
Get(id: string): NamedCheck | undefined;
|
|
@@ -35,5 +43,9 @@ export declare class IntegrationCheckRegistry extends BaseSingleton<IntegrationC
|
|
|
35
43
|
RegisterLifecycle(bundle: string, lifecycle: BundleLifecycle): void;
|
|
36
44
|
/** The lifecycle for a bundle, or undefined when the bundle needs no shared fixture. */
|
|
37
45
|
GetLifecycle(bundle: string): BundleLifecycle | undefined;
|
|
46
|
+
/** True when two check objects define the same check (a re-evaluated module's copy). */
|
|
47
|
+
private static isSameCheck;
|
|
48
|
+
/** True when two lifecycles have the same Setup and Teardown source. */
|
|
49
|
+
private static isSameLifecycle;
|
|
38
50
|
}
|
|
39
51
|
//# sourceMappingURL=check-registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-registry.d.ts","sourceRoot":"","sources":["../src/check-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAEtD,qBAAa,wBAAyB,SAAQ,aAAa,CAAC,wBAAwB,CAAC;IACjF,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,UAAU,CAAsC;IAExD,SAAS;IAIT,WAAkB,QAAQ,IAAI,wBAAwB,CAErD;IAED
|
|
1
|
+
{"version":3,"file":"check-registry.d.ts","sourceRoot":"","sources":["../src/check-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAEtD,qBAAa,wBAAyB,SAAQ,aAAa,CAAC,wBAAwB,CAAC;IACjF,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,UAAU,CAAsC;IAExD,SAAS;IAIT,WAAkB,QAAQ,IAAI,wBAAwB,CAErD;IAED;;;;;;;;OAQG;IACI,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAcxC,6FAA6F;IACtF,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAI9C,oFAAoF;IAC7E,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE;IAI9C;;;;OAIG;IACI,cAAc,IAAI,MAAM,EAAE;IAWjC;;;;OAIG;IACI,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,GAAG,IAAI;IAc1E,wFAAwF;IACjF,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIhE,wFAAwF;IACxF,OAAO,CAAC,MAAM,CAAC,WAAW;IAQ1B,wEAAwE;IACxE,OAAO,CAAC,MAAM,CAAC,eAAe;CAIjC"}
|
package/dist/check-registry.js
CHANGED
|
@@ -18,8 +18,24 @@ export class IntegrationCheckRegistry extends BaseSingleton {
|
|
|
18
18
|
static get Instance() {
|
|
19
19
|
return super.getInstance();
|
|
20
20
|
}
|
|
21
|
-
/**
|
|
21
|
+
/**
|
|
22
|
+
* Register a check by its Id. Throws when the Id already belongs to a different check:
|
|
23
|
+
* the earlier check would otherwise stop running without any failure to show for it.
|
|
24
|
+
*
|
|
25
|
+
* Registering the same check again is allowed. That covers the same object and an
|
|
26
|
+
* equivalent copy (same Id, Name, tier flags and function source), which is what a
|
|
27
|
+
* second evaluation of the same check module produces when a bundler duplicates it. An
|
|
28
|
+
* equivalent copy replaces the stored one so the newest closure is the one that runs.
|
|
29
|
+
*/
|
|
22
30
|
Register(check) {
|
|
31
|
+
const existing = this.checks.get(check.Id);
|
|
32
|
+
if (existing === check) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (existing && !IntegrationCheckRegistry.isSameCheck(existing, check)) {
|
|
36
|
+
throw new Error(`IntegrationCheckRegistry: check Id '${check.Id}' is already registered to a different check ` +
|
|
37
|
+
`('${existing.Name}'; this one is '${check.Name}'). Give each check a unique Id.`);
|
|
38
|
+
}
|
|
23
39
|
this.checks.set(check.Id, check);
|
|
24
40
|
}
|
|
25
41
|
/** Resolve a single check by Id; returns undefined for unknown ids (tolerant, by design). */
|
|
@@ -51,11 +67,32 @@ export class IntegrationCheckRegistry extends BaseSingleton {
|
|
|
51
67
|
* bundle's fixture is created/torn down identically on either execution path.
|
|
52
68
|
*/
|
|
53
69
|
RegisterLifecycle(bundle, lifecycle) {
|
|
70
|
+
const existing = this.lifecycles.get(bundle);
|
|
71
|
+
if (existing === lifecycle) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (existing && !IntegrationCheckRegistry.isSameLifecycle(existing, lifecycle)) {
|
|
75
|
+
throw new Error(`IntegrationCheckRegistry: bundle '${bundle}' already has a different lifecycle registered. ` +
|
|
76
|
+
`A bundle has exactly one Setup/Teardown.`);
|
|
77
|
+
}
|
|
54
78
|
this.lifecycles.set(bundle, lifecycle);
|
|
55
79
|
}
|
|
56
80
|
/** The lifecycle for a bundle, or undefined when the bundle needs no shared fixture. */
|
|
57
81
|
GetLifecycle(bundle) {
|
|
58
82
|
return this.lifecycles.get(bundle);
|
|
59
83
|
}
|
|
84
|
+
/** True when two check objects define the same check (a re-evaluated module's copy). */
|
|
85
|
+
static isSameCheck(a, b) {
|
|
86
|
+
return a.Id === b.Id
|
|
87
|
+
&& a.Name === b.Name
|
|
88
|
+
&& (a.RequiresMutation ?? false) === (b.RequiresMutation ?? false)
|
|
89
|
+
&& (a.RequiresLiveModel ?? false) === (b.RequiresLiveModel ?? false)
|
|
90
|
+
&& a.Fn.toString() === b.Fn.toString();
|
|
91
|
+
}
|
|
92
|
+
/** True when two lifecycles have the same Setup and Teardown source. */
|
|
93
|
+
static isSameLifecycle(a, b) {
|
|
94
|
+
return a.Setup.toString() === b.Setup.toString()
|
|
95
|
+
&& a.Teardown.toString() === b.Teardown.toString();
|
|
96
|
+
}
|
|
60
97
|
}
|
|
61
98
|
//# sourceMappingURL=check-registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-registry.js","sourceRoot":"","sources":["../src/check-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAGvD,MAAM,OAAO,wBAAyB,SAAQ,aAAuC;IAIjF;QACI,KAAK,EAAE,CAAC;QAJJ,WAAM,GAAG,IAAI,GAAG,EAAsB,CAAC;QACvC,eAAU,GAAG,IAAI,GAAG,EAA2B,CAAC;IAIxD,CAAC;IAEM,MAAM,KAAK,QAAQ;QACtB,OAAO,KAAK,CAAC,WAAW,EAA4B,CAAC;IACzD,CAAC;IAED,+CAA+C;
|
|
1
|
+
{"version":3,"file":"check-registry.js","sourceRoot":"","sources":["../src/check-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* (InMemoryLocalStorageProvider, ILocalStorageProvider) is imported from
|
|
6
6
|
* @memberjunction/core, never copied.
|
|
7
7
|
*/
|
|
8
|
-
import type { ILocalStorageProvider } from '@memberjunction/core';
|
|
8
|
+
import type { ILocalStorageProvider, LocalStorageWriteOptions } from '@memberjunction/core';
|
|
9
9
|
/**
|
|
10
10
|
* Wraps any ILocalStorageProvider with call counters so tests can prove cache
|
|
11
11
|
* behavior from the outside: a cache WRITE shows up as SetItemCount++, a cache
|
|
@@ -25,18 +25,29 @@ export declare class InstrumentedLocalStorageProvider implements ILocalStoragePr
|
|
|
25
25
|
get SharesReferences(): boolean | undefined;
|
|
26
26
|
/**
|
|
27
27
|
* Delegated for the same reason as {@link SharesReferences}: this wrapper stores nothing of its
|
|
28
|
-
* own
|
|
29
|
-
* provider, and a wrapper that failed to delegate would report itself persistent and make
|
|
30
|
-
* `ProviderBase` serialize the whole metadata graph on every refresh in the test tier, which is
|
|
31
|
-
* exactly the cost the flag exists to avoid.
|
|
28
|
+
* own, so whether what it holds outlives the process is a property of the inner store.
|
|
32
29
|
* See {@link ILocalStorageProvider.SupportsCrossProcessPersistence}.
|
|
33
30
|
*/
|
|
34
31
|
get SupportsCrossProcessPersistence(): boolean | undefined;
|
|
32
|
+
/** Delegated, like {@link SharesReferences}: sharing is a property of the inner store. */
|
|
33
|
+
get SharedAcrossProcesses(): boolean | undefined;
|
|
35
34
|
GetItemCount: number;
|
|
36
35
|
GetItemsCount: number;
|
|
37
36
|
SetItemCount: number;
|
|
38
37
|
RemoveCount: number;
|
|
39
38
|
private perCategory;
|
|
39
|
+
private setsPerKey;
|
|
40
|
+
/**
|
|
41
|
+
* Present only when the inner provider has it: `LocalCacheManager` chooses its lookup path by
|
|
42
|
+
* whether the method exists, so the wrapper must not add one the real provider lacks.
|
|
43
|
+
*/
|
|
44
|
+
readonly GetIndexGroupKeys?: (category: string, group: string) => Promise<string[]>;
|
|
45
|
+
/** Present only when the inner provider has it, for the same reason as {@link GetIndexGroupKeys}. */
|
|
46
|
+
readonly WithKeyLock?: <T>(key: string, category: string, work: () => Promise<T>) => Promise<T>;
|
|
47
|
+
/** Present only when the inner provider has it, for the same reason as {@link GetIndexGroupKeys}. */
|
|
48
|
+
readonly TryAcquireLease?: (name: string, ttlMs: number) => Promise<boolean>;
|
|
49
|
+
/** Present only when the inner provider has it, for the same reason as {@link GetIndexGroupKeys}. */
|
|
50
|
+
readonly ReleaseLease?: (name: string) => Promise<void>;
|
|
40
51
|
constructor(inner: ILocalStorageProvider);
|
|
41
52
|
ResetCounts(): void;
|
|
42
53
|
/**
|
|
@@ -47,10 +58,15 @@ export declare class InstrumentedLocalStorageProvider implements ILocalStoragePr
|
|
|
47
58
|
*/
|
|
48
59
|
GetCount(category: string): number;
|
|
49
60
|
SetCount(category: string): number;
|
|
61
|
+
/**
|
|
62
|
+
* Writes to one key since the last {@link ResetCounts}. Use it to assert how often a single
|
|
63
|
+
* cache slot was rewritten when other slots in the same category may be written meanwhile.
|
|
64
|
+
*/
|
|
65
|
+
SetCountForKey(key: string): number;
|
|
50
66
|
private bump;
|
|
51
67
|
GetItem<T = unknown>(key: string, category?: string): Promise<T | null>;
|
|
52
68
|
GetItems<T = unknown>(keys: string[], category?: string): Promise<Map<string, T | null>>;
|
|
53
|
-
SetItem<T>(key: string, value: T, category?: string): Promise<void>;
|
|
69
|
+
SetItem<T>(key: string, value: T, category?: string, options?: LocalStorageWriteOptions): Promise<void>;
|
|
54
70
|
Remove(key: string, category?: string): Promise<void>;
|
|
55
71
|
ClearCategory(category: string): Promise<void>;
|
|
56
72
|
GetCategoryKeys(category: string): Promise<string[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumented-cache.d.ts","sourceRoot":"","sources":["../src/instrumented-cache.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"instrumented-cache.d.ts","sourceRoot":"","sources":["../src/instrumented-cache.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAE5F;;;;;GAKG;AACH,qBAAa,gCAAiC,YAAW,qBAAqB;IAiD9D,OAAO,CAAC,QAAQ,CAAC,KAAK;IAhDlC;;;;;;;OAOG;IACH,IAAW,gBAAgB,IAAI,OAAO,GAAG,SAAS,CAEjD;IAED;;;;OAIG;IACH,IAAW,+BAA+B,IAAI,OAAO,GAAG,SAAS,CAEhE;IAED,0FAA0F;IAC1F,IAAW,qBAAqB,IAAI,OAAO,GAAG,SAAS,CAEtD;IAEM,YAAY,SAAK;IACjB,aAAa,SAAK;IAClB,YAAY,SAAK;IACjB,WAAW,SAAK;IACvB,OAAO,CAAC,WAAW,CAAqD;IACxE,OAAO,CAAC,UAAU,CAA6B;IAE/C;;;OAGG;IACH,SAAgB,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAE3F,qGAAqG;IACrG,SAAgB,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAEvG,qGAAqG;IACrG,SAAgB,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpF,qGAAqG;IACrG,SAAgB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;gBAElC,KAAK,EAAE,qBAAqB;IAmBlD,WAAW,IAAI,IAAI;IAS1B;;;;;OAKG;IACI,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAIlC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAIzC;;;OAGG;IACI,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAI1C,OAAO,CAAC,IAAI;IAOC,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAMvE,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IAMxF,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;IAOvG,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrD,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM9C,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAMpE;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhE"}
|
|
@@ -18,15 +18,16 @@ export class InstrumentedLocalStorageProvider {
|
|
|
18
18
|
}
|
|
19
19
|
/**
|
|
20
20
|
* Delegated for the same reason as {@link SharesReferences}: this wrapper stores nothing of its
|
|
21
|
-
* own
|
|
22
|
-
* provider, and a wrapper that failed to delegate would report itself persistent and make
|
|
23
|
-
* `ProviderBase` serialize the whole metadata graph on every refresh in the test tier, which is
|
|
24
|
-
* exactly the cost the flag exists to avoid.
|
|
21
|
+
* own, so whether what it holds outlives the process is a property of the inner store.
|
|
25
22
|
* See {@link ILocalStorageProvider.SupportsCrossProcessPersistence}.
|
|
26
23
|
*/
|
|
27
24
|
get SupportsCrossProcessPersistence() {
|
|
28
25
|
return this.inner.SupportsCrossProcessPersistence;
|
|
29
26
|
}
|
|
27
|
+
/** Delegated, like {@link SharesReferences}: sharing is a property of the inner store. */
|
|
28
|
+
get SharedAcrossProcesses() {
|
|
29
|
+
return this.inner.SharedAcrossProcesses;
|
|
30
|
+
}
|
|
30
31
|
constructor(inner) {
|
|
31
32
|
this.inner = inner;
|
|
32
33
|
this.GetItemCount = 0;
|
|
@@ -34,6 +35,23 @@ export class InstrumentedLocalStorageProvider {
|
|
|
34
35
|
this.SetItemCount = 0;
|
|
35
36
|
this.RemoveCount = 0;
|
|
36
37
|
this.perCategory = new Map();
|
|
38
|
+
this.setsPerKey = new Map();
|
|
39
|
+
const innerGroupKeys = inner.GetIndexGroupKeys;
|
|
40
|
+
if (innerGroupKeys) {
|
|
41
|
+
this.GetIndexGroupKeys = (category, group) => innerGroupKeys.call(inner, category, group);
|
|
42
|
+
}
|
|
43
|
+
const innerLock = inner.WithKeyLock;
|
|
44
|
+
if (innerLock) {
|
|
45
|
+
this.WithKeyLock = (key, category, work) => innerLock.call(inner, key, category, work);
|
|
46
|
+
}
|
|
47
|
+
const innerLease = inner.TryAcquireLease;
|
|
48
|
+
if (innerLease) {
|
|
49
|
+
this.TryAcquireLease = (name, ttlMs) => innerLease.call(inner, name, ttlMs);
|
|
50
|
+
}
|
|
51
|
+
const innerRelease = inner.ReleaseLease;
|
|
52
|
+
if (innerRelease) {
|
|
53
|
+
this.ReleaseLease = (name) => innerRelease.call(inner, name);
|
|
54
|
+
}
|
|
37
55
|
}
|
|
38
56
|
ResetCounts() {
|
|
39
57
|
this.GetItemCount = 0;
|
|
@@ -41,6 +59,7 @@ export class InstrumentedLocalStorageProvider {
|
|
|
41
59
|
this.SetItemCount = 0;
|
|
42
60
|
this.RemoveCount = 0;
|
|
43
61
|
this.perCategory.clear();
|
|
62
|
+
this.setsPerKey.clear();
|
|
44
63
|
}
|
|
45
64
|
/**
|
|
46
65
|
* Per-category counters — IMPORTANT for assertions: LocalCacheManager also
|
|
@@ -54,6 +73,13 @@ export class InstrumentedLocalStorageProvider {
|
|
|
54
73
|
SetCount(category) {
|
|
55
74
|
return this.perCategory.get(category)?.Sets ?? 0;
|
|
56
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* Writes to one key since the last {@link ResetCounts}. Use it to assert how often a single
|
|
78
|
+
* cache slot was rewritten when other slots in the same category may be written meanwhile.
|
|
79
|
+
*/
|
|
80
|
+
SetCountForKey(key) {
|
|
81
|
+
return this.setsPerKey.get(key) ?? 0;
|
|
82
|
+
}
|
|
57
83
|
bump(category, kind) {
|
|
58
84
|
const key = category ?? 'default';
|
|
59
85
|
const entry = this.perCategory.get(key) ?? { Gets: 0, Sets: 0 };
|
|
@@ -70,10 +96,11 @@ export class InstrumentedLocalStorageProvider {
|
|
|
70
96
|
this.bump(category, 'Gets');
|
|
71
97
|
return this.inner.GetItems(keys, category);
|
|
72
98
|
}
|
|
73
|
-
async SetItem(key, value, category) {
|
|
99
|
+
async SetItem(key, value, category, options) {
|
|
74
100
|
this.SetItemCount++;
|
|
75
101
|
this.bump(category, 'Sets');
|
|
76
|
-
|
|
102
|
+
this.setsPerKey.set(key, (this.setsPerKey.get(key) ?? 0) + 1);
|
|
103
|
+
return this.inner.SetItem(key, value, category, options);
|
|
77
104
|
}
|
|
78
105
|
async Remove(key, category) {
|
|
79
106
|
this.RemoveCount++;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumented-cache.js","sourceRoot":"","sources":["../src/instrumented-cache.ts"],"names":[],"mappings":"AASA;;;;;GAKG;AACH,MAAM,OAAO,gCAAgC;IACzC;;;;;;;OAOG;IACH,IAAW,gBAAgB;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;IACvC,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"instrumented-cache.js","sourceRoot":"","sources":["../src/instrumented-cache.ts"],"names":[],"mappings":"AASA;;;;;GAKG;AACH,MAAM,OAAO,gCAAgC;IACzC;;;;;;;OAOG;IACH,IAAW,gBAAgB;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;IACvC,CAAC;IAED;;;;OAIG;IACH,IAAW,+BAA+B;QACtC,OAAO,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC;IACtD,CAAC;IAED,0FAA0F;IAC1F,IAAW,qBAAqB;QAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC;IAC5C,CAAC;IAwBD,YAA6B,KAA4B;QAA5B,UAAK,GAAL,KAAK,CAAuB;QAtBlD,iBAAY,GAAG,CAAC,CAAC;QACjB,kBAAa,GAAG,CAAC,CAAC;QAClB,iBAAY,GAAG,CAAC,CAAC;QACjB,gBAAW,GAAG,CAAC,CAAC;QACf,gBAAW,GAAG,IAAI,GAAG,EAA0C,CAAC;QAChE,eAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;QAkB3C,MAAM,cAAc,GAAG,KAAK,CAAC,iBAAiB,CAAC;QAC/C,IAAI,cAAc,EAAE,CAAC;YACjB,IAAI,CAAC,iBAAiB,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC9F,CAAC;QACD,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC;QACpC,IAAI,SAAS,EAAE,CAAC;YACZ,IAAI,CAAC,WAAW,GAAG,CAAI,GAAW,EAAE,QAAgB,EAAE,IAAsB,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAe,CAAC;QAC9I,CAAC;QACD,MAAM,UAAU,GAAG,KAAK,CAAC,eAAe,CAAC;QACzC,IAAI,UAAU,EAAE,CAAC;YACb,IAAI,CAAC,eAAe,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAChF,CAAC;QACD,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QACxC,IAAI,YAAY,EAAE,CAAC;YACf,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACjE,CAAC;IACL,CAAC;IAEM,WAAW;QACd,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED;;;;;OAKG;IACI,QAAQ,CAAC,QAAgB;QAC5B,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC;IACrD,CAAC;IAEM,QAAQ,CAAC,QAAgB;QAC5B,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC;IACrD,CAAC;IAED;;;OAGG;IACI,cAAc,CAAC,GAAW;QAC7B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAEO,IAAI,CAAC,QAA4B,EAAE,IAAqB;QAC5D,MAAM,GAAG,GAAG,QAAQ,IAAI,SAAS,CAAC;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAChE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACd,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IAEM,KAAK,CAAC,OAAO,CAAc,GAAW,EAAE,QAAiB;QAC5D,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAI,GAAG,EAAE,QAAQ,CAAC,CAAC;IAChD,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAc,IAAc,EAAE,QAAiB;QAChE,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAI,IAAI,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC;IAEM,KAAK,CAAC,OAAO,CAAI,GAAW,EAAE,KAAQ,EAAE,QAAiB,EAAE,OAAkC;QAChG,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC5B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAI,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,QAAiB;QAC9C,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,QAAgB;QACvC,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC9C,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,QAAgB;QACzC,IAAI,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,EAAE,CAAC;IACd,CAAC;CACJ;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,GAAW;IACpD,OAAO,GAAG,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAClD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/testing-integration",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "6.2.0-edge.
|
|
4
|
+
"version": "6.2.0-edge.4",
|
|
5
5
|
"description": "MemberJunction Integration Test bootstrap library, IntegrationCheck registry, and IntegrationTestDriver. Installs an instrumented LocalCacheManager as the first caller and owns its process.",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -11,22 +11,22 @@
|
|
|
11
11
|
"author": "MemberJunction.com",
|
|
12
12
|
"license": "BUSL-1.1",
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@memberjunction/core": "6.2.0-edge.
|
|
15
|
-
"@memberjunction/dynamic-packages": "6.2.0-edge.
|
|
16
|
-
"@memberjunction/core-entities": "6.2.0-edge.
|
|
17
|
-
"@memberjunction/global": "6.2.0-edge.
|
|
18
|
-
"@memberjunction/testing-engine": "6.2.0-edge.
|
|
19
|
-
"@memberjunction/testing-engine-base": "6.2.0-edge.
|
|
20
|
-
"@memberjunction/generic-database-provider": "6.2.0-edge.
|
|
21
|
-
"@memberjunction/sqlserver-dataprovider": "6.2.0-edge.
|
|
22
|
-
"@memberjunction/graphql-dataprovider": "6.2.0-edge.
|
|
23
|
-
"@memberjunction/server-bootstrap-lite": "6.2.0-edge.
|
|
14
|
+
"@memberjunction/core": "6.2.0-edge.4",
|
|
15
|
+
"@memberjunction/dynamic-packages": "6.2.0-edge.4",
|
|
16
|
+
"@memberjunction/core-entities": "6.2.0-edge.4",
|
|
17
|
+
"@memberjunction/global": "6.2.0-edge.4",
|
|
18
|
+
"@memberjunction/testing-engine": "6.2.0-edge.4",
|
|
19
|
+
"@memberjunction/testing-engine-base": "6.2.0-edge.4",
|
|
20
|
+
"@memberjunction/generic-database-provider": "6.2.0-edge.4",
|
|
21
|
+
"@memberjunction/sqlserver-dataprovider": "6.2.0-edge.4",
|
|
22
|
+
"@memberjunction/graphql-dataprovider": "6.2.0-edge.4",
|
|
23
|
+
"@memberjunction/server-bootstrap-lite": "6.2.0-edge.4",
|
|
24
24
|
"cosmiconfig": "9.0.0",
|
|
25
25
|
"dotenv": "17.2.4",
|
|
26
26
|
"mssql": "^12.2.0"
|
|
27
27
|
},
|
|
28
28
|
"optionalDependencies": {
|
|
29
|
-
"@memberjunction/postgresql-dataprovider": "6.2.0-edge.
|
|
29
|
+
"@memberjunction/postgresql-dataprovider": "6.2.0-edge.4"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"typescript": "^5.9.3",
|