target-supabase-sdk 0.2.5 → 0.2.7
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/browser.d.ts +2 -3
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +2 -2
- package/dist/chunks/{enable-log-persist-BL2FaGQp.js → enable-log-persist-C8AaEfW2.js} +2 -2
- package/dist/chunks/{enable-log-persist-BL2FaGQp.js.map → enable-log-persist-C8AaEfW2.js.map} +1 -1
- package/dist/chunks/{list.api-Ab9v8yOg.js → list.api-9CyffUtf.js} +50 -19
- package/dist/chunks/list.api-9CyffUtf.js.map +1 -0
- package/dist/chunks/{word.interface-Mw7bTSqs.js → task-queue-D3AGLocE.js} +85 -8
- package/dist/chunks/task-queue-D3AGLocE.js.map +1 -0
- package/dist/core.api.d.ts +46 -1
- package/dist/core.api.d.ts.map +1 -1
- package/dist/node.js +6 -6
- package/dist/preload.js +2 -2
- package/dist/service/config.api.d.ts.map +1 -1
- package/dist/service/index.d.ts +2 -2
- package/dist/service/index.d.ts.map +1 -1
- package/dist/service/registry.service.d.ts +19 -0
- package/dist/service/registry.service.d.ts.map +1 -1
- package/package.json +1 -3
- package/src/browser.ts +3 -1
- package/src/core.api.ts +122 -39
- package/src/service/config.api.ts +2 -0
- package/src/service/index.ts +3 -0
- package/src/service/registry.service.ts +111 -0
- package/dist/chunks/list.api-Ab9v8yOg.js.map +0 -1
- package/dist/chunks/word.interface-Mw7bTSqs.js.map +0 -1
- package/dist/word/word.api.d.ts +0 -15
- package/dist/word/word.api.d.ts.map +0 -1
- package/dist/word/word.interface.d.ts +0 -20
- package/dist/word/word.interface.d.ts.map +0 -1
- package/src/word/word.api.ts +0 -41
- package/src/word/word.interface.ts +0 -22
package/dist/core.api.d.ts
CHANGED
|
@@ -112,13 +112,59 @@ export declare const postTarget: (payload: PostTargetPayload) => Promise<import(
|
|
|
112
112
|
export interface PatchTargetPayload extends PostTargetPayload {
|
|
113
113
|
id: string;
|
|
114
114
|
}
|
|
115
|
+
export declare const OPTIMISTIC_LOCK_FAILED_MESSAGE = "[updateTargetDetails] Optimistic lock failed: target no longer matches expected state.";
|
|
116
|
+
/**
|
|
117
|
+
* @deprecated Use {@link updateTarget} (narrow RMW + optimistic lock) or {@link updateTargetDetails}.
|
|
118
|
+
*
|
|
119
|
+
* Full-row rewrite of create-shaped fields. Forces callers to resupply name/value/category,
|
|
120
|
+
* has no optimistic lock, and can accidentally mutate identity columns. Unused in-tree.
|
|
121
|
+
*/
|
|
115
122
|
export declare const patchTarget: ({ id, ...restPayload }: PatchTargetPayload) => Promise<import("./core.interface").SupabaseResponse<Target>>;
|
|
123
|
+
/** Mutable Target columns allowed by {@link updateTarget} (identity fields excluded). */
|
|
124
|
+
export interface UpdateTargetRowSnapshot<D> {
|
|
125
|
+
tagList: string[];
|
|
126
|
+
details: D;
|
|
127
|
+
extra?: string;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Narrow patch returned by `updateTarget` updateFn.
|
|
131
|
+
* Omitted keys are left unchanged on the row.
|
|
132
|
+
*/
|
|
133
|
+
export type UpdateTargetPatch<D> = {
|
|
134
|
+
tagList?: string[];
|
|
135
|
+
details?: D;
|
|
136
|
+
extra?: string;
|
|
137
|
+
};
|
|
138
|
+
/**
|
|
139
|
+
* Read-modify-write mutable Target columns (`tagList` / `details` / `extra`) with optional
|
|
140
|
+
* DB-level optimistic locking. Does not write `name` / `value` / `category`.
|
|
141
|
+
*
|
|
142
|
+
* Prefer this when the update may touch `tagList` (and optionally `details`/`extra`) in one UPDATE.
|
|
143
|
+
* For details-only flows, {@link updateTargetDetails} remains the thinner API.
|
|
144
|
+
*/
|
|
145
|
+
export interface UpdateTargetParams<D> {
|
|
146
|
+
/** Target row id. */
|
|
147
|
+
id: string;
|
|
148
|
+
/**
|
|
149
|
+
* Builds a narrow patch from the row fetched immediately before UPDATE.
|
|
150
|
+
* Only returned keys are written; omit a key to leave that column unchanged.
|
|
151
|
+
*/
|
|
152
|
+
updateFn: (existing: UpdateTargetRowSnapshot<D>) => UpdateTargetPatch<D>;
|
|
153
|
+
/**
|
|
154
|
+
* Optimistic lock conditions applied on UPDATE (not on the prior SELECT).
|
|
155
|
+
* Same semantics as {@link UpdateTargetDetailsParams.optimisticLockFilterList}.
|
|
156
|
+
*/
|
|
157
|
+
optimisticLockFilterList?: QueryFilter[];
|
|
158
|
+
}
|
|
159
|
+
export declare const updateTarget: <T, D>({ id, updateFn, optimisticLockFilterList, }: UpdateTargetParams<D>) => Promise<T>;
|
|
116
160
|
/**
|
|
117
161
|
* Read-modify-write `target.details` with optional DB-level optimistic locking on UPDATE.
|
|
118
162
|
*
|
|
119
163
|
* Do not use application-layer pre-update validators (e.g. checking state after SELECT then
|
|
120
164
|
* UPDATE with only `id`). That pattern is not atomic and loses under concurrency. Pass expected
|
|
121
165
|
* row conditions via `optimisticLockFilterList` so they are applied on the UPDATE statement.
|
|
166
|
+
*
|
|
167
|
+
* For updates that also need `tagList`, use {@link updateTarget}.
|
|
122
168
|
*/
|
|
123
169
|
export interface UpdateTargetDetailsParams<D> {
|
|
124
170
|
/** Target row id. */
|
|
@@ -144,7 +190,6 @@ export interface UpdateTargetDetailsParams<D> {
|
|
|
144
190
|
optimisticLockFilterList?: QueryFilter[];
|
|
145
191
|
}
|
|
146
192
|
export declare const updateTargetDetails: <T, D>({ id, updateFn, updateExtraFn, optimisticLockFilterList, }: UpdateTargetDetailsParams<D>) => Promise<T>;
|
|
147
|
-
export declare const OPTIMISTIC_LOCK_FAILED_MESSAGE = "[updateTargetDetails] Optimistic lock failed: target no longer matches expected state.";
|
|
148
193
|
export declare const OPTIMISTIC_LOCK_ERROR_CODE: "OPTIMISTIC_LOCK";
|
|
149
194
|
export declare function isOptimisticLockError(error: unknown): boolean;
|
|
150
195
|
export declare function isOptimisticLockResponse(error: {
|
package/dist/core.api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.api.d.ts","sourceRoot":"","sources":["../src/core.api.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"core.api.d.ts","sourceRoot":"","sources":["../src/core.api.ts"],"names":[],"mappings":"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"}
|
package/dist/node.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { M as MAX_POLL_TARGET_LIST_SIZE,
|
|
3
|
-
export { B as BaseValidator, C as CREATE_TARGET_ALREADY_EXISTS_MESSAGE, a as CategoryList, L as LOG_BATCH_LOADER_KEY, b as LOG_PERSIST_LOADER_KEY, d as MAX_TARGET_LIST_PAGE_SIZE, O as OPTIMISTIC_LOCK_ERROR_CODE, e as OPTIMISTIC_LOCK_FAILED_MESSAGE, P as PostListValidator, S as StatusCode, h as deleteTarget, k as getTarget, l as getTargetList, m as getTargetTotalCount, n as handleSupabaseError, o as isCreateTargetAlreadyExistsError, p as isDevEnvironment, q as isOptimisticLockError, s as logDev, t as logDevGroup, v as patchTarget, x as postListCreate, y as postLogListCreate, z as postTarget,
|
|
4
|
-
import { l as loadEnvFiles, b as readEnv, c as requireEnv, d as createJsonFileStateStore, a as logPersistEnabledFromEnv, e as disableLogPersist, g as getLogPersistStats, s as snapshotLogPersistReady, w as waitForLogPersistReady, f as ensureLogPersistFromEnv } from './chunks/enable-log-persist-
|
|
5
|
-
export { C as CLI_PROD_FLAG, S as SERVICE_ENV_PROFILE_ENV_KEY, h as SERVICE_ENV_PROFILE_PROD, i as enableLogPersist, j as envBool, k as envInt, m as envMs, n as envNumber, o as envPort, q as envProfileFromProcess, t as parseEnvFile, u as parseEnvLine, p as pinEnvProfileFromArgv, x as pollUntil, y as resolveDefaultEnvFiles, z as resolveLogPersistRegistryPath, r as resolveProjectRootByPackageName, A as resolveProjectRootFromModule, v as validateLogPersistPreloadEnv } from './chunks/enable-log-persist-
|
|
2
|
+
import { M as MAX_POLL_TARGET_LIST_SIZE, H as validateWithSchema, f as createLogger, w as pollTargetList, i as generateResponse, g as createTarget, D as supabase, u as logManager, J as createScope, c as LogLevel, K as patchScope, A as scanTargetList, N as withModule, j as getPossibleTarget, r as isOptimisticLockResponse, F as updateTargetDetails } from './chunks/list.api-9CyffUtf.js';
|
|
3
|
+
export { B as BaseValidator, C as CREATE_TARGET_ALREADY_EXISTS_MESSAGE, a as CategoryList, L as LOG_BATCH_LOADER_KEY, b as LOG_PERSIST_LOADER_KEY, d as MAX_TARGET_LIST_PAGE_SIZE, O as OPTIMISTIC_LOCK_ERROR_CODE, e as OPTIMISTIC_LOCK_FAILED_MESSAGE, P as PostListValidator, S as StatusCode, h as deleteTarget, k as getTarget, l as getTargetList, m as getTargetTotalCount, n as handleSupabaseError, o as isCreateTargetAlreadyExistsError, p as isDevEnvironment, q as isOptimisticLockError, s as logDev, t as logDevGroup, v as patchTarget, x as postListCreate, y as postLogListCreate, z as postTarget, E as updateTarget, G as validateWith } from './chunks/list.api-9CyffUtf.js';
|
|
4
|
+
import { l as loadEnvFiles, b as readEnv, c as requireEnv, d as createJsonFileStateStore, a as logPersistEnabledFromEnv, e as disableLogPersist, g as getLogPersistStats, s as snapshotLogPersistReady, w as waitForLogPersistReady, f as ensureLogPersistFromEnv } from './chunks/enable-log-persist-C8AaEfW2.js';
|
|
5
|
+
export { C as CLI_PROD_FLAG, S as SERVICE_ENV_PROFILE_ENV_KEY, h as SERVICE_ENV_PROFILE_PROD, i as enableLogPersist, j as envBool, k as envInt, m as envMs, n as envNumber, o as envPort, q as envProfileFromProcess, t as parseEnvFile, u as parseEnvLine, p as pinEnvProfileFromArgv, x as pollUntil, y as resolveDefaultEnvFiles, z as resolveLogPersistRegistryPath, r as resolveProjectRootByPackageName, A as resolveProjectRootFromModule, v as validateLogPersistPreloadEnv } from './chunks/enable-log-persist-C8AaEfW2.js';
|
|
6
6
|
import { access, stat, readFile, mkdir, unlink, writeFile, readdir } from 'node:fs/promises';
|
|
7
7
|
import { resolve, join, dirname, isAbsolute } from 'node:path';
|
|
8
|
-
import { bd as sha256Hex, bi as getErrorMessage, aI as postRegisterNode, am as patchChangeNodeStatus, N as NodeStatus, ax as patchStopNode, au as patchNodeHeartBeat, E as EMPTY_REGISTRY_SLOT_RUNTIME_STATE, b3 as runRegistrySlotGuardCheck, aW as registrySlotRuntimePatchFromGuardResult, d as CategoryNode, L as evaluateBusyNodeLiveness, aw as patchServiceRuntime,
|
|
9
|
-
export { A as ApiMethod, C as CategoryConfig, a as CategoryExtraction, b as CategoryIdea, c as CategoryLink, e as CategoryParcel, g as CategoryService, h as CategoryTask,
|
|
8
|
+
import { bd as sha256Hex, bi as getErrorMessage, aI as postRegisterNode, am as patchChangeNodeStatus, N as NodeStatus, ax as patchStopNode, au as patchNodeHeartBeat, E as EMPTY_REGISTRY_SLOT_RUNTIME_STATE, b3 as runRegistrySlotGuardCheck, aW as registrySlotRuntimePatchFromGuardResult, d as CategoryNode, L as evaluateBusyNodeLiveness, aw as patchServiceRuntime, k as ServiceRegistryError, v as claimServiceRegistrySlot, f as CategoryRepo, R as ResultCode, bj as LOG_TOPIC_TASK, m as TASK_REPO_USAGE, a4 as getScanRemoteRepoValues, aq as patchClaimTask, bk as CRITICAL_UNKNOWN_TASK_TRACE_ID, ao as patchChangeTaskStatus, o as TaskStatusAction, bl as toError, aQ as postTaskSchema, bm as createTaskRow, n as TaskStatus } from './chunks/task-queue-D3AGLocE.js';
|
|
9
|
+
export { A as ApiMethod, C as CategoryConfig, a as CategoryExtraction, b as CategoryIdea, c as CategoryLink, e as CategoryParcel, g as CategoryService, h as CategoryTask, D as DEFAULT_SYSTEM_REGISTRY_SEED_SLOTS, M as Market, P as POST_TASK_DEFAULT_MAX_ATTEMPTS, i as ParcelManager, j as PostLinkValidator, S as ServiceLifecycleStatus, l as ServiceSlotStatus, T as TARGET_SYSTEM_REGISTRY_KEY, p as apiDetailsSchema, q as appendSystemRegistrySlots, r as assertRegistrySlotAvailable, s as assertRegistrySlotOwner, t as buildEmptyServiceSlots, u as buildSystemRegistryConfigDetails, w as classifyNetworkError, x as countTasksByType, y as createActiveServiceLifecycle, z as createClaimedRegistrySlotRuntimeState, B as createStorageProviderRegistry, F as createUploadTracker, G as decodeLogBatch, H as decodeLogBatchList, I as defaultL3ServiceDetails, J as deleteParcel, K as deleteParcelSchema, O as fetchBinaryWithRetry, Q as fetchWithRetry, U as fieldDefinitionSchema, V as flattenLogBatch, W as flattenLogBatches, X as formatNetworkError, Y as getApi, Z as getApiSchema, _ as getConfig, $ as getConfigSchema, a0 as getExtraction, a1 as getExtractionSchema, a2 as getParcel, a3 as getParcelSchema, a5 as getScanRemoteRepoValuesSchema, a6 as getService, a7 as getServiceSchema, a8 as getTargetSystemRegistry, a9 as getValueAtPath, aa as installChunkFetchRegistry, ab as isHttpUrl, ac as isLocalFilesystemPath, ad as isLogBatchList, ae as isLogEntry, af as isOpaqueChunkUrl, ag as isRetryableHttpStatus, ah as parcelDetailsSchema, ai as parseLogBatchMeta, aj as parseProviderPrefixedUrl, ak as parseServiceSlot, al as parseServiceSlots, an as patchChangeNodeStatusSchema, ap as patchChangeTaskStatusSchema, ar as patchClaimTaskSchema, as as patchExtractionObjects, at as patchExtractionObjectsSchema, av as patchNodeHeartBeatSchema, ay as patchStopNodeSchema, az as patchTaskProgress, aA as patchTaskProgressSchema, aB as postApi, aC as postApiSchema, aD as postExtraction, aE as postExtractionSchema, aF as postLinkCreate, aG as postParcel, aH as postParcelSchema, aJ as postRegisterNodeSchema, aK as postService, aL as postServiceInstance, aM as postServiceSchema, aN as postSystemRegistryConfig, aO as postSystemRegistryConfigSchema, aP as postTask, aR as postTaskWithRetry, aS as publishParcel, aT as registerProviderChunkResolver, aU as registerService, aV as registerServiceAtStartup, aX as releaseSystemRegistrySlots, aY as requestHasBody, aZ as resetSystemRegistryConfig, a_ as resetSystemRegistryConfigSchema, a$ as resolveActiveRegistryServiceId, b0 as resolveFetchUrl, b1 as restoreParcel, b2 as restoreParcelById, b4 as sanitizeFileName, b5 as sanitizeParcelFileName, b6 as scanExtractionList, b7 as scanExtractionListSchema, b8 as schemaDefinitionSchema, b9 as serviceDetailsSchema, ba as serviceLifecycleSchema, bb as serviceNodeSnapshotSchema, bc as serviceRuntimeSchema, be as summarizeTaskQueue, bf as systemRegistrySeedSlotSchema, bg as unregisterService, bh as unregisterServiceAtShutdown } from './chunks/task-queue-D3AGLocE.js';
|
|
10
10
|
import { spawn } from 'node:child_process';
|
|
11
11
|
import { createHash } from 'node:crypto';
|
|
12
12
|
import { tmpdir } from 'node:os';
|
package/dist/preload.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { resolve } from 'node:path';
|
|
2
|
-
import { r as resolveProjectRootByPackageName, p as pinEnvProfileFromArgv, l as loadEnvFiles, v as validateLogPersistPreloadEnv, a as logPersistEnabledFromEnv } from './chunks/enable-log-persist-
|
|
2
|
+
import { r as resolveProjectRootByPackageName, p as pinEnvProfileFromArgv, l as loadEnvFiles, v as validateLogPersistPreloadEnv, a as logPersistEnabledFromEnv } from './chunks/enable-log-persist-C8AaEfW2.js';
|
|
3
3
|
import 'node:fs';
|
|
4
4
|
import 'node:url';
|
|
5
5
|
import 'node:fs/promises';
|
|
6
|
-
import './chunks/list.api-
|
|
6
|
+
import './chunks/list.api-9CyffUtf.js';
|
|
7
7
|
import 'lodash-es';
|
|
8
8
|
import '@supabase/supabase-js';
|
|
9
9
|
import 'node:crypto';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.api.d.ts","sourceRoot":"","sources":["../../src/service/config.api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,OAAO,EAAkB,KAAK,MAAM,EAAE,KAAK,aAAa,EAA8B,MAAM,oBAAoB,CAAC;AACjH,OAAO,EAAE,KAAK,WAAW,EAAqB,MAAM,qBAAqB,CAAC;AAI1E,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;EAYvB,CAAC;AAEN,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE/D,wEAAwE;AACxE,eAAO,MAAM,4BAA4B;;;;;;EAEvC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAElF,eAAO,MAAM,8BAA8B;IACvC,wEAAwE;;;;;;;;;;;;;;;;;;;EAG1E,CAAC;AAEH,MAAM,MAAM,+BAA+B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AAE7F,qGAAqG;AACrG,eAAO,MAAM,+BAA+B;IARxC,wEAAwE;;;;;;;;;;;;;;;;;;;EAQC,CAAC;AAE9E,MAAM,MAAM,gCAAgC,GAAG,+BAA+B,CAAC;AAK/E,uFAAuF;AACvF,eAAO,MAAM,kCAAkC,EAAE,SAAS,sBAAsB,
|
|
1
|
+
{"version":3,"file":"config.api.d.ts","sourceRoot":"","sources":["../../src/service/config.api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,OAAO,EAAkB,KAAK,MAAM,EAAE,KAAK,aAAa,EAA8B,MAAM,oBAAoB,CAAC;AACjH,OAAO,EAAE,KAAK,WAAW,EAAqB,MAAM,qBAAqB,CAAC;AAI1E,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;EAYvB,CAAC;AAEN,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE/D,wEAAwE;AACxE,eAAO,MAAM,4BAA4B;;;;;;EAEvC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAElF,eAAO,MAAM,8BAA8B;IACvC,wEAAwE;;;;;;;;;;;;;;;;;;;EAG1E,CAAC;AAEH,MAAM,MAAM,+BAA+B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AAE7F,qGAAqG;AACrG,eAAO,MAAM,+BAA+B;IARxC,wEAAwE;;;;;;;;;;;;;;;;;;;EAQC,CAAC;AAE9E,MAAM,MAAM,gCAAgC,GAAG,+BAA+B,CAAC;AAK/E,uFAAuF;AACvF,eAAO,MAAM,kCAAkC,EAAE,SAAS,sBAAsB,EAOtE,CAAC;AAkBX,wFAAwF;AACxF,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,SAAS,sBAAsB,EAAE,GAAG,WAAW,EAAE,CAMlG;AAgBD,yEAAyE;AACzE,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,GAAG,aAAa,CAO7F;AAED,+EAA+E;AAC/E,eAAO,MAAM,SAAS;;;;UAaW,MAAM;;;;;;YA5GnC,CAAC;;;;;;;;;YAAD,CAAC;;;UA4G4B,MAAM;;;;;;YA5GnC,CAAC;;;;;;;;;YAAD,CAAC;;EA+HH,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,wBAAwB;;;;;4FAsBnC,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,yBAAyB;;;;;4FA2CpC,CAAC"}
|
package/dist/service/index.d.ts
CHANGED
|
@@ -7,8 +7,8 @@ export type { GetConfigPayload, PostSystemRegistryConfigPayload, ResetSystemRegi
|
|
|
7
7
|
export { buildEmptyServiceSlots, buildSystemRegistryConfigDetails, DEFAULT_SYSTEM_REGISTRY_SEED_SLOTS, getConfig, getConfigSchema, postSystemRegistryConfig, postSystemRegistryConfigSchema, resetSystemRegistryConfig, resetSystemRegistryConfigSchema, systemRegistrySeedSlotSchema, } from "./config.api";
|
|
8
8
|
export type { Config, ConfigDetails } from "./config.interface";
|
|
9
9
|
export { CategoryConfig, TARGET_SYSTEM_REGISTRY_KEY } from "./config.interface";
|
|
10
|
-
export type { PatchServiceRuntimeInput, RegisterServiceInput, ReleasedRegistrySlot, ReleaseSystemRegistrySlotsInput, ReleaseSystemRegistrySlotsOutcome, TargetSystemRegistrySlotView, TargetSystemRegistryView, } from "./registry.service";
|
|
11
|
-
export { assertRegistrySlotAvailable, assertRegistrySlotOwner, getTargetSystemRegistry, parseServiceSlot, parseServiceSlots, patchServiceRuntime, registerService, registerServiceAtStartup, releaseSystemRegistrySlots, resolveActiveRegistryServiceId, ServiceRegistryError, unregisterService, unregisterServiceAtShutdown, } from "./registry.service";
|
|
10
|
+
export type { AppendSystemRegistrySlotsInput, AppendSystemRegistrySlotsOutcome, PatchServiceRuntimeInput, RegisterServiceInput, ReleasedRegistrySlot, ReleaseSystemRegistrySlotsInput, ReleaseSystemRegistrySlotsOutcome, TargetSystemRegistrySlotView, TargetSystemRegistryView, } from "./registry.service";
|
|
11
|
+
export { appendSystemRegistrySlots, assertRegistrySlotAvailable, assertRegistrySlotOwner, getTargetSystemRegistry, parseServiceSlot, parseServiceSlots, patchServiceRuntime, registerService, registerServiceAtStartup, releaseSystemRegistrySlots, resolveActiveRegistryServiceId, ServiceRegistryError, unregisterService, unregisterServiceAtShutdown, } from "./registry.service";
|
|
12
12
|
export type { ClaimRegistrySlotInput, RegistrySlotGuardResult, RegistrySlotRuntimeState, ServiceRegistrySession, } from "./registry-lifecycle";
|
|
13
13
|
export { claimServiceRegistrySlot, createClaimedRegistrySlotRuntimeState, EMPTY_REGISTRY_SLOT_RUNTIME_STATE, registrySlotRuntimePatchFromGuardResult, runRegistrySlotGuardCheck, } from "./registry-lifecycle";
|
|
14
14
|
export type { GetApiPayload, GetServicePayload, PostApiPayload, PostServicePayload } from "./service.api";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/service/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EACR,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,gBAAgB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,YAAY,EACR,gBAAgB,EAChB,+BAA+B,EAC/B,gCAAgC,EAChC,sBAAsB,GACzB,MAAM,cAAc,CAAC;AACtB,OAAO,EACH,sBAAsB,EACtB,gCAAgC,EAChC,kCAAkC,EAClC,SAAS,EACT,eAAe,EACf,wBAAwB,EACxB,8BAA8B,EAC9B,yBAAyB,EACzB,+BAA+B,EAC/B,4BAA4B,GAC/B,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAChF,YAAY,EACR,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,EACpB,+BAA+B,EAC/B,iCAAiC,EACjC,4BAA4B,EAC5B,wBAAwB,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACH,2BAA2B,EAC3B,uBAAuB,EACvB,uBAAuB,EACvB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,wBAAwB,EACxB,0BAA0B,EAC1B,8BAA8B,EAC9B,oBAAoB,EACpB,iBAAiB,EACjB,2BAA2B,GAC9B,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACR,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACH,wBAAwB,EACxB,qCAAqC,EACrC,iCAAiC,EACjC,uCAAuC,EACvC,yBAAyB,GAC5B,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAC1G,OAAO,EACH,gBAAgB,EAChB,qBAAqB,EACrB,MAAM,EACN,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,OAAO,EACP,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,EACpB,sBAAsB,EACtB,yBAAyB,EACzB,oBAAoB,GACvB,MAAM,eAAe,CAAC;AACvB,YAAY,EACR,GAAG,EACH,UAAU,EACV,OAAO,EACP,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,WAAW,GACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACjG,YAAY,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC9F,OAAO,EACH,4BAA4B,EAC5B,uBAAuB,EACvB,mBAAmB,GACtB,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/service/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EACR,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,gBAAgB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,YAAY,EACR,gBAAgB,EAChB,+BAA+B,EAC/B,gCAAgC,EAChC,sBAAsB,GACzB,MAAM,cAAc,CAAC;AACtB,OAAO,EACH,sBAAsB,EACtB,gCAAgC,EAChC,kCAAkC,EAClC,SAAS,EACT,eAAe,EACf,wBAAwB,EACxB,8BAA8B,EAC9B,yBAAyB,EACzB,+BAA+B,EAC/B,4BAA4B,GAC/B,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAChF,YAAY,EACR,8BAA8B,EAC9B,gCAAgC,EAChC,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,EACpB,+BAA+B,EAC/B,iCAAiC,EACjC,4BAA4B,EAC5B,wBAAwB,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACH,yBAAyB,EACzB,2BAA2B,EAC3B,uBAAuB,EACvB,uBAAuB,EACvB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,wBAAwB,EACxB,0BAA0B,EAC1B,8BAA8B,EAC9B,oBAAoB,EACpB,iBAAiB,EACjB,2BAA2B,GAC9B,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACR,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACH,wBAAwB,EACxB,qCAAqC,EACrC,iCAAiC,EACjC,uCAAuC,EACvC,yBAAyB,GAC5B,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAC1G,OAAO,EACH,gBAAgB,EAChB,qBAAqB,EACrB,MAAM,EACN,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,OAAO,EACP,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,EACpB,sBAAsB,EACtB,yBAAyB,EACzB,oBAAoB,GACvB,MAAM,eAAe,CAAC;AACvB,YAAY,EACR,GAAG,EACH,UAAU,EACV,OAAO,EACP,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,WAAW,GACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACjG,YAAY,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC9F,OAAO,EACH,4BAA4B,EAC5B,uBAAuB,EACvB,mBAAmB,GACtB,MAAM,qBAAqB,CAAC"}
|
|
@@ -44,6 +44,19 @@ export interface ReleaseSystemRegistrySlotsOutcome {
|
|
|
44
44
|
/** Requested `serviceValues` with no ACTIVE slot released (already EMPTY or never bound). */
|
|
45
45
|
unchangedServiceValues: string[];
|
|
46
46
|
}
|
|
47
|
+
export interface AppendSystemRegistrySlotsInput {
|
|
48
|
+
/** Logical service keys to declare with one new EMPTY slot each when missing. */
|
|
49
|
+
serviceValues: string[];
|
|
50
|
+
traceId?: string;
|
|
51
|
+
maxAttempts?: number;
|
|
52
|
+
}
|
|
53
|
+
export interface AppendSystemRegistrySlotsOutcome {
|
|
54
|
+
config: Config;
|
|
55
|
+
/** Service keys that received a new EMPTY slot this run. */
|
|
56
|
+
added: string[];
|
|
57
|
+
/** Requested keys that already had at least one declared slot — no change. */
|
|
58
|
+
skipped: string[];
|
|
59
|
+
}
|
|
47
60
|
export declare class ServiceRegistryError extends Error {
|
|
48
61
|
readonly code: "REGISTRY_CONFIG_NOT_FOUND" | "SERVICE_NOT_DECLARED" | "SERVICE_SLOTS_FULL" | "REGISTRY_SLOT_LOST" | "REGISTRY_UPDATE_FAILED";
|
|
49
62
|
constructor(message: string, code: "REGISTRY_CONFIG_NOT_FOUND" | "SERVICE_NOT_DECLARED" | "SERVICE_SLOTS_FULL" | "REGISTRY_SLOT_LOST" | "REGISTRY_UPDATE_FAILED");
|
|
@@ -76,6 +89,12 @@ export declare function assertRegistrySlotOwner(input: {
|
|
|
76
89
|
* Does not delete Service rows or mutate `details.runtime`.
|
|
77
90
|
*/
|
|
78
91
|
export declare function releaseSystemRegistrySlots(input: ReleaseSystemRegistrySlotsInput): Promise<ReleaseSystemRegistrySlotsOutcome>;
|
|
92
|
+
/**
|
|
93
|
+
* Append EMPTY {@link ServiceSlot} rows for logical service keys not yet declared.
|
|
94
|
+
* Idempotent — skips keys that already appear in `details.objects`.
|
|
95
|
+
* Does not modify existing slots or release ACTIVE bindings.
|
|
96
|
+
*/
|
|
97
|
+
export declare function appendSystemRegistrySlots(input: AppendSystemRegistrySlotsInput): Promise<AppendSystemRegistrySlotsOutcome>;
|
|
79
98
|
/**
|
|
80
99
|
* Claim one EMPTY slot for a running Service instance (`EMPTY → ACTIVE` only).
|
|
81
100
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.service.d.ts","sourceRoot":"","sources":["../../src/service/registry.service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"registry.service.d.ts","sourceRoot":"","sources":["../../src/service/registry.service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "target-supabase-sdk",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.7",
|
|
4
4
|
"description": "Supabase client initializer and data access APIs",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "KyLoc20",
|
|
@@ -56,8 +56,6 @@
|
|
|
56
56
|
"worker:trigger": "tsx scripts/run-trigger-node.ts",
|
|
57
57
|
"post-command": "tsx scripts/post-command.ts",
|
|
58
58
|
"post-trigger": "tsx scripts/post-trigger.ts",
|
|
59
|
-
"seed:system-registry": "tsx scripts/seed-system-registry.ts",
|
|
60
|
-
"reset:system-registry": "tsx scripts/reset-system-registry.ts",
|
|
61
59
|
"parcel:split": "tsx scripts/parcel-split-local.ts",
|
|
62
60
|
"parcel:restore": "tsx scripts/parcel-restore-local.ts",
|
|
63
61
|
"dev": "rollup -c --watch",
|
package/src/browser.ts
CHANGED
|
@@ -104,6 +104,8 @@ export * from "./repo/repo.interface";
|
|
|
104
104
|
export type {
|
|
105
105
|
Api,
|
|
106
106
|
ApiDetails,
|
|
107
|
+
AppendSystemRegistrySlotsInput,
|
|
108
|
+
AppendSystemRegistrySlotsOutcome,
|
|
107
109
|
ClaimRegistrySlotInput,
|
|
108
110
|
Config,
|
|
109
111
|
ConfigDetails,
|
|
@@ -136,6 +138,7 @@ export type {
|
|
|
136
138
|
export {
|
|
137
139
|
ApiMethod,
|
|
138
140
|
apiDetailsSchema,
|
|
141
|
+
appendSystemRegistrySlots,
|
|
139
142
|
assertRegistrySlotAvailable,
|
|
140
143
|
assertRegistrySlotOwner,
|
|
141
144
|
buildEmptyServiceSlots,
|
|
@@ -260,4 +263,3 @@ export type { PostTaskWithRetryOptions, PostTaskWithRetryResult } from "./task/t
|
|
|
260
263
|
export { POST_TASK_DEFAULT_MAX_ATTEMPTS, postTaskWithRetry } from "./task/task-post-retry.api";
|
|
261
264
|
export type { TaskStatusCount } from "./task/task-queue";
|
|
262
265
|
export { countTasksByType, summarizeTaskQueue } from "./task/task-queue";
|
|
263
|
-
export * from "./word/word.interface";
|
package/src/core.api.ts
CHANGED
|
@@ -420,6 +420,15 @@ export interface PatchTargetPayload extends PostTargetPayload {
|
|
|
420
420
|
id: string;
|
|
421
421
|
}
|
|
422
422
|
|
|
423
|
+
export const OPTIMISTIC_LOCK_FAILED_MESSAGE =
|
|
424
|
+
"[updateTargetDetails] Optimistic lock failed: target no longer matches expected state.";
|
|
425
|
+
|
|
426
|
+
/**
|
|
427
|
+
* @deprecated Use {@link updateTarget} (narrow RMW + optimistic lock) or {@link updateTargetDetails}.
|
|
428
|
+
*
|
|
429
|
+
* Full-row rewrite of create-shaped fields. Forces callers to resupply name/value/category,
|
|
430
|
+
* has no optimistic lock, and can accidentally mutate identity columns. Unused in-tree.
|
|
431
|
+
*/
|
|
423
432
|
export const patchTarget = async ({ id, ...restPayload }: PatchTargetPayload) => {
|
|
424
433
|
const { data: currentData, error: fetchError } = await supabase.client
|
|
425
434
|
.from("target")
|
|
@@ -448,69 +457,91 @@ export const patchTarget = async ({ id, ...restPayload }: PatchTargetPayload) =>
|
|
|
448
457
|
return generateResponse.success<Target>(data as Target);
|
|
449
458
|
};
|
|
450
459
|
|
|
460
|
+
/** Mutable Target columns allowed by {@link updateTarget} (identity fields excluded). */
|
|
461
|
+
export interface UpdateTargetRowSnapshot<D> {
|
|
462
|
+
tagList: string[];
|
|
463
|
+
details: D;
|
|
464
|
+
extra?: string;
|
|
465
|
+
}
|
|
466
|
+
|
|
451
467
|
/**
|
|
452
|
-
*
|
|
468
|
+
* Narrow patch returned by `updateTarget` updateFn.
|
|
469
|
+
* Omitted keys are left unchanged on the row.
|
|
470
|
+
*/
|
|
471
|
+
export type UpdateTargetPatch<D> = {
|
|
472
|
+
tagList?: string[];
|
|
473
|
+
details?: D;
|
|
474
|
+
extra?: string;
|
|
475
|
+
};
|
|
476
|
+
|
|
477
|
+
/**
|
|
478
|
+
* Read-modify-write mutable Target columns (`tagList` / `details` / `extra`) with optional
|
|
479
|
+
* DB-level optimistic locking. Does not write `name` / `value` / `category`.
|
|
453
480
|
*
|
|
454
|
-
*
|
|
455
|
-
*
|
|
456
|
-
* row conditions via `optimisticLockFilterList` so they are applied on the UPDATE statement.
|
|
481
|
+
* Prefer this when the update may touch `tagList` (and optionally `details`/`extra`) in one UPDATE.
|
|
482
|
+
* For details-only flows, {@link updateTargetDetails} remains the thinner API.
|
|
457
483
|
*/
|
|
458
|
-
export interface
|
|
484
|
+
export interface UpdateTargetParams<D> {
|
|
459
485
|
/** Target row id. */
|
|
460
486
|
id: string;
|
|
461
487
|
/**
|
|
462
|
-
*
|
|
463
|
-
*
|
|
488
|
+
* Builds a narrow patch from the row fetched immediately before UPDATE.
|
|
489
|
+
* Only returned keys are written; omit a key to leave that column unchanged.
|
|
464
490
|
*/
|
|
465
|
-
updateFn: (existing: D) => D
|
|
466
|
-
/**
|
|
467
|
-
* Optional `target.extra` derived from existing details (written together with details).
|
|
468
|
-
*/
|
|
469
|
-
updateExtraFn?: (existing: D) => string;
|
|
491
|
+
updateFn: (existing: UpdateTargetRowSnapshot<D>) => UpdateTargetPatch<D>;
|
|
470
492
|
/**
|
|
471
493
|
* Optimistic lock conditions applied on UPDATE (not on the prior SELECT).
|
|
472
|
-
*
|
|
473
|
-
* Replaces the removed `beforeUpdateValidator`: validators ran in app code between read and
|
|
474
|
-
* write and could not prevent concurrent overwrites. These filters become part of the UPDATE
|
|
475
|
-
* WHERE clause (via `applyQueryFilters`), e.g. `{ field: "details->>status", operator: "eq", value: "TODO" }`.
|
|
476
|
-
*
|
|
477
|
-
* If no row matches after UPDATE, throws "Optimistic lock failed". Empty array = update by id only.
|
|
494
|
+
* Same semantics as {@link UpdateTargetDetailsParams.optimisticLockFilterList}.
|
|
478
495
|
*/
|
|
479
496
|
optimisticLockFilterList?: QueryFilter[];
|
|
480
497
|
}
|
|
481
498
|
|
|
482
|
-
export const
|
|
499
|
+
export const updateTarget = async <T, D>({
|
|
483
500
|
id,
|
|
484
501
|
updateFn,
|
|
485
|
-
updateExtraFn,
|
|
486
502
|
optimisticLockFilterList = [],
|
|
487
|
-
}:
|
|
503
|
+
}: UpdateTargetParams<D>) => {
|
|
488
504
|
const { data: currentData, error: fetchError } = await supabase.client
|
|
489
505
|
.from("target")
|
|
490
|
-
.select("details")
|
|
506
|
+
.select("tagList, details, extra")
|
|
491
507
|
.eq("id", id)
|
|
492
508
|
.single();
|
|
493
509
|
|
|
494
510
|
if (fetchError) {
|
|
495
|
-
handleSupabaseError("
|
|
511
|
+
handleSupabaseError("updateTarget", fetchError, "Failed to fetch target.");
|
|
496
512
|
}
|
|
497
513
|
if (!currentData) {
|
|
498
|
-
const msg = `[
|
|
514
|
+
const msg = `[updateTarget] Target NOT exists: ${id}`;
|
|
499
515
|
console.error(msg);
|
|
500
516
|
throw new Error(msg);
|
|
501
517
|
}
|
|
502
518
|
|
|
503
|
-
const
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
519
|
+
const existing: UpdateTargetRowSnapshot<D> = {
|
|
520
|
+
tagList: Array.isArray(currentData.tagList) ? (currentData.tagList as string[]) : [],
|
|
521
|
+
details: currentData.details as D,
|
|
522
|
+
extra: typeof currentData.extra === "string" ? currentData.extra : undefined,
|
|
523
|
+
};
|
|
524
|
+
|
|
525
|
+
const patch = updateFn(existing);
|
|
526
|
+
const updated: {
|
|
527
|
+
tagList?: string[];
|
|
528
|
+
details?: D;
|
|
529
|
+
extra?: string;
|
|
530
|
+
} = {};
|
|
531
|
+
|
|
532
|
+
if (patch.tagList !== undefined) {
|
|
533
|
+
updated.tagList = patch.tagList;
|
|
534
|
+
}
|
|
535
|
+
if (patch.details !== undefined) {
|
|
536
|
+
updated.details = patch.details;
|
|
537
|
+
}
|
|
538
|
+
if (patch.extra !== undefined) {
|
|
539
|
+
updated.extra = patch.extra;
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
if (Object.keys(updated).length === 0) {
|
|
543
|
+
throw new Error("[updateTarget] updateFn returned an empty patch");
|
|
544
|
+
}
|
|
514
545
|
|
|
515
546
|
const updateQuery = applyQueryFilters(
|
|
516
547
|
supabase.client.from("target").update(updated).eq("id", id),
|
|
@@ -520,21 +551,73 @@ export const updateTargetDetails = async <T, D>({
|
|
|
520
551
|
const { data, error } = await updateQuery.select().maybeSingle();
|
|
521
552
|
|
|
522
553
|
if (error) {
|
|
523
|
-
handleSupabaseError("
|
|
554
|
+
handleSupabaseError("updateTarget", error, "Failed to update target.");
|
|
524
555
|
}
|
|
525
556
|
if (!data) {
|
|
526
557
|
const msg =
|
|
527
558
|
optimisticLockFilterList.length > 0
|
|
528
559
|
? OPTIMISTIC_LOCK_FAILED_MESSAGE
|
|
529
|
-
: "[
|
|
560
|
+
: "[updateTarget] Target not found or was deleted.";
|
|
530
561
|
throw new Error(msg);
|
|
531
562
|
}
|
|
532
563
|
|
|
533
564
|
return data as T;
|
|
534
565
|
};
|
|
535
566
|
|
|
536
|
-
|
|
537
|
-
|
|
567
|
+
/**
|
|
568
|
+
* Read-modify-write `target.details` with optional DB-level optimistic locking on UPDATE.
|
|
569
|
+
*
|
|
570
|
+
* Do not use application-layer pre-update validators (e.g. checking state after SELECT then
|
|
571
|
+
* UPDATE with only `id`). That pattern is not atomic and loses under concurrency. Pass expected
|
|
572
|
+
* row conditions via `optimisticLockFilterList` so they are applied on the UPDATE statement.
|
|
573
|
+
*
|
|
574
|
+
* For updates that also need `tagList`, use {@link updateTarget}.
|
|
575
|
+
*/
|
|
576
|
+
export interface UpdateTargetDetailsParams<D> {
|
|
577
|
+
/** Target row id. */
|
|
578
|
+
id: string;
|
|
579
|
+
/**
|
|
580
|
+
* Computes new details from the row fetched immediately before UPDATE.
|
|
581
|
+
* Runs after SELECT; the write still relies on `optimisticLockFilterList` for atomic guards.
|
|
582
|
+
*/
|
|
583
|
+
updateFn: (existing: D) => D;
|
|
584
|
+
/**
|
|
585
|
+
* Optional `target.extra` derived from existing details (written together with details).
|
|
586
|
+
*/
|
|
587
|
+
updateExtraFn?: (existing: D) => string;
|
|
588
|
+
/**
|
|
589
|
+
* Optimistic lock conditions applied on UPDATE (not on the prior SELECT).
|
|
590
|
+
*
|
|
591
|
+
* Replaces the removed `beforeUpdateValidator`: validators ran in app code between read and
|
|
592
|
+
* write and could not prevent concurrent overwrites. These filters become part of the UPDATE
|
|
593
|
+
* WHERE clause (via `applyQueryFilters`), e.g. `{ field: "details->>status", operator: "eq", value: "TODO" }`.
|
|
594
|
+
*
|
|
595
|
+
* If no row matches after UPDATE, throws "Optimistic lock failed". Empty array = update by id only.
|
|
596
|
+
*/
|
|
597
|
+
optimisticLockFilterList?: QueryFilter[];
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
export const updateTargetDetails = async <T, D>({
|
|
601
|
+
id,
|
|
602
|
+
updateFn,
|
|
603
|
+
updateExtraFn,
|
|
604
|
+
optimisticLockFilterList = [],
|
|
605
|
+
}: UpdateTargetDetailsParams<D>) => {
|
|
606
|
+
return updateTarget<T, D>({
|
|
607
|
+
id,
|
|
608
|
+
optimisticLockFilterList,
|
|
609
|
+
updateFn: (existing) => {
|
|
610
|
+
const nextDetails = updateFn(existing.details);
|
|
611
|
+
if (updateExtraFn == null) {
|
|
612
|
+
return { details: nextDetails };
|
|
613
|
+
}
|
|
614
|
+
return {
|
|
615
|
+
details: nextDetails,
|
|
616
|
+
extra: updateExtraFn(existing.details),
|
|
617
|
+
};
|
|
618
|
+
},
|
|
619
|
+
});
|
|
620
|
+
};
|
|
538
621
|
|
|
539
622
|
export const OPTIMISTIC_LOCK_ERROR_CODE = "OPTIMISTIC_LOCK" as const;
|
|
540
623
|
|
|
@@ -59,6 +59,8 @@ export const DEFAULT_SYSTEM_REGISTRY_SEED_SLOTS: readonly SystemRegistrySeedSlot
|
|
|
59
59
|
{ serviceValue: "watch-service" },
|
|
60
60
|
{ serviceValue: "download-service" },
|
|
61
61
|
{ serviceValue: "storage-service" },
|
|
62
|
+
{ serviceValue: "gc-service" },
|
|
63
|
+
{ serviceValue: "upload-service" },
|
|
62
64
|
] as const;
|
|
63
65
|
|
|
64
66
|
const configCategoryFilter: QueryFilter = {
|
package/src/service/index.ts
CHANGED
|
@@ -30,6 +30,8 @@ export {
|
|
|
30
30
|
export type { Config, ConfigDetails } from "./config.interface";
|
|
31
31
|
export { CategoryConfig, TARGET_SYSTEM_REGISTRY_KEY } from "./config.interface";
|
|
32
32
|
export type {
|
|
33
|
+
AppendSystemRegistrySlotsInput,
|
|
34
|
+
AppendSystemRegistrySlotsOutcome,
|
|
33
35
|
PatchServiceRuntimeInput,
|
|
34
36
|
RegisterServiceInput,
|
|
35
37
|
ReleasedRegistrySlot,
|
|
@@ -39,6 +41,7 @@ export type {
|
|
|
39
41
|
TargetSystemRegistryView,
|
|
40
42
|
} from "./registry.service";
|
|
41
43
|
export {
|
|
44
|
+
appendSystemRegistrySlots,
|
|
42
45
|
assertRegistrySlotAvailable,
|
|
43
46
|
assertRegistrySlotOwner,
|
|
44
47
|
getTargetSystemRegistry,
|
|
@@ -71,6 +71,21 @@ export interface ReleaseSystemRegistrySlotsOutcome {
|
|
|
71
71
|
unchangedServiceValues: string[];
|
|
72
72
|
}
|
|
73
73
|
|
|
74
|
+
export interface AppendSystemRegistrySlotsInput {
|
|
75
|
+
/** Logical service keys to declare with one new EMPTY slot each when missing. */
|
|
76
|
+
serviceValues: string[];
|
|
77
|
+
traceId?: string;
|
|
78
|
+
maxAttempts?: number;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export interface AppendSystemRegistrySlotsOutcome {
|
|
82
|
+
config: Config;
|
|
83
|
+
/** Service keys that received a new EMPTY slot this run. */
|
|
84
|
+
added: string[];
|
|
85
|
+
/** Requested keys that already had at least one declared slot — no change. */
|
|
86
|
+
skipped: string[];
|
|
87
|
+
}
|
|
88
|
+
|
|
74
89
|
export class ServiceRegistryError extends Error {
|
|
75
90
|
constructor(
|
|
76
91
|
message: string,
|
|
@@ -460,6 +475,102 @@ export async function releaseSystemRegistrySlots(
|
|
|
460
475
|
);
|
|
461
476
|
}
|
|
462
477
|
|
|
478
|
+
/**
|
|
479
|
+
* Append EMPTY {@link ServiceSlot} rows for logical service keys not yet declared.
|
|
480
|
+
* Idempotent — skips keys that already appear in `details.objects`.
|
|
481
|
+
* Does not modify existing slots or release ACTIVE bindings.
|
|
482
|
+
*/
|
|
483
|
+
export async function appendSystemRegistrySlots(
|
|
484
|
+
input: AppendSystemRegistrySlotsInput,
|
|
485
|
+
): Promise<AppendSystemRegistrySlotsOutcome> {
|
|
486
|
+
const serviceValues = [
|
|
487
|
+
...new Set(input.serviceValues.map((value) => value.trim()).filter((value) => value !== "")),
|
|
488
|
+
];
|
|
489
|
+
if (serviceValues.length === 0) {
|
|
490
|
+
throw new Error("[appendSystemRegistrySlots] serviceValues must not be empty");
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
const maxAttempts = input.maxAttempts ?? DEFAULT_REGISTER_RETRY_ATTEMPTS;
|
|
494
|
+
const logger = createLogger({
|
|
495
|
+
module: "appendSystemRegistrySlots",
|
|
496
|
+
traceId: input.traceId,
|
|
497
|
+
labels: { serviceValues: serviceValues.join(",") },
|
|
498
|
+
});
|
|
499
|
+
|
|
500
|
+
logger.info("开始追加 registry 槽位声明", {
|
|
501
|
+
topic: LOG_TOPIC_REGISTRY,
|
|
502
|
+
data: { serviceValues },
|
|
503
|
+
});
|
|
504
|
+
|
|
505
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
|
|
506
|
+
try {
|
|
507
|
+
const config = await loadSystemRegistryConfig();
|
|
508
|
+
const revision = parseRegistryRevision(config.details.meta);
|
|
509
|
+
const slots = parseServiceSlots(config);
|
|
510
|
+
|
|
511
|
+
const added: string[] = [];
|
|
512
|
+
const skipped: string[] = [];
|
|
513
|
+
const nextSlots = [...slots];
|
|
514
|
+
|
|
515
|
+
for (const serviceValue of serviceValues) {
|
|
516
|
+
if (isServiceValueDeclared(nextSlots, serviceValue)) {
|
|
517
|
+
skipped.push(serviceValue);
|
|
518
|
+
continue;
|
|
519
|
+
}
|
|
520
|
+
nextSlots.push({
|
|
521
|
+
serviceValue,
|
|
522
|
+
serviceId: null,
|
|
523
|
+
status: ServiceSlotStatus.EMPTY,
|
|
524
|
+
});
|
|
525
|
+
added.push(serviceValue);
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
if (added.length === 0) {
|
|
529
|
+
logger.info("所有 service 已声明 — 无需追加", {
|
|
530
|
+
topic: LOG_TOPIC_REGISTRY,
|
|
531
|
+
data: { serviceValues, skipped },
|
|
532
|
+
});
|
|
533
|
+
return { config, added, skipped: serviceValues };
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
await persistSlotClaim({
|
|
537
|
+
configId: config.id,
|
|
538
|
+
revision,
|
|
539
|
+
slots: nextSlots,
|
|
540
|
+
});
|
|
541
|
+
|
|
542
|
+
const updated = await loadSystemRegistryConfig();
|
|
543
|
+
logger.info("registry 槽位追加成功", {
|
|
544
|
+
topic: LOG_TOPIC_REGISTRY,
|
|
545
|
+
data: { added, skipped, attempt, revision: revision + 1 },
|
|
546
|
+
});
|
|
547
|
+
|
|
548
|
+
return { config: updated, added, skipped };
|
|
549
|
+
} catch (error) {
|
|
550
|
+
if (isOptimisticLockError(error) && attempt < maxAttempts) {
|
|
551
|
+
logger.warn("registry 乐观锁冲突,重试", {
|
|
552
|
+
topic: LOG_TOPIC_REGISTRY,
|
|
553
|
+
data: { serviceValues, attempt, maxAttempts },
|
|
554
|
+
});
|
|
555
|
+
await sleep(50 * attempt);
|
|
556
|
+
continue;
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
560
|
+
logger.error("registry 槽位追加失败", {
|
|
561
|
+
topic: LOG_TOPIC_REGISTRY,
|
|
562
|
+
data: { serviceValues, attempt, message },
|
|
563
|
+
});
|
|
564
|
+
throw new ServiceRegistryError(message, "REGISTRY_UPDATE_FAILED");
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
throw new ServiceRegistryError(
|
|
569
|
+
"[appendSystemRegistrySlots] Optimistic lock retries exhausted",
|
|
570
|
+
"REGISTRY_UPDATE_FAILED",
|
|
571
|
+
);
|
|
572
|
+
}
|
|
573
|
+
|
|
463
574
|
/**
|
|
464
575
|
* Claim one EMPTY slot for a running Service instance (`EMPTY → ACTIVE` only).
|
|
465
576
|
*
|