@ninedeploy/sdk 0.10.5 → 0.16.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 (129) hide show
  1. package/LICENSE +21 -21
  2. package/dist/apiPath.d.ts +5 -0
  3. package/dist/apiPath.d.ts.map +1 -0
  4. package/dist/apiPath.js +18 -0
  5. package/dist/apiPath.js.map +1 -0
  6. package/dist/client.d.ts +29 -0
  7. package/dist/client.d.ts.map +1 -0
  8. package/dist/client.js +51 -0
  9. package/dist/client.js.map +1 -0
  10. package/dist/databaseImport.d.ts +138 -0
  11. package/dist/databaseImport.d.ts.map +1 -0
  12. package/dist/databaseImport.js +126 -0
  13. package/dist/databaseImport.js.map +1 -0
  14. package/dist/errors.js +1 -1
  15. package/dist/errors.js.map +1 -1
  16. package/dist/index.d.ts +12 -1973
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +9 -641
  19. package/dist/index.js.map +1 -1
  20. package/dist/manifest.d.ts.map +1 -1
  21. package/dist/manifest.js +25 -21
  22. package/dist/manifest.js.map +1 -1
  23. package/dist/resources/auth.d.ts +282 -0
  24. package/dist/resources/auth.d.ts.map +1 -0
  25. package/dist/resources/auth.js +111 -0
  26. package/dist/resources/auth.js.map +1 -0
  27. package/dist/resources/databases.d.ts +178 -0
  28. package/dist/resources/databases.d.ts.map +1 -0
  29. package/dist/resources/databases.js +82 -0
  30. package/dist/resources/databases.js.map +1 -0
  31. package/dist/resources/deploys.d.ts +125 -0
  32. package/dist/resources/deploys.d.ts.map +1 -0
  33. package/dist/resources/deploys.js +46 -0
  34. package/dist/resources/deploys.js.map +1 -0
  35. package/dist/resources/domains.d.ts +101 -0
  36. package/dist/resources/domains.d.ts.map +1 -0
  37. package/dist/resources/domains.js +28 -0
  38. package/dist/resources/domains.js.map +1 -0
  39. package/dist/resources/env.d.ts +55 -0
  40. package/dist/resources/env.d.ts.map +1 -0
  41. package/dist/resources/env.js +33 -0
  42. package/dist/resources/env.js.map +1 -0
  43. package/dist/resources/logs.d.ts +27 -0
  44. package/dist/resources/logs.d.ts.map +1 -0
  45. package/dist/resources/logs.js +18 -0
  46. package/dist/resources/logs.js.map +1 -0
  47. package/dist/resources/network.d.ts +134 -0
  48. package/dist/resources/network.d.ts.map +1 -0
  49. package/dist/resources/network.js +33 -0
  50. package/dist/resources/network.js.map +1 -0
  51. package/dist/resources/plugins.d.ts +42 -0
  52. package/dist/resources/plugins.d.ts.map +1 -0
  53. package/dist/resources/plugins.js +22 -0
  54. package/dist/resources/plugins.js.map +1 -0
  55. package/dist/resources/servers.d.ts +130 -0
  56. package/dist/resources/servers.d.ts.map +1 -0
  57. package/dist/resources/servers.js +37 -0
  58. package/dist/resources/servers.js.map +1 -0
  59. package/dist/resources/services.d.ts +185 -0
  60. package/dist/resources/services.d.ts.map +1 -0
  61. package/dist/resources/services.js +83 -0
  62. package/dist/resources/services.js.map +1 -0
  63. package/dist/resources/settings.d.ts +312 -0
  64. package/dist/resources/settings.d.ts.map +1 -0
  65. package/dist/resources/settings.js +85 -0
  66. package/dist/resources/settings.js.map +1 -0
  67. package/dist/resources/sources.d.ts +87 -0
  68. package/dist/resources/sources.d.ts.map +1 -0
  69. package/dist/resources/sources.js +39 -0
  70. package/dist/resources/sources.js.map +1 -0
  71. package/dist/resources/system.d.ts +240 -0
  72. package/dist/resources/system.d.ts.map +1 -0
  73. package/dist/resources/system.js +86 -0
  74. package/dist/resources/system.js.map +1 -0
  75. package/dist/resources/templates.d.ts +36 -0
  76. package/dist/resources/templates.d.ts.map +1 -0
  77. package/dist/resources/templates.js +17 -0
  78. package/dist/resources/templates.js.map +1 -0
  79. package/dist/resources/terminals.d.ts +60 -0
  80. package/dist/resources/terminals.d.ts.map +1 -0
  81. package/dist/resources/terminals.js +35 -0
  82. package/dist/resources/terminals.js.map +1 -0
  83. package/dist/resources/traefik.d.ts +84 -0
  84. package/dist/resources/traefik.d.ts.map +1 -0
  85. package/dist/resources/traefik.js +35 -0
  86. package/dist/resources/traefik.js.map +1 -0
  87. package/dist/resources/volumes.d.ts +114 -0
  88. package/dist/resources/volumes.d.ts.map +1 -0
  89. package/dist/resources/volumes.js +47 -0
  90. package/dist/resources/volumes.js.map +1 -0
  91. package/dist/terminal.d.ts +98 -0
  92. package/dist/terminal.d.ts.map +1 -0
  93. package/dist/terminal.js +180 -0
  94. package/dist/terminal.js.map +1 -0
  95. package/dist/transport.d.ts +61 -0
  96. package/dist/transport.d.ts.map +1 -0
  97. package/dist/transport.js +90 -0
  98. package/dist/transport.js.map +1 -0
  99. package/dist/types.d.ts +539 -0
  100. package/dist/types.d.ts.map +1 -0
  101. package/dist/types.js +5 -0
  102. package/dist/types.js.map +1 -0
  103. package/package.json +5 -4
  104. package/src/apiPath.ts +23 -0
  105. package/src/client.ts +70 -0
  106. package/src/databaseImport.ts +174 -0
  107. package/src/errors.ts +27 -0
  108. package/src/index.ts +118 -0
  109. package/src/manifest.ts +414 -0
  110. package/src/resources/auth.ts +357 -0
  111. package/src/resources/databases.ts +227 -0
  112. package/src/resources/deploys.ts +161 -0
  113. package/src/resources/domains.ts +142 -0
  114. package/src/resources/env.ts +84 -0
  115. package/src/resources/logs.ts +48 -0
  116. package/src/resources/network.ts +126 -0
  117. package/src/resources/plugins.ts +52 -0
  118. package/src/resources/servers.ts +141 -0
  119. package/src/resources/services.ts +250 -0
  120. package/src/resources/settings.ts +275 -0
  121. package/src/resources/sources.ts +131 -0
  122. package/src/resources/system.ts +281 -0
  123. package/src/resources/templates.ts +55 -0
  124. package/src/resources/terminals.ts +112 -0
  125. package/src/resources/traefik.ts +116 -0
  126. package/src/resources/volumes.ts +138 -0
  127. package/src/terminal.ts +254 -0
  128. package/src/transport.ts +154 -0
  129. package/src/types.ts +588 -0
