@serve.zone/interfaces 32.20.1 → 32.22.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.
Files changed (42) hide show
  1. package/changelog.md +74 -0
  2. package/dist_ts/00_commitinfo_data.js +1 -1
  3. package/dist_ts/data/clusteringress.d.ts +58 -0
  4. package/dist_ts/data/clusteringress.js +96 -2
  5. package/dist_ts/data/clusteringressdesignation.d.ts +64 -0
  6. package/dist_ts/data/clusteringressdesignation.js +84 -0
  7. package/dist_ts/data/gateway.d.ts +169 -0
  8. package/dist_ts/data/gateway.js +115 -2
  9. package/dist_ts/data/index.d.ts +4 -0
  10. package/dist_ts/data/index.js +4 -1
  11. package/dist_ts/data/networkprojection.d.ts +18 -0
  12. package/dist_ts/data/networkprojection.js +31 -2
  13. package/dist_ts/data/networkworkloadingress.d.ts +61 -0
  14. package/dist_ts/data/networkworkloadingress.js +54 -0
  15. package/dist_ts/data/runtimelocalstorageclaim.d.ts +124 -0
  16. package/dist_ts/data/runtimelocalstorageclaim.js +167 -0
  17. package/dist_ts/data/serviceruntime.d.ts +10 -3
  18. package/dist_ts/data/serviceruntime.js +6 -2
  19. package/dist_ts/private/ipaddress.d.ts +29 -0
  20. package/dist_ts/private/ipaddress.js +120 -0
  21. package/dist_ts/private/storagecontract.d.ts +1 -0
  22. package/dist_ts/private/storagecontract.js +2 -1
  23. package/dist_ts/requests/clusteringress.d.ts +52 -0
  24. package/dist_ts/requests/clusteringress.js +1 -1
  25. package/dist_ts/requests/gateway.d.ts +58 -1
  26. package/dist_ts/requests/runtimesession.d.ts +12 -0
  27. package/package.json +1 -1
  28. package/readme.md +167 -2
  29. package/ts/00_commitinfo_data.ts +1 -1
  30. package/ts/data/clusteringress.ts +136 -1
  31. package/ts/data/clusteringressdesignation.ts +141 -0
  32. package/ts/data/gateway.ts +308 -0
  33. package/ts/data/index.ts +5 -0
  34. package/ts/data/networkprojection.ts +49 -1
  35. package/ts/data/networkworkloadingress.ts +107 -0
  36. package/ts/data/runtimelocalstorageclaim.ts +275 -0
  37. package/ts/data/serviceruntime.ts +13 -2
  38. package/ts/private/ipaddress.ts +140 -0
  39. package/ts/private/storagecontract.ts +1 -0
  40. package/ts/requests/clusteringress.ts +65 -0
  41. package/ts/requests/gateway.ts +71 -0
  42. package/ts/requests/runtimesession.ts +16 -0
@@ -90,6 +90,11 @@ export interface IGatewayCapabilities {
90
90
  read: boolean;
91
91
  export: boolean;
92
92
  forceRenew: boolean;
93
+ /**
94
+ * `getGatewayClientCertificate` and `releaseGatewayClientCertificate` are served: an exact
95
+ * certificate for one owned hostname, with no route behind it. Absent means unsupported.
96
+ */
97
+ exactIssuance?: boolean;
93
98
  };
