@milaboratories/pl-middle-layer 1.67.5 → 1.68.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/dist/block_registry/registry-v2-provider.d.ts +1 -3
- package/dist/block_registry/registry-v2-provider.d.ts.map +1 -1
- package/dist/block_registry/registry.d.ts +5 -9
- package/dist/block_registry/registry.d.ts.map +1 -1
- package/dist/block_registry/template_provider.d.ts +3 -5
- package/dist/block_registry/template_provider.d.ts.map +1 -1
- package/dist/block_registry/watcher.d.ts +4 -6
- package/dist/block_registry/watcher.d.ts.map +1 -1
- package/dist/block_registry/well_known_registries.d.ts +3 -5
- package/dist/block_registry/well_known_registries.d.ts.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/middle_layer/build_stamp.cjs +34 -0
- package/dist/middle_layer/build_stamp.cjs.map +1 -0
- package/dist/middle_layer/build_stamp.js +34 -0
- package/dist/middle_layer/build_stamp.js.map +1 -0
- package/dist/middle_layer/driver_kit.d.ts +3 -4
- package/dist/middle_layer/driver_kit.d.ts.map +1 -1
- package/dist/middle_layer/index.d.ts +3 -2
- package/dist/middle_layer/middle_layer.cjs +48 -0
- package/dist/middle_layer/middle_layer.cjs.map +1 -1
- package/dist/middle_layer/middle_layer.d.ts +23 -4
- package/dist/middle_layer/middle_layer.d.ts.map +1 -1
- package/dist/middle_layer/middle_layer.js +48 -0
- package/dist/middle_layer/middle_layer.js.map +1 -1
- package/dist/middle_layer/ops.cjs +8 -2
- package/dist/middle_layer/ops.cjs.map +1 -1
- package/dist/middle_layer/ops.d.ts +70 -26
- package/dist/middle_layer/ops.d.ts.map +1 -1
- package/dist/middle_layer/ops.js +8 -2
- package/dist/middle_layer/ops.js.map +1 -1
- package/dist/middle_layer/project.cjs +163 -8
- package/dist/middle_layer/project.cjs.map +1 -1
- package/dist/middle_layer/project.d.ts +56 -7
- package/dist/middle_layer/project.d.ts.map +1 -1
- package/dist/middle_layer/project.js +165 -11
- package/dist/middle_layer/project.js.map +1 -1
- package/dist/middle_layer/project_list.d.ts +5 -3
- package/dist/middle_layer/project_list.d.ts.map +1 -1
- package/dist/middle_layer/sharing_list.d.ts +3 -4
- package/dist/middle_layer/sharing_list.d.ts.map +1 -1
- package/dist/middle_layer/tree_snapshot_store.cjs +283 -0
- package/dist/middle_layer/tree_snapshot_store.cjs.map +1 -0
- package/dist/middle_layer/tree_snapshot_store.d.ts +143 -0
- package/dist/middle_layer/tree_snapshot_store.d.ts.map +1 -0
- package/dist/middle_layer/tree_snapshot_store.js +280 -0
- package/dist/middle_layer/tree_snapshot_store.js.map +1 -0
- package/dist/middle_layer/types.d.ts +1 -3
- package/dist/middle_layer/types.d.ts.map +1 -1
- package/dist/model/block_pack_spec.d.ts +13 -15
- package/dist/model/block_pack_spec.d.ts.map +1 -1
- package/dist/model/frontend.d.ts +1 -2
- package/dist/model/frontend.d.ts.map +1 -1
- package/dist/model/project_helper.d.ts +2 -4
- package/dist/model/project_helper.d.ts.map +1 -1
- package/dist/model/project_model.d.ts +12 -12
- package/dist/model/project_model.d.ts.map +1 -1
- package/dist/model/sharing_model.d.ts +24 -26
- package/dist/model/sharing_model.d.ts.map +1 -1
- package/dist/model/template_apply.d.ts +9 -8
- package/dist/model/template_apply.d.ts.map +1 -1
- package/dist/model/template_export.d.ts +2 -2
- package/dist/model/template_export.d.ts.map +1 -1
- package/dist/model/template_parser.d.ts +2 -4
- package/dist/model/template_parser.d.ts.map +1 -1
- package/dist/model/template_resolve.d.ts +10 -11
- package/dist/model/template_resolve.d.ts.map +1 -1
- package/dist/model/template_serializer.d.ts +6 -5
- package/dist/model/template_serializer.d.ts.map +1 -1
- package/dist/model/template_spec.d.ts +7 -9
- package/dist/model/template_spec.d.ts.map +1 -1
- package/dist/mutator/block-pack/block_pack.d.ts +2 -3
- package/dist/mutator/block-pack/block_pack.d.ts.map +1 -1
- package/dist/mutator/project.cjs +20 -3
- package/dist/mutator/project.cjs.map +1 -1
- package/dist/mutator/project.d.ts +4 -3
- package/dist/mutator/project.d.ts.map +1 -1
- package/dist/mutator/project.js +20 -3
- package/dist/mutator/project.js.map +1 -1
- package/dist/mutator/template/render_template.d.ts +1 -3
- package/dist/mutator/template/render_template.d.ts.map +1 -1
- package/dist/mutator/template/template_cache.d.ts +15 -16
- package/dist/mutator/template/template_cache.d.ts.map +1 -1
- package/dist/mutator/template/template_loading.d.ts +10 -12
- package/dist/mutator/template/template_loading.d.ts.map +1 -1
- package/dist/network_check/network_check.d.ts +3 -5
- package/dist/network_check/network_check.d.ts.map +1 -1
- package/dist/pool/data.d.ts +2 -4
- package/dist/pool/data.d.ts.map +1 -1
- package/dist/pool/driver.d.ts +6 -6
- package/dist/pool/driver.d.ts.map +1 -1
- package/dist/pool/index.d.ts +1 -0
- package/dist/pool/p_object_collection.d.ts +1 -3
- package/dist/pool/p_object_collection.d.ts.map +1 -1
- package/dist/pool/result_pool.d.ts +3 -1
- package/dist/worker/worker.d.ts +1 -1
- package/package.json +14 -14
- package/src/middle_layer/build_stamp.ts +36 -0
- package/src/middle_layer/index.ts +1 -0
- package/src/middle_layer/middle_layer.ts +77 -0
- package/src/middle_layer/ops.ts +46 -1
- package/src/middle_layer/project.ts +234 -14
- package/src/middle_layer/project_failsafe.test.ts +47 -0
- package/src/middle_layer/tree_snapshot_scenarios.test.ts +337 -0
- package/src/middle_layer/tree_snapshot_store.test.ts +331 -0
- package/src/middle_layer/tree_snapshot_store.ts +419 -0
- package/src/mutator/project.ts +27 -5
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import { Dispatcher } from "undici";
|
|
2
2
|
import { RegistryV2Reader } from "@platforma-sdk/block-tools";
|
|
3
|
-
|
|
4
3
|
//#region src/block_registry/registry-v2-provider.d.ts
|
|
5
|
-
declare class V2RegistryProvider {
|
|
4
|
+
export declare class V2RegistryProvider {
|
|
6
5
|
private readonly http;
|
|
7
6
|
private readonly registries;
|
|
8
7
|
constructor(http: Dispatcher);
|
|
9
8
|
getRegistry(url: string): RegistryV2Reader;
|
|
10
9
|
}
|
|
11
10
|
//#endregion
|
|
12
|
-
export { V2RegistryProvider };
|
|
13
11
|
//# sourceMappingURL=registry-v2-provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry-v2-provider.d.ts","names":[],"sources":["../../src/block_registry/registry-v2-provider.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"registry-v2-provider.d.ts","names":[],"sources":["../../src/block_registry/registry-v2-provider.ts"],"mappings":";;;qBAGa;mBAGkB;mBAFZ;EAEjB,YAA6B,MAAM;EAE5B,YAAY,cAAc"}
|
|
@@ -3,17 +3,16 @@ import { BlockPackFromRegistryV2, BlockPackId, BlockPackListing, RegistryEntry,
|
|
|
3
3
|
import { Dispatcher } from "undici";
|
|
4
4
|
import { BlockPackDescriptionAbsolute } from "@platforma-sdk/block-tools";
|
|
5
5
|
import { BlockKindReference } from "@milaboratories/pl-model-common";
|
|
6
|
-
|
|
7
6
|
//#region src/block_registry/registry.d.ts
|
|
8
|
-
declare function getDevV1PacketMtime(devPath: string): Promise<string>;
|
|
9
|
-
declare function getDevV2PacketMtime(description: BlockPackDescriptionAbsolute): Promise<string>;
|
|
7
|
+
export declare function getDevV1PacketMtime(devPath: string): Promise<string>;
|
|
8
|
+
export declare function getDevV2PacketMtime(description: BlockPackDescriptionAbsolute): Promise<string>;
|
|
10
9
|
/** Mtime for a `from-pack-v2` locator: prefer the manifest `timestamp`, else
|
|
11
10
|
* stat the `ui.tgz` archive. Must be called identically by `block_pack.ts`
|
|
12
11
|
* prepare (which bakes the result into the spec) and the update watcher (which
|
|
13
12
|
* recomputes it to diff against the stored value) — divergence makes the block
|
|
14
13
|
* flap perpetually "update available". */
|
|
15
|
-
declare function getFromPackV2Mtime(packDir: string, uiTgzPath: string): Promise<string>;
|
|
16
|
-
declare class BlockPackRegistry {
|
|
14
|
+
export declare function getFromPackV2Mtime(packDir: string, uiTgzPath: string): Promise<string>;
|
|
15
|
+
export declare class BlockPackRegistry {
|
|
17
16
|
private readonly v2Provider;
|
|
18
17
|
private readonly registries;
|
|
19
18
|
private readonly http?;
|
|
@@ -30,12 +29,9 @@ declare class BlockPackRegistry {
|
|
|
30
29
|
* delegate to the reader's pure-core-backed `resolveKind`. All version-math
|
|
31
30
|
* lives in `@platforma-sdk/block-tools` (no backend involvement).
|
|
32
31
|
*/
|
|
33
|
-
resolveKind(registryId: string, ref: BlockKindReference, {
|
|
34
|
-
allowUnstable
|
|
35
|
-
}: {
|
|
32
|
+
resolveKind(registryId: string, ref: BlockKindReference, { allowUnstable }: {
|
|
36
33
|
allowUnstable: boolean;
|
|
37
34
|
}): Promise<BlockPackFromRegistryV2>;
|
|
38
35
|
}
|
|
39
36
|
//#endregion
|
|
40
|
-
export { BlockPackRegistry, getDevV1PacketMtime, getDevV2PacketMtime, getFromPackV2Mtime };
|
|
41
37
|
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","names":[],"sources":["../../src/block_registry/registry.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"registry.d.ts","names":[],"sources":["../../src/block_registry/registry.ts"],"mappings":";;;;;;wBA8CsB,oBAAoB,kBAAkB;wBAWtC,oBACpB,aAAa,+BACZ;;;;;;wBAamB,mBAAmB,iBAAiB,oBAAoB;qBAcjE;mBAEQ;mBACA;mBACA;EAHnB,YACmB,YAAY,oBACZ,YAAY,iBACZ,OAAO;UAGZ;EA4LD,eAAe;IAAY,SAAS;MAAgB,QAAQ;EAU5D,YACX,oBACA,SAAS,aACT,kBACC,QAAQ;;;;;;;;EAkBE,YACX,oBACA,KAAK,sBACH;IAAmB;MACpB,QAAQ"}
|
|
@@ -2,7 +2,6 @@ import { BlockPackProvider } from "../model/template_resolve.js";
|
|
|
2
2
|
import { BlockPackFromRegistryV2, BlockPackId, RegistryEntry, SingleBlockPackOverview } from "@milaboratories/pl-model-middle-layer";
|
|
3
3
|
import { MiLogger } from "@milaboratories/ts-helpers";
|
|
4
4
|
import { BlockKindReference } from "@milaboratories/pl-model-common";
|
|
5
|
-
|
|
6
5
|
//#region src/block_registry/template_provider.d.ts
|
|
7
6
|
/**
|
|
8
7
|
* The part of {@link BlockPackRegistry} a template's provider uses.
|
|
@@ -11,7 +10,7 @@ import { BlockKindReference } from "@milaboratories/pl-model-common";
|
|
|
11
10
|
* configured environment — and so it is obvious that these two calls are the entire
|
|
12
11
|
* dependency.
|
|
13
12
|
*/
|
|
14
|
-
type KindAwareRegistry = {
|
|
13
|
+
export type KindAwareRegistry = {
|
|
15
14
|
resolveKind: (registryId: string, ref: BlockKindReference, options: {
|
|
16
15
|
allowUnstable: boolean;
|
|
17
16
|
}) => Promise<BlockPackFromRegistryV2>;
|
|
@@ -32,7 +31,7 @@ type KindAwareRegistry = {
|
|
|
32
31
|
* registries — with the search stopping at the first hit, the earlier registry is
|
|
33
32
|
* simply the answer.
|
|
34
33
|
*/
|
|
35
|
-
declare function kindCapableRegistryIds(entries: readonly RegistryEntry[]): string[];
|
|
34
|
+
export declare function kindCapableRegistryIds(entries: readonly RegistryEntry[]): string[];
|
|
36
35
|
/**
|
|
37
36
|
* A {@link BlockPackProvider} over the configured block registries.
|
|
38
37
|
*
|
|
@@ -52,11 +51,10 @@ declare function kindCapableRegistryIds(entries: readonly RegistryEntry[]): stri
|
|
|
52
51
|
* fallback to the next registry has to swallow the reason; this is the only place it
|
|
53
52
|
* survives
|
|
54
53
|
*/
|
|
55
|
-
declare function templateBlockPackProvider(deps: {
|
|
54
|
+
export declare function templateBlockPackProvider(deps: {
|
|
56
55
|
readonly registry: KindAwareRegistry;
|
|
57
56
|
readonly registryIds: readonly string[];
|
|
58
57
|
readonly logger: MiLogger;
|
|
59
58
|
}): BlockPackProvider;
|
|
60
59
|
//#endregion
|
|
61
|
-
export { KindAwareRegistry, kindCapableRegistryIds, templateBlockPackProvider };
|
|
62
60
|
//# sourceMappingURL=template_provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template_provider.d.ts","names":[],"sources":["../../src/block_registry/template_provider.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"template_provider.d.ts","names":[],"sources":["../../src/block_registry/template_provider.ts"],"mappings":";;;;;;;;;;;;YAqBY;EACV,cACE,oBACA,KAAK,oBACL;IAAW;QACR,QAAQ;EACb,cACE,oBACA,SAAS,aACT,oBACG,QAAQ;;;;;;;;;;;;;;;;;wBAkBC,uBAAuB,kBAAkB;;;;;;;;;;;;;;;;;;;;wBAuBzC,0BAA0B;WAC/B,UAAU;WACV;WACA,QAAQ;IACf"}
|
|
@@ -3,21 +3,20 @@ import { BlockPackSpec, BlockSettings, UpdateSuggestions } from "@milaboratories
|
|
|
3
3
|
import { Dispatcher } from "undici";
|
|
4
4
|
import { MiLogger } from "@milaboratories/ts-helpers";
|
|
5
5
|
import { PollComputablePool, PollPoolOps } from "@milaboratories/computable";
|
|
6
|
-
|
|
7
6
|
//#region src/block_registry/watcher.d.ts
|
|
8
|
-
type BlockUpdateWatcherOps = Partial<PollPoolOps> & {
|
|
7
|
+
export type BlockUpdateWatcherOps = Partial<PollPoolOps> & {
|
|
9
8
|
readonly http?: Dispatcher;
|
|
10
9
|
readonly preferredUpdateChannel?: string;
|
|
11
10
|
};
|
|
12
|
-
type CheckForUpdateRequest = {
|
|
11
|
+
export type CheckForUpdateRequest = {
|
|
13
12
|
currentSpec: BlockPackSpec;
|
|
14
13
|
settings: BlockSettings;
|
|
15
14
|
};
|
|
16
|
-
type CheckForUpdateResponse = {
|
|
15
|
+
export type CheckForUpdateResponse = {
|
|
17
16
|
suggestions: UpdateSuggestions;
|
|
18
17
|
mainSuggestion?: BlockPackSpec;
|
|
19
18
|
};
|
|
20
|
-
declare class BlockUpdateWatcher extends PollComputablePool<CheckForUpdateRequest, CheckForUpdateResponse> {
|
|
19
|
+
export declare class BlockUpdateWatcher extends PollComputablePool<CheckForUpdateRequest, CheckForUpdateResponse> {
|
|
21
20
|
private readonly registryProvider;
|
|
22
21
|
private readonly http?;
|
|
23
22
|
private readonly preferredUpdateChannel?;
|
|
@@ -27,5 +26,4 @@ declare class BlockUpdateWatcher extends PollComputablePool<CheckForUpdateReques
|
|
|
27
26
|
protected resultsEqual(res1: CheckForUpdateResponse, res2: CheckForUpdateResponse): boolean;
|
|
28
27
|
}
|
|
29
28
|
//#endregion
|
|
30
|
-
export { BlockUpdateWatcher, BlockUpdateWatcherOps, CheckForUpdateRequest, CheckForUpdateResponse };
|
|
31
29
|
//# sourceMappingURL=watcher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcher.d.ts","names":[],"sources":["../../src/block_registry/watcher.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","names":[],"sources":["../../src/block_registry/watcher.ts"],"mappings":";;;;;;YA6BY,wBAAwB,QAAQ;WACjC,OAAO;WACP;;YAKC;EACV,aAAa;EACb,UAAU;;YAGA;EACV,aAAa;EACb,iBAAiB;;qBAGN,2BAA2B,mBACtC,uBACA;mBAMmB;mBAJF;mBACA;EAEjB,YACmB,kBAAkB,oBACnC,QAAQ,UACR,MAAK;YAOG,OAAO,KAAK;YAeN,UAAU,KAAK,wBAAwB,QAAQ;YAgIrD,aAAa,MAAM,wBAAwB,MAAM"}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { RegistrySpec } from "@milaboratories/pl-model-middle-layer";
|
|
2
|
-
|
|
3
2
|
//#region src/block_registry/well_known_registries.d.ts
|
|
4
|
-
declare const CentralBlockRegistry: RegistrySpec;
|
|
5
|
-
declare const V1CentralRegistry: RegistrySpec;
|
|
6
|
-
declare const V1CentralDevSnapshotRegistry: RegistrySpec;
|
|
3
|
+
export declare const CentralBlockRegistry: RegistrySpec;
|
|
4
|
+
export declare const V1CentralRegistry: RegistrySpec;
|
|
5
|
+
export declare const V1CentralDevSnapshotRegistry: RegistrySpec;
|
|
7
6
|
//#endregion
|
|
8
|
-
export { CentralBlockRegistry, V1CentralDevSnapshotRegistry, V1CentralRegistry };
|
|
9
7
|
//# sourceMappingURL=well_known_registries.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"well_known_registries.d.ts","names":[],"sources":["../../src/block_registry/well_known_registries.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"well_known_registries.d.ts","names":[],"sources":["../../src/block_registry/well_known_registries.ts"],"mappings":";;qBAEa,sBAAsB;qBAKtB,mBAAmB;qBAKnB,8BAA8B"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,17 +4,21 @@ import { CentralBlockRegistry, V1CentralDevSnapshotRegistry, V1CentralRegistry }
|
|
|
4
4
|
import { AppliedEntry, TemplateApplyProblem, TemplateApplyReport, TemplateEntryRejected } from "./model/template_apply.js";
|
|
5
5
|
import { BlockPackProvider, ExactResolution, KindResolution, ResolvedEntry, TemplateResolveOutcome, parseBlockPackName, resolveTemplateEntries } from "./model/template_resolve.js";
|
|
6
6
|
import { KindAwareRegistry, kindCapableRegistryIds, templateBlockPackProvider } from "./block_registry/template_provider.js";
|
|
7
|
+
import "./block_registry/index.js";
|
|
7
8
|
import { BlockArgsAuthorKeyPrefix, ProjectCreatedTimestamp, ProjectField, ProjectId, ProjectLastModifiedTimestamp, ProjectListEntry, ProjectMetaKey, ProjectResourceType, ProjectStructureAuthorKey, ProjectStructureKey, SchemaVersionCurrent, SchemaVersionKey } from "./model/project_model.js";
|
|
8
9
|
import { AcceptanceFieldPrefix, EnvelopeAcceptance, EnvelopeData, EnvelopeMode, EnvelopeProject, ProjectChangeAction, ProjectFieldUuid, ShareId, ShareProjectsOptions, SharedEnvelopeResourceType, SharingDecision, SharingOutboxField, SharingOutboxResourceType, SharingStateField, SharingStateResourceType, acceptanceField, acceptanceFieldLogin, asShareId, canGrantToEveryone, canImpersonate, decisionField, decodeEnvelopeData, isAcceptanceField, newShareId } from "./model/sharing_model.js";
|
|
9
10
|
import { OutgoingShare, PendingShare } from "./middle_layer/sharing_list.js";
|
|
10
11
|
import { CachedTemplate, ExplicitTemplate, PreparedTemplate, TemplateFromFile, TemplateFromRegistry, TemplateSpecAny, TemplateSpecPrepared } from "./model/template_spec.js";
|
|
11
12
|
import { BlockPackExplicit, BlockPackSpecAny, BlockPackSpecPrepared, FrontendFromFolder, FrontendFromFolderData, FrontendFromFolderResourceType, FrontendFromLocalTgz, FrontendFromLocalTgzData, FrontendFromLocalTgzResourceType, FrontendFromUrl, FrontendFromUrlData, FrontendFromUrlResourceType, FrontendSpec } from "./model/block_pack_spec.js";
|
|
12
13
|
import { TemplateParseOutcome, parseProjectTemplateV1Yaml } from "./model/template_parser.js";
|
|
14
|
+
import "./model/index.js";
|
|
13
15
|
import { Project } from "./middle_layer/project.js";
|
|
14
|
-
import { DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings, DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings, DriverKitOps, DriverKitOpsConstructor, DriverKitOpsPaths, DriverKitOpsSettings, MiddleLayerDebugOptions, MiddleLayerOps, MiddleLayerOpsConstructor, MiddleLayerOpsPaths, MiddleLayerOpsSettings } from "./middle_layer/ops.js";
|
|
16
|
+
import { DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings, DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings, DriverKitOps, DriverKitOpsConstructor, DriverKitOpsPaths, DriverKitOpsSettings, MiddleLayerDebugOptions, MiddleLayerOps, MiddleLayerOpsConstructor, MiddleLayerOpsPaths, MiddleLayerOpsSettings, TreeSnapshotOps } from "./middle_layer/ops.js";
|
|
15
17
|
import { MiddleLayerDriverKit, initDriverKit } from "./middle_layer/driver_kit.js";
|
|
18
|
+
import { TreeSnapshotMiss, TreeSnapshotStat } from "./middle_layer/tree_snapshot_store.js";
|
|
16
19
|
import { MiddleLayer } from "./middle_layer/middle_layer.js";
|
|
17
20
|
import { ProjectsField } from "./middle_layer/project_list.js";
|
|
21
|
+
import "./middle_layer/index.js";
|
|
18
22
|
import { CheckNetworkOpts, checkNetwork, initNetworkCheck } from "./network_check/network_check.js";
|
|
19
23
|
import { TengoTemplateGet, TengoTemplateGetRegistry, TengoTemplateGetTemplate, TengoTemplateGetTemplateURI, TengoTemplatePack, TengoTemplatePackConvert, TengoTemplatePackConvertTemplate, TengoTemplatePackConvertTemplatePack, loadTemplate, prepareTemplateSpec } from "./mutator/template/template_loading.js";
|
|
20
24
|
import { ACCESS_COUNT_KEY, ACCESS_KEY_PREFIX, GC_ACCESS_THRESHOLD, GC_MAX_ENTRIES, TemplateCacheFieldName, TemplateCacheStat, TemplateCacheType, cacheBlockPackTemplate, dropTemplateCache, flattenTemplateTree, getOrCreateTemplateCache, invalidateTemplateCacheId, loadTemplateCached, runGc } from "./mutator/template/template_cache.js";
|
|
@@ -28,4 +32,4 @@ export * from "@platforma-sdk/model";
|
|
|
28
32
|
export * from "@milaboratories/pl-model-middle-layer";
|
|
29
33
|
export * from "@milaboratories/pl-deployments";
|
|
30
34
|
export * from "@milaboratories/pl-client";
|
|
31
|
-
export { ACCESS_COUNT_KEY, ACCESS_KEY_PREFIX, AcceptanceFieldPrefix, type AppliedEntry, BlockArgsAuthorKeyPrefix, BlockPackExplicit, type BlockPackProvider, BlockPackRegistry, BlockPackSpecAny, BlockPackSpecPrepared, CachedTemplate, CentralBlockRegistry, CheckNetworkOpts, DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings, DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings, DriverKitOps, DriverKitOpsConstructor, DriverKitOpsPaths, DriverKitOpsSettings, EnvelopeAcceptance, EnvelopeData, EnvelopeMode, EnvelopeProject, type ExactResolution, ExplicitTemplate, type FieldType, FrontendFromFolder, FrontendFromFolderData, FrontendFromFolderResourceType, FrontendFromLocalTgz, FrontendFromLocalTgzData, FrontendFromLocalTgzResourceType, FrontendFromUrl, FrontendFromUrlData, FrontendFromUrlResourceType, FrontendSpec, GC_ACCESS_THRESHOLD, GC_MAX_ENTRIES, type InternalLsDriver, KindAwareRegistry, type KindResolution, MiddleLayer, MiddleLayerDebugOptions, MiddleLayerDriverKit, MiddleLayerOps, MiddleLayerOpsConstructor, MiddleLayerOpsPaths, MiddleLayerOpsSettings, type OutgoingShare, type PendingShare, PreparedTemplate, Project, ProjectChangeAction, ProjectCreatedTimestamp, type ProjectField, ProjectFieldUuid, type ProjectId, ProjectLastModifiedTimestamp, type ProjectListEntry, ProjectMetaKey, ProjectResourceType, ProjectStructureAuthorKey, ProjectStructureKey, ProjectsField, type ResolvedEntry, type ResourceType, SchemaVersionCurrent, SchemaVersionKey, ShareId, ShareProjectsOptions, SharedEnvelopeResourceType, SharingDecision, SharingOutboxField, SharingOutboxResourceType, SharingStateField, SharingStateResourceType, type TemplateApplyProblem, type TemplateApplyReport, TemplateCacheFieldName, TemplateCacheStat, TemplateCacheType, TemplateEntryRejected, TemplateFromFile, TemplateFromRegistry, type TemplateParseOutcome, type TemplateResolveOutcome, TemplateSpecAny, TemplateSpecPrepared, TengoTemplateGet, TengoTemplateGetRegistry, TengoTemplateGetTemplate, TengoTemplateGetTemplateURI, TengoTemplatePack, TengoTemplatePackConvert, TengoTemplatePackConvertTemplate, TengoTemplatePackConvertTemplatePack, V1CentralDevSnapshotRegistry, V1CentralRegistry, V2RegistryProvider, acceptanceField, acceptanceFieldLogin, asShareId, cacheBlockPackTemplate, canGrantToEveryone, canImpersonate, checkNetwork, createRenderTemplate, decisionField, decodeEnvelopeData, deriveGlobalPObjectId, deriveLocalPObjectId, dropTemplateCache, duplicateProject, flattenTemplateTree, getDevV1PacketMtime, getDevV2PacketMtime, getFromPackV2Mtime, getOrCreateTemplateCache, initDriverKit, initNetworkCheck, invalidateTemplateCacheId, isAcceptanceField, kindCapableRegistryIds, loadTemplate, loadTemplateCached, newShareId, parseBlockPackName, parseFinalPObjectCollection, parseProjectTemplateV1Yaml, prepareTemplateSpec, resolveTemplateEntries, runGc, templateBlockPackProvider };
|
|
35
|
+
export { ACCESS_COUNT_KEY, ACCESS_KEY_PREFIX, AcceptanceFieldPrefix, type AppliedEntry, BlockArgsAuthorKeyPrefix, BlockPackExplicit, type BlockPackProvider, BlockPackRegistry, BlockPackSpecAny, BlockPackSpecPrepared, CachedTemplate, CentralBlockRegistry, CheckNetworkOpts, DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings, DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings, DriverKitOps, DriverKitOpsConstructor, DriverKitOpsPaths, DriverKitOpsSettings, EnvelopeAcceptance, EnvelopeData, EnvelopeMode, EnvelopeProject, type ExactResolution, ExplicitTemplate, type FieldType, FrontendFromFolder, FrontendFromFolderData, FrontendFromFolderResourceType, FrontendFromLocalTgz, FrontendFromLocalTgzData, FrontendFromLocalTgzResourceType, FrontendFromUrl, FrontendFromUrlData, FrontendFromUrlResourceType, FrontendSpec, GC_ACCESS_THRESHOLD, GC_MAX_ENTRIES, type InternalLsDriver, KindAwareRegistry, type KindResolution, MiddleLayer, MiddleLayerDebugOptions, MiddleLayerDriverKit, MiddleLayerOps, MiddleLayerOpsConstructor, MiddleLayerOpsPaths, MiddleLayerOpsSettings, type OutgoingShare, type PendingShare, PreparedTemplate, Project, ProjectChangeAction, ProjectCreatedTimestamp, type ProjectField, ProjectFieldUuid, type ProjectId, ProjectLastModifiedTimestamp, type ProjectListEntry, ProjectMetaKey, ProjectResourceType, ProjectStructureAuthorKey, ProjectStructureKey, ProjectsField, type ResolvedEntry, type ResourceType, SchemaVersionCurrent, SchemaVersionKey, ShareId, ShareProjectsOptions, SharedEnvelopeResourceType, SharingDecision, SharingOutboxField, SharingOutboxResourceType, SharingStateField, SharingStateResourceType, type TemplateApplyProblem, type TemplateApplyReport, TemplateCacheFieldName, TemplateCacheStat, TemplateCacheType, TemplateEntryRejected, TemplateFromFile, TemplateFromRegistry, type TemplateParseOutcome, type TemplateResolveOutcome, TemplateSpecAny, TemplateSpecPrepared, TengoTemplateGet, TengoTemplateGetRegistry, TengoTemplateGetTemplate, TengoTemplateGetTemplateURI, TengoTemplatePack, TengoTemplatePackConvert, TengoTemplatePackConvertTemplate, TengoTemplatePackConvertTemplatePack, type TreeSnapshotMiss, TreeSnapshotOps, type TreeSnapshotStat, V1CentralDevSnapshotRegistry, V1CentralRegistry, V2RegistryProvider, acceptanceField, acceptanceFieldLogin, asShareId, cacheBlockPackTemplate, canGrantToEveryone, canImpersonate, checkNetwork, createRenderTemplate, decisionField, decodeEnvelopeData, deriveGlobalPObjectId, deriveLocalPObjectId, dropTemplateCache, duplicateProject, flattenTemplateTree, getDevV1PacketMtime, getDevV2PacketMtime, getFromPackV2Mtime, getOrCreateTemplateCache, initDriverKit, initNetworkCheck, invalidateTemplateCacheId, isAcceptanceField, kindCapableRegistryIds, loadTemplate, loadTemplateCached, newShareId, parseBlockPackName, parseFinalPObjectCollection, parseProjectTemplateV1Yaml, prepareTemplateSpec, resolveTemplateEntries, runGc, templateBlockPackProvider };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
//#region src/middle_layer/build_stamp.ts
|
|
2
|
+
function injectedStamp() {
|
|
3
|
+
try {
|
|
4
|
+
return "48a74953f8cd-dirty-1787671552027";
|
|
5
|
+
} catch {
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Identifies the build of this package, and through it the rules that shape what a persisted
|
|
11
|
+
* tree mirror contains: the pruning function, the field filter and the traversal stop rules,
|
|
12
|
+
* all of which live in this package. (The finality predicate comes from pl-client and is NOT
|
|
13
|
+
* covered, which is harmless: finality is recomputed on restore, so it is the one rule that
|
|
14
|
+
* cannot poison a stored file.)
|
|
15
|
+
*
|
|
16
|
+
* Used as a cache-key component, so a change to those rules invalidates every snapshot, costing
|
|
17
|
+
* one cold open. Each built artifact bakes in one stamp, so reopens stay warm across restarts
|
|
18
|
+
* of an installed version. A build from a dirty worktree includes the build time, so editing
|
|
19
|
+
* those rules locally can never hit a snapshot written under the old ones. In practice release
|
|
20
|
+
* builds are dirty too, because CI writes version bumps into the worktree before building; that
|
|
21
|
+
* costs nothing, since the stamp only has to be stable within an artifact.
|
|
22
|
+
*
|
|
23
|
+
* With no build at all (sources mode) the value is a constant. That deliberately trades away
|
|
24
|
+
* the dirty-worktree guarantee: it means someone running from sources exercises the restore
|
|
25
|
+
* path at all, rather than every snapshot being a guaranteed miss for the one audience most
|
|
26
|
+
* likely to find its defects. The exposure it reintroduces, editing pruning rules from sources
|
|
27
|
+
* and hitting a mirror written under the old ones, is the local-development gap the design
|
|
28
|
+
* already accepts, and `treeSnapshots: false` or deleting the directory clears it.
|
|
29
|
+
*/
|
|
30
|
+
const ML_BUILD_STAMP = injectedStamp() ?? "sources";
|
|
31
|
+
//#endregion
|
|
32
|
+
exports.ML_BUILD_STAMP = ML_BUILD_STAMP;
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=build_stamp.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build_stamp.cjs","names":[],"sources":["../../src/middle_layer/build_stamp.ts"],"sourcesContent":["/** Injected by rolldown at build time, see `build.node.config.js`. Absent when the package is\n * consumed straight from sources (`USE_SOURCES=1`), because no build step runs then. */\ndeclare const __PL_ML_BUILD_STAMP__: string | undefined;\n\nfunction injectedStamp(): string | undefined {\n try {\n // Read inside a try: with no build step the identifier is an undeclared global, and\n // reading it throws a ReferenceError rather than yielding undefined.\n return __PL_ML_BUILD_STAMP__;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Identifies the build of this package, and through it the rules that shape what a persisted\n * tree mirror contains: the pruning function, the field filter and the traversal stop rules,\n * all of which live in this package. (The finality predicate comes from pl-client and is NOT\n * covered, which is harmless: finality is recomputed on restore, so it is the one rule that\n * cannot poison a stored file.)\n *\n * Used as a cache-key component, so a change to those rules invalidates every snapshot, costing\n * one cold open. Each built artifact bakes in one stamp, so reopens stay warm across restarts\n * of an installed version. A build from a dirty worktree includes the build time, so editing\n * those rules locally can never hit a snapshot written under the old ones. In practice release\n * builds are dirty too, because CI writes version bumps into the worktree before building; that\n * costs nothing, since the stamp only has to be stable within an artifact.\n *\n * With no build at all (sources mode) the value is a constant. That deliberately trades away\n * the dirty-worktree guarantee: it means someone running from sources exercises the restore\n * path at all, rather than every snapshot being a guaranteed miss for the one audience most\n * likely to find its defects. The exposure it reintroduces, editing pruning rules from sources\n * and hitting a mirror written under the old ones, is the local-development gap the design\n * already accepts, and `treeSnapshots: false` or deleting the directory clears it.\n */\nexport const ML_BUILD_STAMP: string = injectedStamp() ?? \"sources\";\n"],"mappings":";AAIA,SAAS,gBAAoC;CAC3C,IAAI;EAGF,OAAA;CACF,QAAQ;EACN;CACF;AACF;;;;;;;;;;;;;;;;;;;;;;AAuBA,MAAa,iBAAyB,cAAc,KAAK"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
//#region src/middle_layer/build_stamp.ts
|
|
2
|
+
function injectedStamp() {
|
|
3
|
+
try {
|
|
4
|
+
return "48a74953f8cd-dirty-1787671551997";
|
|
5
|
+
} catch {
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Identifies the build of this package, and through it the rules that shape what a persisted
|
|
11
|
+
* tree mirror contains: the pruning function, the field filter and the traversal stop rules,
|
|
12
|
+
* all of which live in this package. (The finality predicate comes from pl-client and is NOT
|
|
13
|
+
* covered, which is harmless: finality is recomputed on restore, so it is the one rule that
|
|
14
|
+
* cannot poison a stored file.)
|
|
15
|
+
*
|
|
16
|
+
* Used as a cache-key component, so a change to those rules invalidates every snapshot, costing
|
|
17
|
+
* one cold open. Each built artifact bakes in one stamp, so reopens stay warm across restarts
|
|
18
|
+
* of an installed version. A build from a dirty worktree includes the build time, so editing
|
|
19
|
+
* those rules locally can never hit a snapshot written under the old ones. In practice release
|
|
20
|
+
* builds are dirty too, because CI writes version bumps into the worktree before building; that
|
|
21
|
+
* costs nothing, since the stamp only has to be stable within an artifact.
|
|
22
|
+
*
|
|
23
|
+
* With no build at all (sources mode) the value is a constant. That deliberately trades away
|
|
24
|
+
* the dirty-worktree guarantee: it means someone running from sources exercises the restore
|
|
25
|
+
* path at all, rather than every snapshot being a guaranteed miss for the one audience most
|
|
26
|
+
* likely to find its defects. The exposure it reintroduces, editing pruning rules from sources
|
|
27
|
+
* and hitting a mirror written under the old ones, is the local-development gap the design
|
|
28
|
+
* already accepts, and `treeSnapshots: false` or deleting the directory clears it.
|
|
29
|
+
*/
|
|
30
|
+
const ML_BUILD_STAMP = injectedStamp() ?? "sources";
|
|
31
|
+
//#endregion
|
|
32
|
+
export { ML_BUILD_STAMP };
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=build_stamp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build_stamp.js","names":[],"sources":["../../src/middle_layer/build_stamp.ts"],"sourcesContent":["/** Injected by rolldown at build time, see `build.node.config.js`. Absent when the package is\n * consumed straight from sources (`USE_SOURCES=1`), because no build step runs then. */\ndeclare const __PL_ML_BUILD_STAMP__: string | undefined;\n\nfunction injectedStamp(): string | undefined {\n try {\n // Read inside a try: with no build step the identifier is an undeclared global, and\n // reading it throws a ReferenceError rather than yielding undefined.\n return __PL_ML_BUILD_STAMP__;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Identifies the build of this package, and through it the rules that shape what a persisted\n * tree mirror contains: the pruning function, the field filter and the traversal stop rules,\n * all of which live in this package. (The finality predicate comes from pl-client and is NOT\n * covered, which is harmless: finality is recomputed on restore, so it is the one rule that\n * cannot poison a stored file.)\n *\n * Used as a cache-key component, so a change to those rules invalidates every snapshot, costing\n * one cold open. Each built artifact bakes in one stamp, so reopens stay warm across restarts\n * of an installed version. A build from a dirty worktree includes the build time, so editing\n * those rules locally can never hit a snapshot written under the old ones. In practice release\n * builds are dirty too, because CI writes version bumps into the worktree before building; that\n * costs nothing, since the stamp only has to be stable within an artifact.\n *\n * With no build at all (sources mode) the value is a constant. That deliberately trades away\n * the dirty-worktree guarantee: it means someone running from sources exercises the restore\n * path at all, rather than every snapshot being a guaranteed miss for the one audience most\n * likely to find its defects. The exposure it reintroduces, editing pruning rules from sources\n * and hitting a mirror written under the old ones, is the local-development gap the design\n * already accepts, and `treeSnapshots: false` or deleting the directory clears it.\n */\nexport const ML_BUILD_STAMP: string = injectedStamp() ?? \"sources\";\n"],"mappings":";AAIA,SAAS,gBAAoC;CAC3C,IAAI;EAGF,OAAA;CACF,QAAQ;EACN;CACF;AACF;;;;;;;;;;;;;;;;;;;;;;AAuBA,MAAa,iBAAyB,cAAc,KAAK"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { InternalPFrameDriver } from "../pool/driver.js";
|
|
2
|
+
import "../pool/index.js";
|
|
2
3
|
import { DriverKitOpsConstructor } from "./ops.js";
|
|
3
4
|
import { Signer } from "@milaboratories/ts-helpers";
|
|
4
5
|
import * as Sdk from "@milaboratories/pl-model-common";
|
|
5
6
|
import { PlClient } from "@milaboratories/pl-client";
|
|
6
7
|
import { DownloadBlobToURLDriver, DownloadDriver, DownloadUrlDriver, InternalLsDriver, LogsDriver, UploadDriver } from "@milaboratories/pl-drivers";
|
|
7
|
-
|
|
8
8
|
//#region src/middle_layer/driver_kit.d.ts
|
|
9
9
|
/**
|
|
10
10
|
* Drivers offered by the middle-layer for internal consumers,
|
|
@@ -13,7 +13,7 @@ import { DownloadBlobToURLDriver, DownloadDriver, DownloadUrlDriver, InternalLsD
|
|
|
13
13
|
* This intertface is basically a version of the DriverKit from
|
|
14
14
|
* UI SDK with extended API.
|
|
15
15
|
* */
|
|
16
|
-
interface MiddleLayerDriverKit extends Sdk.DriverKit, AsyncDisposable {
|
|
16
|
+
export interface MiddleLayerDriverKit extends Sdk.DriverKit, AsyncDisposable {
|
|
17
17
|
/** Dispose the driver kit and all its resources. */
|
|
18
18
|
dispose(): Promise<void>;
|
|
19
19
|
readonly blobDriver: DownloadDriver;
|
|
@@ -33,7 +33,6 @@ interface MiddleLayerDriverKit extends Sdk.DriverKit, AsyncDisposable {
|
|
|
33
33
|
* */
|
|
34
34
|
readonly uploadDriver: UploadDriver;
|
|
35
35
|
}
|
|
36
|
-
declare function initDriverKit(pl: PlClient, workdir: string, frontendDownloadPath: string, _ops: DriverKitOpsConstructor): Promise<MiddleLayerDriverKit>;
|
|
36
|
+
export declare function initDriverKit(pl: PlClient, workdir: string, frontendDownloadPath: string, _ops: DriverKitOpsConstructor): Promise<MiddleLayerDriverKit>;
|
|
37
37
|
//#endregion
|
|
38
|
-
export { MiddleLayerDriverKit, initDriverKit };
|
|
39
38
|
//# sourceMappingURL=driver_kit.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver_kit.d.ts","names":[],"sources":["../../src/middle_layer/driver_kit.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"driver_kit.d.ts","names":[],"sources":["../../src/middle_layer/driver_kit.ts"],"mappings":";;;;;;;;;;;;;;;iBA+BiB,6BAA6B,IAAI,WAAW;;EAE3D,WAAW;WAGF,YAAY;WAEZ,iBAAiB;WAEjB,WAAW;WAEX,UAAU;WAEV,cAAc;WAEd,gBAAgB;;;;;WAMhB,QAAQ;;;;;WAMR,cAAc;;wBAGH,cACpB,IAAI,UACJ,iBACA,8BACA,MAAM,0BACL,QAAQ"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { OutgoingShare, PendingShare } from "./sharing_list.js";
|
|
2
2
|
import { Project } from "./project.js";
|
|
3
|
-
import { DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings, DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings, DriverKitOps, DriverKitOpsConstructor, DriverKitOpsPaths, DriverKitOpsSettings, MiddleLayerDebugOptions, MiddleLayerOps, MiddleLayerOpsConstructor, MiddleLayerOpsPaths, MiddleLayerOpsSettings } from "./ops.js";
|
|
3
|
+
import { DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings, DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings, DriverKitOps, DriverKitOpsConstructor, DriverKitOpsPaths, DriverKitOpsSettings, MiddleLayerDebugOptions, MiddleLayerOps, MiddleLayerOpsConstructor, MiddleLayerOpsPaths, MiddleLayerOpsSettings, TreeSnapshotOps } from "./ops.js";
|
|
4
4
|
import { MiddleLayerDriverKit, initDriverKit } from "./driver_kit.js";
|
|
5
|
+
import { TreeSnapshotMiss, TreeSnapshotStat } from "./tree_snapshot_store.js";
|
|
5
6
|
import { MiddleLayer } from "./middle_layer.js";
|
|
6
7
|
import { ProjectsField } from "./project_list.js";
|
|
7
|
-
export { DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings, DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings, DriverKitOps, DriverKitOpsConstructor, DriverKitOpsPaths, DriverKitOpsSettings, MiddleLayer, MiddleLayerDebugOptions, MiddleLayerDriverKit, MiddleLayerOps, MiddleLayerOpsConstructor, MiddleLayerOpsPaths, MiddleLayerOpsSettings, type OutgoingShare, type PendingShare, Project, ProjectsField, initDriverKit };
|
|
8
|
+
export { DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings, DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings, DriverKitOps, DriverKitOpsConstructor, DriverKitOpsPaths, DriverKitOpsSettings, MiddleLayer, MiddleLayerDebugOptions, MiddleLayerDriverKit, MiddleLayerOps, MiddleLayerOpsConstructor, MiddleLayerOpsPaths, MiddleLayerOpsSettings, type OutgoingShare, type PendingShare, Project, ProjectsField, type TreeSnapshotMiss, TreeSnapshotOps, type TreeSnapshotStat, initDriverKit };
|
|
@@ -18,6 +18,7 @@ const require_watcher = require("../block_registry/watcher.cjs");
|
|
|
18
18
|
const require_driver_kit = require("./driver_kit.cjs");
|
|
19
19
|
const require_service_factories = require("../service_factories.cjs");
|
|
20
20
|
const require_project_helper = require("../model/project_helper.cjs");
|
|
21
|
+
const require_tree_snapshot_store = require("./tree_snapshot_store.cjs");
|
|
21
22
|
let _platforma_sdk_model = require("@platforma-sdk/model");
|
|
22
23
|
let undici = require("undici");
|
|
23
24
|
let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
|
|
@@ -28,6 +29,10 @@ let _milaboratories_computable = require("@milaboratories/computable");
|
|
|
28
29
|
let node_crypto = require("node:crypto");
|
|
29
30
|
let quickjs_emscripten = require("quickjs-emscripten");
|
|
30
31
|
//#region src/middle_layer/middle_layer.ts
|
|
32
|
+
/** How long shutdown waits for close-boundary snapshot writes that are already running. Long
|
|
33
|
+
* enough for a ten-megabyte encode and write on ordinary storage, short enough that a wedged
|
|
34
|
+
* filesystem does not hold the quit open. */
|
|
35
|
+
const SNAPSHOT_DRAIN_TIMEOUT_MS = 5e3;
|
|
31
36
|
/**
|
|
32
37
|
* Main access object to work with pl from UI.
|
|
33
38
|
*
|
|
@@ -757,6 +762,32 @@ var MiddleLayer = class MiddleLayer {
|
|
|
757
762
|
}
|
|
758
763
|
}
|
|
759
764
|
openedProjects = /* @__PURE__ */ new Map();
|
|
765
|
+
/** Snapshot writes started by {@link closeProject} and not yet finished. Held only so
|
|
766
|
+
* {@link close} can give them a bounded chance to land. */
|
|
767
|
+
pendingSnapshotWrites = /* @__PURE__ */ new Set();
|
|
768
|
+
trackSnapshotWrite(write) {
|
|
769
|
+
this.pendingSnapshotWrites.add(write);
|
|
770
|
+
write.finally(() => this.pendingSnapshotWrites.delete(write));
|
|
771
|
+
}
|
|
772
|
+
/** Waits for close-boundary snapshot writes that are already running, up to `timeoutMs`.
|
|
773
|
+
*
|
|
774
|
+
* This starts no work: quitting still performs no snapshot of its own. It only lets a write
|
|
775
|
+
* that a project close already began finish, so closing a project and immediately quitting
|
|
776
|
+
* does not routinely lose it. Bounded, because a wedged filesystem must not hang the quit,
|
|
777
|
+
* and losing the write costs one cold open rather than any correctness. */
|
|
778
|
+
async drainSnapshotWrites(timeoutMs) {
|
|
779
|
+
if (this.pendingSnapshotWrites.size === 0) return;
|
|
780
|
+
let timer;
|
|
781
|
+
const expiry = new Promise((resolve) => {
|
|
782
|
+
timer = setTimeout(resolve, timeoutMs);
|
|
783
|
+
timer.unref?.();
|
|
784
|
+
});
|
|
785
|
+
try {
|
|
786
|
+
await Promise.race([Promise.allSettled(this.pendingSnapshotWrites), expiry]);
|
|
787
|
+
} finally {
|
|
788
|
+
if (timer !== void 0) clearTimeout(timer);
|
|
789
|
+
}
|
|
790
|
+
}
|
|
760
791
|
/** Opens a project, and starts corresponding project maintenance loop. */
|
|
761
792
|
async openProject(id) {
|
|
762
793
|
if (this.openedProjects.has(id)) throw new Error(`Project ${id} already opened`);
|
|
@@ -769,6 +800,7 @@ var MiddleLayer = class MiddleLayer {
|
|
|
769
800
|
const prj = this.openedProjects.get(id);
|
|
770
801
|
if (prj === void 0) throw new Error(`Project ${id} not found among opened projects`);
|
|
771
802
|
this.openedProjects.delete(id);
|
|
803
|
+
this.trackSnapshotWrite(prj.snapshotOnClose());
|
|
772
804
|
await prj.destroy();
|
|
773
805
|
this.openedProjectsList.setValue([...this.openedProjects.keys()]);
|
|
774
806
|
}
|
|
@@ -782,6 +814,12 @@ var MiddleLayer = class MiddleLayer {
|
|
|
782
814
|
isProjectOpened(id) {
|
|
783
815
|
return this.openedProjects.has(id);
|
|
784
816
|
}
|
|
817
|
+
/** Counters for the persisted project tree mirrors, or undefined when they are switched off.
|
|
818
|
+
* Reads and hits are what show whether a reopen was actually warm, and the miss breakdown
|
|
819
|
+
* says why it was not. */
|
|
820
|
+
get treeSnapshotStats() {
|
|
821
|
+
return this.env.treeSnapshots?.getStats();
|
|
822
|
+
}
|
|
785
823
|
/**
|
|
786
824
|
* Deallocates all runtime resources consumed by this object and awaits
|
|
787
825
|
* actual termination of event loops and other processes associated with
|
|
@@ -796,6 +834,7 @@ var MiddleLayer = class MiddleLayer {
|
|
|
796
834
|
this.sharingStateTree.terminate(),
|
|
797
835
|
this.pendingSharesTree.terminate()
|
|
798
836
|
]);
|
|
837
|
+
await this.drainSnapshotWrites(SNAPSHOT_DRAIN_TIMEOUT_MS);
|
|
799
838
|
await this.env.dispose();
|
|
800
839
|
await this.pl.close();
|
|
801
840
|
}
|
|
@@ -858,6 +897,14 @@ var MiddleLayer = class MiddleLayer {
|
|
|
858
897
|
runtimeCapabilities.addSupportedRequirement("requiresPFramesVersion", _milaboratories_pl_model_common.REQUIRES_PFRAMES_VERSION);
|
|
859
898
|
(0, _milaboratories_pl_model_common.registerServiceCapabilities)((flag, value) => runtimeCapabilities.addSupportedRequirement(flag, value));
|
|
860
899
|
const serviceRegistry = require_service_factories.createModelServiceRegistry({ logger });
|
|
900
|
+
const treeSnapshots = require_tree_snapshot_store.TreeSnapshotStore.create(pl, {
|
|
901
|
+
dir: ops.treeSnapshotPath,
|
|
902
|
+
maxSizeBytes: ops.treeSnapshotOps.maxSizeBytes,
|
|
903
|
+
enabled: ops.treeSnapshotOps.enabled,
|
|
904
|
+
logger
|
|
905
|
+
});
|
|
906
|
+
if (ops.treeSnapshotOps.enabled) await treeSnapshots?.evict();
|
|
907
|
+
else await require_tree_snapshot_store.TreeSnapshotStore.purge(ops.treeSnapshotPath, logger);
|
|
861
908
|
const env = {
|
|
862
909
|
pl,
|
|
863
910
|
blockEventDispatcher: new _milaboratories_ts_helpers.BlockEventDispatcher(),
|
|
@@ -878,6 +925,7 @@ var MiddleLayer = class MiddleLayer {
|
|
|
878
925
|
serviceRegistry,
|
|
879
926
|
quickJs,
|
|
880
927
|
projectHelper: new require_project_helper.ProjectHelper(quickJs, logger),
|
|
928
|
+
treeSnapshots,
|
|
881
929
|
dispose: async () => {
|
|
882
930
|
await serviceRegistry.dispose();
|
|
883
931
|
await retryHttpDispatcher.destroy();
|