@timecell/api 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.
- package/dist/routes/crash.d.ts +3 -0
- package/dist/routes/crash.d.ts.map +1 -0
- package/dist/routes/crash.js +8 -0
- package/dist/routes/crash.js.map +1 -0
- package/dist/routes/portfolio.d.ts +3 -0
- package/dist/routes/portfolio.d.ts.map +1 -0
- package/dist/routes/portfolio.js +29 -0
- package/dist/routes/portfolio.js.map +1 -0
- package/dist/routes/price.d.ts +3 -0
- package/dist/routes/price.d.ts.map +1 -0
- package/dist/routes/price.js +25 -0
- package/dist/routes/price.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +32 -0
- package/dist/server.js.map +1 -0
- package/package.json +32 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crash.d.ts","sourceRoot":"","sources":["../../src/routes/crash.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAc/C,wBAAsB,WAAW,CAAC,OAAO,EAAE,eAAe,iBAKzD"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { calculateCrashSurvival, } from "@timecell/engine";
|
|
2
|
+
export async function crashRoutes(fastify) {
|
|
3
|
+
fastify.post("/crash-survival", async (request) => {
|
|
4
|
+
const { portfolio, hedgePositions = [], config = {} } = request.body;
|
|
5
|
+
return calculateCrashSurvival(portfolio, hedgePositions, config);
|
|
6
|
+
});
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=crash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crash.js","sourceRoot":"","sources":["../../src/routes/crash.ts"],"names":[],"mappings":"AACA,OAAO,EACN,sBAAsB,GAItB,MAAM,kBAAkB,CAAC;AAQ1B,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAwB;IACzD,OAAO,CAAC,IAAI,CAA8B,iBAAiB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC9E,MAAM,EAAE,SAAS,EAAE,cAAc,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;QACrE,OAAO,sBAAsB,CAAC,SAAS,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portfolio.d.ts","sourceRoot":"","sources":["../../src/routes/portfolio.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AA4B/C,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,iBAS7D"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { DEMO_PORTFOLIO, DEMO_HEDGE_POSITIONS } from "@timecell/engine";
|
|
2
|
+
import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
const CONFIG_DIR = join(homedir(), ".timecell");
|
|
6
|
+
const PORTFOLIO_PATH = join(CONFIG_DIR, "portfolio.json");
|
|
7
|
+
async function loadPortfolio() {
|
|
8
|
+
try {
|
|
9
|
+
const data = await readFile(PORTFOLIO_PATH, "utf-8");
|
|
10
|
+
return JSON.parse(data);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return { portfolio: DEMO_PORTFOLIO, hedgePositions: DEMO_HEDGE_POSITIONS };
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
async function savePortfolio(data) {
|
|
17
|
+
await mkdir(CONFIG_DIR, { recursive: true });
|
|
18
|
+
await writeFile(PORTFOLIO_PATH, JSON.stringify(data, null, 2));
|
|
19
|
+
}
|
|
20
|
+
export async function portfolioRoutes(fastify) {
|
|
21
|
+
fastify.get("/portfolio", async () => {
|
|
22
|
+
return loadPortfolio();
|
|
23
|
+
});
|
|
24
|
+
fastify.post("/portfolio", async (request) => {
|
|
25
|
+
await savePortfolio(request.body);
|
|
26
|
+
return { saved: true };
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=portfolio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portfolio.js","sourceRoot":"","sources":["../../src/routes/portfolio.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAA2C,MAAM,kBAAkB,CAAC;AACjH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAChD,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;AAO1D,KAAK,UAAU,aAAa;IAC3B,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,oBAAoB,EAAE,CAAC;IAC5E,CAAC;AACF,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAoB;IAChD,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAwB;IAC7D,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;QACpC,OAAO,aAAa,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,IAAI,CAA2B,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACtE,MAAM,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAClC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"price.d.ts","sourceRoot":"","sources":["../../src/routes/price.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAkB/C,wBAAsB,WAAW,CAAC,OAAO,EAAE,eAAe,iBASzD"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { DEMO_BTC_PRICE } from "@timecell/engine";
|
|
2
|
+
let cachedPrice = { price: DEMO_BTC_PRICE, source: "default", updatedAt: new Date().toISOString() };
|
|
3
|
+
async function fetchLivePrice() {
|
|
4
|
+
try {
|
|
5
|
+
const res = await fetch("https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=usd");
|
|
6
|
+
if (!res.ok)
|
|
7
|
+
return null;
|
|
8
|
+
const data = await res.json();
|
|
9
|
+
return data?.bitcoin?.usd ?? null;
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export async function priceRoutes(fastify) {
|
|
16
|
+
fastify.get("/price", async () => {
|
|
17
|
+
// Try live price, fall back to cached/default
|
|
18
|
+
const live = await fetchLivePrice();
|
|
19
|
+
if (live) {
|
|
20
|
+
cachedPrice = { price: live, source: "coingecko", updatedAt: new Date().toISOString() };
|
|
21
|
+
}
|
|
22
|
+
return cachedPrice;
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=price.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"price.js","sourceRoot":"","sources":["../../src/routes/price.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,IAAI,WAAW,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;AAEpG,KAAK,UAAU,cAAc;IAC5B,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,MAAM,KAAK,CACtB,6EAA6E,CAC7E,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAwB;IACzD,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QAChC,8CAA8C;QAC9C,MAAM,IAAI,GAAG,MAAM,cAAc,EAAE,CAAC;QACpC,IAAI,IAAI,EAAE,CAAC;YACV,WAAW,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;QACzF,CAAC;QACD,OAAO,WAAW,CAAC;IACpB,CAAC,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare function buildServer(): Promise<import("fastify").FastifyInstance<import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>, import("node:http").IncomingMessage, import("node:http").ServerResponse<import("node:http").IncomingMessage>, import("fastify").FastifyBaseLogger, import("fastify").FastifyTypeProviderDefault>>;
|
|
2
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAMA,wBAAsB,WAAW,mWAchC"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import Fastify from "fastify";
|
|
2
|
+
import cors from "@fastify/cors";
|
|
3
|
+
import { crashRoutes } from "./routes/crash.js";
|
|
4
|
+
import { portfolioRoutes } from "./routes/portfolio.js";
|
|
5
|
+
import { priceRoutes } from "./routes/price.js";
|
|
6
|
+
export async function buildServer() {
|
|
7
|
+
const fastify = Fastify({ logger: true });
|
|
8
|
+
await fastify.register(cors, { origin: true });
|
|
9
|
+
// API routes
|
|
10
|
+
await fastify.register(crashRoutes, { prefix: "/api" });
|
|
11
|
+
await fastify.register(portfolioRoutes, { prefix: "/api" });
|
|
12
|
+
await fastify.register(priceRoutes, { prefix: "/api" });
|
|
13
|
+
// Health check
|
|
14
|
+
fastify.get("/api/health", async () => ({ status: "ok", version: "0.1.0" }));
|
|
15
|
+
return fastify;
|
|
16
|
+
}
|
|
17
|
+
// Direct execution (dev mode)
|
|
18
|
+
const isDirectRun = process.argv[1]?.endsWith("src/server.ts") ||
|
|
19
|
+
process.argv[1]?.endsWith("dist/server.js");
|
|
20
|
+
if (isDirectRun) {
|
|
21
|
+
buildServer().then(async (server) => {
|
|
22
|
+
try {
|
|
23
|
+
await server.listen({ port: 3737, host: "0.0.0.0" });
|
|
24
|
+
console.log("TimeCell API running on http://localhost:3737");
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
server.log.error(err);
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,IAAI,MAAM,eAAe,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,WAAW;IAChC,MAAM,OAAO,GAAG,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1C,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/C,aAAa;IACb,MAAM,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACxD,MAAM,OAAO,CAAC,QAAQ,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,MAAM,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAExD,eAAe;IACf,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAE7E,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,8BAA8B;AAC9B,MAAM,WAAW,GAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC;IAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAC;AAC7C,IAAI,WAAW,EAAE,CAAC;IACjB,WAAW,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QACnC,IAAI,CAAC;YACJ,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACF,CAAC,CAAC,CAAC;AACJ,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@timecell/api",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "TimeCell API server",
|
|
6
|
+
"main": "dist/server.js",
|
|
7
|
+
"types": "dist/server.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/server.d.ts",
|
|
11
|
+
"import": "./dist/server.js",
|
|
12
|
+
"default": "./dist/server.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": ["dist"],
|
|
16
|
+
"publishConfig": {
|
|
17
|
+
"access": "public"
|
|
18
|
+
},
|
|
19
|
+
"scripts": {
|
|
20
|
+
"dev": "tsx watch src/server.ts",
|
|
21
|
+
"build": "tsc"
|
|
22
|
+
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"@timecell/engine": "*",
|
|
25
|
+
"fastify": "^5",
|
|
26
|
+
"@fastify/cors": "latest"
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"@types/node": "latest",
|
|
30
|
+
"tsx": "latest"
|
|
31
|
+
}
|
|
32
|
+
}
|