target-supabase-sdk 0.2.3 → 0.2.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.
Files changed (155) hide show
  1. package/README.md +24 -18
  2. package/dist/browser.d.ts +11 -4
  3. package/dist/browser.d.ts.map +1 -1
  4. package/dist/browser.js +3 -3
  5. package/dist/chunks/{enable-log-persist-C7GJo_Nc.js → enable-log-persist-B8rg_wXG.js} +5 -6
  6. package/dist/chunks/enable-log-persist-B8rg_wXG.js.map +1 -0
  7. package/dist/chunks/{create-logger-DyH3mZ8p.js → list.api-Ab9v8yOg.js} +66 -57
  8. package/dist/chunks/list.api-Ab9v8yOg.js.map +1 -0
  9. package/dist/chunks/{word.interface-DLgRobKV.js → word.interface-B_fbVFOW.js} +1078 -97
  10. package/dist/chunks/word.interface-B_fbVFOW.js.map +1 -0
  11. package/dist/extraction/extraction.api.d.ts +117 -0
  12. package/dist/extraction/extraction.api.d.ts.map +1 -0
  13. package/dist/extraction/extraction.interface.d.ts +43 -0
  14. package/dist/extraction/extraction.interface.d.ts.map +1 -0
  15. package/dist/list/list.interface.d.ts +2 -2
  16. package/dist/list/list.interface.d.ts.map +1 -1
  17. package/dist/node/node-runtime.base.d.ts +13 -1
  18. package/dist/node/node-runtime.base.d.ts.map +1 -1
  19. package/dist/node/process/create-managed-child-processes.d.ts +12 -0
  20. package/dist/node/process/create-managed-child-processes.d.ts.map +1 -0
  21. package/dist/node/process/index.d.ts +3 -1
  22. package/dist/node/process/index.d.ts.map +1 -1
  23. package/dist/node/process/managed-child-processes.d.ts +15 -2
  24. package/dist/node/process/managed-child-processes.d.ts.map +1 -1
  25. package/dist/node/runtime-state/create-service-runtime-state-store.d.ts +23 -0
  26. package/dist/node/runtime-state/create-service-runtime-state-store.d.ts.map +1 -0
  27. package/dist/node/runtime-state/index.d.ts +4 -0
  28. package/dist/node/runtime-state/index.d.ts.map +1 -0
  29. package/dist/node/runtime-state/service-runtime-state.types.d.ts +57 -0
  30. package/dist/node/runtime-state/service-runtime-state.types.d.ts.map +1 -0
  31. package/dist/node/service-guard/index.d.ts +9 -0
  32. package/dist/node/service-guard/index.d.ts.map +1 -0
  33. package/dist/node/service-guard/register-service-guard-runner.d.ts +9 -0
  34. package/dist/node/service-guard/register-service-guard-runner.d.ts.map +1 -0
  35. package/dist/node/service-guard/run-readiness-gate.d.ts +11 -0
  36. package/dist/node/service-guard/run-readiness-gate.d.ts.map +1 -0
  37. package/dist/node/service-guard/run-service-guard-tick.d.ts +7 -0
  38. package/dist/node/service-guard/run-service-guard-tick.d.ts.map +1 -0
  39. package/dist/node/service-guard/service-guard-node.d.ts +18 -0
  40. package/dist/node/service-guard/service-guard-node.d.ts.map +1 -0
  41. package/dist/node/service-guard/service-guard.interface.d.ts +58 -0
  42. package/dist/node/service-guard/service-guard.interface.d.ts.map +1 -0
  43. package/dist/node/service-guard/worker-spawn-cooldown.d.ts +4 -0
  44. package/dist/node/service-guard/worker-spawn-cooldown.d.ts.map +1 -0
  45. package/dist/node/service-host/index.d.ts +9 -0
  46. package/dist/node/service-host/index.d.ts.map +1 -0
  47. package/dist/node/service-host/registry-slot-guard-step.d.ts +21 -0
  48. package/dist/node/service-host/registry-slot-guard-step.d.ts.map +1 -0
  49. package/dist/node/service-host/service-host.d.ts +36 -0
  50. package/dist/node/service-host/service-host.d.ts.map +1 -0
  51. package/dist/node/service-host/single-process-service.d.ts +21 -0
  52. package/dist/node/service-host/single-process-service.d.ts.map +1 -0
  53. package/dist/node.d.ts +15 -2
  54. package/dist/node.d.ts.map +1 -1
  55. package/dist/node.js +2088 -1495
  56. package/dist/node.js.map +1 -1
  57. package/dist/preload.js +3 -3
  58. package/dist/service/config.api.d.ts +143 -0
  59. package/dist/service/config.api.d.ts.map +1 -0
  60. package/dist/service/config.interface.d.ts +22 -0
  61. package/dist/service/config.interface.d.ts.map +1 -0
  62. package/dist/service/index.d.ts +16 -17
  63. package/dist/service/index.d.ts.map +1 -1
  64. package/dist/service/registry-lifecycle.d.ts +43 -0
  65. package/dist/service/registry-lifecycle.d.ts.map +1 -0
  66. package/dist/service/registry.service.d.ts +94 -0
  67. package/dist/service/registry.service.d.ts.map +1 -0
  68. package/dist/service/service-bootstrap.d.ts +28 -0
  69. package/dist/service/service-bootstrap.d.ts.map +1 -0
  70. package/dist/service/service.api.d.ts +160 -0
  71. package/dist/service/service.api.d.ts.map +1 -1
  72. package/dist/service/service.interface.d.ts +32 -1
  73. package/dist/service/service.interface.d.ts.map +1 -1
  74. package/dist/shared/log/index.d.ts +4 -0
  75. package/dist/shared/log/index.d.ts.map +1 -1
  76. package/dist/shared/log/log-batch.d.ts +44 -0
  77. package/dist/shared/log/log-batch.d.ts.map +1 -0
  78. package/dist/shared/log/log-persist-coordinator.d.ts +37 -0
  79. package/dist/shared/log/log-persist-coordinator.d.ts.map +1 -0
  80. package/dist/shared/log/log-persist-flush.d.ts.map +1 -1
  81. package/dist/shared/log/log-persist.config.d.ts +0 -1
  82. package/dist/shared/log/log-persist.config.d.ts.map +1 -1
  83. package/dist/shared/log/log-persist.interface.d.ts +8 -0
  84. package/dist/shared/log/log-persist.interface.d.ts.map +1 -1
  85. package/dist/shared/utils/config-path.utils.d.ts +21 -0
  86. package/dist/shared/utils/config-path.utils.d.ts.map +1 -1
  87. package/dist/shared/utils/get-value-at-path.d.ts +3 -0
  88. package/dist/shared/utils/get-value-at-path.d.ts.map +1 -0
  89. package/dist/task/index.d.ts +2 -0
  90. package/dist/task/index.d.ts.map +1 -1
  91. package/dist/task/task-manager.d.ts +1 -1
  92. package/dist/task/task-manager.d.ts.map +1 -1
  93. package/dist/task/task-post-retry.api.d.ts +24 -0
  94. package/dist/task/task-post-retry.api.d.ts.map +1 -0
  95. package/dist/task/task-repo-context.d.ts +7 -1
  96. package/dist/task/task-repo-context.d.ts.map +1 -1
  97. package/dist/trigger/trigger-manager.d.ts +1 -1
  98. package/dist/trigger/trigger-manager.d.ts.map +1 -1
  99. package/dist/trigger/trigger-node.d.ts +1 -0
  100. package/dist/trigger/trigger-node.d.ts.map +1 -1
  101. package/dist/trigger/trigger.constant.d.ts +1 -1
  102. package/dist/trigger/trigger.constant.d.ts.map +1 -1
  103. package/dist/trigger/trigger.interface.d.ts +10 -0
  104. package/dist/trigger/trigger.interface.d.ts.map +1 -1
  105. package/package.json +4 -2
  106. package/src/browser.ts +98 -4
  107. package/src/extraction/extraction.api.ts +232 -0
  108. package/src/extraction/extraction.interface.ts +45 -0
  109. package/src/list/list.interface.ts +2 -2
  110. package/src/node/node-runtime.base.ts +37 -6
  111. package/src/node/process/create-managed-child-processes.ts +27 -0
  112. package/src/node/process/index.ts +4 -0
  113. package/src/node/process/managed-child-processes.ts +48 -15
  114. package/src/node/runtime-state/create-service-runtime-state-store.ts +125 -0
  115. package/src/node/runtime-state/index.ts +17 -0
  116. package/src/node/runtime-state/service-runtime-state.types.ts +64 -0
  117. package/src/node/service-guard/index.ts +17 -0
  118. package/src/node/service-guard/register-service-guard-runner.ts +64 -0
  119. package/src/node/service-guard/run-readiness-gate.ts +34 -0
  120. package/src/node/service-guard/run-service-guard-tick.ts +106 -0
  121. package/src/node/service-guard/service-guard-node.ts +52 -0
  122. package/src/node/service-guard/service-guard.interface.ts +64 -0
  123. package/src/node/service-guard/worker-spawn-cooldown.ts +13 -0
  124. package/src/node/service-host/index.ts +30 -0
  125. package/src/node/service-host/registry-slot-guard-step.ts +57 -0
  126. package/src/node/service-host/service-host.ts +168 -0
  127. package/src/node/service-host/single-process-service.ts +58 -0
  128. package/src/node.ts +69 -0
  129. package/src/service/config.api.ts +224 -0
  130. package/src/service/config.interface.ts +25 -0
  131. package/src/service/index.ts +74 -149
  132. package/src/service/registry-lifecycle.ts +144 -0
  133. package/src/service/registry.service.ts +564 -0
  134. package/src/service/service-bootstrap.ts +74 -0
  135. package/src/service/service.api.ts +13 -0
  136. package/src/service/service.interface.ts +36 -1
  137. package/src/shared/log/index.ts +13 -0
  138. package/src/shared/log/log-batch.ts +156 -0
  139. package/src/shared/log/log-persist-coordinator.ts +107 -0
  140. package/src/shared/log/log-persist-flush.ts +3 -3
  141. package/src/shared/log/log-persist.config.ts +0 -2
  142. package/src/shared/log/log-persist.interface.ts +10 -0
  143. package/src/shared/utils/config-path.utils.ts +35 -0
  144. package/src/shared/utils/get-value-at-path.ts +17 -0
  145. package/src/task/index.ts +2 -0
  146. package/src/task/task-manager.ts +10 -4
  147. package/src/task/task-post-retry.api.ts +61 -0
  148. package/src/task/task-repo-context.ts +8 -1
  149. package/src/trigger/trigger-manager.ts +4 -2
  150. package/src/trigger/trigger-node.ts +10 -4
  151. package/src/trigger/trigger.constant.ts +1 -1
  152. package/src/trigger/trigger.interface.ts +10 -0
  153. package/dist/chunks/create-logger-DyH3mZ8p.js.map +0 -1
  154. package/dist/chunks/enable-log-persist-C7GJo_Nc.js.map +0 -1
  155. package/dist/chunks/word.interface-DLgRobKV.js.map +0 -1
