@xrift/sdk 0.1.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 (122) hide show
  1. package/README.md +127 -0
  2. package/dist/cjs/api/auth.cjs +32 -0
  3. package/dist/cjs/api/auth.cjs.map +1 -0
  4. package/dist/cjs/api/auth.d.cts +13 -0
  5. package/dist/cjs/api/auth.d.cts.map +1 -0
  6. package/dist/cjs/api/http-client.cjs +117 -0
  7. package/dist/cjs/api/http-client.cjs.map +1 -0
  8. package/dist/cjs/api/http-client.d.cts +25 -0
  9. package/dist/cjs/api/http-client.d.cts.map +1 -0
  10. package/dist/cjs/api/items.cjs +88 -0
  11. package/dist/cjs/api/items.cjs.map +1 -0
  12. package/dist/cjs/api/items.d.cts +15 -0
  13. package/dist/cjs/api/items.d.cts.map +1 -0
  14. package/dist/cjs/api/worlds.cjs +94 -0
  15. package/dist/cjs/api/worlds.cjs.map +1 -0
  16. package/dist/cjs/api/worlds.d.cts +15 -0
  17. package/dist/cjs/api/worlds.d.cts.map +1 -0
  18. package/dist/cjs/client.cjs +21 -0
  19. package/dist/cjs/client.cjs.map +1 -0
  20. package/dist/cjs/client.d.cts +13 -0
  21. package/dist/cjs/client.d.cts.map +1 -0
  22. package/dist/cjs/constants.cjs +10 -0
  23. package/dist/cjs/constants.cjs.map +1 -0
  24. package/dist/cjs/constants.d.cts +5 -0
  25. package/dist/cjs/constants.d.cts.map +1 -0
  26. package/dist/cjs/errors.cjs +38 -0
  27. package/dist/cjs/errors.cjs.map +1 -0
  28. package/dist/cjs/errors.d.cts +16 -0
  29. package/dist/cjs/errors.d.cts.map +1 -0
  30. package/dist/cjs/hash.cjs +96 -0
  31. package/dist/cjs/hash.cjs.map +1 -0
  32. package/dist/cjs/hash.d.cts +11 -0
  33. package/dist/cjs/hash.d.cts.map +1 -0
  34. package/dist/cjs/index.cjs +19 -0
  35. package/dist/cjs/index.cjs.map +1 -0
  36. package/dist/cjs/index.d.cts +7 -0
  37. package/dist/cjs/index.d.cts.map +1 -0
  38. package/dist/cjs/types/auth.cjs +3 -0
  39. package/dist/cjs/types/auth.cjs.map +1 -0
  40. package/dist/cjs/types/auth.d.cts +20 -0
  41. package/dist/cjs/types/auth.d.cts.map +1 -0
  42. package/dist/cjs/types/common.cjs +3 -0
  43. package/dist/cjs/types/common.cjs.map +1 -0
  44. package/dist/cjs/types/common.d.cts +30 -0
  45. package/dist/cjs/types/common.d.cts.map +1 -0
  46. package/dist/cjs/types/index.cjs +3 -0
  47. package/dist/cjs/types/index.cjs.map +1 -0
  48. package/dist/cjs/types/index.d.cts +4 -0
  49. package/dist/cjs/types/index.d.cts.map +1 -0
  50. package/dist/cjs/types/items.cjs +3 -0
  51. package/dist/cjs/types/items.cjs.map +1 -0
  52. package/dist/cjs/types/items.d.cts +62 -0
  53. package/dist/cjs/types/items.d.cts.map +1 -0
  54. package/dist/cjs/types/worlds.cjs +3 -0
  55. package/dist/cjs/types/worlds.cjs.map +1 -0
  56. package/dist/cjs/types/worlds.d.cts +72 -0
  57. package/dist/cjs/types/worlds.d.cts.map +1 -0
  58. package/dist/cjs/utils/mime.cjs +34 -0
  59. package/dist/cjs/utils/mime.cjs.map +1 -0
  60. package/dist/cjs/utils/mime.d.cts +2 -0
  61. package/dist/cjs/utils/mime.d.cts.map +1 -0
  62. package/dist/esm/api/auth.d.ts +13 -0
  63. package/dist/esm/api/auth.d.ts.map +1 -0
  64. package/dist/esm/api/auth.js +26 -0
  65. package/dist/esm/api/auth.js.map +1 -0
  66. package/dist/esm/api/http-client.d.ts +25 -0
  67. package/dist/esm/api/http-client.d.ts.map +1 -0
  68. package/dist/esm/api/http-client.js +113 -0
  69. package/dist/esm/api/http-client.js.map +1 -0
  70. package/dist/esm/api/items.d.ts +15 -0
  71. package/dist/esm/api/items.d.ts.map +1 -0
  72. package/dist/esm/api/items.js +84 -0
  73. package/dist/esm/api/items.js.map +1 -0
  74. package/dist/esm/api/worlds.d.ts +15 -0
  75. package/dist/esm/api/worlds.d.ts.map +1 -0
  76. package/dist/esm/api/worlds.js +90 -0
  77. package/dist/esm/api/worlds.js.map +1 -0
  78. package/dist/esm/client.d.ts +13 -0
  79. package/dist/esm/client.d.ts.map +1 -0
  80. package/dist/esm/client.js +17 -0
  81. package/dist/esm/client.js.map +1 -0
  82. package/dist/esm/constants.d.ts +5 -0
  83. package/dist/esm/constants.d.ts.map +1 -0
  84. package/dist/esm/constants.js +7 -0
  85. package/dist/esm/constants.js.map +1 -0
  86. package/dist/esm/errors.d.ts +16 -0
  87. package/dist/esm/errors.d.ts.map +1 -0
  88. package/dist/esm/errors.js +31 -0
  89. package/dist/esm/errors.js.map +1 -0
  90. package/dist/esm/hash.d.ts +11 -0
  91. package/dist/esm/hash.d.ts.map +1 -0
  92. package/dist/esm/hash.js +60 -0
  93. package/dist/esm/hash.js.map +1 -0
  94. package/dist/esm/index.d.ts +7 -0
  95. package/dist/esm/index.d.ts.map +1 -0
  96. package/dist/esm/index.js +9 -0
  97. package/dist/esm/index.js.map +1 -0
  98. package/dist/esm/types/auth.d.ts +20 -0
  99. package/dist/esm/types/auth.d.ts.map +1 -0
  100. package/dist/esm/types/auth.js +2 -0
  101. package/dist/esm/types/auth.js.map +1 -0
  102. package/dist/esm/types/common.d.ts +30 -0
  103. package/dist/esm/types/common.d.ts.map +1 -0
  104. package/dist/esm/types/common.js +2 -0
  105. package/dist/esm/types/common.js.map +1 -0
  106. package/dist/esm/types/index.d.ts +4 -0
  107. package/dist/esm/types/index.d.ts.map +1 -0
  108. package/dist/esm/types/index.js +2 -0
  109. package/dist/esm/types/index.js.map +1 -0
  110. package/dist/esm/types/items.d.ts +62 -0
  111. package/dist/esm/types/items.d.ts.map +1 -0
  112. package/dist/esm/types/items.js +2 -0
  113. package/dist/esm/types/items.js.map +1 -0
  114. package/dist/esm/types/worlds.d.ts +72 -0
  115. package/dist/esm/types/worlds.d.ts.map +1 -0
  116. package/dist/esm/types/worlds.js +2 -0
  117. package/dist/esm/types/worlds.js.map +1 -0
  118. package/dist/esm/utils/mime.d.ts +2 -0
  119. package/dist/esm/utils/mime.d.ts.map +1 -0
  120. package/dist/esm/utils/mime.js +31 -0
  121. package/dist/esm/utils/mime.js.map +1 -0
  122. package/package.json +49 -0
