@package-broker/runtime-node 0.0.0-stage → 2.0.0-rc.1

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 (100) hide show
  1. package/LICENSE +661 -0
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/assets.d.ts +4 -0
  4. package/dist/assets.d.ts.map +1 -0
  5. package/dist/assets.js +68 -0
  6. package/dist/assets.js.map +1 -0
  7. package/dist/blob/archive-staging.d.ts +15 -0
  8. package/dist/blob/archive-staging.d.ts.map +1 -0
  9. package/dist/blob/archive-staging.js +154 -0
  10. package/dist/blob/archive-staging.js.map +1 -0
  11. package/dist/blob/filesystem.d.ts +18 -0
  12. package/dist/blob/filesystem.d.ts.map +1 -0
  13. package/dist/blob/filesystem.js +631 -0
  14. package/dist/blob/filesystem.js.map +1 -0
  15. package/dist/blob/hasher.d.ts +3 -0
  16. package/dist/blob/hasher.d.ts.map +1 -0
  17. package/dist/blob/hasher.js +26 -0
  18. package/dist/blob/hasher.js.map +1 -0
  19. package/dist/blob/s3.d.ts +40 -0
  20. package/dist/blob/s3.d.ts.map +1 -0
  21. package/dist/blob/s3.js +494 -0
  22. package/dist/blob/s3.js.map +1 -0
  23. package/dist/cache/lru.d.ts +8 -0
  24. package/dist/cache/lru.d.ts.map +1 -0
  25. package/dist/cache/lru.js +103 -0
  26. package/dist/cache/lru.js.map +1 -0
  27. package/dist/client-ip.d.ts +2 -0
  28. package/dist/client-ip.d.ts.map +1 -0
  29. package/dist/client-ip.js +51 -0
  30. package/dist/client-ip.js.map +1 -0
  31. package/dist/codec/node-codec.d.ts +3 -0
  32. package/dist/codec/node-codec.d.ts.map +1 -0
  33. package/dist/codec/node-codec.js +163 -0
  34. package/dist/codec/node-codec.js.map +1 -0
  35. package/dist/db/better-sqlite3-executor.d.ts +10 -0
  36. package/dist/db/better-sqlite3-executor.d.ts.map +1 -0
  37. package/dist/db/better-sqlite3-executor.js +129 -0
  38. package/dist/db/better-sqlite3-executor.js.map +1 -0
  39. package/dist/entry.d.ts +32 -0
  40. package/dist/entry.d.ts.map +1 -0
  41. package/dist/entry.js +158 -0
  42. package/dist/entry.js.map +1 -0
  43. package/dist/import-jobs.d.ts +18 -0
  44. package/dist/import-jobs.d.ts.map +1 -0
  45. package/dist/import-jobs.js +56 -0
  46. package/dist/import-jobs.js.map +1 -0
  47. package/dist/index.d.ts +112 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +981 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/internal/seams-key.d.ts +2 -0
  52. package/dist/internal/seams-key.d.ts.map +1 -0
  53. package/dist/internal/seams-key.js +2 -0
  54. package/dist/internal/seams-key.js.map +1 -0
  55. package/dist/jobs/loop.d.ts +38 -0
  56. package/dist/jobs/loop.d.ts.map +1 -0
  57. package/dist/jobs/loop.js +318 -0
  58. package/dist/jobs/loop.js.map +1 -0
  59. package/dist/observability/stdio.d.ts +11 -0
  60. package/dist/observability/stdio.d.ts.map +1 -0
  61. package/dist/observability/stdio.js +47 -0
  62. package/dist/observability/stdio.js.map +1 -0
  63. package/dist/organization-administration.d.ts +5 -0
  64. package/dist/organization-administration.d.ts.map +1 -0
  65. package/dist/organization-administration.js +16 -0
  66. package/dist/organization-administration.js.map +1 -0
  67. package/dist/sources/dns-guard.d.ts +33 -0
  68. package/dist/sources/dns-guard.d.ts.map +1 -0
  69. package/dist/sources/dns-guard.js +202 -0
  70. package/dist/sources/dns-guard.js.map +1 -0
  71. package/dist/sources/git-provider.d.ts +30 -0
  72. package/dist/sources/git-provider.d.ts.map +1 -0
  73. package/dist/sources/git-provider.js +213 -0
  74. package/dist/sources/git-provider.js.map +1 -0
  75. package/dist/sources/guarded-fetch.d.ts +15 -0
  76. package/dist/sources/guarded-fetch.d.ts.map +1 -0
  77. package/dist/sources/guarded-fetch.js +217 -0
  78. package/dist/sources/guarded-fetch.js.map +1 -0
  79. package/dist/sources/ssh-archive-store.d.ts +19 -0
  80. package/dist/sources/ssh-archive-store.d.ts.map +1 -0
  81. package/dist/sources/ssh-archive-store.js +284 -0
  82. package/dist/sources/ssh-archive-store.js.map +1 -0
  83. package/dist/sources/ssh-git.d.ts +46 -0
  84. package/dist/sources/ssh-git.d.ts.map +1 -0
  85. package/dist/sources/ssh-git.js +430 -0
  86. package/dist/sources/ssh-git.js.map +1 -0
  87. package/dist/sources/ssh-provider.d.ts +55 -0
  88. package/dist/sources/ssh-provider.d.ts.map +1 -0
  89. package/dist/sources/ssh-provider.js +369 -0
  90. package/dist/sources/ssh-provider.js.map +1 -0
  91. package/dist/startup.d.ts +49 -0
  92. package/dist/startup.d.ts.map +1 -0
  93. package/dist/startup.js +687 -0
  94. package/dist/startup.js.map +1 -0
  95. package/dist/token-jobs.d.ts +18 -0
  96. package/dist/token-jobs.d.ts.map +1 -0
  97. package/dist/token-jobs.js +45 -0
  98. package/dist/token-jobs.js.map +1 -0
  99. package/package.json +45 -3
  100. package/README.md +0 -3
