fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima

This commit is contained in:
Rodrigo Rodriguez 2023-12-10 12:21:28 -03:00
parent f2da1f8810
commit 84cc7b85cb
2 changed files with 69 additions and 21 deletions

View file

@ -546,6 +546,7 @@ export class GBVMService extends GBService {
global[i] = this.variables[i];
}
// Defines local utility BASIC functions.
const ubound = (gbarray) => {return gbarray ? gbarray.length - 1: 0};
@ -581,7 +582,35 @@ export class GBVMService extends GBService {
const wa = (await createRpcClient(() => createHttpClient(url, {agent: agent}), optsRPC)).remote;
url = 'http://localhost:${GBVMService.API_PORT}/${min.botId}/img';
const img = (await createRpcClient(() => createHttpClient(url, {agent: agent}), optsRPC)).remote;
const timeout = (ms)=> {
return new Promise(resolve => setTimeout(resolve, ms));
}
const tokenStops = {};
// Setups refresh token mechanism.
const tokens = this.variables['tokens'];
const interval = 60; // 1 hour.
for(i in tokens) {
const token = tokens[i];
tokenStops[token] = false;
const waitAndRefreshToken = async (token) => {
await timeout(interval);
global[i] = await sys.getCustomToken({pid, token});
if (!tokenStops[token]) {
await waitAndRefreshToken(token);
}
};
await waitAndRefreshToken(token);
}
${code}
// Closes handles if any.
@ -589,6 +618,15 @@ export class GBVMService extends GBService {
await wa.closeHandles({pid: pid});
await sys.closeHandles({pid: pid});
// Signals token refresh job to stop.
for(i in tokens) {
const token = tokens[i];
tokenStops[token] = true;
}
})();
`;
Fs.writeFileSync(jsfile, code);
@ -846,26 +884,6 @@ export class GBVMService extends GBService {
let variables = [];
// Find all tokens in .gbot Config.
const strFind = ' Client ID';
const tokens = await min.core['findParam'](min.instance, strFind);
await CollectionUtil.asyncForEach(tokens, async t => {
const tokenName = t.replace(strFind, '');
try {
variables[tokenName] = await (min.adminService as any)['acquireElevatedToken']
(min.instance.instanceId, false,
tokenName,
min.core.getParam<string>(min.instance, `${tokenName} Client ID`, null),
min.core.getParam<string>(min.instance, `${tokenName} Client Secret`, null),
min.core.getParam<string>(min.instance, `${tokenName} Host`, null),
min.core.getParam<string>(min.instance, `${tokenName} Tenant`, null)
);
} catch (error) {
variables[t] = 'ERROR: Configure /setupSecurity before using token variables.';
}
});
// These variables will be automatically be available as normal BASIC variables.
@ -916,6 +934,21 @@ export class GBVMService extends GBService {
const sys = new SystemKeywords();
await dk.setFilter({ pid: pid, value: null });
// Find all tokens in .gbot Config.
const strFind = ' Client ID';
const tokens = await min.core['findParam'](min.instance, strFind);
await CollectionUtil.asyncForEach(tokens, async t => {
const tokenName = t.replace(strFind, '');
try {
variables[tokenName] = await sys.getCustomToken({pid, tokenName});
} catch (error) {
variables[t] = 'ERROR: Configure /setupSecurity before using token variables.';
}
});
sandbox['tokens'] = tokens;
sandbox['variables'] = variables;
sandbox['id'] = sys.getRandomId();
sandbox['username'] = await dk.userName({ pid });

View file

@ -1594,6 +1594,21 @@ export class SystemKeywords {
return res;
}
public async getCustomToken({pid, tokenName}) :Promise<string>{
const { min, user, params, proc } = await DialogKeywords.getProcessInfo(pid);
GBLogEx.info(min, `GET TOKEN: ${tokenName}`);
return await (min.adminService as any)['acquireElevatedToken']
(min.instance.instanceId, false,
tokenName,
min.core.getParam(min.instance, `${tokenName} Client ID`, null),
min.core.getParam(min.instance, `${tokenName} Client Secret`, null),
min.core.getParam(min.instance, `${tokenName} Host`, null),
min.core.getParam(min.instance, `${tokenName} Tenant`, null)
);
}
static aa;
/**