@@ -0,0 +1,35 @@
1
+ export function traefikApi(t) {
2
+ const { get, send, request } = t;
3
+ return {
4
+ traefik: {
5
+ get: () => get('/v1/traefik'),
6
+ status: () => get('/v1/traefik/status'),
7
+ certificates: () => get('/v1/traefik/certificates'),
8
+ certificateInventory: (opts) => get(
9
+ // `!= null` (not truthiness): 0 ("only already-expired") is a real
10
+ // threshold and must reach the server, not silently become the
11
+ // server-side default of 30.
12
+ `/v1/traefik/certificates/inventory${opts?.threshold != null ? `?threshold=${opts.threshold}` : ''}`),
13
+ expiringCertificates: (opts) => get(`/v1/traefik/certificates/expiring${opts?.days != null ? `?days=${opts.days}` : ''}`),
14
+ logs: (lines = 50) => get(`/v1/traefik/logs?lines=${lines}`),
15
+ restart: () => send('POST', '/v1/traefik/restart'),
16
+ backupCerts: () => send('POST', '/v1/traefik/backup-certs'),
17
+ config: () => get('/v1/traefik/config'),
18
+ version: () => get('/v1/traefik/version'),
19
+ update: () => request('/v1/traefik/update', { method: 'POST' }, 10 * 60_000),
20
+ customConfig: {
21
+ get: () => get('/v1/traefik/custom-config'),
22
+ validate: (content) => send('POST', '/v1/traefik/custom-config/validate', { content }),
23
+ set: (content) => request('/v1/traefik/custom-config', { method: 'PUT', body: { content }, findings: true }),
24
+ clear: () => send('DELETE', '/v1/traefik/custom-config'),
25
+ },
26
+ customCertificates: {
27
+ list: () => get('/v1/traefik/certificates/custom'),
28
+ upload: (input) => send('POST', '/v1/traefik/certificates/custom', input),
29
+ replace: (id, input) => send('PUT', `/v1/traefik/certificates/custom/${id}`, input),
30
+ delete: (id) => send('DELETE', `/v1/traefik/certificates/custom/${id}`),
31
+ },
32
+ },
33
+ };
34
+ }
35
+ //# sourceMappingURL=traefik.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traefik.js","sourceRoot":"","sources":["../../src/resources/traefik.ts"],"names":[],"mappings":"AA4EA,MAAM,UAAU,UAAU,CAAC,CAAY;IACrC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IACjC,OAAO;QACL,OAAO,EAAE;YACP,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAc,aAAa,CAAC;YAC1C,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAgB,oBAAoB,CAAC;YACtD,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAuB,0BAA0B,CAAC;YACzE,oBAAoB,EAAE,CAAC,IAAI,EAAE,EAAE,CAC7B,GAAG;YACD,mEAAmE;YACnE,+DAA+D;YAC/D,6BAA6B;YAC7B,qCAAqC,IAAI,EAAE,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACrG;YACH,oBAAoB,EAAE,CAAC,IAAI,EAAE,EAAE,CAC7B,GAAG,CACD,oCAAoC,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACrF;YACH,IAAI,EAAE,CAAC,KAAK,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,CAAqB,0BAA0B,KAAK,EAAE,CAAC;YAChF,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAmC,MAAM,EAAE,qBAAqB,CAAC;YACpF,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,CAAsC,MAAM,EAAE,0BAA0B,CAAC;YAChG,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAuB,oBAAoB,CAAC;YAC7D,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAqB,qBAAqB,CAAC;YAC7D,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAA6C,oBAAoB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC;YACxH,YAAY,EAAE;gBACZ,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAsB,2BAA2B,CAAC;gBAChE,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAgC,MAAM,EAAE,oCAAoC,EAAE,EAAE,OAAO,EAAE,CAAC;gBACrH,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,CACf,OAAO,CAA6B,2BAA2B,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;gBACxH,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAoC,QAAQ,EAAE,2BAA2B,CAAC;aAC5F;YACD,kBAAkB,EAAE;gBAClB,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,CAAsB,iCAAiC,CAAC;gBACvE,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAyB,MAAM,EAAE,iCAAiC,EAAE,KAAK,CAAC;gBACjG,OAAO,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAyB,KAAK,EAAE,mCAAmC,EAAE,EAAE,EAAE,KAAK,CAAC;gBAC3G,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAkB,QAAQ,EAAE,mCAAmC,EAAE,EAAE,CAAC;aACzF;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,114 @@
1
+ import type { CreateServiceVolumeAttachmentInput, ServiceVolumeAttachment, UpdateServiceVolumeAttachmentInput, VolumeFileEntry, VolumeFileWriteInput, VolumePathCreateInput, VolumeCreateInput } from '@ninedeploy/schemas';
2
+ import type { VolumeListEntry, VolumeCreateResult, ContainerInspectData, ContainerComposeData } from '../types.js';
3
+ import type { Transport } from '../transport.js';
4
+ export interface VolumesApi {
5
+ volumes: {
6
+ /**
7
+ * Managed volumes on the panel host or (0.16 T8) with `serverId` on a
8
+ * node, through its agent; node entries carry `serverId`. An older agent
9
+ * answers 422 `node_agent_outdated`.
10
+ */
11
+ list: (options?: {
12
+ serverId?: number;
13
+ }) => Promise<VolumeListEntry[]>;
14
+ /** Delete a retained volume; with `serverId` (r466) on that node. */
15
+ remove: (name: string, options?: {
16
+ serverId?: number;
17
+ }) => Promise<void>;
18
+ /**
19
+ * 0.16 T8: create a managed volume (`nd-svc-*` / `nd-db-*`) on the panel
20
+ * host or, with `serverId`, on a node. An existing volume answers 409
21
+ * `node_volume_exists`.
22
+ */
23
+ create: (input: VolumeCreateInput) => Promise<VolumeCreateResult>;
24
+ prune: () => Promise<{
25
+ ok: boolean;
26
+ deleted: number;
27
+ freedBytes: number;
28
+ }>;
29
+ /** File manager: list a directory inside the volume. */
30
+ listFiles: (name: string, path?: string) => Promise<{
31
+ path: string;
32
+ entries: VolumeFileEntry[];
33
+ }>;
34
+ /** File manager: read a file (base64 content). */
35
+ readFile: (name: string, path: string) => Promise<{
36
+ content: string;
37
+ encoding: 'utf8' | 'base64';
38
+ }>;
39
+ /** File manager: write/overwrite a file (base64 content). */
40
+ writeFile: (name: string, input: VolumeFileWriteInput) => Promise<{
41
+ ok: boolean;
42
+ }>;
43
+ /** File manager: create a directory. */
44
+ mkdir: (name: string, input: VolumePathCreateInput) => Promise<{
45
+ ok: boolean;
46
+ }>;
47
+ /** File manager: delete a file or directory (recursive). */
48
+ deleteFile: (name: string, path: string) => Promise<void>;
49
+ };
50
+ containers: {
51
+ inspect: (container: string) => Promise<ContainerInspectData>;
52
+ compose: (container: string) => Promise<ContainerComposeData>;
53
+ /** File manager: list a directory inside the container. */
54
+ listFiles: (container: string, path?: string) => Promise<{
55
+ path: string;
56
+ entries: VolumeFileEntry[];
57
+ }>;
58
+ /** File manager: read a file (base64 content). */
59
+ readFile: (container: string, path: string) => Promise<{
60
+ content: string;
61
+ encoding: 'utf8' | 'base64';
62
+ }>;
63
+ /** File manager: write/overwrite a file (base64 content). */
64
+ writeFile: (container: string, input: VolumeFileWriteInput) => Promise<{
65
+ ok: boolean;
66
+ }>;
67
+ /** File manager: create a directory. */
68
+ mkdir: (container: string, input: VolumePathCreateInput) => Promise<{
69
+ ok: boolean;
70
+ }>;
71
+ makeDir: (container: string, input: VolumePathCreateInput) => Promise<{
72
+ ok: boolean;
73
+ }>;
74
+ /** File manager: delete a file or directory (recursive). */
75
+ deleteFile: (container: string, path: string) => Promise<void>;
76
+ deletePath: (container: string, path: string) => Promise<void>;
77
+ };
78
+ /** Per-service additional volume attachments. Distinct from the instance-wide
79
+ * `volumes` namespace (which lists every Docker volume on the host). The
80
+ * list endpoint returns runtime-computed metadata (size, in-use, sharing);
81
+ * the create/update endpoints return the database row only. */
82
+ serviceVolumes: {
83
+ list: (serviceId: number) => Promise<Array<ServiceVolumeAttachment & {
84
+ sizeBytes: number;
85
+ inUse: boolean;
86
+ sharedWith: number;
87
+ }>>;
88
+ /** Attach an existing managed volume or create a new one and attach it. */
89
+ create: (serviceId: number, input: CreateServiceVolumeAttachmentInput) => Promise<{
90
+ attachment: ServiceVolumeAttachment;
91
+ deploymentId: number;
92
+ }>;
93
+ update: (serviceId: number, attachmentId: number, input: UpdateServiceVolumeAttachmentInput) => Promise<{
94
+ attachment: ServiceVolumeAttachment;
95
+ deploymentId: number;
96
+ }>;
97
+ /** Detach. The underlying Docker volume is NOT deleted (data persists). */
98
+ remove: (serviceId: number, attachmentId: number) => Promise<void>;
99
+ /** Delete a first-boot-baked config file from the volume and queue a
100
+ * redeploy so the app regenerates it from the current environment
101
+ * (WordPress wp-config.php et al.). Exactly one of `attachmentId` /
102
+ * `volumeName` must be set; `filePath` is a single path segment. */
103
+ repairConfig: (serviceId: number, input: {
104
+ filePath: string;
105
+ attachmentId?: number;
106
+ volumeName?: string;
107
+ }) => Promise<{
108
+ ok: boolean;
109
+ deploymentId: number;
110
+ }>;
111
+ };
112
+ }
113
+ export declare function volumesApi(t: Transport): VolumesApi;
114
+ //# sourceMappingURL=volumes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"volumes.d.ts","sourceRoot":"","sources":["../../src/resources/volumes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import { apiGetUrl } from '../apiPath.js';
2
+ export function volumesApi(t) {
3
+ const { get, send, request } = t;
4
+ return {
5
+ volumes: {
6
+ list: (options) => get(apiGetUrl('/v1/volumes', { serverId: options?.serverId })),
7
+ create: (input) => send('POST', '/v1/volumes', input),
8
+ listFiles: (name, path = '') => get(`/v1/volumes/${encodeURIComponent(name)}/files?path=${encodeURIComponent(path)}`),
9
+ readFile: (name, path) => get(`/v1/volumes/${encodeURIComponent(name)}/files/content?path=${encodeURIComponent(path)}`),
10
+ writeFile: (name, input) => send('PUT', `/v1/volumes/${encodeURIComponent(name)}/files`, input),
11
+ mkdir: (name, input) => send('POST', `/v1/volumes/${encodeURIComponent(name)}/files/dir`, input),
12
+ deleteFile: async (name, path) => {
13
+ await request(`/v1/volumes/${encodeURIComponent(name)}/files?path=${encodeURIComponent(path)}`, { method: 'DELETE' });
14
+ },
15
+ remove: async (name, options) => {
16
+ const node = options?.serverId === undefined ? '' : `?serverId=${options.serverId}`;
17
+ await request(`/v1/volumes/${encodeURIComponent(name)}${node}`, { method: 'DELETE' });
18
+ },
19
+ prune: () => send('POST', '/v1/volumes/prune'),
20
+ },
21
+ containers: {
22
+ inspect: (container) => get(`/v1/containers/${encodeURIComponent(container)}/inspect`),
23
+ compose: (container) => get(`/v1/containers/${encodeURIComponent(container)}/compose`),
24
+ listFiles: (container, path = '/') => get(`/v1/containers/${encodeURIComponent(container)}/files?path=${encodeURIComponent(path)}`),
25
+ readFile: (container, path) => get(`/v1/containers/${encodeURIComponent(container)}/files/content?path=${encodeURIComponent(path)}`),
26
+ writeFile: (container, input) => send('PUT', `/v1/containers/${encodeURIComponent(container)}/files`, input),
27
+ mkdir: (container, input) => send('POST', `/v1/containers/${encodeURIComponent(container)}/files/dir`, input),
28
+ makeDir: (container, input) => send('POST', `/v1/containers/${encodeURIComponent(container)}/files/dir`, input),
29
+ deleteFile: async (container, path) => {
30
+ await request(`/v1/containers/${encodeURIComponent(container)}/files?path=${encodeURIComponent(path)}`, { method: 'DELETE' });
31
+ },
32
+ deletePath: async (container, path) => {
33
+ await request(`/v1/containers/${encodeURIComponent(container)}/files?path=${encodeURIComponent(path)}`, { method: 'DELETE' });
34
+ },
35
+ },
36
+ serviceVolumes: {
37
+ list: (serviceId) => get(`/v1/services/${serviceId}/volumes`),
38
+ create: (serviceId, input) => send('POST', `/v1/services/${serviceId}/volumes`, input),
39
+ update: (serviceId, attachmentId, input) => send('PATCH', `/v1/services/${serviceId}/volumes/${attachmentId}`, input),
40
+ remove: async (serviceId, attachmentId) => {
41
+ await request(`/v1/services/${serviceId}/volumes/${attachmentId}`, { method: 'DELETE' });
42
+ },
43
+ repairConfig: (serviceId, input) => send('POST', `/v1/services/${serviceId}/volumes/config-repair`, input),
44
+ },
45
+ };
46
+ }
47
+ //# sourceMappingURL=volumes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"volumes.js","sourceRoot":"","sources":["../../src/resources/volumes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ import type { TerminalSessionCreated, TerminalTargetKind } from '@ninedeploy/schemas';
2
+ /** Attach subprotocol (protocol v1) and the ticket's subprotocol prefix; mirror `@ninedeploy/schemas`. */
3
+ export declare const TERMINAL_SUBPROTOCOL = "ninedeploy.terminal.v1";
4
+ export declare const TERMINAL_TICKET_PREFIX = "ninedeploy.ticket.";
5
+ /** The server closes a socket whose frame exceeds 64 KiB (1009); input is sent in smaller pieces. */
6
+ export declare const TERMINAL_INPUT_CHUNK_BYTES: number;
7
+ /** Input typed before the shell is `ready` is held, up to this many bytes. */
8
+ export declare const TERMINAL_PENDING_INPUT_MAX: number;
9
+ /** What `attachInfo` needs from `terminals.create`'s answer. */
10
+ export type TerminalAttachSource = Pick<TerminalSessionCreated, 'ticket' | 'attachPath'>;
11
+ /** A page location, for a client whose `baseUrl` is relative (the dashboard). */
12
+ export interface WebSocketLocation {
13
+ protocol: string;
14
+ host: string;
15
+ }
16
+ export interface TerminalAttachInfo {
17
+ url: string;
18
+ /** `['ninedeploy.terminal.v1', 'ninedeploy.ticket.<ticket>']`: the server selects the first, so the ticket is never echoed. */
19
+ protocols: string[];
20
+ }
21
+ /**
22
+ * The attach WebSocket URL for `baseUrl` (absolute, or relative to
23
+ * `location` / `globalThis.location`) and the v1 subprotocols.
24
+ */
25
+ export declare function terminalAttachInfo(baseUrl: string, created: TerminalAttachSource, location?: WebSocketLocation): TerminalAttachInfo;
26
+ /** A human sentence for an attach socket's close code. */
27
+ export declare function terminalCloseMessage(code: number): string;
28
+ /** The structural WebSocket the connection drives (browser `WebSocket`, Node's global one, or `ws`). */
29
+ export interface TerminalSocketLike {
30
+ binaryType: string;
31
+ readyState: number;
32
+ send(data: string | Uint8Array): void;
33
+ close(code?: number, reason?: string): void;
34
+ onopen: ((event: unknown) => void) | null;
35
+ onmessage: ((event: {
36
+ data: unknown;
37
+ }) => void) | null;
38
+ onclose: ((event: {
39
+ code: number;
40
+ reason: string;
41
+ }) => void) | null;
42
+ onerror: ((event: unknown) => void) | null;
43
+ }
44
+ export type TerminalSocketFactory = (url: string, protocols: string[]) => TerminalSocketLike;
45
+ export interface TerminalReady {
46
+ sessionId: number;
47
+ target: {
48
+ kind: TerminalTargetKind;
49
+ label: string;
50
+ serverId: number | null;
51
+ };
52
+ }
53
+ export interface TerminalHandlers {
54
+ /** The shell runs; input typed before this was held and is flushed now. */
55
+ onReady?: (ready: TerminalReady) => void;
56
+ /** Shell output. */
57
+ onData?: (bytes: Uint8Array) => void;
58
+ /** A server notice (why a session failed, an ignored control message). */
59
+ onNotice?: (message: string) => void;
60
+ /** The server's `exit` message: the shell's exit code (null when unknown) and the end reason. */
61
+ onExit?: (exit: {
62
+ code: number | null;
63
+ reason: string;
64
+ }) => void;
65
+ /** The socket closed; `message` explains the close code. */
66
+ onClose?: (close: {
67
+ code: number;
68
+ reason: string;
69
+ message: string;
70
+ }) => void;
71
+ }
72
+ export interface TerminalConnectOptions {
73
+ /** Defaults to `globalThis.WebSocket`. */
74
+ socketFactory?: TerminalSocketFactory;
75
+ /** For a relative `baseUrl` outside a browser page. */
76
+ location?: WebSocketLocation;
77
+ /** Keep-alive ping interval (ms); pings do not reset the idle timeout. 0 disables. Default 30s. */
78
+ pingIntervalMs?: number;
79
+ }
80
+ export interface TerminalConnection {
81
+ /** True once the server sent `ready`. */
82
+ readonly ready: boolean;
83
+ /** Send input (held until `ready`, then sent in frames below the server's cap). */
84
+ write: (data: string | Uint8Array) => void;
85
+ /** Resize the terminal (clamped to 10–500 × 5–200; the last size before `ready` is sent on `ready`). */
86
+ resize: (cols: number, rows: number) => void;
87
+ close: () => void;
88
+ }
89
+ /**
90
+ * Attach to a terminal session over protocol v1 (`ninedeploy.terminal.v1`).
91
+ *
92
+ * Binary frames carry input and output; text frames carry the JSON control
93
+ * messages. Input written before the server's `ready` is held (up to 64 KiB)
94
+ * and flushed on `ready`, because the server may drop input that arrives
95
+ * while it is still starting the shell.
96
+ */
97
+ export declare function connectTerminal(info: TerminalAttachInfo, handlers?: TerminalHandlers, options?: TerminalConnectOptions): TerminalConnection;
98
+ //# sourceMappingURL=terminal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../src/terminal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,180 @@
1
+ import { NineDeployError } from './errors.js';
2
+ /** Attach subprotocol (protocol v1) and the ticket's subprotocol prefix; mirror `@ninedeploy/schemas`. */
3
+ export const TERMINAL_SUBPROTOCOL = 'ninedeploy.terminal.v1';
4
+ export const TERMINAL_TICKET_PREFIX = 'ninedeploy.ticket.';
5
+ /** The server closes a socket whose frame exceeds 64 KiB (1009); input is sent in smaller pieces. */
6
+ export const TERMINAL_INPUT_CHUNK_BYTES = 32 * 1024;
7
+ /** Input typed before the shell is `ready` is held, up to this many bytes. */
8
+ export const TERMINAL_PENDING_INPUT_MAX = 64 * 1024;
9
+ /**
10
+ * The attach WebSocket URL for `baseUrl` (absolute, or relative to
11
+ * `location` / `globalThis.location`) and the v1 subprotocols.
12
+ */
13
+ export function terminalAttachInfo(baseUrl, created, location) {
14
+ if (!/^\/v1\/terminals\/\d+\/attach$/.test(created.attachPath)) {
15
+ throw new NineDeployError(0, 'invalid_path', `Not a terminal attach path: ${created.attachPath}`);
16
+ }
17
+ if (!/^[A-Za-z0-9_-]{16,128}$/.test(created.ticket)) {
18
+ throw new NineDeployError(0, 'invalid_ticket', 'The terminal ticket is malformed');
19
+ }
20
+ const base = baseUrl.replace(/\/+$/, '');
21
+ let url;
22
+ if (/^https?:\/\//i.test(base)) {
23
+ url = `${base.replace(/^http/i, 'ws')}${created.attachPath}`;
24
+ }
25
+ else {
26
+ const loc = location ?? globalThis.location;
27
+ if (!loc)
28
+ throw new NineDeployError(0, 'no_base_url', 'A relative baseUrl needs a page location to build a WebSocket URL');
29
+ const proto = loc.protocol === 'https:' ? 'wss' : 'ws';
30
+ url = `${proto}://${loc.host}${base}${created.attachPath}`;
31
+ }
32
+ return { url, protocols: [TERMINAL_SUBPROTOCOL, `${TERMINAL_TICKET_PREFIX}${created.ticket}`] };
33
+ }
34
+ /** A human sentence for an attach socket's close code. */
35
+ export function terminalCloseMessage(code) {
36
+ switch (code) {
37
+ case 1000:
38
+ return 'The shell exited.';
39
+ case 1009:
40
+ return 'A message was too large (over 64 KiB), so the session was closed.';
41
+ case 4401:
42
+ return 'The session ticket was invalid or expired. Open a new terminal.';
43
+ case 4403:
44
+ return 'Access was refused: the session was revoked, or this page is not a panel origin.';
45
+ case 4408:
46
+ return 'The session was closed after being idle too long.';
47
+ case 4409:
48
+ return 'The session reached its maximum length.';
49
+ case 4410:
50
+ return 'An operator terminated this session.';
51
+ case 4429:
52
+ return 'Too many terminals are open. Close one and try again.';
53
+ case 4502:
54
+ return 'The target could not be reached.';
55
+ default:
56
+ return `The connection was lost (code ${code}).`;
57
+ }
58
+ }
59
+ const clamp = (n, min, max) => Math.min(max, Math.max(min, Math.round(n)));
60
+ /** Timers and TextEncoder exist wherever the SDK runs; typed structurally (no DOM or Node lib types). */
61
+ const runtime = globalThis;
62
+ function defaultSocketFactory() {
63
+ const Ctor = globalThis.WebSocket;
64
+ if (!Ctor)
65
+ throw new NineDeployError(0, 'no_websocket', 'No WebSocket implementation is available; pass socketFactory');
66
+ return (url, protocols) => new Ctor(url, protocols);
67
+ }
68
+ function toBytes(data) {
69
+ if (data instanceof Uint8Array)
70
+ return data;
71
+ if (data instanceof ArrayBuffer)
72
+ return new Uint8Array(data);
73
+ const view = data;
74
+ return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);
75
+ }
76
+ /**
77
+ * Attach to a terminal session over protocol v1 (`ninedeploy.terminal.v1`).
78
+ *
79
+ * Binary frames carry input and output; text frames carry the JSON control
80
+ * messages. Input written before the server's `ready` is held (up to 64 KiB)
81
+ * and flushed on `ready`, because the server may drop input that arrives
82
+ * while it is still starting the shell.
83
+ */
84
+ export function connectTerminal(info, handlers = {}, options = {}) {
85
+ const factory = options.socketFactory ?? defaultSocketFactory();
86
+ const socket = factory(info.url, info.protocols);
87
+ socket.binaryType = 'arraybuffer';
88
+ const encoder = new runtime.TextEncoder();
89
+ let ready = false;
90
+ let closed = false;
91
+ let pending = [];
92
+ let pendingBytes = 0;
93
+ let size = null;
94
+ let ping;
95
+ const sendInput = (bytes) => {
96
+ for (let at = 0; at < bytes.length; at += TERMINAL_INPUT_CHUNK_BYTES) {
97
+ socket.send(bytes.subarray(at, at + TERMINAL_INPUT_CHUNK_BYTES));
98
+ }
99
+ };
100
+ const sendResize = (cols, rows) => socket.send(JSON.stringify({ t: 'resize', cols, rows }));
101
+ socket.onmessage = (event) => {
102
+ if (typeof event.data !== 'string') {
103
+ handlers.onData?.(toBytes(event.data));
104
+ return;
105
+ }
106
+ let msg;
107
+ try {
108
+ msg = JSON.parse(event.data);
109
+ }
110
+ catch {
111
+ return;
112
+ }
113
+ if (msg.t === 'ready') {
114
+ ready = true;
115
+ if (size)
116
+ sendResize(size.cols, size.rows);
117
+ const held = pending;
118
+ pending = [];
119
+ pendingBytes = 0;
120
+ for (const bytes of held)
121
+ sendInput(bytes);
122
+ handlers.onReady?.({ sessionId: msg.sessionId, target: msg.target });
123
+ const every = options.pingIntervalMs ?? 30_000;
124
+ if (every > 0) {
125
+ ping = runtime.setInterval(() => {
126
+ if (!closed)
127
+ socket.send(JSON.stringify({ t: 'ping' }));
128
+ }, every);
129
+ }
130
+ }
131
+ else if (msg.t === 'notice') {
132
+ handlers.onNotice?.(String(msg.message));
133
+ }
134
+ else if (msg.t === 'exit') {
135
+ handlers.onExit?.({ code: typeof msg.code === 'number' ? msg.code : null, reason: String(msg.reason) });
136
+ }
137
+ };
138
+ socket.onclose = (event) => {
139
+ closed = true;
140
+ ready = false;
141
+ runtime.clearInterval(ping);
142
+ handlers.onClose?.({ code: event.code, reason: event.reason, message: terminalCloseMessage(event.code) });
143
+ };
144
+ socket.onerror = () => {
145
+ /* the close event follows and carries the code */
146
+ };
147
+ return {
148
+ get ready() {
149
+ return ready;
150
+ },
151
+ write: (data) => {
152
+ if (closed)
153
+ return;
154
+ const bytes = typeof data === 'string' ? encoder.encode(data) : data;
155
+ if (bytes.length === 0)
156
+ return;
157
+ if (ready) {
158
+ sendInput(bytes);
159
+ return;
160
+ }
161
+ if (pendingBytes + bytes.length > TERMINAL_PENDING_INPUT_MAX)
162
+ return;
163
+ pending.push(bytes);
164
+ pendingBytes += bytes.length;
165
+ },
166
+ resize: (cols, rows) => {
167
+ size = { cols: clamp(cols, 10, 500), rows: clamp(rows, 5, 200) };
168
+ if (ready && !closed)
169
+ sendResize(size.cols, size.rows);
170
+ },
171
+ close: () => {
172
+ if (closed)
173
+ return;
174
+ closed = true;
175
+ runtime.clearInterval(ping);
176
+ socket.close(1000, 'client closed');
177
+ },
178
+ };
179
+ }
180
+ //# sourceMappingURL=terminal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal.js","sourceRoot":"","sources":["../src/terminal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Minimal structural fetch type so the SDK is isomorphic (browser + Node)
3
+ * without pulling in DOM lib types. Both `globalThis.fetch` implementations
4
+ * satisfy this shape.
5
+ */
6
+ export type FetchLike = (input: string, init: {
7
+ method?: string;
8
+ headers?: Record<string, string>;
9
+ body?: string;
10
+ credentials?: 'omit' | 'same-origin' | 'include';
11
+ }) => Promise<{
12
+ ok: boolean;
13
+ status: number;
14
+ text(): Promise<string>;
15
+ /** Optional so minimal fetch stand-ins stay assignable; a real fetch has it (F1010). */
16
+ headers?: {
17
+ get(name: string): string | null;
18
+ };
19
+ }>;
20
+ export interface NineDeployClientOptions {
21
+ /** Base URL of the NineDeploy API, e.g. http://localhost:3000. */
22
+ baseUrl: string;
23
+ /** Returns the current access token (or bearer credential). */
24
+ getToken?: () => string | undefined | null;
25
+ /**
26
+ * Per-request timeout in milliseconds. A stalled backend must not hang
27
+ * callers forever (worst in CI, where nothing is interactive to Ctrl-C).
28
+ * Defaults to 30_000; pass `0` to disable entirely.
29
+ */
30
+ timeoutMs?: number;
31
+ /** Custom fetch implementation (defaults to globalThis.fetch). */
32
+ fetch?: FetchLike;
33
+ }
34
+ export interface RequestInit {
35
+ method?: string;
36
+ credentials?: 'omit' | 'same-origin' | 'include';
37
+ headers?: Record<string, string>;
38
+ body?: unknown;
39
+ /**
40
+ * Propagated to fetch as-is. Typed structurally: the SDK compiles without
41
+ * DOM lib types, and only `AbortSignal.timeout()` ever produces one here.
42
+ */
43
+ signal?: unknown;
44
+ /** 0.14: a binary body, sent as-is (`application/octet-stream`). */
45
+ raw?: Uint8Array;
46
+ /** 0.14: keep a refusal's top-level `errors` / `warnings` as the error's `details`. */
47
+ findings?: boolean;
48
+ }
49
+ /** The request core every resource module calls through. */
50
+ export interface Transport {
51
+ baseUrl: string;
52
+ requestWithHeaders<T>(path: string, init?: RequestInit, minTimeoutMs?: number): Promise<{
53
+ data: T;
54
+ header: (name: string) => string | null;
55
+ }>;
56
+ request<T>(path: string, init?: RequestInit, minTimeoutMs?: number): Promise<T>;
57
+ get<T>(path: string): Promise<T>;
58
+ send<T>(method: string, path: string, body?: unknown): Promise<T>;
59
+ }
60
+ export declare function createTransport(opts: NineDeployClientOptions): Transport;
61
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;CAClD,KAAK,OAAO,CAAC;IACZ,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACxB,wFAAwF;IACxF,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;CAChD,CAAC,CAAA;AAEJ,MAAM,WAAW,uBAAuB;IACtC,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAC3C;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,oEAAoE;IACpE,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,uFAAuF;IACvF,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAKD,4DAA4D;AAC5D,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,CAAC;QAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IAC9I,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAChF,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACnE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,uBAAuB,GAAG,SAAS,CAuFxE"}