Initial commit

This commit is contained in:
2026-06-30 17:06:06 +02:00
commit d0bb893522
19 changed files with 1333 additions and 0 deletions

5
dist/constants.js vendored Normal file
View File

@@ -0,0 +1,5 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.BambuddyAddress = void 0;
exports.BambuddyAddress = 'https://print.morphix.nl';
//# sourceMappingURL=constants.js.map

1
dist/constants.js.map vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../ts/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,eAAe,GAAG,0BAA0B,CAAC"}

71
dist/login.js vendored Normal file
View File

@@ -0,0 +1,71 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.login = void 0;
var constants_1 = require("./constants");
function login(username, password) {
return __awaiter(this, void 0, void 0, function () {
var request, response;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, fetch("".concat(constants_1.BambuddyAddress, "/api/v1/auth/login"), {
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
username: username,
password: password,
}),
method: 'POST',
})];
case 1:
request = _a.sent();
return [4 /*yield*/, request.json()];
case 2:
response = _a.sent();
if ((response === null || response === void 0 ? void 0 : response.detail) != null) {
console.error("Login failed: ".concat(response.detail));
return [2 /*return*/, null];
}
return [2 /*return*/, response];
}
});
});
}
exports.login = login;
//# sourceMappingURL=login.js.map

1
dist/login.js.map vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"login.js","sourceRoot":"","sources":["../ts/login.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yCAA8C;AAE9C,SAAsB,KAAK,CAC1B,QAAgB,EAChB,QAAgB;;;;;wBAEA,qBAAM,KAAK,CAAC,UAAG,2BAAe,uBAAoB,EAAE;wBACnE,OAAO,EAAE;4BACR,cAAc,EAAE,kBAAkB;yBAClC;wBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACpB,QAAQ,EAAE,QAAQ;4BAClB,QAAQ,EAAE,QAAQ;yBAClB,CAAC;wBACF,MAAM,EAAE,MAAM;qBACd,CAAC,EAAA;;oBATI,OAAO,GAAG,SASd;oBAEe,qBAAM,OAAO,CAAC,IAAI,EAAE,EAAA;;oBAA/B,QAAQ,GAAG,SAAoB;oBAErC,IAAI,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,KAAI,IAAI,EAAE,CAAC;wBAC9B,OAAO,CAAC,KAAK,CAAC,wBAAiB,QAAQ,CAAC,MAAM,CAAE,CAAC,CAAC;wBAClD,sBAAO,IAAI,EAAC;oBACb,CAAC;oBAED,sBAAO,QAAyB,EAAC;;;;CACjC;AAvBD,sBAuBC"}

82
dist/main.js vendored Normal file
View File

@@ -0,0 +1,82 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
var constants_1 = require("./constants");
var login_1 = require("./login");
var streamToken_1 = require("./streamToken");
var express = require("express");
function getToken() {
return __awaiter(this, void 0, void 0, function () {
var loginResponse, streamToken;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, (0, login_1.login)('screen', 'e8$o$u@F8XtHt#')];
case 1:
loginResponse = _a.sent();
console.log('Login response:', loginResponse);
return [4 /*yield*/, (0, streamToken_1.getStreamToken)(loginResponse === null || loginResponse === void 0 ? void 0 : loginResponse.access_token)];
case 2:
streamToken = _a.sent();
return [2 /*return*/, streamToken === null || streamToken === void 0 ? void 0 : streamToken.token];
}
});
});
}
var app = express();
app.get('/', function (req, res) { return __awaiter(void 0, void 0, void 0, function () {
return __generator(this, function (_a) {
res.send('Bambuddy Camera Bridge is running. Use /:printerId to access the camera stream.');
return [2 /*return*/];
});
}); });
app.get('/:printerId', function (req, res) { return __awaiter(void 0, void 0, void 0, function () {
var token;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, getToken()];
case 1:
token = _a.sent();
res.redirect("".concat(constants_1.BambuddyAddress, "/api/v1/printers/").concat(req.params.printerId, "/camera/stream?fps=15&t=").concat(Date.now(), "&token=").concat(token));
return [2 /*return*/];
}
});
}); });
app.listen(3838, function () {
console.log('Server is running on port 3838');
});
//# sourceMappingURL=main.js.map