@@ -1,9 +1,6 @@
1
- import { scanTargetList } from "../core.api";
2
- import { generateResponse, type SupabaseResponse } from "../core.interface";
3
- import { createLogger } from "../shared/log";
4
- import { ServiceLifecycleStatus } from "./base.interface";
5
- import { getService } from "./service.api";
6
- import { CategoryService, type Service } from "./service.interface";
1
+ /**
2
+ * Service domain public API — curated re-exports only.
3
+ */
7
4
 
8
5
  export type {
9
6
  EnumMembers,
@@ -12,6 +9,59 @@ export type {
12
9
  ServiceLifecycle,
13
10
  } from "./base.interface";
14
11
  export { ServiceLifecycleStatus } from "./base.interface";
12
+ export type {
13
+ GetConfigPayload,
14
+ PostSystemRegistryConfigPayload,
15
+ ResetSystemRegistryConfigPayload,
16
+ SystemRegistrySeedSlot,
17
+ } from "./config.api";
18
+ export {
19
+ buildEmptyServiceSlots,
20
+ buildSystemRegistryConfigDetails,
21
+ DEFAULT_SYSTEM_REGISTRY_SEED_SLOTS,
22
+ getConfig,
23
+ getConfigSchema,
24
+ postSystemRegistryConfig,
25
+ postSystemRegistryConfigSchema,
26
+ resetSystemRegistryConfig,
27
+ resetSystemRegistryConfigSchema,
28
+ systemRegistrySeedSlotSchema,
29
+ } from "./config.api";
30
+ export type { Config, ConfigDetails } from "./config.interface";
31
+ export { CategoryConfig, TARGET_SYSTEM_REGISTRY_KEY } from "./config.interface";
32
+ export type {
33
+ PatchServiceRuntimeInput,
34
+ RegisterServiceInput,
35
+ TargetSystemRegistrySlotView,
36
+ TargetSystemRegistryView,
37
+ } from "./registry.service";
38
+ export {
39
+ assertRegistrySlotAvailable,
40
+ assertRegistrySlotOwner,
41
+ getTargetSystemRegistry,
42
+ parseServiceSlot,
43
+ parseServiceSlots,
44
+ patchServiceRuntime,
45
+ registerService,
46
+ registerServiceAtStartup,
47
+ resolveActiveRegistryServiceId,
48
+ ServiceRegistryError,
49
+ unregisterService,
50
+ unregisterServiceAtShutdown,
51
+ } from "./registry.service";
52
+ export type {
53
+ ClaimRegistrySlotInput,
54
+ RegistrySlotGuardResult,
55
+ RegistrySlotRuntimeState,
56
+ ServiceRegistrySession,
57
+ } from "./registry-lifecycle";
58
+ export {
59
+ claimServiceRegistrySlot,
60
+ createClaimedRegistrySlotRuntimeState,
61
+ EMPTY_REGISTRY_SLOT_RUNTIME_STATE,
62
+ registrySlotRuntimePatchFromGuardResult,
63
+ runRegistrySlotGuardCheck,
64
+ } from "./registry-lifecycle";
15
65
  export type { GetApiPayload, GetServicePayload, PostApiPayload, PostServicePayload } from "./service.api";
16
66
  export {
17
67
  apiDetailsSchema,
@@ -27,147 +77,22 @@ export {
27
77
  schemaDefinitionSchema,
28
78
  serviceDetailsSchema,
29
79
  serviceLifecycleSchema,
80
+ serviceNodeSnapshotSchema,
81
+ serviceRuntimeSchema,
30
82
  } from "./service.api";
31
- export type { Api, ApiDetails, Service, ServiceDetails } from "./service.interface";
32
- export { ApiMethod, CategoryApi, CategoryService } from "./service.interface";
33
-
34
- export interface DiscoverServiceInput {
35
- /** {@link Service.value} */
36
- value: string;
37
- traceId?: string;
38
- }
39
-
40
- const DISCOVER_LIFECYCLE_STATUS = ServiceLifecycleStatus.ACTIVE;
41
- const SERVICE_LIFECYCLE_STATUS_FIELD = "details->lifecycle->>status" as const;
42
-
43
- async function lookupServicePrimary(value: string): Promise<Service | null> {
44
- const response = await getService({ value, lifecycleStatus: DISCOVER_LIFECYCLE_STATUS });
45
- return response.data ?? null;
46
- }
47
-
48
- async function lookupServiceByScan(value: string): Promise<Service | null> {
49
- const { data } = await scanTargetList<Service>({
50
- category: CategoryService.SERVICE,
51
- orderBy: { field: "value", ascending: true },
52
- maxRows: 1,
53
- filterList: [
54
- { field: "value", operator: "eq", value },
55
- {
56
- field: SERVICE_LIFECYCLE_STATUS_FIELD,
57
- operator: "eq",
58
- value: DISCOVER_LIFECYCLE_STATUS,
59
- },
60
- ],
61
- });
62
-
63
- return data?.[0] ?? null;
64
- }
65
-
66
- async function resolveDiscoverFailureReason(value: string): Promise<"not-found" | "not-available"> {
67
- const response = await getService({ value });
68
- if (response.data == null) {
69
- return "not-found";
70
- }
71
- return "not-available";
72
- }
73
-
74
- /**
75
- * Discover a single service by {@link Service.value}.
76
- * Only returns services with `lifecycle.status === ACTIVE` (filtered at query time).
77
- *
78
- * Lookup: primary `getService` → fallback `scanTargetList` by value.
79
- */
80
- export async function discoverService(input: DiscoverServiceInput): Promise<SupabaseResponse<Service>> {
81
- const value = input.value.trim();
82
- const logger = createLogger({
83
- module: "discoverService",
84
- traceId: input.traceId,
85
- labels: { serviceValue: value },
86
- });
87
-
88
- if (value === "") {
89
- const message = "discoverService: value must not be empty";
90
- logger.warn(message, { topic: "service", data: { value: input.value } });
91
- return generateResponse.error(message, undefined, "SERVICE_VALUE_REQUIRED") as SupabaseResponse<Service>;
92
- }
93
-
94
- try {
95
- logger.info("开始发现服务", {
96
- topic: "service",
97
- data: { value, lifecycleStatus: DISCOVER_LIFECYCLE_STATUS },
98
- });
99
-
100
- let service = await lookupServicePrimary(value);
101
- let source: "primary" | "scan" = "primary";
102
-
103
- if (service == null) {
104
- logger.warn("主路径未命中,尝试 catalog 扫描回退", {
105
- topic: "service",
106
- data: { value, step: "scan-fallback", lifecycleStatus: DISCOVER_LIFECYCLE_STATUS },
107
- });
108
- service = await lookupServiceByScan(value);
109
- source = "scan";
110
- }
111
-
112
- if (service == null) {
113
- const reason = await resolveDiscoverFailureReason(value);
114
- if (reason === "not-available") {
115
- const message = `Service ${value} is not available (lifecycle is not ACTIVE)`;
116
- logger.warn("服务已注册但不可用", {
117
- topic: "service",
118
- data: { value, step: "not-available", lifecycleStatus: DISCOVER_LIFECYCLE_STATUS },
119
- });
120
- return generateResponse.error(message, undefined, "SERVICE_NOT_AVAILABLE") as SupabaseResponse<Service>;
121
- }
122
-
123
- const message = `Service not found: ${value}`;
124
- logger.error("服务未发现", {
125
- topic: "service",
126
- data: { value, step: "not-found", tried: ["primary", "scan"] },
127
- });
128
- return generateResponse.error(message, undefined, "SERVICE_NOT_FOUND") as SupabaseResponse<Service>;
129
- }
130
-
131
- logger.info("服务发现成功", {
132
- topic: "service",
133
- data: {
134
- value,
135
- source,
136
- serviceId: service.id,
137
- lifecycleStatus: service.details.lifecycle.status,
138
- apiKeyCount: service.details.apiKeys.length,
139
- dependencyCount: service.details.dependencies.length,
140
- },
141
- });
142
-
143
- return generateResponse.success(service);
144
- } catch (error) {
145
- const message = error instanceof Error ? error.message : String(error);
146
- logger.error("服务发现失败", {
147
- topic: "service",
148
- data: { value, message },
149
- });
150
-
151
- let service: Service | null = null;
152
- try {
153
- service = await lookupServiceByScan(value);
154
- } catch (fallbackError) {
155
- const fallbackMessage = fallbackError instanceof Error ? fallbackError.message : String(fallbackError);
156
- logger.error("扫描回退失败", {
157
- topic: "service",
158
- data: { value, message: fallbackMessage },
159
- });
160
- return generateResponse.error(message, undefined, "SERVICE_DISCOVER_FAILED") as SupabaseResponse<Service>;
161
- }
162
-
163
- if (service != null) {
164
- logger.warn("主路径异常后扫描回退成功", {
165
- topic: "service",
166
- data: { value, serviceId: service.id, primaryError: message },
167
- });
168
- return generateResponse.success(service);
169
- }
170
-
171
- return generateResponse.error(message, undefined, "SERVICE_DISCOVER_FAILED") as SupabaseResponse<Service>;
172
- }
173
- }
83
+ export type {
84
+ Api,
85
+ ApiDetails,
86
+ Service,
87
+ ServiceDetails,
88
+ ServiceNodeSnapshot,
89
+ ServiceRuntime,
90
+ ServiceSlot,
91
+ } from "./service.interface";
92
+ export { ApiMethod, CategoryApi, CategoryService, ServiceSlotStatus } from "./service.interface";
93
+ export type { PostServiceInstanceOptions, ServiceBootstrapResult } from "./service-bootstrap";
94
+ export {
95
+ createActiveServiceLifecycle,
96
+ defaultL3ServiceDetails,
97
+ postServiceInstance,
98
+ } from "./service-bootstrap";
@@ -0,0 +1,144 @@
1
+ import { deleteTarget } from "../core.api";
2
+ import { createLogger } from "../shared/log";
3
+ import {
4
+ assertRegistrySlotAvailable,
5
+ assertRegistrySlotOwner,
6
+ registerServiceAtStartup,
7
+ ServiceRegistryError,
8
+ unregisterServiceAtShutdown,
9
+ } from "./registry.service";
10
+ import type { Service } from "./service.interface";
11
+
12
+ const LOG_TOPIC = "service-registry-lifecycle";
13
+
14
+ /** Shared registry slice for L3 runtime state files (`state.json`). */
15
+ export interface RegistrySlotRuntimeState {
16
+ serviceId: string | null;
17
+ serviceValue: string | null;
18
+ slotOwned: boolean | null;
19
+ lastSlotCheckAt: string | null;
20
+ lastSlotCheckError: string | null;
21
+ }
22
+
23
+ export const EMPTY_REGISTRY_SLOT_RUNTIME_STATE: RegistrySlotRuntimeState = {
24
+ serviceId: null,
25
+ serviceValue: null,
26
+ slotOwned: null,
27
+ lastSlotCheckAt: null,
28
+ lastSlotCheckError: null,
29
+ };
30
+
31
+ export function createClaimedRegistrySlotRuntimeState(service: Service): RegistrySlotRuntimeState {
32
+ return {
33
+ serviceId: service.id,
34
+ serviceValue: service.value,
35
+ slotOwned: true,
36
+ lastSlotCheckAt: null,
37
+ lastSlotCheckError: null,
38
+ };
39
+ }
40
+
41
+ export interface ClaimRegistrySlotInput {
42
+ serviceValue: string;
43
+ createInstance: () => Promise<Service>;
44
+ traceId?: string;
45
+ }
46
+
47
+ export interface ServiceRegistrySession {
48
+ service: Service;
49
+ /** Graceful shutdown — releases ACTIVE registry slot. */
50
+ release: () => Promise<void>;
51
+ /** Abandon orphan instance row when register never succeeded. */
52
+ abandon: () => Promise<void>;
53
+ }
54
+
55
+ /**
56
+ * Preflight → create Service instance → claim registry slot.
57
+ * On register failure after `createInstance`, deletes the orphan Service row.
58
+ */
59
+ export async function claimServiceRegistrySlot(input: ClaimRegistrySlotInput): Promise<ServiceRegistrySession> {
60
+ const logger = createLogger({
61
+ module: "claimServiceRegistrySlot",
62
+ traceId: input.traceId,
63
+ labels: { serviceValue: input.serviceValue },
64
+ });
65
+
66
+ await assertRegistrySlotAvailable(input.serviceValue);
67
+
68
+ const service = await input.createInstance();
69
+ let registered = false;
70
+
71
+ try {
72
+ await registerServiceAtStartup({ service, traceId: input.traceId });
73
+ registered = true;
74
+ } catch (error) {
75
+ await deleteTarget({ id: service.id }).catch((deleteError: unknown) => {
76
+ const message = deleteError instanceof Error ? deleteError.message : String(deleteError);
77
+ logger.warn("Failed to delete orphan Service row after register failure", {
78
+ topic: LOG_TOPIC,
79
+ data: { serviceId: service.id, message },
80
+ });
81
+ });
82
+ throw error;
83
+ }
84
+
85
+ logger.info("registry slot claimed", {
86
+ topic: LOG_TOPIC,
87
+ data: { serviceValue: service.value, serviceId: service.id, registered },
88
+ });
89
+
90
+ return {
91
+ service,
92
+ release: async () => {
93
+ await unregisterServiceAtShutdown({ service, traceId: input.traceId });
94
+ },
95
+ abandon: async () => {
96
+ await deleteTarget({ id: service.id }).catch(() => undefined);
97
+ },
98
+ };
99
+ }
100
+
101
+ export interface RegistrySlotGuardResult {
102
+ slotOwned: boolean | null;
103
+ shouldShutdown: boolean;
104
+ error?: string;
105
+ }
106
+
107
+ /**
108
+ * Runtime guard step for service supervisor loops.
109
+ * Transient read failures soft-fail; confirmed slot loss returns `shouldShutdown: true`.
110
+ */
111
+ export async function runRegistrySlotGuardCheck(input: {
112
+ serviceValue: string;
113
+ serviceId: string;
114
+ }): Promise<RegistrySlotGuardResult> {
115
+ try {
116
+ await assertRegistrySlotOwner(input);
117
+ return { slotOwned: true, shouldShutdown: false };
118
+ } catch (error) {
119
+ if (error instanceof ServiceRegistryError && error.code === "REGISTRY_SLOT_LOST") {
120
+ return {
121
+ slotOwned: false,
122
+ shouldShutdown: true,
123
+ error: error.message,
124
+ };
125
+ }
126
+ const message = error instanceof Error ? error.message : String(error);
127
+ return {
128
+ slotOwned: null,
129
+ shouldShutdown: false,
130
+ error: message,
131
+ };
132
+ }
133
+ }
134
+
135
+ export function registrySlotRuntimePatchFromGuardResult(
136
+ result: RegistrySlotGuardResult,
137
+ checkedAt: string,
138
+ ): Pick<RegistrySlotRuntimeState, "slotOwned" | "lastSlotCheckAt" | "lastSlotCheckError"> {
139
+ return {
140
+ slotOwned: result.slotOwned,
141
+ lastSlotCheckAt: checkedAt,
142
+ lastSlotCheckError: result.error ?? null,
143
+ };
144
+ }