@newcoin-core/agent
Version:
A super simple way to set up newOS agents
505 lines (449 loc) • 17.7 kB
JavaScript
/******/ (() => { // webpackBootstrap
/******/ "use strict";
/******/ var __webpack_modules__ = ({
/***/ 32:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.NewcoinWriterAgent = exports.NewcoinReaderAgent = void 0;
const client_1 = __webpack_require__(27);
const reader_1 = __webpack_require__(181);
const writer_1 = __webpack_require__(117);
const NewcoinReaderAgent = (token) => {
const client = (0, client_1.NewgraphClient)(token);
return (0, reader_1.NewcoinReader)(client);
};
exports.NewcoinReaderAgent = NewcoinReaderAgent;
const NewcoinWriterAgent = (token) => {
const client = (0, client_1.NewgraphClient)(token);
return (0, writer_1.NewcoinWriter)(client);
};
exports.NewcoinWriterAgent = NewcoinWriterAgent;
/***/ }),
/***/ 234:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.NewcoinListener = void 0;
const wsclient_1 = __webpack_require__(141);
const _1 = __webpack_require__(32);
const DEBUG = process.env.NEWCOIN_CORE_DEBUG;
const NewcoinListener = (token, listener) => {
const user = { current: {} };
const writer = (0, _1.NewcoinWriterAgent)(token); // if a tree fell in a wood and someone heard it but said nothing, did it even happen?
const currentP = writer.current().then((u) => {
user.current = u;
return u;
});
const newgraphWebsocketsClient = (0, wsclient_1.newgraphWebsocketsClientManager)((wsServer, token) => `${wsServer}?token=${encodeURIComponent(token)}`);
;
newgraphWebsocketsClient.toggle(token);
const stats = {
totalStringSize: 0,
messagesCount: 0
};
newgraphWebsocketsClient.socket?.addEventListener("open", () => {
currentP.then(() => {
console.log(`Listening as ${user.current.username}`);
});
});
newgraphWebsocketsClient.socket?.addEventListener("message", async (msg) => {
const msgSize = msg.data.toString().length;
stats.totalStringSize += msgSize;
stats.messagesCount += 1;
if (msg.data == "pong") {
return Promise.resolve();
}
;
const data = JSON.parse(msg.data.toString());
const reqContent = data.payload?.post?.content?.trim().replace(/\<[^\>]+\>/g, "") || "";
console.log("replying to: ", reqContent || "not replying");
if (data.type == "newgraph" && data?.payload?.message == "post_in_folder") {
const text = reqContent;
if (DEBUG) {
console.log("Received: ", text);
}
if (!text.startsWith(`/${user.current.username}`)) //"/igorrubinovich.nco"))
return Promise.resolve();
if (listener) {
const _r = listener(text, writer);
const r = _r instanceof Promise ? await _r : _r;
const rr = typeof r == "string" ? r : (r.filesPaths?.length ? r : r.content);
if (DEBUG)
console.log("Replying: ", rr);
if (typeof rr == "string") {
// await NewcoinWriter(agents[0]).postMessage(data.payload.folder.id!, "Hi, I'm a too basic bot. Cant tell you much but I can listen")
await writer.postMessage(data.payload.folder.id, rr, "", "text/plain");
console.log("replied to: ", data.payload.post.content, 'in folder', data.payload.folder.id);
}
else {
const filesPaths = rr.filesPaths || [undefined];
for (let i = 0; i < filesPaths.length; i++) {
const fp = filesPaths[i];
console.log("Uploading file", fp);
await writer.postMessage(data.payload.folder.id, i ? "" : rr.content, fp);
}
}
}
// const p = await agents[0].api.post.postCreate({ content: "Hi, I'm a too basic bot. Cant tell you much but I can listen", contentType: "text/html" })
}
});
return {
get stats() {
return stats;
},
wsclient: newgraphWebsocketsClient
};
};
exports.NewcoinListener = NewcoinListener;
/***/ }),
/***/ 181:
/***/ ((__unused_webpack_module, exports) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.NewcoinReader = void 0;
const NewcoinReader = (client) => {
let user;
return ({
current: async () => {
if (user)
return user;
return user = await client.authorize();
},
getUser: async () => {
return user;
},
toString: () => {
return user.username;
},
listTopFolders: async (page = 0) => {
console.log("Listing top folders...");
return (await client.api.mood.listTopList({ page: page.toString() })).data;
},
listAttachedPosts: async (folderId, page = 0, order = "created") => {
console.log(`Listing posts in folder ${folderId}...`);
debugger;
return (await client.api.mood.attachmentsList({ id: folderId, page: page.toString(), order: order })).data;
},
listOwnFolders: async () => {
return (await client.api.user.moodsList()).data;
},
ratePost: async (postId, folderId, value) => {
return (await client.api.mood.rateCreate({ targetId: postId, contextType: "folder", contextValue: folderId, value }));
}
});
};
exports.NewcoinReader = NewcoinReader;
/***/ }),
/***/ 117:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.NewcoinWriter = void 0;
const reader_1 = __webpack_require__(181);
const promises_1 = __webpack_require__(943);
const NewcoinWriter = (client) => {
let user;
return ({
...(0, reader_1.NewcoinReader)(client),
toString: () => {
return (user || {}).username;
},
createFolder: async (name) => {
const f = await client.api.mood.moodCreate({
name: name + new Date().toString()
});
return f.data;
},
postMessage: async (folderId, content, filePath, contentType) => {
try {
const np = {
content: content || new Date().toString() + " test",
contentType: contentType || "text/plain",
moodId: folderId
};
const post = await client.api.post.postCreate(np);
await client.api.mood.attachPostUpdate({ id: folderId, targetId: post.data.id });
if (filePath) {
const uploadInfo = await client.api.post.uploadCreate({ targetId: post.data.id, contentType: contentType || "image/jpeg", filename: filePath.split(/\//).at(-1) });
const r = await fetch(uploadInfo.data.url, {
method: "PUT",
body: await (0, promises_1.readFile)(filePath),
});
console.log("Upload status: ", r.status);
}
return post.data;
}
catch (ex) {
console.error("Failed to post response: ", ex);
}
}
});
};
exports.NewcoinWriter = NewcoinWriter;
/***/ }),
/***/ 27:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.NewgraphClient = void 0;
const newgraph_1 = __webpack_require__(278);
const API_URL = "https://api.newgra.ph/v1";
const NewgraphClient = (token) => {
const a = (0, newgraph_1.NewgraphApi)();
a.initialize(API_URL);
a.updateToken(token);
return a;
};
exports.NewgraphClient = NewgraphClient;
/***/ }),
/***/ 278:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.NewgraphApi = exports.CreatorApi = void 0;
const iosdk_newgraph_client_js_1 = __webpack_require__(135);
class CreatorApi extends iosdk_newgraph_client_js_1.Api {
}
exports.CreatorApi = CreatorApi;
exports.NewgraphApi = (() => {
let _api;
let _token = "";
return {
initialize(baseUrl) {
_api = new CreatorApi({
baseUrl,
securityWorker: (securityData) => {
return !securityData ? {} : { headers: { Authorization: securityData.token } };
},
});
return _api;
},
getCurrentToken() {
return _token;
},
updateToken(token) {
_token = token;
_api.setSecurityData({ token });
},
async authorize() {
try {
console.log(`Authoriziing with token:${this.getCurrentToken()}`);
const r = await _api.user.currentList();
console.log("Authorized as: ", r.data.username);
return r.data;
}
catch (_ex) {
const ex = _ex;
throw ex;
}
},
get api() {
return _api;
}
};
});
/***/ }),
/***/ 141:
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.newgraphWebsocketsClientManager = void 0;
const WEBSOCKETS_SERVER = "wss://wsapi.newgra.ph/v1";
const ws_1 = __importDefault(__webpack_require__(86));
const newgraphWebsocketsClientManager = (upd) => {
const state = {
socket: null,
};
const outboundQueue = [];
let pingInterval;
let pingCounter = 0;
let _token = "";
const processPong = (ev) => {
if (ev.data === "pong") {
pingCounter = Math.max(pingCounter - 1, 0); // without the .max if disconnect occurs between ping and pong, after reconnection will go to negative values and delay disconnect detection
console.log("pong, pingCounter == ", pingCounter, new Date().toISOString());
}
};
const handleNoPing = () => {
console.log("Websockets ping failed, trying to reconnect");
if (_token)
toggle(_token);
else
console.log("No token, not attempting to resume after failed ping");
};
const startPing = () => (pingInterval = setInterval(() => {
if (pingCounter > 0) {
pingCounter--;
return handleNoPing();
}
try {
state?.socket?.send("ping");
}
catch (ex) {
console.log("Couldn't ping:", ex);
return handleNoPing();
}
pingCounter++;
console.log("ping, pingCounter == ", pingCounter);
}, 10000));
const stopPing = () => {
clearInterval(pingInterval);
};
const logConnected = () => console.log("Websockets client connected");
const logDisconnected = () => console.log("Websockets client disconnected");
const logError = (err) => console.log(err);
const sendQueued = () => {
let msg;
for (msg of outboundQueue)
state.send(msg);
};
const eventHandlers = {
open: [startPing, sendQueued, logConnected],
close: [stopPing],
error: [logError],
message: [processPong],
upgrade: [(res) => {
console.log('Upgrade response status:', res.statusCode);
console.log('Headers:', res.headers);
}],
'unexpected-response': [(req, res) => {
console.error('Unexpected response:', res.statusCode);
res.on('data', (chunk) => {
console.error('Body:', chunk.toString());
});
}]
};
const toggle = async (token) => {
debugger;
_token = token;
const url = upd(WEBSOCKETS_SERVER, token);
if (state.url === url)
return;
state.url = url;
if (state.socket) {
// clean up subscriptions
Object.keys(eventHandlers)
.forEach((eventName) => eventHandlers[eventName].forEach(handler => state.socket?.removeEventListener(eventName, handler)));
state.socket.close();
state.socket = null;
}
stopPing();
if (token && url) {
state.socket = new ws_1.default(url);
// subscribe to events
Object.keys(eventHandlers)
.forEach(eventName => eventHandlers[eventName].forEach(handler => state.socket?.addEventListener(eventName, handler)));
}
};
state.toggle = toggle;
state.send = (msg) => {
if (state.socket?.readyState == state.socket?.CONNECTING) {
outboundQueue.push(msg);
return;
}
if (typeof msg != "string")
msg = JSON.stringify(msg);
state.socket?.send(msg);
};
return state;
};
exports.newgraphWebsocketsClientManager = newgraphWebsocketsClientManager;
/***/ }),
/***/ 229:
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
//#!/usr/bin/env node
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports._ = exports.NewcoinWriterAgent = exports.NewcoinReaderAgent = exports.NewcoinListener = void 0;
const agents_1 = __webpack_require__(32);
Object.defineProperty(exports, "NewcoinReaderAgent", ({ enumerable: true, get: function () { return agents_1.NewcoinReaderAgent; } }));
Object.defineProperty(exports, "NewcoinWriterAgent", ({ enumerable: true, get: function () { return agents_1.NewcoinWriterAgent; } }));
const listener_1 = __webpack_require__(234);
Object.defineProperty(exports, "NewcoinListener", ({ enumerable: true, get: function () { return listener_1.NewcoinListener; } }));
const fs_1 = __importDefault(__webpack_require__(896));
const path_1 = __importDefault(__webpack_require__(928));
exports["default"] = listener_1.NewcoinListener;
const args = process.argv.slice(2);
const templateArgIndex = args.findIndex((arg) => arg === "--template");
if (templateArgIndex !== -1 && args.length > templateArgIndex + 1) {
const templateName = args[templateArgIndex + 1];
const projectName = args[templateArgIndex + 2];
const templateDir = path_1.default.resolve(__dirname, "..", "templates", templateName);
const targetDir = projectName ? path_1.default.join(process.cwd(), projectName) : process.cwd();
if (fs_1.default.existsSync(templateDir)) {
if (projectName) {
fs_1.default.mkdirSync(targetDir, { recursive: true });
}
console.log(`Creating a new project in ${targetDir} from template ${templateName}...`);
fs_1.default.cpSync(templateDir, targetDir, { recursive: true });
if (projectName) {
const packageJsonPath = path_1.default.join(targetDir, "package.json");
if (fs_1.default.existsSync(packageJsonPath)) {
const packageJson = JSON.parse(fs_1.default.readFileSync(packageJsonPath, "utf-8"));
packageJson.name = projectName;
fs_1.default.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
}
}
console.log("Done.");
}
else {
console.error(`Template ${templateName} not found.`);
}
}
exports._ = "hi";
/***/ }),
/***/ 135:
/***/ ((module) => {
module.exports = require("@newstackdev/iosdk-newgraph-client-js");
/***/ }),
/***/ 86:
/***/ ((module) => {
module.exports = require("ws");
/***/ }),
/***/ 896:
/***/ ((module) => {
module.exports = require("fs");
/***/ }),
/***/ 943:
/***/ ((module) => {
module.exports = require("fs/promises");
/***/ }),
/***/ 928:
/***/ ((module) => {
module.exports = require("path");
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
/******/
/******/ // startup
/******/ // Load entry module and return exports
/******/ // This entry module is referenced by other modules so it can't be inlined
/******/ var __webpack_exports__ = __webpack_require__(229);
/******/ module.exports = __webpack_exports__;
/******/
/******/ })()
;