94
99
  email: {
95
100
  domains: boolean;
@@ -102,6 +107,11 @@ export interface IGatewayCapabilities {
102
107
  dns: {
103
108
  authoritative: boolean;
104
109
  providerManaged: boolean;
110
+ /**
111
+ * `syncGatewayClientDnsRecord` is served: an address record at a value the client chooses
112
+ * inside its `allowedDnsRecordAddresses`. Absent means unsupported.
113
+ */
114
+ clientRecords?: boolean;
105
115
  };
106
116
  http3: {
107
117
  enabled: boolean;
@@ -148,6 +158,11 @@ export interface IGatewayClient {
148
158
  /** `*` matches any hostname under a managed zone; `*.zone` matches exactly one label. */
149
159
  hostnamePatterns: string[];
150
160
  allowedRouteTargets: IGatewayRouteTargetAllowance[];
161
+ /**
162
+ * Canonical address prefixes the client's own address records may point into; see
163
+ * `validateGatewayAllowedDnsRecordAddresses`. Absent or empty allows no address record.
164
+ */
165
+ allowedDnsRecordAddresses?: string[];
151
166
  capabilities: IGatewayTokenCapabilities;
152
167
  enabled: boolean;
153
168
  tokenCount?: number;
@@ -166,6 +181,11 @@ export interface IGatewayClientProvisioningSpec {
166
181
  /** `*` matches any hostname under a managed zone; `*.zone` matches exactly one label. */
167
182
  hostnamePatterns: string[];
168
183
  allowedRouteTargets: IGatewayRouteTargetAllowance[];
184
+ /**
185
+ * Canonical address prefixes the client's own address records may point into; see
186
+ * `validateGatewayAllowedDnsRecordAddresses`. Absent or empty allows no address record.
187
+ */
188
+ allowedDnsRecordAddresses?: string[];
169
189
  capabilities: IGatewayTokenCapabilities;
170
190
  enabled?: boolean;
171
191
  }
@@ -194,6 +214,8 @@ interface IGatewayClientContextBase {
194
214
  /** `*` matches any hostname under a managed zone; `*.zone` matches exactly one label. */
195
215
  hostnamePatterns: string[];
196
216
  allowedRouteTargets: IGatewayRouteTargetAllowance[];
217
+ /** Absent on gateways that predate address records; read it as an empty allowance. */
218
+ allowedDnsRecordAddresses?: string[];
197
219
  capabilities: IGatewayTokenCapabilities;
198
220
  }
199
221
  /** Server-authoritative lifecycle of an authenticated gateway-client credential. */
@@ -410,4 +432,151 @@ export interface IGatewayRouteSyncResult {
410
432
  dns?: IGatewayRouteDnsResult;
411
433
  message?: string;
412
434
  }
435
+ /**
436
+ * Bounds of the gateway-client address record and certificate contracts.
437
+ *
438
+ * A gateway applies `defaultTtl` to a record that names none, and refuses a TTL outside
439
+ * `minTtl`..`maxTtl` as it refuses an allowance list longer than `maxAllowedDnsRecordAddresses`.
440
+ */
441
+ export declare const gatewayClientHostnameContract: Readonly<{
442
+ minTtl: 60;
443
+ maxTtl: 86400;
444
+ defaultTtl: 300;
445
+ maxAllowedDnsRecordAddresses: 64;
446
+ maxAppIdLength: 128;
447
+ maxHostnameLength: 253;
448
+ }>;
449
+ /**
450
+ * What one gateway client owns a hostname for: its app and the exact hostname.
451
+ *
452
+ * The gateway client itself is never named here. The gateway resolves it from the authenticating
453
+ * gateway-client credential, so a client cannot act for another one. One ownership holds at most
454
+ * one address record and one certificate for its hostname, and a hostname is held by at most one
455
+ * ownership: a second client or app, a gateway route claim, or a record the gateway does not
456
+ * manage makes the hostname a conflict rather than a shared name.
457
+ */
458
+ export interface IGatewayClientHostnameOwnership {
459
+ /** 1 to 128 characters of letters, digits, `.`, `_`, `:` or `-`, starting with a letter or digit. */
460
+ appId: string;
461
+ /** Lowercase fully qualified hostname without a trailing dot and without a wildcard. */
462
+ hostname: string;
463
+ }
464
+ /** Address record types a gateway client may publish at a value it chooses. */
465
+ export type TGatewayClientDnsRecordType = 'A' | 'AAAA';
466
+ /**
467
+ * One address record a gateway client asks the gateway to publish for its hostname.
468
+ *
469
+ * The value is the canonical literal of the record's family (a dotted quad for `A`, RFC 5952 text
470
+ * for `AAAA`) and must lie inside the client's `allowedDnsRecordAddresses`. The record is never
471
+ * proxied: a client that chooses its own address asks for exactly that address to be served.
472
+ */
473
+ export interface IGatewayClientDnsRecord {
474
+ type: TGatewayClientDnsRecordType;
475
+ value: string;
476
+ /** Seconds, `minTtl`..`maxTtl`; `defaultTtl` when omitted. */
477
+ ttl?: number;
478
+ }
479
+ /**
480
+ * Outcome of one address record synchronization, in the gateway route DNS vocabulary.
481
+ *
482
+ * - `managed-created` / `managed-updated` / `managed-unchanged` / `managed-deleted`: done.
483
+ * - `target-invalid`: the value is outside the client's address allowance.
484
+ * - `zone-unmanaged`: no zone the gateway manages holds the hostname.
485
+ * - `zone-unavailable`: the zone's DNS provider or authority cannot be reached; retryable.
486
+ * - `record-conflict`: another ownership, a gateway route claim, or an unmanaged record holds
487
+ * the hostname. The gateway never overwrites or adopts it.
488
+ * - `mutation-failed`: writing the record failed; retryable.
489
+ */
490
+ export type TGatewayClientDnsRecordStatus = Extract<TGatewayRouteDnsStatus, 'managed-created' | 'managed-updated' | 'managed-unchanged' | 'managed-deleted' | 'target-invalid' | 'zone-unmanaged' | 'zone-unavailable' | 'record-conflict' | 'mutation-failed'>;
491
+ /** Result of `syncGatewayClientDnsRecord`. */
492
+ export interface IGatewayClientDnsRecordSyncResult {
493
+ success: boolean;
494
+ /** True when the same request may succeed later without any change on the client's side. */
495
+ retryable: boolean;
496
+ status: TGatewayClientDnsRecordStatus;
497
+ hostname: string;
498
+ zoneName?: string;
499
+ /** The record this ownership holds after the call; absent after a deletion or a refusal. */
500
+ record?: IGatewayRouteDnsRecord;
501
+ /** The records that hold the hostname, as evidence for `record-conflict`. */
502
+ conflictingRecords?: IGatewayRouteDnsRecord[];
503
+ /** Unix epoch milliseconds at which the gateway checked the DNS state. */
504
+ checkedAt: number;
505
+ /** Unix epoch milliseconds at which authoritative DNS confirmed the desired state. */
506
+ authoritativeVerifiedAt?: number;
507
+ message?: string;
508
+ }
509
+ /**
510
+ * The certificate a gateway issued for one owned hostname, with its private key.
511
+ *
512
+ * Secret-bearing: a receiver keeps the key sealed and never logs or caches the response as is.
513
+ */
514
+ export interface IGatewayClientCertificate {
515
+ hostname: string;
516
+ /** PEM leaf certificate followed by its chain. */
517
+ certificatePem: string;
518
+ /** PEM private key of the leaf certificate. */
519
+ privateKeyPem: string;
520
+ /** Unix epoch milliseconds. */
521
+ validFrom: number;
522
+ /** Unix epoch milliseconds. */
523
+ validUntil: number;
524
+ /** Unix epoch milliseconds after which asking again yields a renewed certificate. */
525
+ renewAfter: number;
526
+ }
527
+ /**
528
+ * Why a gateway does not issue a certificate for an ownership.
529
+ *
530
+ * - `zone-unmanaged`: no zone the gateway manages with verified authority holds the hostname.
531
+ * - `hostname-conflict`: another ownership or a gateway route claim holds the hostname.
532
+ * - `issuance-failed`: the certificate authority refused the order; `retryAfter` says when a new
533
+ * order is placed.
534
+ * - `issuance-unavailable`: the gateway's ACME configuration or DNS authority is not ready.
535
+ */
536
+ export type TGatewayClientCertificateRefusal = 'zone-unmanaged' | 'hostname-conflict' | 'issuance-failed' | 'issuance-unavailable';
537
+ /** Result of `getGatewayClientCertificate`. */
538
+ export type TGatewayClientCertificateResult = {
539
+ status: 'ready';
540
+ certificate: IGatewayClientCertificate;
541
+ } | {
542
+ /** An issuance runs; ask again after `retryAfterMs`. */
543
+ status: 'pending';
544
+ hostname: string;
545
+ retryAfterMs: number;
546
+ } | {
547
+ status: 'refused';
548
+ hostname: string;
549
+ code: TGatewayClientCertificateRefusal;
550
+ retryable: boolean;
551
+ /** Unix epoch milliseconds before which asking again cannot change the answer. */
552
+ retryAfter?: number;
553
+ message?: string;
554
+ };
555
+ /** Result of `releaseGatewayClientCertificate`. */
556
+ export type TGatewayClientCertificateReleaseResult = {
557
+ success: true;
558
+ /** `released` when material or an issuance was held; `unchanged` when nothing was. */
559
+ action: 'released' | 'unchanged';
560
+ } | {
561
+ success: false;
562
+ retryable: boolean;
563
+ message: string;
564
+ };
565
+ /** True for a lowercase fully qualified hostname of two or more labels, without wildcard or dot. */
566
+ export declare const isGatewayClientHostname: (valueArg: unknown) => valueArg is string;
567
+ /** Validates one hostname ownership and names every reason it is refused. */
568
+ export declare const validateGatewayClientHostnameOwnership: (valueArg: unknown, pathArg?: string) => string[];
569
+ /** True for one canonical address prefix of either family whose host bits are zero. */
570
+ export declare const isGatewayAddressPrefix: (valueArg: unknown) => valueArg is string;
571
+ /** Validates a client's address allowance and names every reason it is refused. */
572
+ export declare const validateGatewayAllowedDnsRecordAddresses: (valueArg: unknown, pathArg?: string) => string[];
573
+ /** Validates one requested address record and names every reason it is refused. */
574
+ export declare const validateGatewayClientDnsRecord: (valueArg: unknown, pathArg?: string) => string[];
575
+ /**
576
+ * True when a valid record's value lies inside one of the allowance's prefixes of its family.
577
+ *
578
+ * A prefix that is not canonical allows nothing, so an allowance a gateway would refuse never
579
+ * widens what a record may point at.
580
+ */
581
+ export declare const isGatewayClientDnsRecordAllowed: (recordArg: IGatewayClientDnsRecord, allowedDnsRecordAddressesArg: readonly string[] | undefined) => boolean;
413
582
  export {};
@@ -1,2 +1,115 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2RhdGEvZ2F0ZXdheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
1
+ import { hasExactKeys, readDataElements, readDataProperties } from '../private/dataproperties.js';
2
+ import { isPlausibleUnicastIpv4 } from '../private/ipv4.js';
3
+ import { ipPrefixContains, parseCanonicalIpAddress, parseCanonicalIpPrefix, } from '../private/ipaddress.js';
4
+ /**
5
+ * Bounds of the gateway-client address record and certificate contracts.
6
+ *
7
+ * A gateway applies `defaultTtl` to a record that names none, and refuses a TTL outside
8
+ * `minTtl`..`maxTtl` as it refuses an allowance list longer than `maxAllowedDnsRecordAddresses`.
9
+ */
10
+ export const gatewayClientHostnameContract = Object.freeze({
11
+ minTtl: 60,
12
+ maxTtl: 86_400,
13
+ defaultTtl: 300,
14
+ maxAllowedDnsRecordAddresses: 64,
15
+ maxAppIdLength: 128,
16
+ maxHostnameLength: 253,
17
+ });
18
+ const gatewayHostnameLabel = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;
19
+ const gatewayAppId = /^[A-Za-z0-9][A-Za-z0-9._:-]*$/;
20
+ /** True for a lowercase fully qualified hostname of two or more labels, without wildcard or dot. */
21
+ export const isGatewayClientHostname = (valueArg) => (typeof valueArg === 'string'
22
+ && valueArg.length <= gatewayClientHostnameContract.maxHostnameLength
23
+ && valueArg.split('.').length >= 2
24
+ && valueArg.split('.').every((labelArg) => gatewayHostnameLabel.test(labelArg)));
25
+ /** Validates one hostname ownership and names every reason it is refused. */
26
+ export const validateGatewayClientHostnameOwnership = (valueArg, pathArg = 'ownership') => {
27
+ const ownership = readDataProperties(valueArg);
28
+ if (ownership === null || !hasExactKeys(ownership, ['appId', 'hostname'])) {
29
+ return [`${pathArg} must use its exact schema`];
30
+ }
31
+ const errors = [];
32
+ const appId = ownership.appId;
33
+ if (typeof appId !== 'string' || appId.length > gatewayClientHostnameContract.maxAppIdLength
34
+ || !gatewayAppId.test(appId)) {
35
+ errors.push(`${pathArg} appId must be 1 to ${gatewayClientHostnameContract.maxAppIdLength} `
36
+ + 'characters of letters, digits, dot, underscore, colon or hyphen, starting with a letter or digit');
37
+ }
38
+ if (!isGatewayClientHostname(ownership.hostname)) {
39
+ errors.push(`${pathArg} hostname must be a lowercase fully qualified hostname `
40
+ + 'without a trailing dot or wildcard');
41
+ }
42
+ return errors;
43
+ };
44
+ /** True for one canonical address prefix of either family whose host bits are zero. */
45
+ export const isGatewayAddressPrefix = (valueArg) => parseCanonicalIpPrefix(valueArg) !== null;
46
+ /** Validates a client's address allowance and names every reason it is refused. */
47
+ export const validateGatewayAllowedDnsRecordAddresses = (valueArg, pathArg = 'allowedDnsRecordAddresses') => {
48
+ const maximum = gatewayClientHostnameContract.maxAllowedDnsRecordAddresses;
49
+ const prefixes = readDataElements(valueArg, maximum);
50
+ if (prefixes === null) {
51
+ return [`${pathArg} must be a list of at most ${maximum} address prefixes`];
52
+ }
53
+ const errors = [];
54
+ prefixes.forEach((prefixArg, indexArg) => {
55
+ if (!isGatewayAddressPrefix(prefixArg)) {
56
+ errors.push(`${pathArg}[${indexArg}] must be a canonical address prefix whose host bits are zero`);
57
+ }
58
+ else if (prefixes.indexOf(prefixArg) !== indexArg) {
59
+ errors.push(`${pathArg}[${indexArg}] repeats ${prefixArg}`);
60
+ }
61
+ });
62
+ return errors;
63
+ };
64
+ /** True when the value is a canonical literal of the record type that can address one host. */
65
+ const isGatewayClientDnsRecordAddress = (typeArg, valueArg) => {
66
+ if (typeArg === 'A') {
67
+ return isPlausibleUnicastIpv4(valueArg);
68
+ }
69
+ const address = parseCanonicalIpAddress(valueArg);
70
+ // `::` is unspecified and `ff00::/8` is multicast; neither addresses one host.
71
+ return address?.family === 6 && address.value !== 0n && address.value >> 120n !== 0xffn;
72
+ };
73
+ /** Validates one requested address record and names every reason it is refused. */
74
+ export const validateGatewayClientDnsRecord = (valueArg, pathArg = 'record') => {
75
+ const record = readDataProperties(valueArg);
76
+ if (record === null || !hasExactKeys(record, ['type', 'value'], ['ttl'])) {
77
+ return [`${pathArg} must use its exact schema`];
78
+ }
79
+ const type = record.type;
80
+ if (type !== 'A' && type !== 'AAAA') {
81
+ return [`${pathArg} type must be A or AAAA`];
82
+ }
83
+ const errors = [];
84
+ if (!isGatewayClientDnsRecordAddress(type, record.value)) {
85
+ errors.push(type === 'A'
86
+ ? `${pathArg} value must be a canonical IPv4 host address (not 0.0.0.0/8, multicast or reserved)`
87
+ : `${pathArg} value must be a canonical RFC 5952 IPv6 host address (not unspecified or multicast)`);
88
+ }
89
+ const { minTtl, maxTtl } = gatewayClientHostnameContract;
90
+ if (Object.hasOwn(record, 'ttl') && !(typeof record.ttl === 'number'
91
+ && Number.isSafeInteger(record.ttl) && record.ttl >= minTtl && record.ttl <= maxTtl)) {
92
+ errors.push(`${pathArg} ttl must be an integer from ${minTtl} to ${maxTtl} seconds`);
93
+ }
94
+ return errors;
95
+ };
96
+ /**
97
+ * True when a valid record's value lies inside one of the allowance's prefixes of its family.
98
+ *
99
+ * A prefix that is not canonical allows nothing, so an allowance a gateway would refuse never
100
+ * widens what a record may point at.
101
+ */
102
+ export const isGatewayClientDnsRecordAllowed = (recordArg, allowedDnsRecordAddressesArg) => {
103
+ if (validateGatewayClientDnsRecord(recordArg).length > 0) {
104
+ return false;
105
+ }
106
+ const address = parseCanonicalIpAddress(recordArg.value);
107
+ const allowance = allowedDnsRecordAddressesArg === undefined
108
+ ? []
109
+ : readDataElements(allowedDnsRecordAddressesArg, gatewayClientHostnameContract.maxAllowedDnsRecordAddresses);
110
+ return address !== null && allowance !== null && allowance.some((prefixArg) => {
111
+ const prefix = parseCanonicalIpPrefix(prefixArg);
112
+ return prefix !== null && ipPrefixContains(prefix, address);
113
+ });
114
+ };
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2RhdGEvZ2F0ZXdheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEcsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUQsT0FBTyxFQUNMLGdCQUFnQixFQUNoQix1QkFBdUIsRUFDdkIsc0JBQXNCLEdBQ3ZCLE1BQU0seUJBQXlCLENBQUM7QUFvZWpDOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUN6RCxNQUFNLEVBQUUsRUFBRTtJQUNWLE1BQU0sRUFBRSxNQUFNO0lBQ2QsVUFBVSxFQUFFLEdBQUc7SUFDZiw0QkFBNEIsRUFBRSxFQUFFO0lBQ2hDLGNBQWMsRUFBRSxHQUFHO0lBQ25CLGlCQUFpQixFQUFFLEdBQUc7Q0FDdkIsQ0FBQyxDQUFDO0FBbUpILE1BQU0sb0JBQW9CLEdBQUcsd0NBQXdDLENBQUM7QUFDdEUsTUFBTSxZQUFZLEdBQUcsK0JBQStCLENBQUM7QUFFckQsb0dBQW9HO0FBQ3BHLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLENBQUMsUUFBaUIsRUFBc0IsRUFBRSxDQUFDLENBQ2hGLE9BQU8sUUFBUSxLQUFLLFFBQVE7T0FDekIsUUFBUSxDQUFDLE1BQU0sSUFBSSw2QkFBNkIsQ0FBQyxpQkFBaUI7T0FDbEUsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQztPQUMvQixRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQ2hGLENBQUM7QUFF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
@@ -3,6 +3,7 @@ export * from './cluster.js';
3
3
  export * from './clusterruntime.js';
4
4
  export * from './clustervpn.js';
5
5
  export * from './clusteringress.js';
6
+ export * from './clusteringressdesignation.js';
6
7
  export * from './clusterrelaycredential.js';
7
8
  export * from './config.js';
8
9
  export * from './corestore.js';
@@ -40,6 +41,8 @@ export * from './networkprojection.js';
40
41
  export type { IRuntimeNetworkRouterPacketGrant, IRuntimeNetworkRouterProjection } from './networkrouter.js';
41
42
  export type { IRuntimeNetworkHostIngress, IRuntimeNetworkHostPacketGrant, IRuntimeNetworkHostProjection } from './networkhost.js';
42
43
  export { runtimeNetworkHostContract } from './networkhost.js';
44
+ export type { IRuntimeNetworkWorkloadIngress, IRuntimeNetworkWorkloadIngressPacketGrant, IRuntimeNetworkWorkloadIngressProjection } from './networkworkloadingress.js';
45
+ export { runtimeNetworkWorkloadIngressContract } from './networkworkloadingress.js';
43
46
  export * from './networkprotection.js';
44
47
  export * from './networksigning.js';
45
48
  export * from './privatenetwork.js';
@@ -48,6 +51,7 @@ export * from './releaseversion.js';
48
51
  export * from './runtimeassignment.js';
49
52
  export * from './runtimeconfig.js';
50
53
  export * from './runtimestorageclaim.js';
54
+ export * from './runtimelocalstorageclaim.js';
51
55
  export * from './runtimesession.js';
52
56
  export * from './runtimeterminalreceipt.js';
53
57
  export * from './secret.js';
@@ -3,6 +3,7 @@ export * from './cluster.js';
3
3
  export * from './clusterruntime.js';
4
4
  export * from './clustervpn.js';
5
5
  export * from './clusteringress.js';
6
+ export * from './clusteringressdesignation.js';
6
7
  export * from './clusterrelaycredential.js';
7
8
  export * from './config.js';
8
9
  export * from './corestore.js';
@@ -38,6 +39,7 @@ export * from './networklease.js';
38
39
  export * from './networknode.js';
39
40
  export * from './networkprojection.js';
40
41
  export { runtimeNetworkHostContract } from './networkhost.js';
42
+ export { runtimeNetworkWorkloadIngressContract } from './networkworkloadingress.js';
41
43
  export * from './networkprotection.js';
42
44
  export * from './networksigning.js';
43
45
  export * from './privatenetwork.js';
@@ -46,6 +48,7 @@ export * from './releaseversion.js';
46
48
  export * from './runtimeassignment.js';
47
49
  export * from './runtimeconfig.js';
48
50
  export * from './runtimestorageclaim.js';
51
+ export * from './runtimelocalstorageclaim.js';
49
52
  export * from './runtimesession.js';
50
53
  export * from './runtimeterminalreceipt.js';
51
54
  export * from './secret.js';
@@ -66,4 +69,4 @@ export * from './traffic.js';
66
69
  export * from './user.js';
67
70
  export * from './version.js';
68
71
  export * from './webpush.js';
69
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsVUFBVSxDQUFDO0FBQ3pCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyx3QkFBd0IsQ0FBQztBQUd2QyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM5RCxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxjQUFjLENBQUMifQ==
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxVQUFVLENBQUM7QUFDekIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLHdCQUF3QixDQUFDO0FBR3ZDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRzlELE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3BGLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsY0FBYyxDQUFDIn0=
@@ -4,6 +4,7 @@ import type { IRuntimeNetworkHandoffLease, IRuntimeNetworkProtectedAuthority } f
4
4
  import type { IPrivateNetwork, IServicePrivateNetworks, IServicePrivateNetworkDnsPolicy } from './privatenetwork.js';
5
5
  import { type IRuntimeNetworkRouterPacketGrant, type IRuntimeNetworkRouterProjection } from './networkrouter.js';
6
6
  import { type IRuntimeNetworkHostPacketGrant, type IRuntimeNetworkHostProjection } from './networkhost.js';
7
+ import { type IRuntimeNetworkWorkloadIngressPacketGrant, type IRuntimeNetworkWorkloadIngressProjection } from './networkworkloadingress.js';
7
8
  export interface IRuntimeNetworkNodeScope {
8
9
  controller: IRuntimeController;
9
10
  nodeId: string;
@@ -154,6 +155,21 @@ export interface IRuntimeNetworkProjection extends IRuntimeNetworkNodeScope {
154
155
  * host-origin flow; any other controller kind carrying it is refused.
155
156
  */
156
157
  host?: IRuntimeNetworkHostProjection;
158
+ /**
159
+ * One-way workload ingress selections of a `cloudly` projection: the cluster ingress workload dials
160
+ * exact target workload ports across organizations (`IRuntimeNetworkWorkloadIngressPacketGrant`).
161
+ * Omitted, it keeps the canonical bytes and grants no such flow; any other controller kind
162
+ * carrying it is refused.
163
+ */
164
+ workloadIngress?: IRuntimeNetworkWorkloadIngressProjection;
165
+ /**
166
+ * Ids of the protected authority's platform endpoints whose address this projection's node's own
167
+ * host carries, such as a relay listener or a Corestore beside the node on one machine. The node
168
+ * delivers workload flows to them locally instead of forwarding them. Sorted, unique and never
169
+ * empty when present; omitted, it keeps the canonical bytes and states that no endpoint is local.
170
+ * It grants nothing: a workload still reaches only the endpoints it selects.
171
+ */
172
+ hostPlatformEndpointIds?: string[];
157
173
  digest: TSha256Digest;
158
174
  }
159
175
  export interface IRuntimeNetworkDnsView {
@@ -203,6 +219,8 @@ export declare const getRuntimeNetworkProjectionPacketGrants: (value: unknown) =
203
219
  export declare const getRuntimeNetworkProjectionRouterPacketGrants: (value: unknown) => Promise<IRuntimeNetworkRouterPacketGrant[]>;
204
220
  /** Host-origin authority comes only from explicit signed `onebox` selections of local workload ports. */
205
221
  export declare const getRuntimeNetworkProjectionHostPacketGrants: (value: unknown) => Promise<IRuntimeNetworkHostPacketGrant[]>;
222
+ /** One-way workload ingress authority comes only from explicit signed `cloudly` selections of exact target ports. */
223
+ export declare const getRuntimeNetworkProjectionWorkloadIngressPacketGrants: (value: unknown) => Promise<IRuntimeNetworkWorkloadIngressPacketGrant[]>;
206
224
  /** Complete offline DNS material, including authorized names never previously queried. */
207
225
  /** Select exact local receivers before expansion; all targets still come from
208
226
  * the complete validated projection. Selection supplies no attachment authority. */