ncloud-mcp-server 1.0.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 (220) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +159 -0
  3. package/README_EN.md +159 -0
  4. package/dist/auth/signature.d.ts +16 -0
  5. package/dist/auth/signature.js +18 -0
  6. package/dist/auth/signature.js.map +1 -0
  7. package/dist/auth/signature.test.d.ts +1 -0
  8. package/dist/auth/signature.test.js +90 -0
  9. package/dist/auth/signature.test.js.map +1 -0
  10. package/dist/client/ncloud-client.d.ts +27 -0
  11. package/dist/client/ncloud-client.js +270 -0
  12. package/dist/client/ncloud-client.js.map +1 -0
  13. package/dist/client/ncloud-client.test.d.ts +1 -0
  14. package/dist/client/ncloud-client.test.js +477 -0
  15. package/dist/client/ncloud-client.test.js.map +1 -0
  16. package/dist/client/s3-compatible-client.d.ts +49 -0
  17. package/dist/client/s3-compatible-client.js +210 -0
  18. package/dist/client/s3-compatible-client.js.map +1 -0
  19. package/dist/client/swift-compatible-client.d.ts +68 -0
  20. package/dist/client/swift-compatible-client.js +173 -0
  21. package/dist/client/swift-compatible-client.js.map +1 -0
  22. package/dist/index.d.ts +2 -0
  23. package/dist/index.js +362 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/tools/acg.d.ts +3 -0
  26. package/dist/tools/acg.js +220 -0
  27. package/dist/tools/acg.js.map +1 -0
  28. package/dist/tools/activity-tracer.d.ts +3 -0
  29. package/dist/tools/activity-tracer.js +77 -0
  30. package/dist/tools/activity-tracer.js.map +1 -0
  31. package/dist/tools/analytics-cdss.d.ts +3 -0
  32. package/dist/tools/analytics-cdss.js +618 -0
  33. package/dist/tools/analytics-cdss.js.map +1 -0
  34. package/dist/tools/analytics-datacatalog.d.ts +10 -0
  35. package/dist/tools/analytics-datacatalog.js +409 -0
  36. package/dist/tools/analytics-datacatalog.js.map +1 -0
  37. package/dist/tools/analytics-dataflow.d.ts +16 -0
  38. package/dist/tools/analytics-dataflow.js +478 -0
  39. package/dist/tools/analytics-dataflow.js.map +1 -0
  40. package/dist/tools/analytics-dataforest.d.ts +10 -0
  41. package/dist/tools/analytics-dataforest.js +379 -0
  42. package/dist/tools/analytics-dataforest.js.map +1 -0
  43. package/dist/tools/analytics-dataquery.d.ts +16 -0
  44. package/dist/tools/analytics-dataquery.js +143 -0
  45. package/dist/tools/analytics-dataquery.js.map +1 -0
  46. package/dist/tools/analytics-datastream.d.ts +13 -0
  47. package/dist/tools/analytics-datastream.js +359 -0
  48. package/dist/tools/analytics-datastream.js.map +1 -0
  49. package/dist/tools/analytics-hadoop.d.ts +12 -0
  50. package/dist/tools/analytics-hadoop.js +450 -0
  51. package/dist/tools/analytics-hadoop.js.map +1 -0
  52. package/dist/tools/analytics-ses.d.ts +3 -0
  53. package/dist/tools/analytics-ses.js +653 -0
  54. package/dist/tools/analytics-ses.js.map +1 -0
  55. package/dist/tools/api-gateway.d.ts +3 -0
  56. package/dist/tools/api-gateway.js +202 -0
  57. package/dist/tools/api-gateway.js.map +1 -0
  58. package/dist/tools/autoscaling.d.ts +3 -0
  59. package/dist/tools/autoscaling.js +430 -0
  60. package/dist/tools/autoscaling.js.map +1 -0
  61. package/dist/tools/billing.d.ts +14 -0
  62. package/dist/tools/billing.js +545 -0
  63. package/dist/tools/billing.js.map +1 -0
  64. package/dist/tools/certificate-manager.d.ts +18 -0
  65. package/dist/tools/certificate-manager.js +84 -0
  66. package/dist/tools/certificate-manager.js.map +1 -0
  67. package/dist/tools/cloud-advisor.d.ts +3 -0
  68. package/dist/tools/cloud-advisor.js +202 -0
  69. package/dist/tools/cloud-advisor.js.map +1 -0
  70. package/dist/tools/cloud-functions.d.ts +3 -0
  71. package/dist/tools/cloud-functions.js +497 -0
  72. package/dist/tools/cloud-functions.js.map +1 -0
  73. package/dist/tools/cloud-insight-integration.d.ts +3 -0
  74. package/dist/tools/cloud-insight-integration.js +90 -0
  75. package/dist/tools/cloud-insight-integration.js.map +1 -0
  76. package/dist/tools/cloud-insight-plugin.d.ts +3 -0
  77. package/dist/tools/cloud-insight-plugin.js +600 -0
  78. package/dist/tools/cloud-insight-plugin.js.map +1 -0
  79. package/dist/tools/cloud-insight-rule.d.ts +3 -0
  80. package/dist/tools/cloud-insight-rule.js +570 -0
  81. package/dist/tools/cloud-insight-rule.js.map +1 -0
  82. package/dist/tools/cloud-insight.d.ts +3 -0
  83. package/dist/tools/cloud-insight.js +246 -0
  84. package/dist/tools/cloud-insight.js.map +1 -0
  85. package/dist/tools/common.d.ts +3 -0
  86. package/dist/tools/common.js +120 -0
  87. package/dist/tools/common.js.map +1 -0
  88. package/dist/tools/compute-initscript.d.ts +3 -0
  89. package/dist/tools/compute-initscript.js +62 -0
  90. package/dist/tools/compute-initscript.js.map +1 -0
  91. package/dist/tools/compute-loginkey.d.ts +3 -0
  92. package/dist/tools/compute-loginkey.js +59 -0
  93. package/dist/tools/compute-loginkey.js.map +1 -0
  94. package/dist/tools/compute-placement.d.ts +3 -0
  95. package/dist/tools/compute-placement.js +196 -0
  96. package/dist/tools/compute-placement.js.map +1 -0
  97. package/dist/tools/compute-publicip.d.ts +3 -0
  98. package/dist/tools/compute-publicip.js +97 -0
  99. package/dist/tools/compute-publicip.js.map +1 -0
  100. package/dist/tools/compute-server.d.ts +3 -0
  101. package/dist/tools/compute-server.js +445 -0
  102. package/dist/tools/compute-server.js.map +1 -0
  103. package/dist/tools/compute-server.test.d.ts +1 -0
  104. package/dist/tools/compute-server.test.js +224 -0
  105. package/dist/tools/compute-server.test.js.map +1 -0
  106. package/dist/tools/compute-storage.d.ts +3 -0
  107. package/dist/tools/compute-storage.js +240 -0
  108. package/dist/tools/compute-storage.js.map +1 -0
  109. package/dist/tools/containers-nks.d.ts +13 -0
  110. package/dist/tools/containers-nks.js +576 -0
  111. package/dist/tools/containers-nks.js.map +1 -0
  112. package/dist/tools/containers-registry.d.ts +3 -0
  113. package/dist/tools/containers-registry.js +181 -0
  114. package/dist/tools/containers-registry.js.map +1 -0
  115. package/dist/tools/database-cache.d.ts +3 -0
  116. package/dist/tools/database-cache.js +388 -0
  117. package/dist/tools/database-cache.js.map +1 -0
  118. package/dist/tools/database-mongodb.d.ts +3 -0
  119. package/dist/tools/database-mongodb.js +460 -0
  120. package/dist/tools/database-mongodb.js.map +1 -0
  121. package/dist/tools/database-mssql.d.ts +3 -0
  122. package/dist/tools/database-mssql.js +345 -0
  123. package/dist/tools/database-mssql.js.map +1 -0
  124. package/dist/tools/database-mysql.d.ts +3 -0
  125. package/dist/tools/database-mysql.js +500 -0
  126. package/dist/tools/database-mysql.js.map +1 -0
  127. package/dist/tools/database-postgresql.d.ts +3 -0
  128. package/dist/tools/database-postgresql.js +432 -0
  129. package/dist/tools/database-postgresql.js.map +1 -0
  130. package/dist/tools/global-dns.d.ts +3 -0
  131. package/dist/tools/global-dns.js +207 -0
  132. package/dist/tools/global-dns.js.map +1 -0
  133. package/dist/tools/global-edge.d.ts +3 -0
  134. package/dist/tools/global-edge.js +386 -0
  135. package/dist/tools/global-edge.js.map +1 -0
  136. package/dist/tools/global-traffic-manager.d.ts +3 -0
  137. package/dist/tools/global-traffic-manager.js +497 -0
  138. package/dist/tools/global-traffic-manager.js.map +1 -0
  139. package/dist/tools/index.d.ts +63 -0
  140. package/dist/tools/index.js +64 -0
  141. package/dist/tools/index.js.map +1 -0
  142. package/dist/tools/kms.d.ts +8 -0
  143. package/dist/tools/kms.js +529 -0
  144. package/dist/tools/kms.js.map +1 -0
  145. package/dist/tools/loadbalancer.d.ts +3 -0
  146. package/dist/tools/loadbalancer.js +341 -0
  147. package/dist/tools/loadbalancer.js.map +1 -0
  148. package/dist/tools/log-analytics.d.ts +3 -0
  149. package/dist/tools/log-analytics.js +183 -0
  150. package/dist/tools/log-analytics.js.map +1 -0
  151. package/dist/tools/media-imageoptimizer.d.ts +3 -0
  152. package/dist/tools/media-imageoptimizer.js +187 -0
  153. package/dist/tools/media-imageoptimizer.js.map +1 -0
  154. package/dist/tools/media-livestation.d.ts +3 -0
  155. package/dist/tools/media-livestation.js +252 -0
  156. package/dist/tools/media-livestation.js.map +1 -0
  157. package/dist/tools/media-vodstation.d.ts +3 -0
  158. package/dist/tools/media-vodstation.js +197 -0
  159. package/dist/tools/media-vodstation.js.map +1 -0
  160. package/dist/tools/nat-gateway.d.ts +3 -0
  161. package/dist/tools/nat-gateway.js +91 -0
  162. package/dist/tools/nat-gateway.js.map +1 -0
  163. package/dist/tools/network-acl.d.ts +3 -0
  164. package/dist/tools/network-acl.js +322 -0
  165. package/dist/tools/network-acl.js.map +1 -0
  166. package/dist/tools/network-interface.d.ts +3 -0
  167. package/dist/tools/network-interface.js +193 -0
  168. package/dist/tools/network-interface.js.map +1 -0
  169. package/dist/tools/private-ca.d.ts +8 -0
  170. package/dist/tools/private-ca.js +368 -0
  171. package/dist/tools/private-ca.js.map +1 -0
  172. package/dist/tools/resource-manager.d.ts +3 -0
  173. package/dist/tools/resource-manager.js +151 -0
  174. package/dist/tools/resource-manager.js.map +1 -0
  175. package/dist/tools/route-table.d.ts +3 -0
  176. package/dist/tools/route-table.js +205 -0
  177. package/dist/tools/route-table.js.map +1 -0
  178. package/dist/tools/security-monitoring.d.ts +3 -0
  179. package/dist/tools/security-monitoring.js +182 -0
  180. package/dist/tools/security-monitoring.js.map +1 -0
  181. package/dist/tools/sens.d.ts +3 -0
  182. package/dist/tools/sens.js +240 -0
  183. package/dist/tools/sens.js.map +1 -0
  184. package/dist/tools/sourcebuild.d.ts +3 -0
  185. package/dist/tools/sourcebuild.js +481 -0
  186. package/dist/tools/sourcebuild.js.map +1 -0
  187. package/dist/tools/sourcecommit.d.ts +13 -0
  188. package/dist/tools/sourcecommit.js +228 -0
  189. package/dist/tools/sourcecommit.js.map +1 -0
  190. package/dist/tools/sourcedeploy.d.ts +3 -0
  191. package/dist/tools/sourcedeploy.js +448 -0
  192. package/dist/tools/sourcedeploy.js.map +1 -0
  193. package/dist/tools/sourcepipeline.d.ts +12 -0
  194. package/dist/tools/sourcepipeline.js +357 -0
  195. package/dist/tools/sourcepipeline.js.map +1 -0
  196. package/dist/tools/storage-archive.d.ts +3 -0
  197. package/dist/tools/storage-archive.js +337 -0
  198. package/dist/tools/storage-archive.js.map +1 -0
  199. package/dist/tools/storage-nas.d.ts +3 -0
  200. package/dist/tools/storage-nas.js +288 -0
  201. package/dist/tools/storage-nas.js.map +1 -0
  202. package/dist/tools/storage-ncloud.d.ts +3 -0
  203. package/dist/tools/storage-ncloud.js +864 -0
  204. package/dist/tools/storage-ncloud.js.map +1 -0
  205. package/dist/tools/storage-object.d.ts +3 -0
  206. package/dist/tools/storage-object.js +982 -0
  207. package/dist/tools/storage-object.js.map +1 -0
  208. package/dist/tools/sub-account.d.ts +3 -0
  209. package/dist/tools/sub-account.js +311 -0
  210. package/dist/tools/sub-account.js.map +1 -0
  211. package/dist/tools/target-group.d.ts +3 -0
  212. package/dist/tools/target-group.js +207 -0
  213. package/dist/tools/target-group.js.map +1 -0
  214. package/dist/tools/vpc-peering.d.ts +3 -0
  215. package/dist/tools/vpc-peering.js +109 -0
  216. package/dist/tools/vpc-peering.js.map +1 -0
  217. package/dist/tools/vpc.d.ts +3 -0
  218. package/dist/tools/vpc.js +194 -0
  219. package/dist/tools/vpc.js.map +1 -0
  220. package/package.json +53 -0
