diff --git a/meshcore/agentcore.c b/meshcore/agentcore.c
index 7c4c164..78be835 100644
--- a/meshcore/agentcore.c
+++ b/meshcore/agentcore.c
@@ -1667,11 +1667,7 @@ duk_ret_t ILibDuktape_MeshAgent_getStartupOptions(duk_context *ctx)
duk_push_this(ctx); // [MeshAgent]
agent = (MeshAgentHostContainer*)Duktape_GetPointerProperty(ctx, -1, MESH_AGENT_PTR);
- int varLen = ILibSimpleDataStore_Cached_GetJSON(agent->masterDb, NULL, 0);
- char *buffer = duk_push_fixed_buffer(ctx, varLen);
- ILibSimpleDataStore_Cached_GetJSON(agent->masterDb, buffer, varLen);
- duk_push_string(ctx, buffer);
- duk_json_decode(ctx, -1);
+ ILibDuktape_SimpleDataStore_raw_GetCachedValues_Object(ctx, agent->masterDb);
return(1);
}
@@ -3726,17 +3722,9 @@ void MeshServer_Agent_SelfTest(MeshAgentHostContainer *agent)
//int CoreModuleTesterLen = ILibSimpleDataStore_Get(agent->masterDb, "CoreModuleTester", NULL, 0);
//char *CoreModule, *CoreModuleTester;
- char *argarray;
- size_t argarrayLen;
-
- argarrayLen = (size_t)ILibSimpleDataStore_Cached_GetJSONEx(agent->masterDb, NULL, 0);
- ILibMemory_AllocateRaw(argarray, argarrayLen);
- ILibSimpleDataStore_Cached_GetJSONEx(agent->masterDb, argarray, (int)argarrayLen);
-
- duk_push_heapptr(agent->meshCoreCtx, ILibDuktape_GetProcessObject(agent->meshCoreCtx)); // [process]
- duk_push_string(agent->meshCoreCtx, argarray); // [process][string]
- duk_json_decode(agent->meshCoreCtx, -1); // [process][json]
- duk_put_prop_string(agent->meshCoreCtx, -2, "\xFF_argArray"); // [process]
+ duk_push_heapptr(agent->meshCoreCtx, ILibDuktape_GetProcessObject(agent->meshCoreCtx)); // [process]
+ ILibDuktape_SimpleDataStore_raw_GetCachedValues_Array(agent->meshCoreCtx, agent->masterDb); // [process][array]
+ duk_put_prop_string(agent->meshCoreCtx, -2, "\xFF_argArray"); // [process]
duk_pop(agent->meshCoreCtx);
printf("Agent Self Test...\n");
@@ -4335,8 +4323,6 @@ int MeshAgent_AgentMode(MeshAgentHostContainer *agentHost, int paramLen, char **
}
else if (installFlag != 0)
{
- int bufLen = 0;
- char *buf;
duk_context *ctxx = ILibDuktape_ScriptContainer_InitializeJavaScriptEngineEx(0, 0, agentHost->chain, NULL, NULL, agentHost->exePath, NULL, MeshAgent_AgentInstallerCTX_Finalizer, agentHost->chain);
duk_eval_string(ctxx, "require('user-sessions').isRoot();");
if (!duk_get_boolean(ctxx, -1))
@@ -4346,19 +4332,15 @@ int MeshAgent_AgentMode(MeshAgentHostContainer *agentHost, int paramLen, char **
exit(0);
}
-
switch (installFlag)
{
case 1:
case 5:
- bufLen = ILibSimpleDataStore_Cached_GetJSONEx(agentHost->masterDb, NULL, 0);
- buf = (char*)ILibMemory_SmartAllocate(bufLen);
- bufLen = ILibSimpleDataStore_Cached_GetJSONEx(agentHost->masterDb, buf, bufLen);
-
duk_eval_string(ctxx, "require('agent-installer');");
duk_get_prop_string(ctxx, -1, "fullInstall");
- duk_swap_top(ctxx, -2);
- duk_push_string(ctxx, buf);
+ duk_swap_top(ctxx, -2); // [func][this]
+ ILibDuktape_SimpleDataStore_raw_GetCachedValues_Array(ctxx, agentHost->masterDb); // [func][this][array]
+ duk_json_encode(ctxx, -1); // [func][this][json]
if (duk_pcall_method(ctxx, 1) != 0)
{
if (strcmp(duk_safe_to_string(ctxx, -1), "Process.exit() forced script termination") != 0)
@@ -4367,18 +4349,14 @@ int MeshAgent_AgentMode(MeshAgentHostContainer *agentHost, int paramLen, char **
}
}
duk_pop(ctxx);
- ILibMemory_Free(buf);
return(1);
break;
case 2:
- bufLen = ILibSimpleDataStore_Cached_GetJSONEx(agentHost->masterDb, NULL, 0);
- buf = (char*)ILibMemory_SmartAllocate(bufLen);
- bufLen = ILibSimpleDataStore_Cached_GetJSONEx(agentHost->masterDb, buf, bufLen);
-
duk_eval_string(ctxx, "require('agent-installer');");
- duk_get_prop_string(ctxx, -1, "fullUninstall");
- duk_swap_top(ctxx, -2);
- duk_push_string(ctxx, buf);
+ duk_get_prop_string(ctxx, -1, "fullUninstall");
+ duk_swap_top(ctxx, -2); // [func][this]
+ ILibDuktape_SimpleDataStore_raw_GetCachedValues_Array(ctxx, agentHost->masterDb); // [func][this][array]
+ duk_json_encode(ctxx, -1); // [func][this][json]
if (duk_pcall_method(ctxx, 1) != 0)
{
if (strcmp(duk_safe_to_string(ctxx, -1), "Process.exit() forced script termination") != 0)
@@ -4387,7 +4365,6 @@ int MeshAgent_AgentMode(MeshAgentHostContainer *agentHost, int paramLen, char **
}
}
duk_pop(ctxx);
- ILibMemory_Free(buf);
return(1);
break;
default:
@@ -5563,19 +5540,37 @@ int MeshAgent_Start(MeshAgentHostContainer *agentHost, int paramLen, char **para
{
if (agentHost->JSRunningAsService == 0)
{
- int jsonlen = ILibSimpleDataStore_Cached_GetJSONEx(agentHost->masterDb, NULL, 0);
- if (jsonlen > 0)
- {
- startParms = (char*)ILibMemory_SmartAllocateEx(jsonlen, ILibBase64EncodeLength(jsonlen));
- unsigned char* tmp = (unsigned char*)ILibMemory_Extra(startParms);
- ILibSimpleDataStore_Cached_GetJSONEx(agentHost->masterDb, startParms, jsonlen);
- ILibBase64Encode((unsigned char*)startParms, jsonlen, &tmp);
- if (agentHost->logUpdate != 0) { ILIBLOGMESSAGEX(" Service Parameters => %s", startParms); }
- }
- else
- {
- if (agentHost->logUpdate != 0) { ILIBLOGMESSAGEX(" Service Parameters => NONE"); }
- }
+ duk_context *ctxx = ILibDuktape_ScriptContainer_InitializeJavaScriptEngine_minimal();
+ duk_size_t jsonLen;
+ char *json = NULL;
+
+ ILibDuktape_SimpleDataStore_raw_GetCachedValues_Array(ctxx, agentHost->masterDb); // [array]
+ if (duk_get_length(ctxx, -1) > 0)
+ {
+ duk_json_encode(ctxx, -1); // [json]
+ json = (char*)duk_get_lstring(ctxx, -1, &jsonLen);
+
+ startParms = (char*)ILibMemory_SmartAllocateEx(jsonLen + 1, ILibBase64EncodeLength(jsonLen + 1));
+ unsigned char* tmp = (unsigned char*)ILibMemory_Extra(startParms);
+ memcpy_s(startParms, jsonLen + 1, json, jsonLen);
+ Duktape_SafeDestroyHeap(ctxx);
+
+ if (jsonLen > INT32_MAX)
+ {
+ ILibMemory_Free(startParms);
+ startParms = NULL;
+ if (agentHost->logUpdate != 0) { ILIBLOGMESSAGEX(" Service Parameters => ERROR"); }
+ }
+ else
+ {
+ ILibBase64Encode((unsigned char*)startParms, (int)jsonLen, &tmp);
+ if (agentHost->logUpdate != 0) { ILIBLOGMESSAGEX(" Service Parameters => %s", startParms); }
+ }
+ }
+ else
+ {
+ if (agentHost->logUpdate != 0) { ILIBLOGMESSAGEX(" Service Parameters => NONE"); }
+ }
}
else
{
diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c
index ca3f2b6..de38078 100644
--- a/microscript/ILibDuktape_Polyfills.c
+++ b/microscript/ILibDuktape_Polyfills.c
@@ -2301,7 +2301,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx)
duk_peval_string_noresult(ctx, "addCompressedModule('message-box', Buffer.from('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', 'base64'));");
// toaster, refer to modules/toaster.js
- duk_peval_string_noresult(ctx, "addCompressedModule('toaster', Buffer.from('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', 'base64'));");
+ duk_peval_string_noresult(ctx, "addCompressedModule('toaster', Buffer.from('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', 'base64'));");
// notifybar-desktop, refer to modules/notifybar-desktop.js
duk_peval_string_noresult(ctx, "addCompressedModule('notifybar-desktop', Buffer.from('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', 'base64'));");
diff --git a/microscript/ILibDuktape_SimpleDataStore.c b/microscript/ILibDuktape_SimpleDataStore.c
index 35efc7a..5a8fba2 100644
--- a/microscript/ILibDuktape_SimpleDataStore.c
+++ b/microscript/ILibDuktape_SimpleDataStore.c
@@ -270,6 +270,48 @@ void ILibDuktape_SimpleDataStore_init(duk_context * ctx, ILibSimpleDataStore sha
}
}
+void ILibDuktape_SimpleDataStore_raw_GetCachedValues_Object_sink(ILibSimpleDataStore sender, char* Key, size_t KeyLen, char* Value, size_t ValueLen, void *user)
+{
+ duk_context *ctx = (duk_context*)user;
+ duk_push_lstring(ctx, Key, KeyLen); // [obj][key]
+ duk_push_lstring(ctx, Value, ValueLen); // [obj][key][value]
+ duk_put_prop(ctx, -3); // [obj]
+}
+void ILibDuktape_SimpleDataStore_raw_GetCachedValues_Array_sink(ILibSimpleDataStore sender, char* Key, size_t KeyLen, char* Value, size_t ValueLen, void *user)
+{
+ duk_context *ctx = (duk_context*)user;
+ duk_idx_t top = duk_get_top(ctx); // [array]
+ duk_push_lstring(ctx, Key, KeyLen); // [array][key]
+ char *k2 = (char*)duk_get_string(ctx, -1);
+
+ duk_push_object(ctx); // [array][key][object]
+ duk_dup(ctx, -2); // [array][key][obj][key]
+ duk_push_lstring(ctx, Value, ValueLen); // [array][key][obj][key][value]
+ duk_put_prop(ctx, -3); // [array][key][obj]
+ duk_json_encode(ctx, -1); // [array][key][json]
+ duk_size_t len;
+ char *json = (char*)duk_get_lstring(ctx, -1, &len);
+ int colon = ILibString_IndexOf(json, len, ":", 1);
+
+ duk_string_substring(ctx, -1, colon+1, (int)len - 1); // [array][key][json][val]
+ char *val = (char*)duk_get_lstring(ctx, -1, &len);
+
+ duk_push_sprintf(ctx, "--%s=%s", k2, val); // [array][key][json][val][string]
+ duk_array_push(ctx, -5); // [array][key][json][val]
+
+ duk_pop_3(ctx); // [array]
+}
+void ILibDuktape_SimpleDataStore_raw_GetCachedValues_Array(duk_context *ctx, ILibSimpleDataStore dataStore)
+{
+ duk_push_array(ctx);
+ ILibSimpleDataStore_Cached_GetValues(dataStore, ILibDuktape_SimpleDataStore_raw_GetCachedValues_Array_sink, ctx);
+}
+void ILibDuktape_SimpleDataStore_raw_GetCachedValues_Object(duk_context *ctx, ILibSimpleDataStore dataStore)
+{
+ duk_push_object(ctx);
+ ILibSimpleDataStore_Cached_GetValues(dataStore, ILibDuktape_SimpleDataStore_raw_GetCachedValues_Object_sink, ctx);
+}
+
#ifdef __DOXY__
/*!
\brief Provides a compact Key/Value datastore. Note: To use, must require('SimpleDataStore').Create() or require('SimpleDataStore').Shared()
diff --git a/microscript/ILibDuktape_SimpleDataStore.h b/microscript/ILibDuktape_SimpleDataStore.h
index 7dadceb..5952f0a 100644
--- a/microscript/ILibDuktape_SimpleDataStore.h
+++ b/microscript/ILibDuktape_SimpleDataStore.h
@@ -22,6 +22,7 @@ limitations under the License.
#include "microstack/ILibSimpleDataStore.h"
void ILibDuktape_SimpleDataStore_init(duk_context *ctx, ILibSimpleDataStore sharedDb);
-
+void ILibDuktape_SimpleDataStore_raw_GetCachedValues_Array(duk_context *ctx, ILibSimpleDataStore dataStore);
+void ILibDuktape_SimpleDataStore_raw_GetCachedValues_Object(duk_context *ctx, ILibSimpleDataStore dataStore);
#endif
diff --git a/microstack/ILibSimpleDataStore.c b/microstack/ILibSimpleDataStore.c
index 4f9eaa7..48c2dcf 100644
--- a/microstack/ILibSimpleDataStore.c
+++ b/microstack/ILibSimpleDataStore.c
@@ -178,50 +178,16 @@ typedef struct ILibSimpleDateStore_JSONCache
int bufferLen;
}ILibSimpleDateStore_JSONCache;
-void ILibSimpleDataStore_Cached_GetJSON_count(ILibHashtable sender, void *Key1, char* Key2, int Key2Len, void *Data, void *user)
+void ILibSimpleDataStore_Cached_GetValues_sink(ILibHashtable sender, void *Key1, char* Key2, int Key2Len, void *Data, void *user)
{
- ILibSimpleDateStore_JSONCache *cache = (ILibSimpleDateStore_JSONCache*)user;
ILibSimpleDataStore_CacheEntry *entry = (ILibSimpleDataStore_CacheEntry*)Data;
+ ILibSimpleDataStore dataStore = (ILibSimpleDataStore)((void**)user)[0];
+ ILibSimpleDataStore_GetValuesHandler handler = (ILibSimpleDataStore_GetValuesHandler)((void**)user)[1];
+ void *userObject = ((void**)user)[2];
- if (cache->bufferLen == 0)
- {
- cache->bufferLen = 3;
- }
- else
- {
- ++cache->bufferLen;
- }
-
- cache->bufferLen += (Key2Len + 3);
- cache->bufferLen += (entry->valueLength + 2);
-}
-void ILibSimpleDataStore_Cached_GetJSONEx_count(ILibHashtable sender, void *Key1, char* Key2, int Key2Len, void *Data, void *user)
-{
- ILibSimpleDateStore_JSONCache *cache = (ILibSimpleDateStore_JSONCache*)user;
- ILibSimpleDataStore_CacheEntry *entry = (ILibSimpleDataStore_CacheEntry*)Data;
-
- if (cache->bufferLen == 0)
- {
- cache->bufferLen = 3;
- }
- else
- {
- ++cache->bufferLen;
- }
-
- cache->bufferLen += (Key2Len + 5);
- cache->bufferLen += (entry->valueLength + 4);
-}
-void ILibSimpleDataStore_Cached_GetJSON_write(ILibHashtable sender, void *Key1, char* Key2, int Key2Len, void *Data, void *user)
-{
- ILibSimpleDateStore_JSONCache *cache = (ILibSimpleDateStore_JSONCache*)user;
- ILibSimpleDataStore_CacheEntry *entry = (ILibSimpleDataStore_CacheEntry*)Data;
char *tmpbuffer = NULL;
size_t tmpbufferLen = 0;
- char* value = entry->value;
- size_t valueLen = entry->valueLength;
-
// check if this is a compressed record
if (Key2Len > sizeof(uint32_t))
{
@@ -233,119 +199,27 @@ void ILibSimpleDataStore_Cached_GetJSON_write(ILibHashtable sender, void *Key1,
{
tmpbuffer = (char*)ILibMemory_SmartAllocate(tmpbufferLen);
ILibInflate(entry->value, entry->valueLength, tmpbuffer, &tmpbufferLen, 0);
- value = tmpbuffer;
- valueLen = tmpbufferLen;
+
+ // Uncompressed Record
+ handler(dataStore, Key2, (size_t)Key2Len, tmpbuffer, tmpbufferLen, userObject);
+ ILibMemory_Free(tmpbuffer);
+ return;
}
}
}
-
-
- if (cache->offset != 1) { cache->offset += sprintf_s(cache->buffer + cache->offset, cache->bufferLen - cache->offset, ","); }
-
- cache->offset += sprintf_s(cache->buffer + cache->offset, cache->bufferLen - cache->offset, "\"");
- memcpy_s(cache->buffer + cache->offset, cache->bufferLen - cache->offset, Key2, Key2Len); cache->offset += Key2Len;
- cache->offset += sprintf_s(cache->buffer + cache->offset, cache->bufferLen - cache->offset, "\":\"");
- memcpy_s(cache->buffer + cache->offset, cache->bufferLen - cache->offset, value, (int)valueLen); cache->offset += (int)valueLen;
- cache->offset += sprintf_s(cache->buffer + cache->offset, cache->bufferLen - cache->offset, "\"");
-
- if (tmpbuffer != NULL) { ILibMemory_Free(tmpbuffer); }
+ // Not a compressed record
+ handler(dataStore, Key2, (size_t)Key2Len, entry->value, entry->valueLength, userObject);
}
-void ILibSimpleDataStore_Cached_GetJSONEx_write(ILibHashtable sender, void *Key1, char* Key2, int Key2Len, void *Data, void *user)
-{
- ILibSimpleDateStore_JSONCache *cache = (ILibSimpleDateStore_JSONCache*)user;
- ILibSimpleDataStore_CacheEntry *entry = (ILibSimpleDataStore_CacheEntry*)Data;
-
- char *tmpbuffer = NULL;
- size_t tmpbufferLen = 0;
-
- char* value = entry->value;
- size_t valueLen = entry->valueLength;
-
- // check if this is a compressed record
- if (Key2Len > sizeof(uint32_t))
- {
- if (((uint32_t*)(Key2 + Key2Len - sizeof(uint32_t)))[0] == crc32c(0, (unsigned char*)Key2, Key2Len - sizeof(uint32_t)))
- {
- Key2Len -= sizeof(uint32_t);
- ILibInflate(entry->value, entry->valueLength, NULL, &tmpbufferLen, 0);
- if (tmpbufferLen > 0)
- {
- tmpbuffer = (char*)ILibMemory_SmartAllocate(tmpbufferLen);
- ILibInflate(entry->value, entry->valueLength, tmpbuffer, &tmpbufferLen, 0);
- value = tmpbuffer;
- valueLen = tmpbufferLen;
- }
- }
- }
-
-
- if (cache->offset != 1) { cache->offset += sprintf_s(cache->buffer + cache->offset, cache->bufferLen - cache->offset, ","); }
-
- cache->offset += sprintf_s(cache->buffer + cache->offset, cache->bufferLen - cache->offset, "\"--");
- memcpy_s(cache->buffer + cache->offset, cache->bufferLen - cache->offset, Key2, Key2Len); cache->offset += Key2Len;
- cache->offset += sprintf_s(cache->buffer + cache->offset, cache->bufferLen - cache->offset, "=\\\"");
- memcpy_s(cache->buffer + cache->offset, cache->bufferLen - cache->offset, value, (int)valueLen); cache->offset += (int)valueLen;
- cache->offset += sprintf_s(cache->buffer + cache->offset, cache->bufferLen - cache->offset, "\\\"\"");
-}
-
-int ILibSimpleDataStore_Cached_GetJSONEx(ILibSimpleDataStore dataStore, char *buffer, int bufferLen)
+int ILibSimpleDataStore_Cached_GetValues(ILibSimpleDataStore dataStore, ILibSimpleDataStore_GetValuesHandler handler, void *user)
{
+ void *callback[] = { dataStore, handler, user };
ILibSimpleDataStore_Root *root = (ILibSimpleDataStore_Root*)dataStore;
- if (root->cacheTable == NULL)
+ if (root->cacheTable != NULL && handler != NULL)
{
- if (bufferLen < 3)
- {
- return(3);
- }
- else
- {
- return(sprintf_s(buffer, (size_t)bufferLen, "[]"));
- }
+ ILibHashtable_Enumerate(root->cacheTable, ILibSimpleDataStore_Cached_GetValues_sink, callback);
}
- ILibSimpleDateStore_JSONCache cache;
- cache.buffer = NULL;
- cache.offset = 0;
- cache.bufferLen = 0;
- ILibHashtable_Enumerate(root->cacheTable, ILibSimpleDataStore_Cached_GetJSONEx_count, &cache);
-
- if (buffer == NULL || bufferLen < cache.bufferLen) { return(cache.bufferLen); }
- cache.buffer = buffer;
- cache.offset = sprintf_s(buffer, bufferLen, "[");
- cache.bufferLen = bufferLen;
-
- ILibHashtable_Enumerate(root->cacheTable, ILibSimpleDataStore_Cached_GetJSONEx_write, &cache);
- cache.offset += sprintf_s(cache.buffer + cache.offset, cache.bufferLen - cache.offset, "]");
- return(cache.offset);
-}
-int ILibSimpleDataStore_Cached_GetJSON(ILibSimpleDataStore dataStore, char *buffer, int bufferLen)
-{
- ILibSimpleDataStore_Root *root = (ILibSimpleDataStore_Root*)dataStore;
- if (root->cacheTable == NULL)
- {
- if (bufferLen < 3)
- {
- return(3);
- }
- else
- {
- return(sprintf_s(buffer, (size_t)bufferLen, "{}"));
- }
- }
- ILibSimpleDateStore_JSONCache cache;
- cache.buffer = NULL;
- cache.offset = 0;
- cache.bufferLen = 0;
- ILibHashtable_Enumerate(root->cacheTable, ILibSimpleDataStore_Cached_GetJSON_count, &cache);
-
- if (buffer == NULL || bufferLen < cache.bufferLen) { return(cache.bufferLen); }
- cache.buffer = buffer;
- cache.offset = sprintf_s(buffer, bufferLen, "{");
- cache.bufferLen = bufferLen;
-
- ILibHashtable_Enumerate(root->cacheTable, ILibSimpleDataStore_Cached_GetJSON_write, &cache);
- cache.offset += sprintf_s(cache.buffer + cache.offset, cache.bufferLen - cache.offset, "}");
- return(cache.offset);
+ return(0);
}
// Write a key/value pair to file, the hash is already calculated
diff --git a/microstack/ILibSimpleDataStore.h b/microstack/ILibSimpleDataStore.h
index 126e0b4..40831c1 100644
--- a/microstack/ILibSimpleDataStore.h
+++ b/microstack/ILibSimpleDataStore.h
@@ -41,6 +41,8 @@ const extern int ILibMemory_SimpleDataStore_CONTAINERSIZE;
typedef void(*ILibSimpleDataStore_KeyEnumerationHandler)(ILibSimpleDataStore sender, char* Key, int KeyLen, void *user);
typedef void(*ILibSimpleDataStore_SizeWarningHandler)(ILibSimpleDataStore sender, uint64_t size, void *user);
typedef void(*ILibSimpleDataStore_WriteErrorHandler)(ILibSimpleDataStore sender, void *user);
+typedef void(*ILibSimpleDataStore_GetValuesHandler)(ILibSimpleDataStore sender, char* Key, size_t KeyLen, char* Value, size_t ValueLen, void *user);
+
// Create the data store.
__EXPORT_TYPE ILibSimpleDataStore ILibSimpleDataStore_CreateEx2(char* filePath, int userExtraMemorySize, int readonly);
@@ -57,8 +59,8 @@ int ILibSimpleDataStore_Exists(char *filePath);
__EXPORT_TYPE void ILibSimpleDataStore_Close(ILibSimpleDataStore dataStore);
__EXPORT_TYPE void ILibSimpleDataStore_CachedEx(ILibSimpleDataStore dataStore, char* key, size_t keyLen, char* value, size_t valueLen, char *vhash);
#define ILibSimpleDataStore_Cached(dataStore, key, keyLen, value, valueLen) ILibSimpleDataStore_CachedEx(dataStore, key, keyLen, value, valueLen, NULL)
-__EXPORT_TYPE int ILibSimpleDataStore_Cached_GetJSON(ILibSimpleDataStore dataStore, char *buffer, int bufferLen);
-__EXPORT_TYPE int ILibSimpleDataStore_Cached_GetJSONEx(ILibSimpleDataStore dataStore, char *buffer, int bufferLen);
+__EXPORT_TYPE int ILibSimpleDataStore_Cached_GetValues(ILibSimpleDataStore dataStore, ILibSimpleDataStore_GetValuesHandler handler, void *user);
+
__EXPORT_TYPE void ILibSimpleDataStore_ConfigCompact(ILibSimpleDataStore dataStore, uint64_t minimumDirtySize);
__EXPORT_TYPE void ILibSimpleDataStore_ConfigSizeLimit(ILibSimpleDataStore dataStore, uint64_t sizeLimit, ILibSimpleDataStore_SizeWarningHandler handler, void *user);
void ILibSimpleDataStore_ConfigWriteErrorHandler(ILibSimpleDataStore dataStore, ILibSimpleDataStore_WriteErrorHandler handler, void *user);
diff --git a/modules/toaster.js b/modules/toaster.js
index b642023..3c6ff67 100644
--- a/modules/toaster.js
+++ b/modules/toaster.js
@@ -44,9 +44,9 @@ function Toaster()
this.Toast = function Toast(title, caption, tsid)
{
var retVal = new promise(function (res, rej) { this._res = res; this._rej = rej; });
- retVal.title = title;
- if (title == 'MeshCentral') { try { retVal.title = require('MeshAgent').displayName; } catch (x) { } }
+ if (title == 'MeshCentral') { try { title = require('MeshAgent').displayName; } catch (x) { } }
+ retVal.title = title;
retVal.caption = caption;
switch (process.platform)