tanksync 1.0.4 → 1.0.5
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/config.d.ts.map +1 -1
- package/dist/config.js +7 -2
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -14
- package/dist/index.js.map +1 -1
- package/dist/payload-worker.d.ts +1 -2
- package/dist/payload-worker.d.ts.map +1 -1
- package/dist/payload-worker.js +48 -36
- package/dist/payload-worker.js.map +1 -1
- package/package.json +1 -1
- package/sample-payload.js +0 -213
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAYjD,qBAAa,MAAM;IACjB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;gBAEhB,UAAU,CAAC,EAAE,YAAY;IA6DrC,OAAO,CAAC,QAAQ;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAYjD,qBAAa,MAAM;IACjB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;gBAEhB,UAAU,CAAC,EAAE,YAAY;IA6DrC,OAAO,CAAC,QAAQ;IA4BhB,MAAM;;;;;;;;;CAWP"}
|
package/dist/config.js
CHANGED
|
@@ -73,8 +73,13 @@ class Config {
|
|
|
73
73
|
if (!this.payloadUrl) {
|
|
74
74
|
throw new Error('TANKSYNC_PAYLOAD_URL is required');
|
|
75
75
|
}
|
|
76
|
-
|
|
77
|
-
|
|
76
|
+
// Allow HTTPS URLs or local file paths (file://, /path, or C:\path on Windows)
|
|
77
|
+
const isLocalFile = this.payloadUrl.startsWith('file://') ||
|
|
78
|
+
this.payloadUrl.startsWith('/') ||
|
|
79
|
+
/^[A-Z]:/i.test(this.payloadUrl);
|
|
80
|
+
const isHttps = this.payloadUrl.startsWith('https://');
|
|
81
|
+
if (!isHttps && !isLocalFile) {
|
|
82
|
+
throw new Error('TANKSYNC_PAYLOAD_URL must use HTTPS or be a local file path');
|
|
78
83
|
}
|
|
79
84
|
if (this.downloadTimeout <= 0) {
|
|
80
85
|
throw new Error('downloadTimeout must be greater than 0');
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;AAEH,4CAAoB;AACpB,gDAAwB;AAGxB,MAAM,cAAc,GAAG;IACrB,UAAU,EAAE,sDAAsD;IAClE,cAAc,EAAE,OAAO;IACvB,gBAAgB,EAAE,cAAc;IAChC,eAAe,EAAE,KAAK,EAAY,aAAa;IAC/C,cAAc,EAAE,KAAK,EAAc,aAAa;IAChD,cAAc,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAG,OAAO;IAC1C,QAAQ,EAAE,MAAkB;CAC7B,CAAC;AAEF,MAAa,MAAM;IAUjB,YAAY,UAAyB;QACnC,gEAAgE;QAChE,IAAI,CAAC,UAAU;YACb,UAAU,EAAE,UAAU;gBACtB,OAAO,CAAC,GAAG,CAAC,oBAAoB;gBAChC,cAAc,CAAC,UAAU,CAAC;QAE5B,wBAAwB;QACxB,IAAI,CAAC,cAAc;YACjB,UAAU,EAAE,cAAc;gBAC1B,OAAO,CAAC,GAAG,CAAC,wBAAwB;gBACpC,cAAc,CAAC,cAAc,CAAC;QAEhC,0BAA0B;QAC1B,IAAI,CAAC,gBAAgB;YACnB,UAAU,EAAE,gBAAgB;gBAC5B,OAAO,CAAC,GAAG,CAAC,0BAA0B;gBACtC,cAAc,CAAC,gBAAgB,CAAC;QAElC,wBAAwB;QACxB,IAAI,CAAC,QAAQ;YACX,UAAU,EAAE,QAAQ;gBACpB,OAAO,CAAC,GAAG,CAAC,kBAAkB;gBAC9B,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QAEhD,iBAAiB;QACjB,IAAI,CAAC,eAAe;YAClB,UAAU,EAAE,eAAe,KAAK,SAAS;gBACvC,CAAC,CAAC,UAAU,CAAC,eAAe;gBAC5B,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,EAAE,EAAE,EAAE,CAAC;oBACzD,cAAc,CAAC,eAAe,CAAC;QAErC,IAAI,CAAC,cAAc;YACjB,UAAU,EAAE,cAAc,KAAK,SAAS;gBACtC,CAAC,CAAC,UAAU,CAAC,cAAc;gBAC3B,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE,EAAE,EAAE,CAAC;oBACxD,cAAc,CAAC,cAAc,CAAC;QAEpC,yBAAyB;QACzB,IAAI,CAAC,cAAc;YACjB,UAAU,EAAE,cAAc,KAAK,SAAS;gBACtC,CAAC,CAAC,UAAU,CAAC,cAAc;gBAC3B,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,EAAE,EAAE,EAAE,CAAC;oBACzD,cAAc,CAAC,cAAc,CAAC;QAEpC,kBAAkB;QAClB,MAAM,QAAQ,GAAG,CACf,UAAU,EAAE,QAAQ;YACpB,OAAO,CAAC,GAAG,CAAC,kBAAkB;YAC9B,cAAc,CAAC,QAAQ,CACxB,CAAC,WAAW,EAAE,CAAC;QAEhB,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3D,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,GAAG,QAAoB,CAAC;QACvC,CAAC;QAED,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAEO,QAAQ;QACd,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGxE,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,aAAa,CAAS;gBAElB,UAAU,CAAC,EAAE,YAAY;IAcrC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGxE,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,aAAa,CAAS;gBAElB,UAAU,CAAC,EAAE,YAAY;IAcrC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgFjC;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAwCrE;;OAEG;IACH,SAAS,IAAI;QACX,aAAa,EAAE,OAAO,CAAC;QACvB,YAAY,CAAC,EAAE;YACb,OAAO,EAAE,OAAO,CAAC;YACjB,OAAO,EAAE,OAAO,CAAC;YACjB,eAAe,EAAE,MAAM,CAAC;SACzB,CAAC;QACF,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACjC;IAQD;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC;QAC7B,QAAQ,EAAE,OAAO,CAAC;QAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,QAAQ,EAAE,GAAG,CAAC;KACf,CAAC;IAIF;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAKjC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAmB7B;AAGD,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -35,23 +35,38 @@ class GamePayloadClient {
|
|
|
35
35
|
this.logger.info('Initializing GamePayloadClient...');
|
|
36
36
|
// Step 1: Initialize cache
|
|
37
37
|
await this.cache.initialize();
|
|
38
|
-
// Step 2: Check if payload is cached
|
|
39
|
-
const isCached = await this.cache.isCached(this.config.payloadVersion, this.config.payloadSignature);
|
|
40
38
|
const payloadPath = this.cache.getPayloadPath();
|
|
41
|
-
if (
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
);
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
await
|
|
51
|
-
this.logger.info('
|
|
39
|
+
// Check if payloadUrl is a local file path (starts with file:// or is an absolute path)
|
|
40
|
+
const isLocalFile = this.config.payloadUrl.startsWith('file://') ||
|
|
41
|
+
this.config.payloadUrl.startsWith('/') ||
|
|
42
|
+
/^[A-Z]:/i.test(this.config.payloadUrl);
|
|
43
|
+
if (isLocalFile) {
|
|
44
|
+
// Handle local file - copy directly without download
|
|
45
|
+
const fs = require('fs').promises;
|
|
46
|
+
const sourcePath = this.config.payloadUrl.replace('file://', '');
|
|
47
|
+
this.logger.info('Using local payload file:', sourcePath);
|
|
48
|
+
await fs.copyFile(sourcePath, payloadPath);
|
|
49
|
+
this.logger.info('Local payload copied to cache');
|
|
52
50
|
}
|
|
53
51
|
else {
|
|
54
|
-
|
|
52
|
+
// Handle remote URL - download normally
|
|
53
|
+
// Step 2: Check if payload is cached
|
|
54
|
+
const isCached = await this.cache.isCached(this.config.payloadVersion, this.config.payloadSignature);
|
|
55
|
+
if (!isCached) {
|
|
56
|
+
// Step 3: Download payload if needed
|
|
57
|
+
await this.downloader.downloadIfNeeded(this.config.payloadUrl, payloadPath, true // Force download if not cached
|
|
58
|
+
);
|
|
59
|
+
// Step 4: Verify payload signature
|
|
60
|
+
await this.verifier.verifySignature(payloadPath, this.config.payloadSignature);
|
|
61
|
+
// Step 5: Verify payload format
|
|
62
|
+
await this.verifier.verifyFormat(payloadPath);
|
|
63
|
+
// Step 6: Save metadata
|
|
64
|
+
await this.cache.saveMetadata(this.config.payloadVersion, this.config.payloadSignature);
|
|
65
|
+
this.logger.info('Payload downloaded, verified, and cached');
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
this.logger.info('Using cached payload');
|
|
69
|
+
}
|
|
55
70
|
}
|
|
56
71
|
// Step 7: Start worker process
|
|
57
72
|
this.worker = new payload_worker_1.PayloadWorker(this.logger, payloadPath, this.config.requestTimeout);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,qCAAkC;AAClC,qCAAkC;AAClC,6DAAyD;AACzD,yDAAqD;AACrD,mDAA+C;AAC/C,qDAAiD;AAEjD,qCAAyC;AAEzC,MAAa,iBAAiB;IAS5B,YAAY,UAAyB;QAH7B,WAAM,GAAyB,IAAI,CAAC;QACpC,kBAAa,GAAG,KAAK,CAAC;QAG5B,IAAI,CAAC,MAAM,GAAG,IAAI,eAAM,CAAC,UAAU,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,GAAG,IAAI,eAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,UAAU,GAAG,IAAI,sCAAiB,CACrC,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,MAAM,CAAC,eAAe,EAC3B,IAAI,CAAC,MAAM,CAAC,cAAc,CAC3B,CAAC;QACF,IAAI,CAAC,QAAQ,GAAG,IAAI,kCAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK,GAAG,IAAI,4BAAY,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEjE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,4CAA4C,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACxF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;YAEtD,2BAA2B;YAC3B,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YAE9B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,qCAAkC;AAClC,qCAAkC;AAClC,6DAAyD;AACzD,yDAAqD;AACrD,mDAA+C;AAC/C,qDAAiD;AAEjD,qCAAyC;AAEzC,MAAa,iBAAiB;IAS5B,YAAY,UAAyB;QAH7B,WAAM,GAAyB,IAAI,CAAC;QACpC,kBAAa,GAAG,KAAK,CAAC;QAG5B,IAAI,CAAC,MAAM,GAAG,IAAI,eAAM,CAAC,UAAU,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,GAAG,IAAI,eAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,UAAU,GAAG,IAAI,sCAAiB,CACrC,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,MAAM,CAAC,eAAe,EAC3B,IAAI,CAAC,MAAM,CAAC,cAAc,CAC3B,CAAC;QACF,IAAI,CAAC,QAAQ,GAAG,IAAI,kCAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK,GAAG,IAAI,4BAAY,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEjE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,4CAA4C,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACxF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;YAEtD,2BAA2B;YAC3B,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YAE9B,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;YAEhD,wFAAwF;YACxF,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC;gBAC7C,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC;gBACtC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAE3D,IAAI,WAAW,EAAE,CAAC;gBAChB,qDAAqD;gBACrD,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC;gBAClC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;gBACjE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,UAAU,CAAC,CAAC;gBAC1D,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;gBAC3C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YACpD,CAAC;iBAAM,CAAC;gBACN,wCAAwC;gBACxC,qCAAqC;gBACrC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CACxC,IAAI,CAAC,MAAM,CAAC,cAAc,EAC1B,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAC7B,CAAC;gBAEF,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,qCAAqC;oBACrC,MAAM,IAAI,CAAC,UAAU,CAAC,gBAAgB,CACpC,IAAI,CAAC,MAAM,CAAC,UAAU,EACtB,WAAW,EACX,IAAI,CAAC,+BAA+B;qBACrC,CAAC;oBAEF,mCAAmC;oBACnC,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CACjC,WAAW,EACX,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAC7B,CAAC;oBAEF,gCAAgC;oBAChC,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;oBAE9C,wBAAwB;oBACxB,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAC3B,IAAI,CAAC,MAAM,CAAC,cAAc,EAC1B,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAC7B,CAAC;oBAEF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;gBAC/D,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;YAED,+BAA+B;YAC/B,IAAI,CAAC,MAAM,GAAG,IAAI,8BAAa,CAC7B,IAAI,CAAC,MAAM,EACX,WAAW,EACX,IAAI,CAAC,MAAM,CAAC,cAAc,CAC3B,CAAC;YAEF,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAE1B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QACjE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;YACnD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,OAAwB;QACzC,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACxC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,iBAAiB;gBACxB,OAAO,EAAE,iDAAiD;aAC3D,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;YAErE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAEvD,MAAM,cAAc,GAAmB;gBACrC,OAAO,EAAE,IAAI;gBACb,GAAG,MAAM;aACV,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC;YACtE,OAAO,cAAc,CAAC;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;YAE7C,IAAI,KAAK,YAAY,sBAAa,EAAE,CAAC;gBACnC,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,KAAK,CAAC,IAAI;oBACjB,OAAO,EAAE,KAAK,CAAC,OAAO;iBACvB,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,eAAe;gBACtB,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;aACvB,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,SAAS;QASP,OAAO;YACL,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE;YACtC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;SAC7B,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QAKjB,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YAE9C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC/B,CAAC;YAED,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;YACnD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAjND,8CAiNC;AAID,mCAAyC;AAAhC,uGAAA,aAAa,OAAA"}
|
package/dist/payload-worker.d.ts
CHANGED
|
@@ -11,7 +11,6 @@ export declare class PayloadWorker {
|
|
|
11
11
|
private process;
|
|
12
12
|
private isReady;
|
|
13
13
|
private pendingRequests;
|
|
14
|
-
private lineBuffer;
|
|
15
14
|
constructor(logger: Logger, payloadPath: string, requestTimeout: number);
|
|
16
15
|
/**
|
|
17
16
|
* Start worker process and wait for ready signal
|
|
@@ -22,7 +21,7 @@ export declare class PayloadWorker {
|
|
|
22
21
|
*/
|
|
23
22
|
purchaseItem(request: PurchaseRequest): Promise<any>;
|
|
24
23
|
/**
|
|
25
|
-
* Send generic request to worker
|
|
24
|
+
* Send generic request to worker via stdin
|
|
26
25
|
*/
|
|
27
26
|
sendRequest(request: IPCRequest): Promise<any>;
|
|
28
27
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payload-worker.d.ts","sourceRoot":"","sources":["../src/payload-worker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,EAEL,UAAU,EACV,eAAe,EAEhB,MAAM,SAAS,CAAC;AASjB,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,eAAe,CAAyB;
|
|
1
|
+
{"version":3,"file":"payload-worker.d.ts","sourceRoot":"","sources":["../src/payload-worker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,EAEL,UAAU,EACV,eAAe,EAEhB,MAAM,SAAS,CAAC;AASjB,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,eAAe,CAAyB;gBAEpC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM;IAMvE;;OAEG;IACG,KAAK,CAAC,gBAAgB,GAAE,MAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IA6D3D;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC;IAS1D;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IA8BpD;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAyD5B;;OAEG;IACH,OAAO,CAAC,aAAa;IAyBrB;;OAEG;IACG,QAAQ,CAAC,OAAO,GAAE,MAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBrD;;OAEG;IACH,SAAS,IAAI;QACX,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,OAAO,CAAC;QACjB,eAAe,EAAE,MAAM,CAAC;KACzB;CAOF"}
|
package/dist/payload-worker.js
CHANGED
|
@@ -13,7 +13,6 @@ class PayloadWorker {
|
|
|
13
13
|
this.process = null;
|
|
14
14
|
this.isReady = false;
|
|
15
15
|
this.pendingRequests = new Map();
|
|
16
|
-
this.lineBuffer = '';
|
|
17
16
|
this.logger = logger;
|
|
18
17
|
this.payloadPath = payloadPath;
|
|
19
18
|
this.requestTimeout = requestTimeout;
|
|
@@ -25,41 +24,51 @@ class PayloadWorker {
|
|
|
25
24
|
this.logger.info('Starting payload worker process');
|
|
26
25
|
return new Promise((resolve, reject) => {
|
|
27
26
|
try {
|
|
27
|
+
// Use spawn() with detached: true for true independence
|
|
28
|
+
// Worker becomes separate process group (survives parent termination)
|
|
28
29
|
this.process = (0, child_process_1.spawn)('node', [this.payloadPath], {
|
|
29
30
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
30
|
-
|
|
31
|
-
detached: true,
|
|
31
|
+
detached: true
|
|
32
32
|
});
|
|
33
33
|
if (!this.process) {
|
|
34
34
|
throw new errors_1.WorkerStartupError('Failed to spawn child process');
|
|
35
35
|
}
|
|
36
|
+
// Unref to allow parent to exit without waiting for child
|
|
36
37
|
this.process.unref();
|
|
37
|
-
this.process.stdin?.unref();
|
|
38
|
-
this.process.stdout?.unref();
|
|
39
|
-
this.process.stderr?.unref();
|
|
40
38
|
const handshakeTimer = setTimeout(() => {
|
|
41
39
|
this.process?.kill();
|
|
42
40
|
this.process = null;
|
|
43
41
|
reject(new errors_1.WorkerHandshakeTimeoutError(handshakeTimeout));
|
|
44
42
|
}, handshakeTimeout);
|
|
45
43
|
this.setupProcessHandlers();
|
|
46
|
-
// Listen for ready signal
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
44
|
+
// Listen for ready signal via stdout
|
|
45
|
+
let stdoutBuffer = '';
|
|
46
|
+
const stdoutHandler = (data) => {
|
|
47
|
+
stdoutBuffer += data.toString();
|
|
48
|
+
const lines = stdoutBuffer.split('\n');
|
|
49
|
+
stdoutBuffer = lines.pop() || '';
|
|
50
|
+
for (const line of lines) {
|
|
51
|
+
if (line.trim()) {
|
|
52
|
+
try {
|
|
53
|
+
const msg = JSON.parse(line);
|
|
54
|
+
if (msg.type === 'ready' && !this.isReady) {
|
|
55
|
+
this.process.stdout?.removeListener('data', stdoutHandler);
|
|
56
|
+
clearTimeout(handshakeTimer);
|
|
57
|
+
this.isReady = true;
|
|
58
|
+
this.logger.info('Worker ready, version:', msg.version);
|
|
59
|
+
resolve();
|
|
60
|
+
}
|
|
61
|
+
else if (msg.id) {
|
|
62
|
+
this.handleMessage(msg);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
// Ignore parse errors from non-JSON output
|
|
67
|
+
}
|
|
56
68
|
}
|
|
57
69
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
reject(new errors_1.WorkerStartupError(`Failed to parse ready signal: ${error}`));
|
|
61
|
-
}
|
|
62
|
-
});
|
|
70
|
+
};
|
|
71
|
+
this.process.stdout?.on('data', stdoutHandler);
|
|
63
72
|
}
|
|
64
73
|
catch (error) {
|
|
65
74
|
reject(new errors_1.WorkerStartupError(`Failed to start worker: ${error}`));
|
|
@@ -77,7 +86,7 @@ class PayloadWorker {
|
|
|
77
86
|
return this.sendRequest(ipcRequest);
|
|
78
87
|
}
|
|
79
88
|
/**
|
|
80
|
-
* Send generic request to worker
|
|
89
|
+
* Send generic request to worker via stdin
|
|
81
90
|
*/
|
|
82
91
|
async sendRequest(request) {
|
|
83
92
|
if (!this.isReady || !this.process) {
|
|
@@ -95,8 +104,8 @@ class PayloadWorker {
|
|
|
95
104
|
timestamp: Date.now(),
|
|
96
105
|
});
|
|
97
106
|
try {
|
|
98
|
-
|
|
99
|
-
this.process.stdin.write(
|
|
107
|
+
// Send via stdin
|
|
108
|
+
this.process.stdin.write(JSON.stringify(request) + '\n');
|
|
100
109
|
this.logger.debug('Request sent:', request.id);
|
|
101
110
|
}
|
|
102
111
|
catch (error) {
|
|
@@ -112,26 +121,29 @@ class PayloadWorker {
|
|
|
112
121
|
setupProcessHandlers() {
|
|
113
122
|
if (!this.process)
|
|
114
123
|
return;
|
|
115
|
-
// Handle stdout (
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
124
|
+
// Handle stdout messages from worker (after ready signal)
|
|
125
|
+
let stdoutBuffer = '';
|
|
126
|
+
this.process.stdout?.on('data', (data) => {
|
|
127
|
+
stdoutBuffer += data.toString();
|
|
128
|
+
const lines = stdoutBuffer.split('\n');
|
|
129
|
+
stdoutBuffer = lines.pop() || '';
|
|
120
130
|
for (const line of lines) {
|
|
121
131
|
if (line.trim()) {
|
|
122
132
|
try {
|
|
123
|
-
const message =
|
|
124
|
-
|
|
133
|
+
const message = JSON.parse(line);
|
|
134
|
+
if (message.id) {
|
|
135
|
+
this.handleMessage(message);
|
|
136
|
+
}
|
|
125
137
|
}
|
|
126
|
-
catch (
|
|
127
|
-
this.logger.
|
|
138
|
+
catch (e) {
|
|
139
|
+
this.logger.debug('Failed to parse stdout:', line);
|
|
128
140
|
}
|
|
129
141
|
}
|
|
130
142
|
}
|
|
131
143
|
});
|
|
132
|
-
// Handle stderr (logging
|
|
133
|
-
this.process.stderr
|
|
134
|
-
this.logger.
|
|
144
|
+
// Handle stderr (logging)
|
|
145
|
+
this.process.stderr?.on('data', (data) => {
|
|
146
|
+
this.logger.debug('Worker stderr:', data.toString().trim());
|
|
135
147
|
});
|
|
136
148
|
// Handle process exit
|
|
137
149
|
this.process.on('exit', (code, signal) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payload-worker.js","sourceRoot":"","sources":["../src/payload-worker.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,iDAAoD;AAEpD,yCAAsC;AAOtC,qCAMkB;AAElB,MAAa,aAAa;
|
|
1
|
+
{"version":3,"file":"payload-worker.js","sourceRoot":"","sources":["../src/payload-worker.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,iDAAoD;AAEpD,yCAAsC;AAOtC,qCAMkB;AAElB,MAAa,aAAa;IAQxB,YAAY,MAAc,EAAE,WAAmB,EAAE,cAAsB;QAJ/D,YAAO,GAAwB,IAAI,CAAC;QACpC,YAAO,GAAG,KAAK,CAAC;QAChB,oBAAe,GAAe,IAAI,GAAG,EAAE,CAAC;QAG9C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,mBAA2B,IAAI;QACzC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAEpD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC;gBACH,wDAAwD;gBACxD,sEAAsE;gBACtE,IAAI,CAAC,OAAO,GAAG,IAAA,qBAAK,EAAC,MAAM,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;oBAC/C,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;oBAC/B,QAAQ,EAAE,IAAI;iBACf,CAAC,CAAC;gBAEH,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;oBAClB,MAAM,IAAI,2BAAkB,CAAC,+BAA+B,CAAC,CAAC;gBAChE,CAAC;gBAED,0DAA0D;gBAC1D,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBAErB,MAAM,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE;oBACrC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;oBACrB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;oBACpB,MAAM,CAAC,IAAI,oCAA2B,CAAC,gBAAgB,CAAC,CAAC,CAAC;gBAC5D,CAAC,EAAE,gBAAgB,CAAC,CAAC;gBAErB,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAE5B,qCAAqC;gBACrC,IAAI,YAAY,GAAG,EAAE,CAAC;gBACtB,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,EAAE;oBACrC,YAAY,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAChC,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACvC,YAAY,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;oBAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;wBACzB,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;4BAChB,IAAI,CAAC;gCACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gCAC7B,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;oCAC1C,IAAI,CAAC,OAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;oCAC5D,YAAY,CAAC,cAAc,CAAC,CAAC;oCAC7B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;oCACpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;oCACxD,OAAO,EAAE,CAAC;gCACZ,CAAC;qCAAM,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;oCAClB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;gCAC1B,CAAC;4BACH,CAAC;4BAAC,OAAO,CAAC,EAAE,CAAC;gCACX,2CAA2C;4BAC7C,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC,CAAC;gBAEF,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;YACjD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,2BAAkB,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC,CAAC;YACrE,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,OAAwB;QACzC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACnC,MAAM,IAAI,+BAAsB,CAAC,qBAAqB,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,UAAU,GAAG,mBAAQ,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,OAAmB;QACnC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACnC,MAAM,IAAI,+BAAsB,CAAC,qBAAqB,CAAC,CAAC;QAC1D,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACxC,MAAM,CAAC,IAAI,4BAAmB,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YACnE,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YAExB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE;gBACnC,OAAO;gBACP,MAAM;gBACN,OAAO;gBACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC,CAAC;YAEH,IAAI,CAAC;gBACH,iBAAiB;gBACjB,IAAI,CAAC,OAAQ,CAAC,KAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;gBAC3D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;YACjD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACxC,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC,CAAC;YACxD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,oBAAoB;QAC1B,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAE1B,0DAA0D;QAC1D,IAAI,YAAY,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YAC/C,YAAY,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvC,YAAY,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;YAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;oBAChB,IAAI,CAAC;wBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBACjC,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;4BACf,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;wBAC9B,CAAC;oBACH,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,IAAI,CAAC,CAAC;oBACrD,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,0BAA0B;QAC1B,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YAC/C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,sBAAsB;QACtB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAmB,EAAE,MAAqB,EAAE,EAAE;YACrE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAC5D,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YAEpB,8BAA8B;YAC9B,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;gBACnD,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,MAAM,CAAC,IAAI,yBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,uBAAuB;QACvB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE;YACxC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;YAClD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YAErB,8BAA8B;YAC9B,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;gBACnD,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,OAAmB;QACvC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;YAChD,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;YACvE,OAAO;QACT,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAE9B,IAAI,mBAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;YACpD,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,MAAM,YAAY,GAAG,mBAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YACvD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,OAAO,CAAC,EAAE,MAAM,YAAY,EAAE,CAAC,CAAC;YACrE,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,UAAkB,IAAI;QACnC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;gBAChE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1B,CAAC,EAAE,OAAO,CAAC,CAAC;YAEZ,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;gBACtB,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,SAAS;QAKP,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM;YAC/C,eAAe,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI;SAC3C,CAAC;IACJ,CAAC;CACF;AA1PD,sCA0PC"}
|
package/package.json
CHANGED
package/sample-payload.js
DELETED
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TankSync Sample Payload
|
|
3
|
-
*
|
|
4
|
-
* This is a sample payload.js that processes game item purchases.
|
|
5
|
-
* In production, this runs as a separate Node.js child process.
|
|
6
|
-
*
|
|
7
|
-
* Communication: JSON over stdin/stdout
|
|
8
|
-
*
|
|
9
|
-
* Input: {"id": "req-123", "method": "purchaseItem", "params": {...}}
|
|
10
|
-
* Output: {"id": "req-123", "success": true, "result": {...}}
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
'use strict';
|
|
14
|
-
|
|
15
|
-
const readline = require('readline');
|
|
16
|
-
const crypto = require('crypto');
|
|
17
|
-
|
|
18
|
-
// ── Mock Database ──────────────────────────────────────────────────────────
|
|
19
|
-
const mockDatabase = {
|
|
20
|
-
players: {
|
|
21
|
-
'player-123': { playerId: 'player-123', balance: 10000, inventory: [] },
|
|
22
|
-
'player-456': { playerId: 'player-456', balance: 5000, inventory: [] },
|
|
23
|
-
},
|
|
24
|
-
items: {
|
|
25
|
-
'tank-size': { itemId: 'tank-size', name: 'Tank Size+', cost: 100, category: 'upgrade' },
|
|
26
|
-
'armor-basic': { itemId: 'armor-basic', name: 'Armor Plating', cost: 200, category: 'defense' },
|
|
27
|
-
'rapid-fire': { itemId: 'rapid-fire', name: 'Rapid Fire', cost: 250, category: 'weapon' },
|
|
28
|
-
'speed-boost': { itemId: 'speed-boost', name: 'Speed Boost', cost: 200, category: 'mobility' },
|
|
29
|
-
},
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
// ── Setup stdin/stdout ─────────────────────────────────────────────────────
|
|
33
|
-
const rl = readline.createInterface({
|
|
34
|
-
input: process.stdin,
|
|
35
|
-
output: process.stdout,
|
|
36
|
-
terminal: false,
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
// ── Signal Ready ───────────────────────────────────────────────────────────
|
|
40
|
-
const ready = {
|
|
41
|
-
type: 'ready',
|
|
42
|
-
id: crypto.randomUUID(),
|
|
43
|
-
version: '1.0.0',
|
|
44
|
-
};
|
|
45
|
-
console.log(JSON.stringify(ready));
|
|
46
|
-
|
|
47
|
-
// ── Handle Requests ───────────────────────────────────────────────────────
|
|
48
|
-
rl.on('line', async (line) => {
|
|
49
|
-
try {
|
|
50
|
-
const request = JSON.parse(line);
|
|
51
|
-
|
|
52
|
-
if (!request.id || !request.method) {
|
|
53
|
-
sendError(request.id || 'unknown', 'INVALID_REQUEST', 'Missing id or method');
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// Route to handler
|
|
58
|
-
switch (request.method) {
|
|
59
|
-
case 'purchaseItem':
|
|
60
|
-
await handlePurchaseItem(request);
|
|
61
|
-
break;
|
|
62
|
-
|
|
63
|
-
case 'getPlayer':
|
|
64
|
-
await handleGetPlayer(request);
|
|
65
|
-
break;
|
|
66
|
-
|
|
67
|
-
case 'getItems':
|
|
68
|
-
await handleGetItems(request);
|
|
69
|
-
break;
|
|
70
|
-
|
|
71
|
-
default:
|
|
72
|
-
sendError(request.id, 'UNKNOWN_METHOD', `Unknown method: ${request.method}`);
|
|
73
|
-
}
|
|
74
|
-
} catch (error) {
|
|
75
|
-
console.error(`Parse error: ${error.message}`);
|
|
76
|
-
// Don't send error for unparseable input - just skip
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
// ── Handle: Purchase Item ──────────────────────────────────────────────────
|
|
81
|
-
async function handlePurchaseItem(request) {
|
|
82
|
-
try {
|
|
83
|
-
const { playerId, itemId, quantity, requestId } = request.params || {};
|
|
84
|
-
|
|
85
|
-
// Validation
|
|
86
|
-
if (!playerId || !itemId || !quantity || !requestId) {
|
|
87
|
-
return sendError(request.id, 'INVALID_PARAMS', 'Missing required parameters');
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
if (typeof quantity !== 'number' || quantity < 1) {
|
|
91
|
-
return sendError(request.id, 'INVALID_QUANTITY', 'Quantity must be positive number');
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// Get player
|
|
95
|
-
const player = mockDatabase.players[playerId];
|
|
96
|
-
if (!player) {
|
|
97
|
-
return sendError(request.id, 'PLAYER_NOT_FOUND', `Player ${playerId} not found`);
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// Get item
|
|
101
|
-
const item = mockDatabase.items[itemId];
|
|
102
|
-
if (!item) {
|
|
103
|
-
return sendError(request.id, 'ITEM_NOT_FOUND', `Item ${itemId} not found`);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
// Calculate total cost
|
|
107
|
-
const totalCost = item.cost * quantity;
|
|
108
|
-
|
|
109
|
-
// Check balance
|
|
110
|
-
if (player.balance < totalCost) {
|
|
111
|
-
return sendError(
|
|
112
|
-
request.id,
|
|
113
|
-
'INSUFFICIENT_BALANCE',
|
|
114
|
-
`Not enough balance. Have ${player.balance}, need ${totalCost}`
|
|
115
|
-
);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// Process purchase
|
|
119
|
-
player.balance -= totalCost;
|
|
120
|
-
player.inventory.push({ itemId, quantity, purchasedAt: Date.now() });
|
|
121
|
-
|
|
122
|
-
// Generate transaction ID
|
|
123
|
-
const transactionId = `tx-${Date.now()}-${crypto.randomBytes(4).toString('hex')}`;
|
|
124
|
-
|
|
125
|
-
// Send success response
|
|
126
|
-
sendSuccess(request.id, {
|
|
127
|
-
transactionId,
|
|
128
|
-
itemId,
|
|
129
|
-
quantity,
|
|
130
|
-
playerId,
|
|
131
|
-
cost: totalCost,
|
|
132
|
-
newBalance: player.balance,
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
// Log (to stderr - for monitoring)
|
|
136
|
-
console.error(`[PURCHASE] ${playerId} bought ${quantity}x ${itemId} (${totalCost} coins)`);
|
|
137
|
-
} catch (error) {
|
|
138
|
-
sendError(request.id, 'PURCHASE_ERROR', error.message);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// ── Handle: Get Player ─────────────────────────────────────────────────────
|
|
143
|
-
async function handleGetPlayer(request) {
|
|
144
|
-
try {
|
|
145
|
-
const { playerId } = request.params || {};
|
|
146
|
-
|
|
147
|
-
if (!playerId) {
|
|
148
|
-
return sendError(request.id, 'INVALID_PARAMS', 'Missing playerId');
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
const player = mockDatabase.players[playerId];
|
|
152
|
-
if (!player) {
|
|
153
|
-
return sendError(request.id, 'PLAYER_NOT_FOUND', `Player ${playerId} not found`);
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
sendSuccess(request.id, {
|
|
157
|
-
playerId: player.playerId,
|
|
158
|
-
balance: player.balance,
|
|
159
|
-
inventoryCount: player.inventory.length,
|
|
160
|
-
});
|
|
161
|
-
} catch (error) {
|
|
162
|
-
sendError(request.id, 'GET_PLAYER_ERROR', error.message);
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
// ── Handle: Get Items ──────────────────────────────────────────────────────
|
|
167
|
-
async function handleGetItems(request) {
|
|
168
|
-
try {
|
|
169
|
-
const items = Object.values(mockDatabase.items).map((item) => ({
|
|
170
|
-
itemId: item.itemId,
|
|
171
|
-
name: item.name,
|
|
172
|
-
cost: item.cost,
|
|
173
|
-
category: item.category,
|
|
174
|
-
}));
|
|
175
|
-
|
|
176
|
-
sendSuccess(request.id, { items, count: items.length });
|
|
177
|
-
} catch (error) {
|
|
178
|
-
sendError(request.id, 'GET_ITEMS_ERROR', error.message);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
// ── Response Helpers ──────────────────────────────────────────────────────
|
|
183
|
-
function sendSuccess(id, result) {
|
|
184
|
-
const response = {
|
|
185
|
-
id,
|
|
186
|
-
success: true,
|
|
187
|
-
result,
|
|
188
|
-
};
|
|
189
|
-
console.log(JSON.stringify(response));
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
function sendError(id, error, message) {
|
|
193
|
-
const response = {
|
|
194
|
-
id,
|
|
195
|
-
success: false,
|
|
196
|
-
error,
|
|
197
|
-
message,
|
|
198
|
-
};
|
|
199
|
-
console.log(JSON.stringify(response));
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
// ── Graceful Shutdown ──────────────────────────────────────────────────────
|
|
203
|
-
process.on('SIGTERM', () => {
|
|
204
|
-
console.error('[INFO] Received SIGTERM, shutting down gracefully...');
|
|
205
|
-
rl.close();
|
|
206
|
-
process.exit(0);
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
process.on('SIGINT', () => {
|
|
210
|
-
console.error('[INFO] Received SIGINT, shutting down gracefully...');
|
|
211
|
-
rl.close();
|
|
212
|
-
process.exit(0);
|
|
213
|
-
});
|