@@ -0,0 +1,369 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { packageKey } from '@package-broker/core/catalogue/names';
3
+ import { normalizeVersion } from '@package-broker/core/registry/composer/version-parser';
4
+ import { UpstreamError } from '@package-broker/core/sources/policy-fetch';
5
+ import { composerVersionInput } from '@package-broker/core/registry/composer/version-object';
6
+ import { versionsFromRefs, } from '@package-broker/core/registry/composer/version-rules';
7
+ import { credentialEchoProbe, } from '@package-broker/core/sources/credentials';
8
+ import { createPackageDescription, snapshotRef, } from '@package-broker/core/sources/provider';
9
+ import { SshArchiveStoreError } from './ssh-archive-store.js';
10
+ import { openSshGitSession, SshGitError, } from './ssh-git.js';
11
+ const MAX_MANIFEST_BYTES = 1024 * 1024;
12
+ const SSH_URL = /^ssh:\/\/(?:([^@/:[\]]+)@)?(\[[^\]/]*\]|[^/:[\]]+)(?::(\d{1,5}))?\/(.+)$/;
13
+ const SCP_LIKE = /^(?:([^@/:[\]]+)@)?(\[[^\]/]*\]|[^/:[\]]+):(.+)$/;
14
+ const SAFE_REF = /^refs\/(?:heads|tags)\/[A-Za-z0-9._/+-]+$/;
15
+ const PLACEHOLDER_SHA1 = '0'.repeat(40);
16
+ export function parseSshRepository(text) {
17
+ const scpForm = !text.startsWith('ssh://');
18
+ const match = scpForm ? (text.includes('://') ? null : SCP_LIKE.exec(text)) : SSH_URL.exec(text);
19
+ if (match) {
20
+ const scp = scpForm;
21
+ const user = match[1];
22
+ const host = match[2] ?? '';
23
+ const port = scp ? undefined : match[3];
24
+ const path = (scp ? match[3] : match[4]) ?? '';
25
+ if (!host.startsWith('-')) {
26
+ return {
27
+ host,
28
+ ...(user === undefined ? {} : { user }),
29
+ ...(port === undefined ? {} : { port: Number(port) }),
30
+ path,
31
+ };
32
+ }
33
+ }
34
+ throw new SshGitError('invalid_host');
35
+ }
36
+ export function informationalUrl(remote) {
37
+ return `https://${remote.host.toLowerCase()}/${remote.path.replace(/^\/+/, '')}`;
38
+ }
39
+ function sshConfig(source) {
40
+ if (source.type !== 'vcs' || source.config.provider !== 'ssh') {
41
+ throw new TypeError('the ssh provider only serves vcs sources with provider ssh');
42
+ }
43
+ return source.config;
44
+ }
45
+ function selectRefs(config, refs) {
46
+ const listed = refs
47
+ .map((ref) => `${ref.name} ${ref.peeled ?? ref.sha}${ref.symref === undefined ? '' : ` ${ref.symref}`}`)
48
+ .sort();
49
+ const digest = createHash('sha256').update(listed.join('\n')).digest('hex');
50
+ const allBranches = config.refs.branches.length === 0 || config.refs.branches.includes('*');
51
+ const tags = new Map();
52
+ const branches = new Map();
53
+ for (const ref of refs) {
54
+ if (!SAFE_REF.test(ref.name))
55
+ continue;
56
+ const entry = { ref: ref.name, commit: ref.peeled ?? ref.sha };
57
+ if (ref.name.startsWith('refs/tags/') && config.refs.tags) {
58
+ tags.set(ref.name.slice('refs/tags/'.length), entry);
59
+ }
60
+ else if (ref.name.startsWith('refs/heads/')) {
61
+ const branch = ref.name.slice('refs/heads/'.length);
62
+ if (allBranches || config.refs.branches.includes(branch))
63
+ branches.set(branch, entry);
64
+ }
65
+ }
66
+ const target = refs.find((ref) => ref.name === 'HEAD')?.symref;
67
+ const defaultBranch = target?.startsWith('refs/heads/')
68
+ ? target.slice('refs/heads/'.length)
69
+ : null;
70
+ return { tags, branches, snapshot: snapshotRef(`sha256:${digest}`), defaultBranch };
71
+ }
72
+ function nameOrder(selected) {
73
+ const preferred = [selected.defaultBranch, 'main', 'master'].flatMap((branch) => branch === null ? [] : (selected.branches.get(branch) ?? []));
74
+ const entries = [...preferred, ...selected.branches.values(), ...selected.tags.values()];
75
+ return [...new Set(entries.map((entry) => entry.commit))];
76
+ }
77
+ function isTooLarge(error) {
78
+ return error instanceof SshGitError && error.reason === 'output_too_large';
79
+ }
80
+ async function readManifest(session, commit) {
81
+ let bytes;
82
+ try {
83
+ bytes = await session.catFile(commit, 'composer.json');
84
+ }
85
+ catch (error) {
86
+ if (error instanceof SshGitError && error.reason === 'not_found')
87
+ return null;
88
+ throw error;
89
+ }
90
+ if (bytes.length > MAX_MANIFEST_BYTES)
91
+ return null;
92
+ try {
93
+ const parsed = JSON.parse(bytes.toString('utf8'));
94
+ return typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)
95
+ ? parsed
96
+ : null;
97
+ }
98
+ catch {
99
+ return null;
100
+ }
101
+ }
102
+ function manifestName(manifest) {
103
+ const name = manifest?.['name'];
104
+ if (typeof name !== 'string')
105
+ return null;
106
+ try {
107
+ return packageKey(name, { ecosystem: 'composer' });
108
+ }
109
+ catch {
110
+ return null;
111
+ }
112
+ }
113
+ function isDev(version) {
114
+ return version.kind === 'branch' || version.versionNormalized.endsWith('-dev');
115
+ }
116
+ export function createSshGitProvider(options) {
117
+ const openSession = (remote, credential, maxStdoutBytes) => openSshGitSession(remote, {
118
+ dnsGuard: options.dnsGuard,
119
+ credential,
120
+ ...(options.tmpRoot === undefined ? {} : { tmpRoot: options.tmpRoot }),
121
+ ...(options.timeoutMs === undefined ? {} : { timeoutMs: options.timeoutMs }),
122
+ ...(maxStdoutBytes === undefined ? {} : { maxStdoutBytes }),
123
+ ...(options.spawn === undefined ? {} : { spawn: options.spawn }),
124
+ });
125
+ /** A session that hits its output limit is closed by the transport, so the walk reopens and refetches the rest. */
126
+ async function walk(remote, credential, maxStdoutBytes, commits, signal, handle, tooLarge) {
127
+ let index = 0;
128
+ while (index < commits.length) {
129
+ const session = await openSession(remote, credential, maxStdoutBytes);
130
+ try {
131
+ await session.fetchRefs([...new Set(commits.slice(index))], {
132
+ filter: 'blob:none',
133
+ depth: 1,
134
+ });
135
+ while (index < commits.length) {
136
+ signal.throwIfAborted();
137
+ const commit = commits[index];
138
+ index += 1;
139
+ try {
140
+ if (await handle(session, commit))
141
+ return;
142
+ }
143
+ catch (error) {
144
+ if (!isTooLarge(error))
145
+ throw error;
146
+ tooLarge(commit);
147
+ break;
148
+ }
149
+ }
150
+ }
151
+ finally {
152
+ await session.close();
153
+ }
154
+ }
155
+ }
156
+ async function discover(remote, credential, config) {
157
+ const session = await openSession(remote, credential, options.maxStdoutBytes);
158
+ try {
159
+ return selectRefs(config, await session.lsRemote());
160
+ }
161
+ finally {
162
+ await session.close();
163
+ }
164
+ }
165
+ async function readManifests(remote, credential, commits, signal, stopAt) {
166
+ const manifests = new Map();
167
+ await walk(remote, credential, MAX_MANIFEST_BYTES, commits, signal, async (session, commit) => {
168
+ const manifest = await readManifest(session, commit);
169
+ manifests.set(commit, manifest);
170
+ return stopAt?.(manifest) ?? false;
171
+ }, (commit) => manifests.set(commit, null));
172
+ return manifests;
173
+ }
174
+ function firstName(order, manifests) {
175
+ for (const commit of order) {
176
+ const name = manifestName(manifests.get(commit) ?? null);
177
+ if (name !== null)
178
+ return name;
179
+ }
180
+ return null;
181
+ }
182
+ return {
183
+ id: 'ssh',
184
+ sourceTypes: ['vcs'],
185
+ ecosystems: ['composer'],
186
+ async listPackages(ctx, source) {
187
+ const config = sshConfig(source);
188
+ const remote = parseSshRepository(config.repository);
189
+ try {
190
+ const credential = await options.sshKey(source);
191
+ const selected = await discover(remote, credential, config);
192
+ let name = config.packageName ?? null;
193
+ if (name === null) {
194
+ const order = nameOrder(selected);
195
+ const manifests = await readManifests(remote, credential, order, ctx.signal, (manifest) => manifestName(manifest) !== null);
196
+ name = firstName(order, manifests);
197
+ }
198
+ return {
199
+ names: name === null ? [] : [name],
200
+ next: null,
201
+ last: name !== null,
202
+ snapshot: selected.snapshot,
203
+ };
204
+ }
205
+ catch (error) {
206
+ if (!(error instanceof SshGitError))
207
+ throw error;
208
+ return {
209
+ names: config.packageName === undefined ? [] : [config.packageName],
210
+ next: null,
211
+ last: false,
212
+ snapshot: snapshotRef(`sha256:${createHash('sha256').digest('hex')}`),
213
+ };
214
+ }
215
+ },
216
+ async describe(ctx, source, requested) {
217
+ const config = sshConfig(source);
218
+ const key = packageKey(requested, { ecosystem: 'composer' });
219
+ if (config.packageName !== undefined && config.packageName !== key) {
220
+ return { kind: 'not_found', definitive: true };
221
+ }
222
+ const remote = parseSshRepository(config.repository);
223
+ const credential = await options.sshKey(source);
224
+ const probe = credentialEchoProbe(credential);
225
+ const importedAt = ctx.clock.now().toISOString();
226
+ const selected = await discover(remote, credential, config);
227
+ const { versions } = versionsFromRefs([...selected.tags.keys()], [...selected.branches.keys()], selected.defaultBranch);
228
+ const commitOf = (version) => (version.kind === 'tag' ? selected.tags : selected.branches).get(version.ref)?.commit;
229
+ const order = nameOrder(selected);
230
+ const versionCommits = versions.flatMap((version) => commitOf(version) ?? []);
231
+ const manifests = await readManifests(remote, credential, [...new Set([...order, ...versionCommits])], ctx.signal);
232
+ const name = config.packageName ?? firstName(order, manifests);
233
+ if (name !== key)
234
+ return { kind: 'not_found', definitive: name !== null };
235
+ const check = (planned, record) => {
236
+ const raw = {
237
+ ...planned.manifest,
238
+ name: key,
239
+ version: planned.version.version,
240
+ version_normalized: planned.version.versionNormalized,
241
+ dist: {
242
+ type: 'zip',
243
+ url: informationalUrl(remote),
244
+ reference: planned.commit,
245
+ shasum: record.sha1,
246
+ },
247
+ };
248
+ delete raw['source'];
249
+ if (record.time === null)
250
+ delete raw['time'];
251
+ else
252
+ raw['time'] = record.time;
253
+ return composerVersionInput(key, raw, { probe, importedAt });
254
+ };
255
+ const plan = [];
256
+ for (const version of versions) {
257
+ ctx.signal.throwIfAborted();
258
+ const commit = commitOf(version);
259
+ const manifest = commit === undefined ? null : (manifests.get(commit) ?? null);
260
+ if (commit === undefined || manifest === null || manifestName(manifest) !== key)
261
+ continue;
262
+ const record = await options.archives.find(ctx.org, source, key, version.versionNormalized, commit);
263
+ const planned = { version, commit, manifest, record };
264
+ if (check(planned, record ?? { sha1: PLACEHOLDER_SHA1, time: null }).ok)
265
+ plan.push(planned);
266
+ }
267
+ let incomplete = false;
268
+ const pending = plan.filter((planned) => planned.record === null);
269
+ const byCommit = new Map();
270
+ for (const planned of pending) {
271
+ byCommit.set(planned.commit, [...(byCommit.get(planned.commit) ?? []), planned]);
272
+ }
273
+ await walk(remote, credential, options.maxStdoutBytes, [...byCommit.keys()], ctx.signal, async (session, commit) => {
274
+ const time = (await session.commitTime(commit)).replace(/\.\d{3}Z$/, '+00:00');
275
+ for (const planned of byCommit.get(commit) ?? []) {
276
+ const zip = new Uint8Array(await session.archiveZip(commit));
277
+ const built = {
278
+ version: planned.version.version,
279
+ versionNormalized: planned.version.versionNormalized,
280
+ commit,
281
+ zip,
282
+ sha1: createHash('sha1').update(zip).digest('hex'),
283
+ time,
284
+ };
285
+ await options.archives.store(ctx.org, source, key, built);
286
+ planned.record = { sha1: built.sha1, time: built.time };
287
+ }
288
+ return false;
289
+ }, () => {
290
+ incomplete = true;
291
+ });
292
+ const candidates = [];
293
+ for (const planned of plan) {
294
+ if (planned.record === null)
295
+ continue;
296
+ const checked = check(planned, planned.record);
297
+ if (!checked.ok)
298
+ continue;
299
+ candidates.push({
300
+ ordinal: candidates.length,
301
+ version: planned.version.version,
302
+ form: isDev(planned.version) ? 'composer-p2-dev' : 'composer-p2',
303
+ ...(planned.record.time === null ? {} : { upstreamTime: planned.record.time }),
304
+ raw: checked.input.metadata.json,
305
+ });
306
+ }
307
+ return {
308
+ kind: 'found',
309
+ description: createPackageDescription({
310
+ name: key,
311
+ snapshot: selected.snapshot,
312
+ members: (async function* () {
313
+ yield* candidates;
314
+ })(),
315
+ validators: {},
316
+ documentsComplete: () => !incomplete,
317
+ }),
318
+ };
319
+ },
320
+ async openDist(ctx, source, target) {
321
+ sshConfig(source);
322
+ ctx.signal.throwIfAborted();
323
+ if (target.distType !== 'zip' ||
324
+ target.sourceRef === null ||
325
+ !/^[0-9a-f]{40}$/.test(target.sourceRef)) {
326
+ throw new UpstreamError('refused');
327
+ }
328
+ let name;
329
+ let version;
330
+ try {
331
+ name = packageKey(target.packageName, { ecosystem: 'composer' });
332
+ version = normalizeVersion(target.version);
333
+ }
334
+ catch {
335
+ throw new UpstreamError('refused');
336
+ }
337
+ let zip;
338
+ try {
339
+ zip = await options.archives.readZip(ctx.org, source, name, version, target.sourceRef);
340
+ }
341
+ catch (error) {
342
+ if (error instanceof SshArchiveStoreError) {
343
+ ctx.observability.log({
344
+ level: 'warn',
345
+ event: 'dist.archive_store_error',
346
+ reason_code: error.reason,
347
+ });
348
+ throw new UpstreamError('network');
349
+ }
350
+ throw error;
351
+ }
352
+ ctx.signal.throwIfAborted();
353
+ if (zip === null) {
354
+ ctx.observability.log({ level: 'warn', event: 'dist.archive_missing' });
355
+ throw new UpstreamError('http_status', 404);
356
+ }
357
+ return {
358
+ size: zip.byteLength,
359
+ body: new ReadableStream({
360
+ start(controller) {
361
+ controller.enqueue(zip);
362
+ controller.close();
363
+ },
364
+ }),
365
+ };
366
+ },
367
+ };
368
+ }
369
+ //# sourceMappingURL=ssh-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh-provider.js","sourceRoot":"","sources":["../../src/sources/ssh-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import { type AuthReasonCode } from '@package-broker/core/auth/reason-codes';
2
+ import type { KernelLog } from '@package-broker/core/kernel/errors';
3
+ import { type Observability } from '@package-broker/core/platform/observability';
4
+ import { type PlatformPortConfig } from '@package-broker/core/platform/port-config';
5
+ import type { PluginDefinition } from '@package-broker/core/plugin';
6
+ import type { MigrationSource } from '@package-broker/db-sqlite/migrations/source';
7
+ import { type NodeBroker } from './index.js';
8
+ import { type BrokerConfig } from '@package-broker/core/config';
9
+ import { type StdioStream } from './observability/stdio.js';
10
+ export interface StartOptions {
11
+ readonly plugins: readonly PluginDefinition[];
12
+ readonly migrations: readonly MigrationSource[];
13
+ readonly env: Readonly<Record<string, string | undefined>>;
14
+ readonly log?: KernelLog;
15
+ readonly platformPorts?: PlatformPortConfig | null;
16
+ readonly observability?: BrokerConfig['observability'];
17
+ readonly registry?: BrokerConfig['registry'];
18
+ readonly tokens?: BrokerConfig['tokens'];
19
+ readonly vulnerability?: BrokerConfig['vulnerability'];
20
+ readonly mcp?: BrokerConfig['mcp'];
21
+ readonly stdout?: StdioStream;
22
+ readonly stderr?: StdioStream;
23
+ readonly fetch?: typeof fetch;
24
+ }
25
+ export declare class AlreadyBootstrappedError extends Error {
26
+ readonly slug: string;
27
+ constructor(slug: string);
28
+ }
29
+ export declare class StartupConfigError extends Error {
30
+ readonly variable: string;
31
+ constructor(variable: string, problem: string);
32
+ }
33
+ export declare const BLOB_PURGE_LEASE_SECONDS = 900;
34
+ export declare const BLOB_DELETE_TIMEOUT_MS = 30000;
35
+ export declare function blobPurgeTiming(deleteTimeoutMs: number, purgeLeaseSeconds: number): {
36
+ deleteTimeoutMs: number;
37
+ leaseMs: number;
38
+ };
39
+ export declare const AUTH_EVENTS: readonly ["auth.hook.denied", "auth.hook.error", "auth.local.locked", "auth.local.setup.completed", "auth.local.setup.refused", "auth.login.refused", "auth.login.succeeded", "auth.logout.refused", "auth.reauth.refused", "auth.reauth.succeeded", "token_touch_failed"];
40
+ export declare const NODE_RUNTIME_EVENTS: ReadonlySet<string>;
41
+ interface ObserveScope {
42
+ readonly requestId?: string;
43
+ readonly plugin?: string;
44
+ }
45
+ export declare function registeredAuthReason(value: unknown): AuthReasonCode | undefined;
46
+ export declare function sinkLog(observe: (scope?: ObserveScope) => Observability): KernelLog;
47
+ export declare function startNode(options: StartOptions): Promise<NodeBroker>;
48
+ export {};
49
+ //# sourceMappingURL=startup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup.d.ts","sourceRoot":"","sources":["../src/startup.ts"],"names":[],"mappings":"AAIA,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,wCAAwC,CAAC;AAIhD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAYpE,OAAO,EAIL,KAAK,aAAa,EAMnB,MAAM,6CAA6C,CAAC;AAGrD,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAYpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AASnF,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,6BAA6B,CAAC;AAWrC,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE7E,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC9C,QAAQ,CAAC,UAAU,EAAE,SAAS,eAAe,EAAE,CAAC;IAChD,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,aAAa,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACnD,QAAQ,CAAC,aAAa,CAAC,EAAE,YAAY,CAAC,eAAe,CAAC,CAAC;IACvD,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;IAC7C,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IACzC,QAAQ,CAAC,aAAa,CAAC,EAAE,YAAY,CAAC,eAAe,CAAC,CAAC;IACvD,QAAQ,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CAC/B;AAED,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM;CAKzB;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK9C;AAED,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAE7C,wBAAgB,eAAe,CAC7B,eAAe,EAAE,MAAM,EACvB,iBAAiB,EAAE,MAAM,GACxB;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAe9C;AAoJD,eAAO,MAAM,WAAW,4QAYb,CAAC;AAEZ,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAUlD,CAAC;AAcH,UAAU,YAAY;IACpB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAOD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,GAAG,SAAS,CAE/E;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,YAAY,KAAK,aAAa,GAAG,SAAS,CA2CnF;AAmSD,wBAAsB,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAmK1E"}