@@ -0,0 +1,210 @@
1
+ import crypto from "node:crypto";
2
+ /** Object Storage endpoint map (storageType: "object") */
3
+ const REGION_ENDPOINT_MAP = {
4
+ KR: "https://kr.object.ncloudstorage.com",
5
+ USWN: "https://us.object.ncloudstorage.com",
6
+ SGN: "https://sg.object.ncloudstorage.com",
7
+ JPN: "https://jp.object.ncpstorage.com",
8
+ DEN: "https://de.object.ncloudstorage.com",
9
+ };
10
+ /** Object Storage host map (storageType: "object") */
11
+ const REGION_HOST_MAP = {
12
+ KR: "kr.object.ncloudstorage.com",
13
+ USWN: "us.object.ncloudstorage.com",
14
+ SGN: "sg.object.ncloudstorage.com",
15
+ JPN: "jp.object.ncpstorage.com",
16
+ DEN: "de.object.ncloudstorage.com",
17
+ };
18
+ /** Ncloud Storage endpoint map (storageType: "ncloud") */
19
+ const NCLOUD_STORAGE_ENDPOINT_MAP = {
20
+ KR: "https://kr.ncloudstorage.com",
21
+ USWN: "https://us.ncloudstorage.com",
22
+ SGN: "https://sg.ncloudstorage.com",
23
+ JPN: "https://jp.ncloudstorage.com",
24
+ DEN: "https://de.ncloudstorage.com",
25
+ };
26
+ /** Ncloud Storage host map (storageType: "ncloud") */
27
+ const NCLOUD_STORAGE_HOST_MAP = {
28
+ KR: "kr.ncloudstorage.com",
29
+ USWN: "us.ncloudstorage.com",
30
+ SGN: "sg.ncloudstorage.com",
31
+ JPN: "jp.ncloudstorage.com",
32
+ DEN: "de.ncloudstorage.com",
33
+ };
34
+ /**
35
+ * Signing region used in AWS Signature V4 credential scope.
36
+ * Ncloud Object Storage uses region names like "kr-standard" for signing.
37
+ */
38
+ const SIGNING_REGION_MAP = {
39
+ KR: "kr-standard",
40
+ USWN: "us-standard",
41
+ SGN: "sg-standard",
42
+ JPN: "jp-standard",
43
+ DEN: "de-standard",
44
+ };
45
+ /**
46
+ * Signing region for Ncloud Storage (non-Object Storage).
47
+ * Ncloud Storage uses short region codes like "kr" for signing.
48
+ * Currently only KR is available, but structured for future expansion.
49
+ */
50
+ const NCLOUD_STORAGE_SIGNING_REGION_MAP = {
51
+ KR: "kr",
52
+ USWN: "us",
53
+ SGN: "sg",
54
+ JPN: "jp",
55
+ DEN: "de",
56
+ };
57
+ /**
58
+ * S3-compatible client for Ncloud Object Storage.
59
+ * Implements AWS Signature V4 authentication using Ncloud Access Key / Secret Key.
60
+ * Endpoints per region:
61
+ * KR: https://kr.object.ncloudstorage.com
62
+ * USWN: https://us.object.ncloudstorage.com
63
+ * SGN: https://sg.object.ncloudstorage.com
64
+ * JPN: https://jp.object.ncpstorage.com
65
+ * DEN: https://de.object.ncloudstorage.com
66
+ */
67
+ export class S3CompatibleClient {
68
+ accessKey;
69
+ secretKey;
70
+ regionCode;
71
+ storageType;
72
+ constructor(config) {
73
+ this.accessKey = config.accessKey;
74
+ this.secretKey = config.secretKey;
75
+ this.regionCode = config.regionCode;
76
+ this.storageType = config.storageType ?? "object";
77
+ }
78
+ setRegionCode(regionCode) {
79
+ this.regionCode = regionCode;
80
+ }
81
+ getRegionCode() {
82
+ return this.regionCode;
83
+ }
84
+ getEndpoint() {
85
+ if (this.storageType === "ncloud") {
86
+ return NCLOUD_STORAGE_ENDPOINT_MAP[this.regionCode] ?? NCLOUD_STORAGE_ENDPOINT_MAP["KR"];
87
+ }
88
+ return REGION_ENDPOINT_MAP[this.regionCode] ?? REGION_ENDPOINT_MAP["KR"];
89
+ }
90
+ getHost() {
91
+ if (this.storageType === "ncloud") {
92
+ return NCLOUD_STORAGE_HOST_MAP[this.regionCode] ?? NCLOUD_STORAGE_HOST_MAP["KR"];
93
+ }
94
+ return REGION_HOST_MAP[this.regionCode] ?? REGION_HOST_MAP["KR"];
95
+ }
96
+ sha256(data) {
97
+ return crypto.createHash("sha256").update(data).digest("hex");
98
+ }
99
+ hmacSha256(key, data) {
100
+ return crypto.createHmac("sha256", key).update(data).digest();
101
+ }
102
+ getSigningRegion() {
103
+ if (this.storageType === "ncloud") {
104
+ return NCLOUD_STORAGE_SIGNING_REGION_MAP[this.regionCode] ?? NCLOUD_STORAGE_SIGNING_REGION_MAP["KR"];
105
+ }
106
+ return SIGNING_REGION_MAP[this.regionCode] ?? SIGNING_REGION_MAP["KR"];
107
+ }
108
+ getSigningKey(dateStamp) {
109
+ const signingRegion = this.getSigningRegion();
110
+ const kDate = this.hmacSha256(`AWS4${this.secretKey}`, dateStamp);
111
+ const kRegion = this.hmacSha256(kDate, signingRegion);
112
+ const kService = this.hmacSha256(kRegion, "s3");
113
+ const kSigning = this.hmacSha256(kService, "aws4_request");
114
+ return kSigning;
115
+ }
116
+ buildCanonicalUri(bucket, key) {
117
+ if (!bucket)
118
+ return "/";
119
+ if (!key)
120
+ return `/${bucket}`;
121
+ const encodedKey = key
122
+ .split("/")
123
+ .map((part) => encodeURIComponent(part))
124
+ .join("/");
125
+ return `/${bucket}/${encodedKey}`;
126
+ }
127
+ buildCanonicalQueryString(queryParams) {
128
+ if (!queryParams || Object.keys(queryParams).length === 0)
129
+ return "";
130
+ const sorted = Object.entries(queryParams).sort(([a], [b]) => a.localeCompare(b));
131
+ return sorted
132
+ .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)
133
+ .join("&");
134
+ }
135
+ async request(options) {
136
+ const { method, bucket, key, queryParams, headers: extraHeaders, body } = options;
137
+ const now = new Date();
138
+ const amzDate = now.toISOString().replace(/[-:]/g, "").replace(/\.\d{3}/, "");
139
+ const dateStamp = amzDate.substring(0, 8);
140
+ const host = this.getHost();
141
+ const canonicalUri = this.buildCanonicalUri(bucket, key);
142
+ const canonicalQueryString = this.buildCanonicalQueryString(queryParams);
143
+ const payloadHash = this.sha256(body ?? "");
144
+ const requestHeaders = {
145
+ host,
146
+ "x-amz-date": amzDate,
147
+ "x-amz-content-sha256": payloadHash,
148
+ ...extraHeaders,
149
+ };
150
+ // Build canonical headers (sorted, lowercase)
151
+ const signedHeaderKeys = Object.keys(requestHeaders)
152
+ .map((k) => k.toLowerCase())
153
+ .sort();
154
+ const canonicalHeaders = signedHeaderKeys
155
+ .map((k) => `${k}:${requestHeaders[Object.keys(requestHeaders).find((h) => h.toLowerCase() === k)].trim()}`)
156
+ .join("\n") + "\n";
157
+ const signedHeaders = signedHeaderKeys.join(";");
158
+ const canonicalRequest = [
159
+ method,
160
+ canonicalUri,
161
+ canonicalQueryString,
162
+ canonicalHeaders,
163
+ signedHeaders,
164
+ payloadHash,
165
+ ].join("\n");
166
+ const credentialScope = `${dateStamp}/${this.getSigningRegion()}/s3/aws4_request`;
167
+ const stringToSign = [
168
+ "AWS4-HMAC-SHA256",
169
+ amzDate,
170
+ credentialScope,
171
+ this.sha256(canonicalRequest),
172
+ ].join("\n");
173
+ const signingKey = this.getSigningKey(dateStamp);
174
+ const signature = crypto
175
+ .createHmac("sha256", signingKey)
176
+ .update(stringToSign)
177
+ .digest("hex");
178
+ const authorization = `AWS4-HMAC-SHA256 Credential=${this.accessKey}/${credentialScope}, SignedHeaders=${signedHeaders}, Signature=${signature}`;
179
+ const fetchHeaders = {
180
+ ...requestHeaders,
181
+ Authorization: authorization,
182
+ };
183
+ // Remove 'host' from fetch headers (fetch sets it automatically)
184
+ delete fetchHeaders["host"];
185
+ const url = canonicalQueryString
186
+ ? `${this.getEndpoint()}${canonicalUri}?${canonicalQueryString}`
187
+ : `${this.getEndpoint()}${canonicalUri}`;
188
+ const response = await fetch(url, {
189
+ method,
190
+ headers: fetchHeaders,
191
+ body: body ?? undefined,
192
+ });
193
+ const responseBody = await response.text();
194
+ if (!response.ok) {
195
+ this.handleErrorResponse(response.status, responseBody);
196
+ }
197
+ return { status: response.status, headers: response.headers, body: responseBody };
198
+ }
199
+ handleErrorResponse(status, body) {
200
+ const serviceName = this.storageType === "ncloud" ? "Ncloud Storage" : "Object Storage";
201
+ // Try to parse XML error response from S3
202
+ const codeMatch = body.match(/<Code>(.*?)<\/Code>/);
203
+ const messageMatch = body.match(/<Message>(.*?)<\/Message>/);
204
+ if (codeMatch && messageMatch) {
205
+ throw new Error(`${serviceName} 호출 실패\n\n에러 코드: ${codeMatch[1]}\n메시지: ${messageMatch[1]}`);
206
+ }
207
+ throw new Error(`${serviceName} 호출 실패: HTTP ${status}\n\n응답: ${body}`);
208
+ }
209
+ }
210
+ //# sourceMappingURL=s3-compatible-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3-compatible-client.js","sourceRoot":"","sources":["../../src/client/s3-compatible-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * OpenStack Swift-compatible client for Ncloud Archive Storage.
3
+ * Uses Keystone v3 token-based authentication.
4
+ *
5
+ * Authentication:
6
+ * - Endpoint: https://kr.archive.ncloudstorage.com:5000/v3/auth/tokens
7
+ * - Access Key → username, Secret Key → password
8
+ * - Requires project_id and domain_id from Archive Storage console
9
+ *
10
+ * API:
11
+ * - Endpoint: https://kr.archive.ncloudstorage.com/v1/AUTH_{project_id}
12
+ * - Header: X-Auth-Token
13
+ */
14
+ export interface SwiftCompatibleClientConfig {
15
+ accessKey: string;
16
+ secretKey: string;
17
+ projectId: string;
18
+ domainId: string;
19
+ regionCode?: string;
20
+ }
21
+ interface SwiftRequestOptions {
22
+ method: string;
23
+ container?: string;
24
+ object?: string;
25
+ queryParams?: Record<string, string>;
26
+ headers?: Record<string, string>;
27
+ body?: string;
28
+ }
29
+ interface SwiftResponse {
30
+ status: number;
31
+ headers: Headers;
32
+ body: string;
33
+ }
34
+ /**
35
+ * Swift-compatible client for Ncloud Archive Storage.
36
+ * Implements OpenStack Keystone v3 token authentication.
37
+ */
38
+ export declare class SwiftCompatibleClient {
39
+ private readonly accessKey;
40
+ private readonly secretKey;
41
+ private readonly projectId;
42
+ private readonly domainId;
43
+ private regionCode;
44
+ private token;
45
+ private tokenExpiresAt;
46
+ constructor(config: SwiftCompatibleClientConfig);
47
+ setRegionCode(regionCode: string): void;
48
+ getRegionCode(): string;
49
+ getProjectId(): string;
50
+ private getAuthEndpoint;
51
+ private getApiEndpoint;
52
+ /**
53
+ * Authenticate with Keystone v3 and obtain a token.
54
+ * Token is cached and reused until expiration.
55
+ */
56
+ private authenticate;
57
+ /**
58
+ * Build the storage URL for API requests.
59
+ * Format: {apiEndpoint}/v1/AUTH_{projectId}[/{container}[/{object}]]
60
+ */
61
+ private buildUrl;
62
+ /**
63
+ * Execute a Swift API request with automatic token management.
64
+ */
65
+ request(options: SwiftRequestOptions): Promise<SwiftResponse>;
66
+ private handleErrorResponse;
67
+ }
68
+ export {};
@@ -0,0 +1,173 @@
1
+ /**
2
+ * OpenStack Swift-compatible client for Ncloud Archive Storage.
3
+ * Uses Keystone v3 token-based authentication.
4
+ *
5
+ * Authentication:
6
+ * - Endpoint: https://kr.archive.ncloudstorage.com:5000/v3/auth/tokens
7
+ * - Access Key → username, Secret Key → password
8
+ * - Requires project_id and domain_id from Archive Storage console
9
+ *
10
+ * API:
11
+ * - Endpoint: https://kr.archive.ncloudstorage.com/v1/AUTH_{project_id}
12
+ * - Header: X-Auth-Token
13
+ */
14
+ const AUTH_ENDPOINT_MAP = {
15
+ KR: "https://kr.archive.ncloudstorage.com:5000",
16
+ };
17
+ const API_ENDPOINT_MAP = {
18
+ KR: "https://kr.archive.ncloudstorage.com",
19
+ };
20
+ /**
21
+ * Swift-compatible client for Ncloud Archive Storage.
22
+ * Implements OpenStack Keystone v3 token authentication.
23
+ */
24
+ export class SwiftCompatibleClient {
25
+ accessKey;
26
+ secretKey;
27
+ projectId;
28
+ domainId;
29
+ regionCode;
30
+ token = null;
31
+ tokenExpiresAt = 0;
32
+ constructor(config) {
33
+ this.accessKey = config.accessKey;
34
+ this.secretKey = config.secretKey;
35
+ this.projectId = config.projectId;
36
+ this.domainId = config.domainId;
37
+ this.regionCode = config.regionCode ?? "KR";
38
+ }
39
+ setRegionCode(regionCode) {
40
+ this.regionCode = regionCode;
41
+ // Invalidate token when region changes
42
+ this.token = null;
43
+ this.tokenExpiresAt = 0;
44
+ }
45
+ getRegionCode() {
46
+ return this.regionCode;
47
+ }
48
+ getProjectId() {
49
+ return this.projectId;
50
+ }
51
+ getAuthEndpoint() {
52
+ return AUTH_ENDPOINT_MAP[this.regionCode] ?? AUTH_ENDPOINT_MAP["KR"];
53
+ }
54
+ getApiEndpoint() {
55
+ return API_ENDPOINT_MAP[this.regionCode] ?? API_ENDPOINT_MAP["KR"];
56
+ }
57
+ /**
58
+ * Authenticate with Keystone v3 and obtain a token.
59
+ * Token is cached and reused until expiration.
60
+ */
61
+ async authenticate() {
62
+ // Return cached token if still valid (with 5 min buffer)
63
+ if (this.token && Date.now() < this.tokenExpiresAt - 5 * 60 * 1000) {
64
+ return this.token;
65
+ }
66
+ const authUrl = `${this.getAuthEndpoint()}/v3/auth/tokens`;
67
+ const authBody = {
68
+ auth: {
69
+ identity: {
70
+ methods: ["password"],
71
+ password: {
72
+ user: {
73
+ name: this.accessKey,
74
+ password: this.secretKey,
75
+ domain: {
76
+ id: this.domainId,
77
+ },
78
+ },
79
+ },
80
+ },
81
+ scope: {
82
+ project: {
83
+ id: this.projectId,
84
+ },
85
+ },
86
+ },
87
+ };
88
+ const response = await fetch(authUrl, {
89
+ method: "POST",
90
+ headers: {
91
+ "Content-Type": "application/json",
92
+ },
93
+ body: JSON.stringify(authBody),
94
+ });
95
+ if (!response.ok) {
96
+ const errorBody = await response.text();
97
+ throw new Error(`Archive Storage 인증 실패: HTTP ${response.status}\n\n응답: ${errorBody}`);
98
+ }
99
+ const token = response.headers.get("x-subject-token");
100
+ if (!token) {
101
+ throw new Error("Archive Storage 인증 실패: 응답에 X-Subject-Token 헤더가 없습니다.");
102
+ }
103
+ // Parse expiration from response body
104
+ const body = await response.json();
105
+ if (body.token?.expires_at) {
106
+ this.tokenExpiresAt = new Date(body.token.expires_at).getTime();
107
+ }
108
+ else {
109
+ // Default: 1 hour from now
110
+ this.tokenExpiresAt = Date.now() + 60 * 60 * 1000;
111
+ }
112
+ this.token = token;
113
+ return token;
114
+ }
115
+ /**
116
+ * Build the storage URL for API requests.
117
+ * Format: {apiEndpoint}/v1/AUTH_{projectId}[/{container}[/{object}]]
118
+ */
119
+ buildUrl(container, object, queryParams) {
120
+ let path = `${this.getApiEndpoint()}/v1/AUTH_${this.projectId}`;
121
+ if (container) {
122
+ path += `/${encodeURIComponent(container)}`;
123
+ }
124
+ if (object) {
125
+ // Encode each path segment separately to preserve slashes
126
+ const encodedObject = object
127
+ .split("/")
128
+ .map((part) => encodeURIComponent(part))
129
+ .join("/");
130
+ path += `/${encodedObject}`;
131
+ }
132
+ if (queryParams && Object.keys(queryParams).length > 0) {
133
+ const qs = Object.entries(queryParams)
134
+ .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)
135
+ .join("&");
136
+ path += `?${qs}`;
137
+ }
138
+ return path;
139
+ }
140
+ /**
141
+ * Execute a Swift API request with automatic token management.
142
+ */
143
+ async request(options) {
144
+ const { method, container, object, queryParams, headers: extraHeaders, body } = options;
145
+ const token = await this.authenticate();
146
+ const url = this.buildUrl(container, object, queryParams);
147
+ const requestHeaders = {
148
+ "X-Auth-Token": token,
149
+ ...extraHeaders,
150
+ };
151
+ const response = await fetch(url, {
152
+ method,
153
+ headers: requestHeaders,
154
+ body: body ?? undefined,
155
+ });
156
+ const responseBody = await response.text();
157
+ if (!response.ok) {
158
+ this.handleErrorResponse(response.status, responseBody, response.headers);
159
+ }
160
+ return { status: response.status, headers: response.headers, body: responseBody };
161
+ }
162
+ handleErrorResponse(status, body, headers) {
163
+ // If 401, invalidate token for next retry
164
+ if (status === 401) {
165
+ this.token = null;
166
+ this.tokenExpiresAt = 0;
167
+ }
168
+ const transId = headers.get("x-trans-id") ?? "";
169
+ const detail = body.trim() || `HTTP ${status}`;
170
+ throw new Error(`Archive Storage 호출 실패: ${detail}${transId ? `\nTransaction-ID: ${transId}` : ""}`);
171
+ }
172
+ }
173
+ //# sourceMappingURL=swift-compatible-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swift-compatible-client.js","sourceRoot":"","sources":["../../src/client/swift-compatible-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};