@@ -0,0 +1,113 @@
1
+ import { DEFAULT_BASE_URL, DEFAULT_TIMEOUT } from '../constants.js';
2
+ import { XriftApiError, XriftAuthError, XriftNetworkError } from '../errors.js';
3
+ export class HttpClient {
4
+ baseUrl;
5
+ token;
6
+ timeout;
7
+ constructor(config = {}) {
8
+ this.baseUrl = (config.baseUrl || DEFAULT_BASE_URL).replace(/\/$/, '');
9
+ this.token = config.token;
10
+ this.timeout = config.timeout ?? DEFAULT_TIMEOUT;
11
+ }
12
+ async get(path) {
13
+ return this.request('GET', path);
14
+ }
15
+ async post(path, body) {
16
+ return this.request('POST', path, body);
17
+ }
18
+ async put(path, body, headers) {
19
+ const url = `${this.baseUrl}${path}`;
20
+ const mergedHeaders = { ...headers };
21
+ if (this.token) {
22
+ mergedHeaders['Authorization'] = `Bearer ${this.token}`;
23
+ }
24
+ try {
25
+ const response = await fetch(url, {
26
+ method: 'PUT',
27
+ headers: mergedHeaders,
28
+ body: body,
29
+ signal: AbortSignal.timeout(this.timeout),
30
+ });
31
+ if (!response.ok) {
32
+ await this.handleErrorResponse(response);
33
+ }
34
+ return { status: response.status, data: null };
35
+ }
36
+ catch (error) {
37
+ if (error instanceof XriftApiError)
38
+ throw error;
39
+ throw new XriftNetworkError(`PUT ${path} failed: ${error.message}`, error);
40
+ }
41
+ }
42
+ /**
43
+ * 外部 URL (署名付き URL 等) への PUT リクエスト
44
+ */
45
+ async putExternal(url, body, headers) {
46
+ try {
47
+ const response = await fetch(url, {
48
+ method: 'PUT',
49
+ headers,
50
+ body: body,
51
+ signal: AbortSignal.timeout(this.timeout * 10), // アップロードは長めに
52
+ });
53
+ if (!response.ok) {
54
+ const text = await response.text().catch(() => '');
55
+ throw new XriftApiError(`Upload failed (${response.status}): ${text}`, response.status);
56
+ }
57
+ }
58
+ catch (error) {
59
+ if (error instanceof XriftApiError)
60
+ throw error;
61
+ throw new XriftNetworkError(`Upload failed: ${error.message}`, error);
62
+ }
63
+ }
64
+ async request(method, path, body) {
65
+ const url = `${this.baseUrl}${path}`;
66
+ const headers = {
67
+ 'Content-Type': 'application/json',
68
+ };
69
+ if (this.token) {
70
+ headers['Authorization'] = `Bearer ${this.token}`;
71
+ }
72
+ try {
73
+ const response = await fetch(url, {
74
+ method,
75
+ headers,
76
+ body: body !== undefined ? JSON.stringify(body) : undefined,
77
+ signal: AbortSignal.timeout(this.timeout),
78
+ });
79
+ if (!response.ok) {
80
+ await this.handleErrorResponse(response);
81
+ }
82
+ const data = (await response.json());
83
+ return { status: response.status, data };
84
+ }
85
+ catch (error) {
86
+ if (error instanceof XriftApiError)
87
+ throw error;
88
+ throw new XriftNetworkError(`${method} ${path} failed: ${error.message}`, error);
89
+ }
90
+ }
91
+ async handleErrorResponse(response) {
92
+ let body;
93
+ try {
94
+ body = await response.json();
95
+ }
96
+ catch {
97
+ body = await response.text().catch(() => null);
98
+ }
99
+ if (response.status === 401) {
100
+ const message = typeof body === 'object' && body && 'message' in body
101
+ ? String(body.message)
102
+ : 'Authentication failed';
103
+ throw new XriftAuthError(message, body);
104
+ }
105
+ const message = typeof body === 'object' && body && 'error' in body
106
+ ? String(body.error)
107
+ : typeof body === 'object' && body && 'message' in body
108
+ ? String(body.message)
109
+ : `Request failed with status ${response.status}`;
110
+ throw new XriftApiError(message, response.status, body);
111
+ }
112
+ }
113
+ //# sourceMappingURL=http-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../../src/api/http-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { HttpClient } from './http-client.js';
2
+ import type { CreateItemResponse, ItemUploadUrlsRequest, ItemUploadUrlsResponse, CompleteItemUploadResponse, ItemUploadOptions, ItemUploadResult } from '../types/items.js';
3
+ import type { UploadFile } from '../types/common.js';
4
+ export declare class ItemsApi {
5
+ private readonly http;
6
+ constructor(http: HttpClient);
7
+ create(): Promise<CreateItemResponse>;
8
+ getUploadUrls(itemId: string, request: ItemUploadUrlsRequest): Promise<ItemUploadUrlsResponse>;
9
+ complete(itemId: string, versionId: string): Promise<CompleteItemUploadResponse>;
10
+ /**
11
+ * アイテムアップロードの統合フロー
12
+ */
13
+ upload(files: UploadFile[], options: ItemUploadOptions): Promise<ItemUploadResult>;
14
+ }
15
+ //# sourceMappingURL=items.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"items.d.ts","sourceRoot":"","sources":["../../../src/api/items.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,KAAK,EACV,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EAEtB,0BAA0B,EAC1B,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,qBAAa,QAAQ;IACP,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,UAAU;IAEvC,MAAM,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAKrC,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,sBAAsB,CAAC;IAQ5B,QAAQ,CACZ,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,0BAA0B,CAAC;IAStC;;OAEG;IACG,MAAM,CACV,KAAK,EAAE,UAAU,EAAE,EACnB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,gBAAgB,CAAC;CAoE7B"}
@@ -0,0 +1,84 @@
1
+ import { ITEMS_BASE_PATH } from '../constants.js';
2
+ import { calculateContentHash } from '../hash.js';
3
+ export class ItemsApi {
4
+ http;
5
+ constructor(http) {
6
+ this.http = http;
7
+ }
8
+ async create() {
9
+ const response = await this.http.post(ITEMS_BASE_PATH, {});
10
+ return response.data;
11
+ }
12
+ async getUploadUrls(itemId, request) {
13
+ const response = await this.http.post(`${ITEMS_BASE_PATH}/${itemId}/upload-urls`, request);
14
+ return response.data;
15
+ }
16
+ async complete(itemId, versionId) {
17
+ const request = { versionId };
18
+ const response = await this.http.post(`${ITEMS_BASE_PATH}/${itemId}/complete`, request);
19
+ return response.data;
20
+ }
21
+ /**
22
+ * アイテムアップロードの統合フロー
23
+ */
24
+ async upload(files, options) {
25
+ // 1. アイテム ID の決定 (既存 or 新規作成)
26
+ let itemId;
27
+ if (options.itemId) {
28
+ itemId = options.itemId;
29
+ }
30
+ else {
31
+ const created = await this.create();
32
+ itemId = created.id;
33
+ }
34
+ // 2. contentHash 計算
35
+ const hashFiles = files.map((f) => ({ remotePath: f.remotePath, data: f.data }));
36
+ const contentHash = await calculateContentHash(hashFiles, {
37
+ permissions: options.permissions,
38
+ });
39
+ // 3. fileSize 計算
40
+ const fileSize = files.reduce((sum, f) => sum + f.size, 0);
41
+ // 4. 署名付き URL 取得
42
+ const uploadUrlsRequest = {
43
+ name: options.name,
44
+ description: options.description,
45
+ thumbnailPath: options.thumbnailPath,
46
+ contentHash,
47
+ fileSize,
48
+ files: files.map((f) => ({
49
+ path: f.remotePath,
50
+ contentType: f.contentType,
51
+ })),
52
+ permissions: options.permissions,
53
+ };
54
+ const urlsResponse = await this.getUploadUrls(itemId, uploadUrlsRequest);
55
+ // 5. ファイルアップロード
56
+ for (let i = 0; i < files.length; i++) {
57
+ const file = files[i];
58
+ const signedUrl = urlsResponse.uploadUrls[i];
59
+ options.onProgress?.({
60
+ completed: i,
61
+ total: files.length,
62
+ currentFile: file.remotePath,
63
+ });
64
+ await this.http.putExternal(signedUrl.uploadUrl, file.data, {
65
+ 'Content-Type': file.contentType,
66
+ });
67
+ }
68
+ options.onProgress?.({
69
+ completed: files.length,
70
+ total: files.length,
71
+ currentFile: '',
72
+ });
73
+ // 6. 完了通知
74
+ await this.complete(itemId, urlsResponse.versionId);
75
+ return {
76
+ itemId,
77
+ versionId: urlsResponse.versionId,
78
+ versionNumber: urlsResponse.versionNumber,
79
+ contentHash,
80
+ files,
81
+ };
82
+ }
83
+ }
84
+ //# sourceMappingURL=items.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"items.js","sourceRoot":"","sources":["../../../src/api/items.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { HttpClient } from './http-client.js';
2
+ import type { CreateWorldResponse, WorldUploadUrlsRequest, WorldUploadUrlsResponse, CompleteWorldUploadResponse, WorldUploadOptions, WorldUploadResult } from '../types/worlds.js';
3
+ import type { UploadFile } from '../types/common.js';
4
+ export declare class WorldsApi {
5
+ private readonly http;
6
+ constructor(http: HttpClient);
7
+ create(): Promise<CreateWorldResponse>;
8
+ getUploadUrls(worldId: string, request: WorldUploadUrlsRequest): Promise<WorldUploadUrlsResponse>;
9
+ complete(worldId: string, versionId: string): Promise<CompleteWorldUploadResponse>;
10
+ /**
11
+ * ワールドアップロードの統合フロー
12
+ */
13
+ upload(files: UploadFile[], options: WorldUploadOptions): Promise<WorldUploadResult>;
14
+ }
15
+ //# sourceMappingURL=worlds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worlds.d.ts","sourceRoot":"","sources":["../../../src/api/worlds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,KAAK,EACV,mBAAmB,EACnB,sBAAsB,EACtB,uBAAuB,EAEvB,2BAA2B,EAC3B,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,UAAU;IAEvC,MAAM,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAKtC,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,uBAAuB,CAAC;IAQ7B,QAAQ,CACZ,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,2BAA2B,CAAC;IASvC;;OAEG;IACG,MAAM,CACV,KAAK,EAAE,UAAU,EAAE,EACnB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC;CA0E9B"}
@@ -0,0 +1,90 @@
1
+ import { WORLDS_BASE_PATH } from '../constants.js';
2
+ import { calculateContentHash } from '../hash.js';
3
+ export class WorldsApi {
4
+ http;
5
+ constructor(http) {
6
+ this.http = http;
7
+ }
8
+ async create() {
9
+ const response = await this.http.post(WORLDS_BASE_PATH, {});
10
+ return response.data;
11
+ }
12
+ async getUploadUrls(worldId, request) {
13
+ const response = await this.http.post(`${WORLDS_BASE_PATH}/${worldId}/upload-urls`, request);
14
+ return response.data;
15
+ }
16
+ async complete(worldId, versionId) {
17
+ const request = { versionId };
18
+ const response = await this.http.post(`${WORLDS_BASE_PATH}/${worldId}/complete`, request);
19
+ return response.data;
20
+ }
21
+ /**
22
+ * ワールドアップロードの統合フロー
23
+ */
24
+ async upload(files, options) {
25
+ // 1. ワールド ID の決定 (既存 or 新規作成)
26
+ let worldId;
27
+ if (options.worldId) {
28
+ worldId = options.worldId;
29
+ }
30
+ else {
31
+ const created = await this.create();
32
+ worldId = created.id;
33
+ }
34
+ // 2. contentHash 計算
35
+ const hashFiles = files.map((f) => ({ remotePath: f.remotePath, data: f.data }));
36
+ const contentHash = await calculateContentHash(hashFiles, {
37
+ physics: options.physics,
38
+ camera: options.camera,
39
+ permissions: options.permissions,
40
+ outputBufferType: options.outputBufferType,
41
+ });
42
+ // 3. fileSize 計算
43
+ const fileSize = files.reduce((sum, f) => sum + f.size, 0);
44
+ // 4. 署名付き URL 取得
45
+ const uploadUrlsRequest = {
46
+ name: options.name,
47
+ description: options.description,
48
+ thumbnailPath: options.thumbnailPath,
49
+ physics: options.physics,
50
+ camera: options.camera,
51
+ permissions: options.permissions,
52
+ outputBufferType: options.outputBufferType,
53
+ contentHash,
54
+ fileSize,
55
+ files: files.map((f) => ({
56
+ path: f.remotePath,
57
+ contentType: f.contentType,
58
+ })),
59
+ };
60
+ const urlsResponse = await this.getUploadUrls(worldId, uploadUrlsRequest);
61
+ // 5. ファイルアップロード
62
+ for (let i = 0; i < files.length; i++) {
63
+ const file = files[i];
64
+ const signedUrl = urlsResponse.uploadUrls[i];
65
+ options.onProgress?.({
66
+ completed: i,
67
+ total: files.length,
68
+ currentFile: file.remotePath,
69
+ });
70
+ await this.http.putExternal(signedUrl.uploadUrl, file.data, {
71
+ 'Content-Type': file.contentType,
72
+ });
73
+ }
74
+ options.onProgress?.({
75
+ completed: files.length,
76
+ total: files.length,
77
+ currentFile: '',
78
+ });
79
+ // 6. 完了通知
80
+ await this.complete(worldId, urlsResponse.versionId);
81
+ return {
82
+ worldId,
83
+ versionId: urlsResponse.versionId,
84
+ versionNumber: urlsResponse.versionNumber,
85
+ contentHash,
86
+ files,
87
+ };
88
+ }
89
+ }
90
+ //# sourceMappingURL=worlds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worlds.js","sourceRoot":"","sources":["../../../src/api/worlds.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { WorldsApi } from './api/worlds.js';
2
+ import { ItemsApi } from './api/items.js';
3
+ export interface XriftClientConfig {
4
+ token: string;
5
+ baseUrl?: string;
6
+ timeout?: number;
7
+ }
8
+ export declare class XriftClient {
9
+ readonly worlds: WorldsApi;
10
+ readonly items: ItemsApi;
11
+ constructor(config: XriftClientConfig);
12
+ }
13
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,WAAW;IACtB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;gBAEb,MAAM,EAAE,iBAAiB;CAUtC"}
@@ -0,0 +1,17 @@
1
+ import { HttpClient } from './api/http-client.js';
2
+ import { WorldsApi } from './api/worlds.js';
3
+ import { ItemsApi } from './api/items.js';
4
+ export class XriftClient {
5
+ worlds;
6
+ items;
7
+ constructor(config) {
8
+ const http = new HttpClient({
9
+ baseUrl: config.baseUrl,
10
+ token: config.token,
11
+ timeout: config.timeout,
12
+ });
13
+ this.worlds = new WorldsApi(http);
14
+ this.items = new ItemsApi(http);
15
+ }
16
+ }
17
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAQ1C,MAAM,OAAO,WAAW;IACb,MAAM,CAAY;IAClB,KAAK,CAAW;IAEzB,YAAY,MAAyB;QACnC,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC;YAC1B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ export declare const DEFAULT_BASE_URL = "https://api.xrift.net";
2
+ export declare const DEFAULT_TIMEOUT = 30000;
3
+ export declare const WORLDS_BASE_PATH = "/api/public/v1/worlds";
4
+ export declare const ITEMS_BASE_PATH = "/api/public/v1/items";
5
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,0BAA0B,CAAC;AACxD,eAAO,MAAM,eAAe,QAAS,CAAC;AAGtC,eAAO,MAAM,gBAAgB,0BAA0B,CAAC;AAGxD,eAAO,MAAM,eAAe,yBAAyB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export const DEFAULT_BASE_URL = 'https://api.xrift.net';
2
+ export const DEFAULT_TIMEOUT = 30_000;
3
+ // Worlds
4
+ export const WORLDS_BASE_PATH = '/api/public/v1/worlds';
5
+ // Items
6
+ export const ITEMS_BASE_PATH = '/api/public/v1/items';
7
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AACxD,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC;AAEtC,SAAS;AACT,MAAM,CAAC,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AAExD,QAAQ;AACR,MAAM,CAAC,MAAM,eAAe,GAAG,sBAAsB,CAAC"}
@@ -0,0 +1,16 @@
1
+ export declare class XriftSdkError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ export declare class XriftApiError extends XriftSdkError {
5
+ readonly statusCode: number;
6
+ readonly responseBody?: unknown;
7
+ constructor(message: string, statusCode: number, responseBody?: unknown);
8
+ }
9
+ export declare class XriftAuthError extends XriftApiError {
10
+ constructor(message?: string, responseBody?: unknown);
11
+ }
12
+ export declare class XriftNetworkError extends XriftSdkError {
13
+ readonly cause?: Error;
14
+ constructor(message?: string, cause?: Error);
15
+ }
16
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,aAAc,SAAQ,aAAa;IAC9C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;gBAEpB,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO;CAMxE;AAED,qBAAa,cAAe,SAAQ,aAAa;gBACnC,OAAO,GAAE,MAAgC,EAAE,YAAY,CAAC,EAAE,OAAO;CAI9E;AAED,qBAAa,iBAAkB,SAAQ,aAAa;IAClD,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;gBAEX,OAAO,GAAE,MAAiC,EAAE,KAAK,CAAC,EAAE,KAAK;CAKtE"}
@@ -0,0 +1,31 @@
1
+ export class XriftSdkError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = 'XriftSdkError';
5
+ }
6
+ }
7
+ export class XriftApiError extends XriftSdkError {
8
+ statusCode;
9
+ responseBody;
10
+ constructor(message, statusCode, responseBody) {
11
+ super(message);
12
+ this.name = 'XriftApiError';
13
+ this.statusCode = statusCode;
14
+ this.responseBody = responseBody;
15
+ }
16
+ }
17
+ export class XriftAuthError extends XriftApiError {
18
+ constructor(message = 'Authentication failed', responseBody) {
19
+ super(message, 401, responseBody);
20
+ this.name = 'XriftAuthError';
21
+ }
22
+ }
23
+ export class XriftNetworkError extends XriftSdkError {
24
+ cause;
25
+ constructor(message = 'Network request failed', cause) {
26
+ super(message);
27
+ this.name = 'XriftNetworkError';
28
+ this.cause = cause;
29
+ }
30
+ }
31
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,aAAa;IACrC,UAAU,CAAS;IACnB,YAAY,CAAW;IAEhC,YAAY,OAAe,EAAE,UAAkB,EAAE,YAAsB;QACrE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,aAAa;IAC/C,YAAY,UAAkB,uBAAuB,EAAE,YAAsB;QAC3E,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IACzC,KAAK,CAAS;IAEvB,YAAY,UAAkB,wBAAwB,EAAE,KAAa;QACnE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import type { FileData } from './types/common.js';
2
+ /**
3
+ * ユニバーサル SHA-256 ハッシュ計算 (先頭12文字)
4
+ * - Node.js: node:crypto (動的 import)
5
+ * - ブラウザ: Web Crypto API (crypto.subtle)
6
+ */
7
+ export declare function calculateContentHash(files: Array<{
8
+ remotePath: string;
9
+ data: FileData;
10
+ }>, configValues?: Record<string, unknown>): Promise<string>;
11
+ //# sourceMappingURL=hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../src/hash.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,KAAK,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,EACpD,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACrC,OAAO,CAAC,MAAM,CAAC,CA6BjB"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * ユニバーサル SHA-256 ハッシュ計算 (先頭12文字)
3
+ * - Node.js: node:crypto (動的 import)
4
+ * - ブラウザ: Web Crypto API (crypto.subtle)
5
+ */
6
+ export async function calculateContentHash(files, configValues) {
7
+ // ファイルをパスでソートして順序を確定
8
+ const sortedFiles = [...files].sort((a, b) => a.remotePath.localeCompare(b.remotePath));
9
+ // 全データを結合
10
+ const chunks = [];
11
+ for (const file of sortedFiles) {
12
+ chunks.push(toUint8Array(file.data));
13
+ }
14
+ // 設定値をハッシュに含める(キーをソートして順序を安定化)
15
+ if (configValues) {
16
+ const configString = JSON.stringify(configValues, (_key, value) => {
17
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
18
+ const sorted = {};
19
+ for (const k of Object.keys(value).sort()) {
20
+ sorted[k] = value[k];
21
+ }
22
+ return sorted;
23
+ }
24
+ return value;
25
+ });
26
+ chunks.push(new TextEncoder().encode(configString));
27
+ }
28
+ const fullHash = await sha256Hex(chunks);
29
+ return fullHash.substring(0, 12);
30
+ }
31
+ function toUint8Array(data) {
32
+ if (data instanceof Uint8Array)
33
+ return data;
34
+ return new Uint8Array(data);
35
+ }
36
+ async function sha256Hex(chunks) {
37
+ // Node.js
38
+ if (typeof globalThis.process !== 'undefined' && globalThis.process.versions?.node) {
39
+ const { createHash } = await import('node:crypto');
40
+ const hash = createHash('sha256');
41
+ for (const chunk of chunks) {
42
+ hash.update(chunk);
43
+ }
44
+ return hash.digest('hex');
45
+ }
46
+ // ブラウザ (Web Crypto API)
47
+ const totalLength = chunks.reduce((sum, c) => sum + c.length, 0);
48
+ const merged = new Uint8Array(totalLength);
49
+ let offset = 0;
50
+ for (const chunk of chunks) {
51
+ merged.set(chunk, offset);
52
+ offset += chunk.length;
53
+ }
54
+ const hashBuffer = await crypto.subtle.digest('SHA-256', merged);
55
+ const hashArray = new Uint8Array(hashBuffer);
56
+ return Array.from(hashArray)
57
+ .map((b) => b.toString(16).padStart(2, '0'))
58
+ .join('');
59
+ }
60
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/hash.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { XriftClient } from './client.js';
2
+ export type { XriftClientConfig } from './client.js';
3
+ export { calculateContentHash } from './hash.js';
4
+ export { getMimeType } from './utils/mime.js';
5
+ export { XriftSdkError, XriftApiError, XriftAuthError, XriftNetworkError, } from './errors.js';
6
+ export type { PhysicsConfig, CameraConfig, OutputBufferType, SignedUrlResponse, FileData, UploadFile, UploadProgress, WorldPermissions, CreateWorldRequest, CreateWorldResponse, WorldUploadUrlsRequest, WorldUploadUrlsResponse, CompleteWorldUploadRequest, CompleteWorldUploadResponse, WorldUploadOptions, WorldUploadResult, ItemPermissions, CreateItemRequest, CreateItemResponse, ItemUploadUrlsRequest, ItemUploadUrlsResponse, CompleteItemUploadRequest, CompleteItemUploadResponse, ItemUploadOptions, ItemUploadResult, } from './types/index.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAGjD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG9C,OAAO,EACL,aAAa,EACb,aAAa,EACb,cAAc,EACd,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAGrB,YAAY,EACV,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,QAAQ,EACR,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EACtB,uBAAuB,EACvB,0BAA0B,EAC1B,2BAA2B,EAC3B,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,yBAAyB,EACzB,0BAA0B,EAC1B,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,9 @@
1
+ // Client
2
+ export { XriftClient } from './client.js';
3
+ // Hash
4
+ export { calculateContentHash } from './hash.js';
5
+ // MIME
6
+ export { getMimeType } from './utils/mime.js';
7
+ // Errors
8
+ export { XriftSdkError, XriftApiError, XriftAuthError, XriftNetworkError, } from './errors.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,SAAS;AACT,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,OAAO;AACP,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAEjD,OAAO;AACP,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,SAAS;AACT,OAAO,EACL,aAAa,EACb,aAAa,EACb,cAAc,EACd,iBAAiB,GAClB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,20 @@
1
+ export interface VerifyTokenResponse {
2
+ valid: boolean;
3
+ user?: {
4
+ id: string;
5
+ email: string;
6
+ displayName: string;
7
+ };
8
+ }
9
+ export interface ExchangeTokenRequest {
10
+ code: string;
11
+ }
12
+ export interface ExchangeTokenResponse {
13
+ token: string;
14
+ user?: {
15
+ id: string;
16
+ email: string;
17
+ displayName: string;
18
+ };
19
+ }
20
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/types/auth.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE;QACL,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE;QACL,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/types/auth.ts"],"names":[],"mappings":""}