Eu gostaria de anunciar o lançamento de algo realmente bastante interessante - revolucionário na verdade. Isso pode soar exagerado, mas acho que você não viu nada parecido com isso, ou mesmo pensou que fosse possível! Lançamos um novo módulo JavaScript/Node.js chamado _glsdb_, mais informações: No entanto, para os propósitos deste anúncio aqui, quero apenas focar em uma parte do _glsdb_: suas APIs que abstraem classes IRIS (ou Caché) como objetos JavaScript equivalentes. Vamos dar uma olhada rápida no que quero dizer com isso, porque quero dizer Objetos JavaScript que na verdade são Objetos IRIS que residem no banco de dados! Suponha que eu instalei os dados SAMPLES do repositório InterSystems, por exemplo, conforme descrito aqui: Então, para acessar esses dados SAMPLES usando o _glsdb_, primeiro preciso abrir uma conexão com o IRIS (o _glsdb_ usa nossa interface _mg-dbx_ para fazer essa conexão), por exemplo:
<span class="hljs-keyword">const</span> {glsDB} = <span class="hljs-keyword">await</span> <span class="hljs-keyword">import</span>(<span class="hljs-string">'glsdb'</span>);
<span class="hljs-keyword">let</span> glsdb = <span class="hljs-keyword">new</span> glsDB(<span class="hljs-string">'iris'</span>);
<span class="hljs-keyword">let</span> options = {
  <span class="hljs-attr">connection</span>: <span class="hljs-string">'network'</span>,
  <span class="hljs-attr">host</span>: <span class="hljs-string">'172.17.0.2'</span>,
  <span class="hljs-attr">tcp_port</span>: <span class="hljs-number">7042</span>,
  <span class="hljs-attr">username</span>: <span class="hljs-string">"_SYSTEM"</span>,
  <span class="hljs-attr">password</span>: <span class="hljs-string">"xxxxxx"</span>,
  <span class="hljs-attr">namespace</span>: <span class="hljs-string">"SAMPLES"</span>
}

glsdb.open(options);
Agora que fiz isso, posso fazer o seguinte para acessar um registro de Funcionário (Employee) no banco de dados SAMPLES:
<span class="hljs-keyword">let</span> Employee = glsdb.irisClass(<span class="hljs-string">'Sample.Employee'</span>);
<span class="hljs-keyword">let</span> employee = Employee(<span class="hljs-number">101</span>);
Até agora, tão surpreendente, talvez. Mas é aqui que começa a diversão alucinante. Criamos um objeto JavaScript chamado _employee_ que parece representar uma instância de Funcionário (Employee) com o OID 101, mas na verdade é um objeto JavaScript bastante especial: é um JavaScript Proxy Object que é mapeado diretamente para a instância física da classe IRIS no banco de dados. Eu tenho acesso direto a todas as propriedades e métodos da Classe IRIS, e quando eu manipulo o Proxy Object, na verdade estou manipulando a instância da Classe IRIS no banco de dados! Então agora eu posso fazer coisas como essa:
<span class="hljs-keyword">let</span> salary = employee.Salary;
<span class="hljs-built_in">console</span>.log(<span class="hljs-string">'employee.Salary = '</span> + salary);
<span class="hljs-keyword">let</span> company = employee.Company;
<span class="hljs-keyword">let</span> name = company.Name;
<span class="hljs-built_in">console</span>.log(<span class="hljs-string">'Company: '</span> + name);
O importante a ser percebido aqui é que meu objeto _employee_ não é uma cópia JavaScript na memória da instância da Classe IRIS - é a instância **_real_** da Classe Class, no **banco de dados**! E como você pode ver acima, posso até encadear o relacionamento entre o Funcionário (Employee) e a Empresa (Company) como você faria em ObjectScript. Na verdade, eu posso até fazer isso de uma só vez:
<span class="hljs-built_in">console</span>.log(employee.Company.Name);
e encadeie diretamente pelas propriedades, diretamente na Classe Física IRIS no banco de dados! Eu também posso salvar as alterações no objeto - para isso eu uso um método especial chamado _save(), ex.:  _employee._save()_ Para criar uma nova instância de um funcionário, eu simplesmente não especifico um OID, ex.:
<span class="hljs-keyword">let</span> newEmployee = Employee();
_glsdb_ fornece um atalho para definir e salvar um novo registro de uma só vez, usando o método __set()_, ex.:
<span class="hljs-keyword">let</span> ok = newEmployee._set({
    <span class="hljs-attr">Title</span>: <span class="hljs-string">'Manager'</span>
    Salary: <span class="hljs-number">60000</span>
})
Você pode até mesmo inspecionar os métodos e propriedades disponíveis da Classe:
<span class="hljs-built_in">console</span>.log(employee._properties);
<span class="hljs-built_in">console</span>.log(employee._methods);
Então, essa é uma visão geral do _glsdb_: espero que dê um gostinho de como é insano! Você provavelmente está se perguntando como é possível fazer esse tipo de coisa. Bem, em resumo, tudo se resume a um recurso relativamente novo do JavaScript: objetos proxy. Objetos Proxy são objetos especiais que atuam, como o próprio nome indica, como um proxy para outro objeto real. Mas o verdadeiro poder deles está no fato de que você pode definir "armadilhas" para acessar ou alterar as propriedades do Objeto Proxy e (e essa é a chave)  você pode aplicar lógica personalizada a essas armadilhas. No caso do _glsdb_, essa lógica personalizada usa as APIs _mg-dbx_ nos bastidores para realizar o acesso equivalente ou a alteração que está acontecendo no objeto Proxy para uma classe IRIS correspondente. De qualquer forma, esse é um vislumbre rápido do mundo louco possível com o _glsdb_! O que eu publiquei é uma versão antecipada, então tenho certeza de que há aspectos do proxy IRIS que precisarão de ajustes. Se você quiser experimentá-lo e ver o que ele pode fazer, por favor, avise-me se você encontrar algo que não funcione adequadamente. Ah, e a propósito, confira as outras APIs que o _glsdb_ fornece - elas são igualmente interessantes e alucinantes! E, finalmente, _glsdb_ é um software de código aberto, então, por favor, brinque com o código e poste PRs no repositório do Github se você quiser ajudar no desenvolvimento posterior.