1
dist/main.js.map vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"main.js","sourceRoot":"","sources":["../ts/main.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yCAA8C;AAC9C,iCAAgC;AAEhC,6CAA+C;AAC/C,iCAAmC;AAGnC,SAAe,QAAQ;;;;;wBACA,qBAAM,IAAA,aAAK,EAAC,QAAQ,EAAE,gBAAgB,CAAC,EAAA;;oBAAvD,aAAa,GAAG,SAAuC;oBAE7D,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;oBAE1B,qBAAM,IAAA,4BAAc,EACvC,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,YAAsB,CACrC,EAAA;;oBAFK,WAAW,GAAG,SAEnB;oBAED,sBAAO,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,KAAK,EAAC;;;;CAC1B;AAED,IAAM,GAAG,GAAG,OAAO,EAAE,CAAC;AAEtB,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,UAAO,GAAY,EAAE,GAAa;;QAC9C,GAAG,CAAC,IAAI,CACP,iFAAiF,CACjF,CAAC;;;KACF,CAAC,CAAC;AAEH,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,UAAO,GAAY,EAAE,GAAa;;;;oBAC1C,qBAAM,QAAQ,EAAE,EAAA;;gBAAxB,KAAK,GAAG,SAAgB;gBAE9B,GAAG,CAAC,QAAQ,CACX,UAAG,2BAAe,8BAAoB,GAAG,CAAC,MAAM,CAAC,SAAS,qCAA2B,IAAI,CAAC,GAAG,EAAE,oBAAU,KAAK,CAAE,CAChH,CAAC;;;;KACF,CAAC,CAAC;AAEH,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE;IAChB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;AAC/C,CAAC,CAAC,CAAC"}

64
dist/printer.js vendored Normal file
View File

@@ -0,0 +1,64 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getPrinterDetails = void 0;
var constants_1 = require("./constants");
function getPrinterDetails(bearerToken, printerId) {
return __awaiter(this, void 0, void 0, function () {
var request, response;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, fetch("".concat(constants_1.BambuddyAddress, "/api/v1/printers/").concat(printerId), {
headers: {
'Content-Type': 'application/json',
Authorization: "Bearer ".concat(bearerToken),
},
method: 'GET',
})];
case 1:
request = _a.sent();
return [4 /*yield*/, request.json()];
case 2:
response = _a.sent();
return [2 /*return*/, response];
}
});
});
}
exports.getPrinterDetails = getPrinterDetails;
//# sourceMappingURL=printer.js.map

1
dist/printer.js.map vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"printer.js","sourceRoot":"","sources":["../ts/printer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yCAA8C;AAE9C,SAAsB,iBAAiB,CACtC,WAAmB,EACnB,SAAiB;;;;;wBAED,qBAAM,KAAK,CAC1B,UAAG,2BAAe,8BAAoB,SAAS,CAAE,EACjD;wBACC,OAAO,EAAE;4BACR,cAAc,EAAE,kBAAkB;4BAClC,aAAa,EAAE,iBAAU,WAAW,CAAE;yBACtC;wBACD,MAAM,EAAE,KAAK;qBACb,CACD,EAAA;;oBATK,OAAO,GAAG,SASf;oBAEgB,qBAAM,OAAO,CAAC,IAAI,EAAE,EAAA;;oBAA/B,QAAQ,GAAG,SAAoB;oBAErC,sBAAO,QAA0B,EAAC;;;;CAClC;AAlBD,8CAkBC"}

64
dist/streamToken.js vendored Normal file
View File

@@ -0,0 +1,64 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getStreamToken = void 0;
var constants_1 = require("./constants");
function getStreamToken(bearerToken) {
return __awaiter(this, void 0, void 0, function () {
var request, response;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, fetch("".concat(constants_1.BambuddyAddress, "/api/v1/printers/camera/stream-token"), {
headers: {
'Content-Type': 'application/json',
Authorization: "Bearer ".concat(bearerToken),
},
method: 'POST',
})];
case 1:
request = _a.sent();
return [4 /*yield*/, request.json()];
case 2:
response = _a.sent();
return [2 /*return*/, response];
}
});
});
}
exports.getStreamToken = getStreamToken;
//# sourceMappingURL=streamToken.js.map

1
dist/streamToken.js.map vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"streamToken.js","sourceRoot":"","sources":["../ts/streamToken.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yCAA8C;AAE9C,SAAsB,cAAc,CACnC,WAAmB;;;;;wBAEH,qBAAM,KAAK,CAC1B,UAAG,2BAAe,yCAAsC,EACxD;wBACC,OAAO,EAAE;4BACR,cAAc,EAAE,kBAAkB;4BAClC,aAAa,EAAE,iBAAU,WAAW,CAAE;yBACtC;wBACD,MAAM,EAAE,MAAM;qBACd,CACD,EAAA;;oBATK,OAAO,GAAG,SASf;oBAEgB,qBAAM,OAAO,CAAC,IAAI,EAAE,EAAA;;oBAA/B,QAAQ,GAAG,SAAoB;oBAErC,sBAAO,QAA0B,EAAC;;;;CAClC;AAjBD,wCAiBC"}