coze-coding-dev-sdk 0.3.1 → 0.4.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.
- package/dist/cli/commands/db.d.ts +3 -0
- package/dist/cli/commands/db.d.ts.map +1 -0
- package/dist/cli/commands/db.js +91 -0
- package/dist/cli/commands/db.js.map +1 -0
- package/dist/cli/index.js +4 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/database/client.d.ts +13 -0
- package/dist/database/client.d.ts.map +1 -0
- package/dist/database/client.js +142 -0
- package/dist/database/client.js.map +1 -0
- package/dist/database/index.d.ts +4 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +20 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/migration.d.ts +7 -0
- package/dist/database/migration.d.ts.map +1 -0
- package/dist/database/migration.js +190 -0
- package/dist/database/migration.js.map +1 -0
- package/dist/database/models.d.ts +26 -0
- package/dist/database/models.d.ts.map +1 -0
- package/dist/database/models.js +15 -0
- package/dist/database/models.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/s3/client.d.ts +66 -0
- package/dist/s3/client.d.ts.map +1 -0
- package/dist/s3/client.js +253 -0
- package/dist/s3/client.js.map +1 -0
- package/dist/s3/index.d.ts +3 -0
- package/dist/s3/index.d.ts.map +1 -0
- package/dist/s3/index.js +19 -0
- package/dist/s3/index.js.map +1 -0
- package/dist/s3/models.d.ts +23 -0
- package/dist/s3/models.d.ts.map +1 -0
- package/dist/s3/models.js +15 -0
- package/dist/s3/models.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +11 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,SAAS,SACe,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.dbCommand = void 0;
|
|
40
|
+
const commander_1 = require("commander");
|
|
41
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
42
|
+
const ora_1 = __importDefault(require("ora"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
exports.dbCommand = new commander_1.Command('db')
|
|
45
|
+
.description('Database operations');
|
|
46
|
+
exports.dbCommand
|
|
47
|
+
.command('generate-models')
|
|
48
|
+
.description('Generate ORM models from database schema')
|
|
49
|
+
.option('-o, --output <path>', 'Output file path', 'src/storage/database/shared/schema.ts')
|
|
50
|
+
.option('-v, --verbose', 'Enable verbose output')
|
|
51
|
+
.action(async (options) => {
|
|
52
|
+
const spinner = (0, ora_1.default)('Generating models from database...').start();
|
|
53
|
+
try {
|
|
54
|
+
const { generateModels } = await Promise.resolve().then(() => __importStar(require('../../database')));
|
|
55
|
+
const outputPath = path.resolve(options.output);
|
|
56
|
+
await generateModels({
|
|
57
|
+
outputPath,
|
|
58
|
+
verbose: options.verbose,
|
|
59
|
+
});
|
|
60
|
+
spinner.succeed(chalk_1.default.green(`Models generated at ${outputPath}`));
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
spinner.fail(chalk_1.default.red('Failed to generate models'));
|
|
64
|
+
console.error(chalk_1.default.red(error.message));
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
exports.dbCommand
|
|
69
|
+
.command('upgrade')
|
|
70
|
+
.description('Push schema changes to database')
|
|
71
|
+
.option('-s, --schema <path>', 'Schema file path', 'src/storage/database/shared/schema.ts')
|
|
72
|
+
.option('-p, --project <path>', 'Project root path', process.cwd())
|
|
73
|
+
.option('-v, --verbose', 'Enable verbose output')
|
|
74
|
+
.action(async (options) => {
|
|
75
|
+
const spinner = (0, ora_1.default)('Pushing schema to database...').start();
|
|
76
|
+
try {
|
|
77
|
+
const { upgrade } = await Promise.resolve().then(() => __importStar(require('../../database')));
|
|
78
|
+
await upgrade({
|
|
79
|
+
schemaPath: options.schema,
|
|
80
|
+
projectPath: options.project,
|
|
81
|
+
verbose: options.verbose,
|
|
82
|
+
});
|
|
83
|
+
spinner.succeed(chalk_1.default.green('Database schema updated successfully'));
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
spinner.fail(chalk_1.default.red('Failed to upgrade database'));
|
|
87
|
+
console.error(chalk_1.default.red(error.message));
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
//# sourceMappingURL=db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../../src/cli/commands/db.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yCAAoC;AACpC,kDAA0B;AAC1B,8CAAsB;AACtB,2CAA6B;AAEhB,QAAA,SAAS,GAAG,IAAI,mBAAO,CAAC,IAAI,CAAC;KACvC,WAAW,CAAC,qBAAqB,CAAC,CAAC;AAEtC,iBAAS;KACN,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,EAAE,uCAAuC,CAAC;KAC1F,MAAM,CAAC,eAAe,EAAE,uBAAuB,CAAC;KAChD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,oCAAoC,CAAC,CAAC,KAAK,EAAE,CAAC;IAElE,IAAI,CAAC;QACH,MAAM,EAAE,cAAc,EAAE,GAAG,wDAAa,gBAAgB,GAAC,CAAC;QAE1D,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAEhD,MAAM,cAAc,CAAC;YACnB,UAAU;YACV,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;QAEH,OAAO,CAAC,OAAO,CAAC,eAAK,CAAC,KAAK,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,iBAAS;KACN,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,iCAAiC,CAAC;KAC9C,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,EAAE,uCAAuC,CAAC;KAC1F,MAAM,CAAC,sBAAsB,EAAE,mBAAmB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KAClE,MAAM,CAAC,eAAe,EAAE,uBAAuB,CAAC;KAChD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,+BAA+B,CAAC,CAAC,KAAK,EAAE,CAAC;IAE7D,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,GAAG,wDAAa,gBAAgB,GAAC,CAAC;QAEnD,MAAM,OAAO,CAAC;YACZ,UAAU,EAAE,OAAO,CAAC,MAAM;YAC1B,WAAW,EAAE,OAAO,CAAC,OAAO;YAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;QAEH,OAAO,CAAC,OAAO,CAAC,eAAK,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
package/dist/cli/index.js
CHANGED
|
@@ -6,11 +6,12 @@ const video_1 = require("./commands/video");
|
|
|
6
6
|
const search_1 = require("./commands/search");
|
|
7
7
|
const voice_1 = require("./commands/voice");
|
|
8
8
|
const chat_1 = require("./commands/chat");
|
|
9
|
+
const db_1 = require("./commands/db");
|
|
9
10
|
const program = new commander_1.Command();
|
|
10
11
|
program
|
|
11
12
|
.name('coze-coding-ai')
|
|
12
|
-
.description('Coze Coding CLI - AI-powered tools for image generation, video generation, search, voice, and
|
|
13
|
-
.version('0.
|
|
13
|
+
.description('Coze Coding CLI - AI-powered tools for image generation, video generation, search, voice, chat, and database')
|
|
14
|
+
.version('0.2.0');
|
|
14
15
|
program.addCommand(image_1.imageCommand);
|
|
15
16
|
program.addCommand(video_1.videoCommand);
|
|
16
17
|
program.addCommand(video_1.videoStatusCommand);
|
|
@@ -18,5 +19,6 @@ program.addCommand(search_1.searchCommand);
|
|
|
18
19
|
program.addCommand(voice_1.ttsCommand);
|
|
19
20
|
program.addCommand(voice_1.asrCommand);
|
|
20
21
|
program.addCommand(chat_1.chatCommand);
|
|
22
|
+
program.addCommand(db_1.dbCommand);
|
|
21
23
|
program.parse(process.argv);
|
|
22
24
|
//# sourceMappingURL=index.js.map
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;AAAA,yCAAoC;AACpC,4CAAgD;AAChD,4CAAoE;AACpE,8CAAkD;AAClD,4CAA0D;AAC1D,0CAA8C;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;AAAA,yCAAoC;AACpC,4CAAgD;AAChD,4CAAoE;AACpE,8CAAkD;AAClD,4CAA0D;AAC1D,0CAA8C;AAC9C,sCAA0C;AAE1C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,gBAAgB,CAAC;KACtB,WAAW,CAAC,8GAA8G,CAAC;KAC3H,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO,CAAC,UAAU,CAAC,oBAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,oBAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,0BAAkB,CAAC,CAAC;AACvC,OAAO,CAAC,UAAU,CAAC,sBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,kBAAU,CAAC,CAAC;AAC/B,OAAO,CAAC,UAAU,CAAC,kBAAU,CAAC,CAAC;AAC/B,OAAO,CAAC,UAAU,CAAC,kBAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,cAAS,CAAC,CAAC;AAE9B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database client module
|
|
3
|
+
*/
|
|
4
|
+
import { drizzle } from 'drizzle-orm/node-postgres';
|
|
5
|
+
import pg from 'pg';
|
|
6
|
+
import { DatabasePoolConfig } from './models';
|
|
7
|
+
export declare function loadEnv(): void;
|
|
8
|
+
export declare function getDbUrl(): string;
|
|
9
|
+
export declare function getPool(config?: DatabasePoolConfig): Promise<pg.Pool>;
|
|
10
|
+
export declare function getDb<T extends Record<string, unknown> = Record<string, never>>(schema?: T): Promise<ReturnType<typeof drizzle>>;
|
|
11
|
+
export declare function getClient(): Promise<pg.PoolClient>;
|
|
12
|
+
export declare function closePool(): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/database/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AACpD,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,OAAO,EAAkB,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAI9D,wBAAgB,OAAO,IAAI,IAAI,CAyD9B;AAED,wBAAgB,QAAQ,IAAI,MAAM,CAiBjC;AAsCD,wBAAsB,OAAO,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAM3E;AAED,wBAAsB,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EACnF,MAAM,CAAC,EAAE,CAAC,GACT,OAAO,CAAC,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC,CAMrC;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,CAGxD;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAM/C"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Database client module
|
|
4
|
+
*/
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.loadEnv = loadEnv;
|
|
10
|
+
exports.getDbUrl = getDbUrl;
|
|
11
|
+
exports.getPool = getPool;
|
|
12
|
+
exports.getDb = getDb;
|
|
13
|
+
exports.getClient = getClient;
|
|
14
|
+
exports.closePool = closePool;
|
|
15
|
+
const node_postgres_1 = require("drizzle-orm/node-postgres");
|
|
16
|
+
const pg_1 = __importDefault(require("pg"));
|
|
17
|
+
const child_process_1 = require("child_process");
|
|
18
|
+
const models_1 = require("./models");
|
|
19
|
+
let envLoaded = false;
|
|
20
|
+
function loadEnv() {
|
|
21
|
+
if (envLoaded || process.env.PGDATABASE_URL) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
try {
|
|
26
|
+
require('dotenv').config();
|
|
27
|
+
if (process.env.PGDATABASE_URL) {
|
|
28
|
+
envLoaded = true;
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// dotenv not available
|
|
34
|
+
}
|
|
35
|
+
const pythonCode = `
|
|
36
|
+
import os
|
|
37
|
+
import sys
|
|
38
|
+
try:
|
|
39
|
+
from coze_workload_identity import Client
|
|
40
|
+
client = Client()
|
|
41
|
+
env_vars = client.get_project_env_vars()
|
|
42
|
+
client.close()
|
|
43
|
+
for env_var in env_vars:
|
|
44
|
+
print(f"{env_var.key}={env_var.value}")
|
|
45
|
+
except Exception as e:
|
|
46
|
+
print(f"# Error: {e}", file=sys.stderr)
|
|
47
|
+
`;
|
|
48
|
+
const output = (0, child_process_1.execSync)(`python3 -c '${pythonCode.replace(/'/g, "'\"'\"'")}'`, {
|
|
49
|
+
encoding: 'utf-8',
|
|
50
|
+
timeout: 10000,
|
|
51
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
52
|
+
});
|
|
53
|
+
const lines = output.trim().split('\n');
|
|
54
|
+
for (const line of lines) {
|
|
55
|
+
if (line.startsWith('#'))
|
|
56
|
+
continue;
|
|
57
|
+
const eqIndex = line.indexOf('=');
|
|
58
|
+
if (eqIndex > 0) {
|
|
59
|
+
const key = line.substring(0, eqIndex);
|
|
60
|
+
let value = line.substring(eqIndex + 1);
|
|
61
|
+
if ((value.startsWith("'") && value.endsWith("'")) ||
|
|
62
|
+
(value.startsWith('"') && value.endsWith('"'))) {
|
|
63
|
+
value = value.slice(1, -1);
|
|
64
|
+
}
|
|
65
|
+
if (!process.env[key]) {
|
|
66
|
+
process.env[key] = value;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
envLoaded = true;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// Silently fail
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function getDbUrl() {
|
|
77
|
+
loadEnv();
|
|
78
|
+
let url = process.env.PGDATABASE_URL || '';
|
|
79
|
+
if (!url) {
|
|
80
|
+
throw new Error('Database URL not configured. Set PGDATABASE_URL environment variable.\n' +
|
|
81
|
+
'Did you create a database? You can create one via the Coze Coding platform.');
|
|
82
|
+
}
|
|
83
|
+
if (url.startsWith('postgres://')) {
|
|
84
|
+
url = 'postgresql://' + url.substring('postgres://'.length);
|
|
85
|
+
}
|
|
86
|
+
return url;
|
|
87
|
+
}
|
|
88
|
+
let pool = null;
|
|
89
|
+
let db = null;
|
|
90
|
+
async function createPoolWithRetry(config) {
|
|
91
|
+
const url = getDbUrl();
|
|
92
|
+
const newPool = new pg_1.default.Pool({
|
|
93
|
+
connectionString: url,
|
|
94
|
+
max: config?.maxConnections ?? models_1.DatabaseConfig.MAX_CONNECTIONS,
|
|
95
|
+
idleTimeoutMillis: config?.idleTimeoutMillis ?? models_1.DatabaseConfig.IDLE_TIMEOUT_MILLIS,
|
|
96
|
+
connectionTimeoutMillis: config?.connectionTimeoutMillis ?? models_1.DatabaseConfig.CONNECTION_TIMEOUT_MILLIS,
|
|
97
|
+
});
|
|
98
|
+
const startTime = Date.now();
|
|
99
|
+
let lastError = null;
|
|
100
|
+
while (Date.now() - startTime < models_1.DatabaseConfig.MAX_RETRY_TIME) {
|
|
101
|
+
try {
|
|
102
|
+
const client = await newPool.connect();
|
|
103
|
+
await client.query('SELECT 1');
|
|
104
|
+
client.release();
|
|
105
|
+
return newPool;
|
|
106
|
+
}
|
|
107
|
+
catch (e) {
|
|
108
|
+
lastError = e;
|
|
109
|
+
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
110
|
+
console.warn(`Database connection failed, retrying... (elapsed: ${elapsed}s)`);
|
|
111
|
+
await new Promise((resolve) => setTimeout(resolve, Math.min(1000, models_1.DatabaseConfig.MAX_RETRY_TIME - (Date.now() - startTime))));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
console.error(`Database connection failed after ${models_1.DatabaseConfig.MAX_RETRY_TIME / 1000}s: ${lastError?.message}`);
|
|
115
|
+
throw lastError;
|
|
116
|
+
}
|
|
117
|
+
async function getPool(config) {
|
|
118
|
+
loadEnv();
|
|
119
|
+
if (!pool) {
|
|
120
|
+
pool = await createPoolWithRetry(config);
|
|
121
|
+
}
|
|
122
|
+
return pool;
|
|
123
|
+
}
|
|
124
|
+
async function getDb(schema) {
|
|
125
|
+
if (!db) {
|
|
126
|
+
const p = await getPool();
|
|
127
|
+
db = schema ? (0, node_postgres_1.drizzle)(p, { schema }) : (0, node_postgres_1.drizzle)(p);
|
|
128
|
+
}
|
|
129
|
+
return db;
|
|
130
|
+
}
|
|
131
|
+
async function getClient() {
|
|
132
|
+
const p = await getPool();
|
|
133
|
+
return p.connect();
|
|
134
|
+
}
|
|
135
|
+
async function closePool() {
|
|
136
|
+
if (pool) {
|
|
137
|
+
await pool.end();
|
|
138
|
+
pool = null;
|
|
139
|
+
db = null;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/database/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./client"), exports);
|
|
18
|
+
__exportStar(require("./migration"), exports);
|
|
19
|
+
__exportStar(require("./models"), exports);
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,8CAA4B;AAC5B,2CAAyB"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database migration module
|
|
3
|
+
*/
|
|
4
|
+
import { GenerateModelsOptions, UpgradeOptions } from './models';
|
|
5
|
+
export declare function generateModels(options?: GenerateModelsOptions): Promise<void>;
|
|
6
|
+
export declare function upgrade(options?: UpgradeOptions): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=migration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../src/database/migration.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAkB,MAAM,UAAU,CAAC;AAqBjF,wBAAsB,cAAc,CAAC,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CA4FvF;AAED,wBAAsB,OAAO,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8DzE"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Database migration module
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.generateModels = generateModels;
|
|
40
|
+
exports.upgrade = upgrade;
|
|
41
|
+
const child_process_1 = require("child_process");
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const os = __importStar(require("os"));
|
|
45
|
+
const models_1 = require("./models");
|
|
46
|
+
const client_1 = require("./client");
|
|
47
|
+
/**
|
|
48
|
+
* Fix Drizzle bug: introspect generates numbers beyond JS precision
|
|
49
|
+
* Replace .generatedByDefaultAsIdentity({...}) with .generatedByDefaultAsIdentity()
|
|
50
|
+
*/
|
|
51
|
+
function fixGeneratedIdentity(filePath) {
|
|
52
|
+
if (!fs.existsSync(filePath))
|
|
53
|
+
return;
|
|
54
|
+
let content = fs.readFileSync(filePath, 'utf-8');
|
|
55
|
+
const fixed = content.replace(/\.generatedByDefaultAsIdentity\(\{[^}]*\}\)/g, '.generatedByDefaultAsIdentity()');
|
|
56
|
+
if (fixed !== content) {
|
|
57
|
+
fs.writeFileSync(filePath, fixed);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async function generateModels(options = {}) {
|
|
61
|
+
const { outputPath = models_1.DatabaseConfig.DEFAULT_SCHEMA_PATH, verbose = false, } = options;
|
|
62
|
+
(0, client_1.loadEnv)();
|
|
63
|
+
const dbUrl = (0, client_1.getDbUrl)();
|
|
64
|
+
const outputDir = path.dirname(outputPath);
|
|
65
|
+
if (outputDir && !fs.existsSync(outputDir)) {
|
|
66
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
67
|
+
}
|
|
68
|
+
// Use /tmp for drizzle-kit output, config in parent of outputDir for module resolution
|
|
69
|
+
const tempOutDir = fs.mkdtempSync(path.join(os.tmpdir(), 'drizzle-'));
|
|
70
|
+
const configDir = path.dirname(outputDir); // src/storage/database instead of src/storage/database/shared
|
|
71
|
+
const tempConfigPath = path.join(configDir, `drizzle.config.ts`);
|
|
72
|
+
const drizzleConfig = `
|
|
73
|
+
import { defineConfig } from 'drizzle-kit';
|
|
74
|
+
|
|
75
|
+
export default defineConfig({
|
|
76
|
+
dialect: 'postgresql',
|
|
77
|
+
out: '${tempOutDir}',
|
|
78
|
+
dbCredentials: {
|
|
79
|
+
url: '${dbUrl}',
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
`;
|
|
83
|
+
try {
|
|
84
|
+
fs.writeFileSync(tempConfigPath, drizzleConfig);
|
|
85
|
+
if (verbose) {
|
|
86
|
+
console.log('Introspecting database schema...');
|
|
87
|
+
}
|
|
88
|
+
const cmd = `npx drizzle-kit introspect --config=${tempConfigPath}`;
|
|
89
|
+
if (verbose) {
|
|
90
|
+
console.log(`Running: ${cmd}`);
|
|
91
|
+
}
|
|
92
|
+
(0, child_process_1.execSync)(cmd, {
|
|
93
|
+
encoding: 'utf-8',
|
|
94
|
+
stdio: verbose ? 'inherit' : 'pipe',
|
|
95
|
+
timeout: 60000,
|
|
96
|
+
});
|
|
97
|
+
// Fix Drizzle bug in generated schema
|
|
98
|
+
const generatedSchema = path.join(tempOutDir, 'schema.ts');
|
|
99
|
+
const generatedRelations = path.join(tempOutDir, 'relations.ts');
|
|
100
|
+
if (fs.existsSync(generatedSchema)) {
|
|
101
|
+
fixGeneratedIdentity(generatedSchema);
|
|
102
|
+
fs.copyFileSync(generatedSchema, outputPath);
|
|
103
|
+
if (verbose) {
|
|
104
|
+
console.log(`✓ Copied schema.ts to ${outputDir}/`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (fs.existsSync(generatedRelations)) {
|
|
108
|
+
const relationsPath = path.join(outputDir, 'relations.ts');
|
|
109
|
+
fs.copyFileSync(generatedRelations, relationsPath);
|
|
110
|
+
if (verbose) {
|
|
111
|
+
console.log(`✓ Copied relations.ts to ${outputDir}/`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Git add generated files
|
|
115
|
+
try {
|
|
116
|
+
(0, child_process_1.execSync)('git add -A', {
|
|
117
|
+
encoding: 'utf-8',
|
|
118
|
+
stdio: 'pipe',
|
|
119
|
+
cwd: process.cwd(),
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
// Ignore git errors (might not be in a git repo)
|
|
124
|
+
}
|
|
125
|
+
if (verbose) {
|
|
126
|
+
console.log(`✓ Schema generated successfully`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
finally {
|
|
130
|
+
// Cleanup temp files
|
|
131
|
+
if (fs.existsSync(tempConfigPath)) {
|
|
132
|
+
fs.unlinkSync(tempConfigPath);
|
|
133
|
+
}
|
|
134
|
+
if (fs.existsSync(tempOutDir)) {
|
|
135
|
+
fs.rmSync(tempOutDir, { recursive: true });
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
async function upgrade(options = {}) {
|
|
140
|
+
const { schemaPath = models_1.DatabaseConfig.DEFAULT_SCHEMA_PATH, projectPath = process.cwd(), verbose = false, } = options;
|
|
141
|
+
(0, client_1.loadEnv)();
|
|
142
|
+
const dbUrl = (0, client_1.getDbUrl)();
|
|
143
|
+
const fullSchemaPath = path.isAbsolute(schemaPath)
|
|
144
|
+
? schemaPath
|
|
145
|
+
: path.join(projectPath, schemaPath);
|
|
146
|
+
if (!fs.existsSync(fullSchemaPath)) {
|
|
147
|
+
throw new Error(`Schema file not found: ${fullSchemaPath}`);
|
|
148
|
+
}
|
|
149
|
+
// Config in parent of schema directory for module resolution
|
|
150
|
+
const schemaDir = path.dirname(fullSchemaPath); // src/storage/database/shared
|
|
151
|
+
const configDir = path.dirname(schemaDir); // src/storage/database
|
|
152
|
+
const tempConfigPath = path.join(configDir, `drizzle.config.ts`);
|
|
153
|
+
const drizzleConfig = `
|
|
154
|
+
import { defineConfig } from 'drizzle-kit';
|
|
155
|
+
|
|
156
|
+
export default defineConfig({
|
|
157
|
+
dialect: 'postgresql',
|
|
158
|
+
schema: '${fullSchemaPath}',
|
|
159
|
+
dbCredentials: {
|
|
160
|
+
url: '${dbUrl}',
|
|
161
|
+
},
|
|
162
|
+
});
|
|
163
|
+
`;
|
|
164
|
+
try {
|
|
165
|
+
fs.writeFileSync(tempConfigPath, drizzleConfig);
|
|
166
|
+
if (verbose) {
|
|
167
|
+
console.log('Pushing schema changes to database...');
|
|
168
|
+
}
|
|
169
|
+
// Use --force to skip confirmation
|
|
170
|
+
const cmd = `npx drizzle-kit push --force --config=${tempConfigPath}`;
|
|
171
|
+
if (verbose) {
|
|
172
|
+
console.log(`Running: ${cmd}`);
|
|
173
|
+
}
|
|
174
|
+
(0, child_process_1.execSync)(cmd, {
|
|
175
|
+
encoding: 'utf-8',
|
|
176
|
+
stdio: verbose ? 'inherit' : 'pipe',
|
|
177
|
+
timeout: 120000,
|
|
178
|
+
cwd: projectPath,
|
|
179
|
+
});
|
|
180
|
+
if (verbose) {
|
|
181
|
+
console.log('✅ Database migration completed successfully');
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
finally {
|
|
185
|
+
if (fs.existsSync(tempConfigPath)) {
|
|
186
|
+
fs.unlinkSync(tempConfigPath);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.js","sourceRoot":"","sources":["../../src/database/migration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database module types
|
|
3
|
+
*/
|
|
4
|
+
export declare class DatabaseConfig {
|
|
5
|
+
static readonly MAX_CONNECTIONS = 100;
|
|
6
|
+
static readonly IDLE_TIMEOUT_MILLIS = 30000;
|
|
7
|
+
static readonly CONNECTION_TIMEOUT_MILLIS = 30000;
|
|
8
|
+
static readonly MAX_RETRY_TIME = 20000;
|
|
9
|
+
static readonly DEFAULT_SCHEMA_PATH = "src/storage/database/shared/schema.ts";
|
|
10
|
+
}
|
|
11
|
+
export interface DatabasePoolConfig {
|
|
12
|
+
connectionString?: string;
|
|
13
|
+
maxConnections?: number;
|
|
14
|
+
idleTimeoutMillis?: number;
|
|
15
|
+
connectionTimeoutMillis?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface UpgradeOptions {
|
|
18
|
+
schemaPath?: string;
|
|
19
|
+
projectPath?: string;
|
|
20
|
+
verbose?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface GenerateModelsOptions {
|
|
23
|
+
outputPath?: string;
|
|
24
|
+
verbose?: boolean;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/database/models.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qBAAa,cAAc;IACzB,MAAM,CAAC,QAAQ,CAAC,eAAe,OAAO;IACtC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,SAAS;IAC5C,MAAM,CAAC,QAAQ,CAAC,yBAAyB,SAAS;IAClD,MAAM,CAAC,QAAQ,CAAC,cAAc,SAAS;IACvC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,2CAA2C;CAC/E;AAED,MAAM,WAAW,kBAAkB;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Database module types
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.DatabaseConfig = void 0;
|
|
7
|
+
class DatabaseConfig {
|
|
8
|
+
}
|
|
9
|
+
exports.DatabaseConfig = DatabaseConfig;
|
|
10
|
+
DatabaseConfig.MAX_CONNECTIONS = 100;
|
|
11
|
+
DatabaseConfig.IDLE_TIMEOUT_MILLIS = 30000;
|
|
12
|
+
DatabaseConfig.CONNECTION_TIMEOUT_MILLIS = 30000;
|
|
13
|
+
DatabaseConfig.MAX_RETRY_TIME = 20000;
|
|
14
|
+
DatabaseConfig.DEFAULT_SCHEMA_PATH = 'src/storage/database/shared/schema.ts';
|
|
15
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/database/models.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,MAAa,cAAc;;AAA3B,wCAMC;AALiB,8BAAe,GAAG,GAAG,CAAC;AACtB,kCAAmB,GAAG,KAAK,CAAC;AAC5B,wCAAyB,GAAG,KAAK,CAAC;AAClC,6BAAc,GAAG,KAAK,CAAC;AACvB,kCAAmB,GAAG,uCAAuC,CAAC"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AACtB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AACtB,cAAc,YAAY,CAAC;AAC3B,cAAc,MAAM,CAAC;AACrB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -21,6 +21,8 @@ __exportStar(require("./search"), exports);
|
|
|
21
21
|
__exportStar(require("./voice"), exports);
|
|
22
22
|
__exportStar(require("./video"), exports);
|
|
23
23
|
__exportStar(require("./llm"), exports);
|
|
24
|
+
__exportStar(require("./database"), exports);
|
|
25
|
+
__exportStar(require("./s3"), exports);
|
|
24
26
|
var version_1 = require("./version");
|
|
25
27
|
Object.defineProperty(exports, "VERSION", { enumerable: true, get: function () { return version_1.VERSION; } });
|
|
26
28
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,0CAAwB;AACxB,2CAAyB;AACzB,0CAAwB;AACxB,0CAAwB;AACxB,wCAAsB;AACtB,qCAAoC;AAA3B,kGAAA,OAAO,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,0CAAwB;AACxB,2CAAyB;AACzB,0CAAwB;AACxB,0CAAwB;AACxB,wCAAsB;AACtB,6CAA2B;AAC3B,uCAAqB;AACrB,qCAAoC;AAA3B,kGAAA,OAAO,OAAA"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* S3 Storage client module
|
|
3
|
+
*/
|
|
4
|
+
import { Readable } from 'stream';
|
|
5
|
+
import { S3StorageConfig, ListFilesResult } from './models';
|
|
6
|
+
export declare class S3Storage {
|
|
7
|
+
private endpointUrl;
|
|
8
|
+
private accessKey;
|
|
9
|
+
private secretKey;
|
|
10
|
+
private bucketName;
|
|
11
|
+
private region;
|
|
12
|
+
private client;
|
|
13
|
+
constructor(config?: S3StorageConfig);
|
|
14
|
+
private getClient;
|
|
15
|
+
private generateObjectKey;
|
|
16
|
+
private resolveBucket;
|
|
17
|
+
private validateFileName;
|
|
18
|
+
uploadFile(options: {
|
|
19
|
+
fileContent: Buffer;
|
|
20
|
+
fileName: string;
|
|
21
|
+
contentType?: string;
|
|
22
|
+
bucket?: string;
|
|
23
|
+
}): Promise<string>;
|
|
24
|
+
readFile(options: {
|
|
25
|
+
fileKey: string;
|
|
26
|
+
bucket?: string;
|
|
27
|
+
}): Promise<Buffer>;
|
|
28
|
+
deleteFile(options: {
|
|
29
|
+
fileKey: string;
|
|
30
|
+
bucket?: string;
|
|
31
|
+
}): Promise<boolean>;
|
|
32
|
+
fileExists(options: {
|
|
33
|
+
fileKey: string;
|
|
34
|
+
bucket?: string;
|
|
35
|
+
}): Promise<boolean>;
|
|
36
|
+
listFiles(options?: {
|
|
37
|
+
prefix?: string;
|
|
38
|
+
bucket?: string;
|
|
39
|
+
maxKeys?: number;
|
|
40
|
+
continuationToken?: string;
|
|
41
|
+
}): Promise<ListFilesResult>;
|
|
42
|
+
generatePresignedUrl(options: {
|
|
43
|
+
key: string;
|
|
44
|
+
bucket?: string;
|
|
45
|
+
expireTime?: number;
|
|
46
|
+
}): Promise<string>;
|
|
47
|
+
streamUploadFile(options: {
|
|
48
|
+
stream: Readable;
|
|
49
|
+
fileName: string;
|
|
50
|
+
contentType?: string;
|
|
51
|
+
bucket?: string;
|
|
52
|
+
}): Promise<string>;
|
|
53
|
+
uploadFromUrl(options: {
|
|
54
|
+
url: string;
|
|
55
|
+
bucket?: string;
|
|
56
|
+
timeout?: number;
|
|
57
|
+
}): Promise<string>;
|
|
58
|
+
chunkUploadFile(options: {
|
|
59
|
+
chunks: AsyncIterable<Buffer>;
|
|
60
|
+
fileName: string;
|
|
61
|
+
contentType?: string;
|
|
62
|
+
bucket?: string;
|
|
63
|
+
}): Promise<string>;
|
|
64
|
+
}
|
|
65
|
+
export default S3Storage;
|
|
66
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/s3/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAGlC,OAAO,EAAE,eAAe,EAAY,eAAe,EAAwB,MAAM,UAAU,CAAC;AAM5F,qBAAa,SAAS;IACpB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAyB;gBAE3B,MAAM,GAAE,eAAoB;IAQxC,OAAO,CAAC,SAAS;IA8BjB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,gBAAgB;IAclB,UAAU,CAAC,OAAO,EAAE;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,MAAM,CAAC;IAoBb,QAAQ,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAoBxE,UAAU,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAY3E,UAAU,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAmB3E,SAAS,CAAC,OAAO,GAAE;QACvB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;KACvB,GAAG,OAAO,CAAC,eAAe,CAAC;IA4B3B,oBAAoB,CAAC,OAAO,EAAE;QAClC,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC,MAAM,CAAC;IAmDb,gBAAgB,CAAC,OAAO,EAAE;QAC9B,MAAM,EAAE,QAAQ,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,MAAM,CAAC;IAqBb,aAAa,CAAC,OAAO,EAAE;QAC3B,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,MAAM,CAAC;IAwBb,eAAe,CAAC,OAAO,EAAE;QAC7B,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QAC9B,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,MAAM,CAAC;CAsBpB;AAED,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* S3 Storage client module
|
|
4
|
+
*/
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.S3Storage = void 0;
|
|
10
|
+
const client_s3_1 = require("@aws-sdk/client-s3");
|
|
11
|
+
const lib_storage_1 = require("@aws-sdk/lib-storage");
|
|
12
|
+
const stream_1 = require("stream");
|
|
13
|
+
const crypto_1 = require("crypto");
|
|
14
|
+
const path_1 = __importDefault(require("path"));
|
|
15
|
+
const models_1 = require("./models");
|
|
16
|
+
function getStorageToken() {
|
|
17
|
+
return process.env.COZE_WORKLOAD_IDENTITY_API_KEY || null;
|
|
18
|
+
}
|
|
19
|
+
class S3Storage {
|
|
20
|
+
constructor(config = {}) {
|
|
21
|
+
this.client = null;
|
|
22
|
+
this.endpointUrl = process.env.COZE_BUCKET_ENDPOINT_URL || config.endpointUrl || '';
|
|
23
|
+
this.accessKey = config.accessKey || '';
|
|
24
|
+
this.secretKey = config.secretKey || '';
|
|
25
|
+
this.bucketName = process.env.COZE_BUCKET_NAME || config.bucketName || '';
|
|
26
|
+
this.region = config.region || models_1.S3Config.DEFAULT_REGION;
|
|
27
|
+
}
|
|
28
|
+
getClient() {
|
|
29
|
+
if (!this.client) {
|
|
30
|
+
if (!this.endpointUrl) {
|
|
31
|
+
throw new Error('Storage endpoint not configured: Set COZE_BUCKET_ENDPOINT_URL');
|
|
32
|
+
}
|
|
33
|
+
this.client = new client_s3_1.S3Client({
|
|
34
|
+
endpoint: this.endpointUrl,
|
|
35
|
+
region: this.region,
|
|
36
|
+
credentials: {
|
|
37
|
+
accessKeyId: this.accessKey,
|
|
38
|
+
secretAccessKey: this.secretKey,
|
|
39
|
+
},
|
|
40
|
+
forcePathStyle: true,
|
|
41
|
+
});
|
|
42
|
+
this.client.middlewareStack.add((next) => async (args) => {
|
|
43
|
+
const token = getStorageToken();
|
|
44
|
+
if (token && args.request?.headers) {
|
|
45
|
+
args.request.headers['x-storage-token'] = token;
|
|
46
|
+
}
|
|
47
|
+
return next(args);
|
|
48
|
+
}, { step: 'build', name: 'injectStorageToken' });
|
|
49
|
+
}
|
|
50
|
+
return this.client;
|
|
51
|
+
}
|
|
52
|
+
generateObjectKey(originalName) {
|
|
53
|
+
const ext = path_1.default.extname(originalName).toLowerCase();
|
|
54
|
+
const stem = path_1.default.basename(originalName, ext);
|
|
55
|
+
const uniq = (0, crypto_1.randomUUID)().replace(/-/g, '').slice(0, 8);
|
|
56
|
+
return path_1.default.join(path_1.default.dirname(originalName), `${stem}_${uniq}${ext}`);
|
|
57
|
+
}
|
|
58
|
+
resolveBucket(bucket) {
|
|
59
|
+
const targetBucket = bucket || process.env.COZE_BUCKET_NAME || this.bucketName;
|
|
60
|
+
if (!targetBucket) {
|
|
61
|
+
throw new Error('Bucket not configured: Provide bucket or set COZE_BUCKET_NAME');
|
|
62
|
+
}
|
|
63
|
+
return targetBucket;
|
|
64
|
+
}
|
|
65
|
+
validateFileName(name) {
|
|
66
|
+
const msg = 'Invalid file name: must be 1-1024 bytes, only letters/numbers/._-/, no spaces or special chars, not start/end with /, no //';
|
|
67
|
+
if (!name || !name.trim())
|
|
68
|
+
throw new Error(msg + ' (empty)');
|
|
69
|
+
if (Buffer.byteLength(name, 'utf-8') > 1024)
|
|
70
|
+
throw new Error(msg + ' (>1024 bytes)');
|
|
71
|
+
if (name.startsWith('/') || name.endsWith('/'))
|
|
72
|
+
throw new Error(msg + ' (starts/ends with /)');
|
|
73
|
+
if (name.includes('//'))
|
|
74
|
+
throw new Error(msg + ' (contains //)');
|
|
75
|
+
if (!models_1.FILE_NAME_ALLOWED_RE.test(name)) {
|
|
76
|
+
const bad = name.match(/[^A-Za-z0-9._\-/]/);
|
|
77
|
+
throw new Error(msg + ` (invalid char: ${bad?.[0]})`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async uploadFile(options) {
|
|
81
|
+
const { fileContent, fileName, contentType = 'application/octet-stream', bucket } = options;
|
|
82
|
+
this.validateFileName(fileName);
|
|
83
|
+
const client = this.getClient();
|
|
84
|
+
const objectKey = this.generateObjectKey(fileName);
|
|
85
|
+
const targetBucket = this.resolveBucket(bucket);
|
|
86
|
+
await client.send(new client_s3_1.PutObjectCommand({
|
|
87
|
+
Bucket: targetBucket,
|
|
88
|
+
Key: objectKey,
|
|
89
|
+
Body: fileContent,
|
|
90
|
+
ContentType: contentType,
|
|
91
|
+
}));
|
|
92
|
+
return objectKey;
|
|
93
|
+
}
|
|
94
|
+
async readFile(options) {
|
|
95
|
+
const { fileKey, bucket } = options;
|
|
96
|
+
const client = this.getClient();
|
|
97
|
+
const targetBucket = this.resolveBucket(bucket);
|
|
98
|
+
const response = await client.send(new client_s3_1.GetObjectCommand({ Bucket: targetBucket, Key: fileKey }));
|
|
99
|
+
if (!response.Body) {
|
|
100
|
+
throw new Error('S3 GetObject returned no Body');
|
|
101
|
+
}
|
|
102
|
+
const chunks = [];
|
|
103
|
+
for await (const chunk of response.Body) {
|
|
104
|
+
chunks.push(Buffer.from(chunk));
|
|
105
|
+
}
|
|
106
|
+
return Buffer.concat(chunks);
|
|
107
|
+
}
|
|
108
|
+
async deleteFile(options) {
|
|
109
|
+
const { fileKey, bucket } = options;
|
|
110
|
+
const client = this.getClient();
|
|
111
|
+
const targetBucket = this.resolveBucket(bucket);
|
|
112
|
+
await client.send(new client_s3_1.DeleteObjectCommand({ Bucket: targetBucket, Key: fileKey }));
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
async fileExists(options) {
|
|
116
|
+
const { fileKey, bucket } = options;
|
|
117
|
+
const client = this.getClient();
|
|
118
|
+
const targetBucket = this.resolveBucket(bucket);
|
|
119
|
+
try {
|
|
120
|
+
await client.send(new client_s3_1.HeadObjectCommand({ Bucket: targetBucket, Key: fileKey }));
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
catch (e) {
|
|
124
|
+
if (e.name === 'NotFound' || e.$metadata?.httpStatusCode === 404) {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
console.error('Error checking file existence:', e);
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
async listFiles(options = {}) {
|
|
132
|
+
const { prefix, bucket, maxKeys = models_1.S3Config.DEFAULT_MAX_KEYS, continuationToken } = options;
|
|
133
|
+
if (maxKeys <= 0 || maxKeys > 1000) {
|
|
134
|
+
throw new Error('maxKeys must be between 1 and 1000');
|
|
135
|
+
}
|
|
136
|
+
const client = this.getClient();
|
|
137
|
+
const targetBucket = this.resolveBucket(bucket);
|
|
138
|
+
const response = await client.send(new client_s3_1.ListObjectsV2Command({
|
|
139
|
+
Bucket: targetBucket,
|
|
140
|
+
MaxKeys: maxKeys,
|
|
141
|
+
Prefix: prefix,
|
|
142
|
+
ContinuationToken: continuationToken,
|
|
143
|
+
}));
|
|
144
|
+
const keys = (response.Contents || []).filter((item) => item.Key).map((item) => item.Key);
|
|
145
|
+
return {
|
|
146
|
+
keys,
|
|
147
|
+
isTruncated: response.IsTruncated || false,
|
|
148
|
+
nextContinuationToken: response.NextContinuationToken,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
async generatePresignedUrl(options) {
|
|
152
|
+
const { key, bucket, expireTime = models_1.S3Config.DEFAULT_PRESIGNED_EXPIRE_TIME } = options;
|
|
153
|
+
const token = getStorageToken();
|
|
154
|
+
if (!token) {
|
|
155
|
+
throw new Error('Failed to get x-storage-token: Set COZE_WORKLOAD_IDENTITY_API_KEY');
|
|
156
|
+
}
|
|
157
|
+
const signBase = process.env.COZE_BUCKET_ENDPOINT_URL || this.endpointUrl;
|
|
158
|
+
if (!signBase) {
|
|
159
|
+
throw new Error('Sign endpoint not configured: Set COZE_BUCKET_ENDPOINT_URL');
|
|
160
|
+
}
|
|
161
|
+
const signUrlEndpoint = signBase.replace(/\/$/, '') + '/sign-url';
|
|
162
|
+
const targetBucket = this.resolveBucket(bucket);
|
|
163
|
+
const response = await fetch(signUrlEndpoint, {
|
|
164
|
+
method: 'POST',
|
|
165
|
+
headers: {
|
|
166
|
+
'Content-Type': 'application/json',
|
|
167
|
+
'x-storage-token': token,
|
|
168
|
+
},
|
|
169
|
+
body: JSON.stringify({
|
|
170
|
+
bucket_name: targetBucket,
|
|
171
|
+
path: key,
|
|
172
|
+
expire_time: expireTime,
|
|
173
|
+
}),
|
|
174
|
+
});
|
|
175
|
+
if (!response.ok) {
|
|
176
|
+
throw new Error(`Failed to generate presigned URL: ${response.status}`);
|
|
177
|
+
}
|
|
178
|
+
const text = await response.text();
|
|
179
|
+
const contentType = response.headers.get('content-type') || '';
|
|
180
|
+
if (contentType.includes('application/json') || text.trim().startsWith('{')) {
|
|
181
|
+
try {
|
|
182
|
+
const obj = JSON.parse(text);
|
|
183
|
+
if (obj.data?.url)
|
|
184
|
+
return obj.data.url;
|
|
185
|
+
if (obj.url || obj.signed_url || obj.presigned_url) {
|
|
186
|
+
return obj.url || obj.signed_url || obj.presigned_url;
|
|
187
|
+
}
|
|
188
|
+
throw new Error('Sign service response missing url field');
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
return text;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return text;
|
|
195
|
+
}
|
|
196
|
+
async streamUploadFile(options) {
|
|
197
|
+
const { stream, fileName, contentType = 'application/octet-stream', bucket } = options;
|
|
198
|
+
const client = this.getClient();
|
|
199
|
+
const objectKey = this.generateObjectKey(fileName);
|
|
200
|
+
const targetBucket = this.resolveBucket(bucket);
|
|
201
|
+
const upload = new lib_storage_1.Upload({
|
|
202
|
+
client,
|
|
203
|
+
params: {
|
|
204
|
+
Bucket: targetBucket,
|
|
205
|
+
Key: objectKey,
|
|
206
|
+
Body: stream,
|
|
207
|
+
ContentType: contentType,
|
|
208
|
+
},
|
|
209
|
+
});
|
|
210
|
+
await upload.done();
|
|
211
|
+
return objectKey;
|
|
212
|
+
}
|
|
213
|
+
async uploadFromUrl(options) {
|
|
214
|
+
const { url, bucket, timeout = models_1.S3Config.DEFAULT_UPLOAD_TIMEOUT } = options;
|
|
215
|
+
const controller = new AbortController();
|
|
216
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
217
|
+
try {
|
|
218
|
+
const response = await fetch(url, { signal: controller.signal });
|
|
219
|
+
if (!response.ok) {
|
|
220
|
+
throw new Error(`Failed to fetch URL: ${response.status}`);
|
|
221
|
+
}
|
|
222
|
+
const urlObj = new URL(url);
|
|
223
|
+
const fileName = path_1.default.basename(decodeURIComponent(urlObj.pathname)) || 'file';
|
|
224
|
+
const contentType = response.headers.get('content-type') || 'application/octet-stream';
|
|
225
|
+
const buffer = Buffer.from(await response.arrayBuffer());
|
|
226
|
+
return this.uploadFile({ fileContent: buffer, fileName, contentType, bucket });
|
|
227
|
+
}
|
|
228
|
+
finally {
|
|
229
|
+
clearTimeout(timeoutId);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
async chunkUploadFile(options) {
|
|
233
|
+
const { chunks, fileName, contentType = 'application/octet-stream', bucket } = options;
|
|
234
|
+
const client = this.getClient();
|
|
235
|
+
const objectKey = this.generateObjectKey(fileName);
|
|
236
|
+
const targetBucket = this.resolveBucket(bucket);
|
|
237
|
+
const stream = stream_1.Readable.from(chunks);
|
|
238
|
+
const upload = new lib_storage_1.Upload({
|
|
239
|
+
client,
|
|
240
|
+
params: {
|
|
241
|
+
Bucket: targetBucket,
|
|
242
|
+
Key: objectKey,
|
|
243
|
+
Body: stream,
|
|
244
|
+
ContentType: contentType,
|
|
245
|
+
},
|
|
246
|
+
});
|
|
247
|
+
await upload.done();
|
|
248
|
+
return objectKey;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
exports.S3Storage = S3Storage;
|
|
252
|
+
exports.default = S3Storage;
|
|
253
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/s3/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/s3/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC"}
|
package/dist/s3/index.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./client"), exports);
|
|
18
|
+
__exportStar(require("./models"), exports);
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/s3/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,2CAAyB"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* S3 Storage module types
|
|
3
|
+
*/
|
|
4
|
+
export declare class S3Config {
|
|
5
|
+
static readonly DEFAULT_REGION = "cn-beijing";
|
|
6
|
+
static readonly DEFAULT_MAX_KEYS = 1000;
|
|
7
|
+
static readonly DEFAULT_PRESIGNED_EXPIRE_TIME = 1800;
|
|
8
|
+
static readonly DEFAULT_UPLOAD_TIMEOUT = 30000;
|
|
9
|
+
}
|
|
10
|
+
export interface S3StorageConfig {
|
|
11
|
+
endpointUrl?: string;
|
|
12
|
+
accessKey?: string;
|
|
13
|
+
secretKey?: string;
|
|
14
|
+
bucketName?: string;
|
|
15
|
+
region?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface ListFilesResult {
|
|
18
|
+
keys: string[];
|
|
19
|
+
isTruncated: boolean;
|
|
20
|
+
nextContinuationToken?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare const FILE_NAME_ALLOWED_RE: RegExp;
|
|
23
|
+
//# sourceMappingURL=models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/s3/models.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qBAAa,QAAQ;IACnB,MAAM,CAAC,QAAQ,CAAC,cAAc,gBAAgB;IAC9C,MAAM,CAAC,QAAQ,CAAC,gBAAgB,QAAQ;IACxC,MAAM,CAAC,QAAQ,CAAC,6BAA6B,QAAQ;IACrD,MAAM,CAAC,QAAQ,CAAC,sBAAsB,SAAS;CAChD;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,eAAO,MAAM,oBAAoB,QAAwB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* S3 Storage module types
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.FILE_NAME_ALLOWED_RE = exports.S3Config = void 0;
|
|
7
|
+
class S3Config {
|
|
8
|
+
}
|
|
9
|
+
exports.S3Config = S3Config;
|
|
10
|
+
S3Config.DEFAULT_REGION = 'cn-beijing';
|
|
11
|
+
S3Config.DEFAULT_MAX_KEYS = 1000;
|
|
12
|
+
S3Config.DEFAULT_PRESIGNED_EXPIRE_TIME = 1800;
|
|
13
|
+
S3Config.DEFAULT_UPLOAD_TIMEOUT = 30000;
|
|
14
|
+
exports.FILE_NAME_ALLOWED_RE = /^[A-Za-z0-9._\-/]+$/;
|
|
15
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/s3/models.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,MAAa,QAAQ;;AAArB,4BAKC;AAJiB,uBAAc,GAAG,YAAY,CAAC;AAC9B,yBAAgB,GAAG,IAAI,CAAC;AACxB,sCAA6B,GAAG,IAAI,CAAC;AACrC,+BAAsB,GAAG,KAAK,CAAC;AAiBpC,QAAA,oBAAoB,GAAG,qBAAqB,CAAC"}
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "0.
|
|
1
|
+
export declare const VERSION = "0.2.0";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "coze-coding-dev-sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Coze Coding Dev SDK - 优雅的多功能 AI SDK,支持图片生成、视频生成、语音合成、语音识别、大语言模型和联网搜索",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -64,9 +64,17 @@
|
|
|
64
64
|
"commander": "^14.0.2",
|
|
65
65
|
"ora": "^9.0.0"
|
|
66
66
|
},
|
|
67
|
+
"optionalDependencies": {
|
|
68
|
+
"@aws-sdk/client-s3": "^3.0.0",
|
|
69
|
+
"@aws-sdk/lib-storage": "^3.0.0",
|
|
70
|
+
"drizzle-kit": "^0.30.0",
|
|
71
|
+
"drizzle-orm": "^0.30.0",
|
|
72
|
+
"pg": "^8.0.0"
|
|
73
|
+
},
|
|
67
74
|
"devDependencies": {
|
|
68
|
-
"@types/jest": "^29.
|
|
69
|
-
"@types/node": "^20.
|
|
75
|
+
"@types/jest": "^29.5.14",
|
|
76
|
+
"@types/node": "^20.19.27",
|
|
77
|
+
"@types/pg": "^8.0.0",
|
|
70
78
|
"@typescript-eslint/eslint-plugin": "^6.0.0",
|
|
71
79
|
"@typescript-eslint/parser": "^6.0.0",
|
|
72
80
|
"eslint": "^8.0.0",
|