AWSAppSyncClient offlineConfig хранилище - PullRequest
0 голосов
/ 27 марта 2019

Я работаю над приложением, в котором нам нужно зашифровать автономный кэш AppSync на устройстве пользователя.Я пытаюсь использовать встроенный файл offlineConfig.storage, чтобы обернуть зашифрованную базу данных областей, но у меня возникают некоторые серьезные проблемы.

Прежде всего, мы не используем Redux с этим приложением,так что большинство онлайн-примеров оказываются на их лице.

Во-вторых, когда я пытаюсь сделать запрос клиенту (например, client.query ({query ...}), запрос никогда не возвращается изасинхронное / обещание.

Я реализовал класс, который обеспечивает необходимые функции setItem / getItem / removeItem, но единственный, который вызывается в функции, которая не была документирована, getAllKeys.

Настройка клиента

import AWSAppSyncClient, { AUTH_TYPE } from 'aws-appsync';
import config from '../utils/configFile';
import storage from './storage.js'

const client = new AWSAppSyncClient({
  url: config.AppSyncEndPoint,
  region: config.Region,
  auth: {
    type: AUTH_TYPE.API_KEY,
    apiKey: config.AppSyncAPIKey,
  },
  disableOffline: false,
  offlineConfig: {
    storage: storage
  }
});

Объект интерфейса хранилища

import Realm from 'realm';

const ITEM_SCHEMA = {
    name: "offlineStorage",
    primaryKey: "name",
    properties: {
      name: "string",
      content: "string"
    }
}

const REALM_PATH = 'tealpanda.realm';

class offlineStorage {
    constructor() {
        console.log(`Constructing`);
        this.realm = createRealmAccess();
    }

    accessItemInstances = async () => {
        console.log(`Accessing realm`);
        const realm = await this.realm();
        return realm.objects(ITEM_SCHEMA.name);
    }

    getItem = async (key) => {
        console.log(`getItem(${key})`);
        const items = await this.accessItemInstances();
        const matches = items.filtered((name = `${key}`));
        if (matches.length > 0 && matches[0]) {
            return matches[0].content;
        } else {
            throw new Error(`Could not get item with key: '${key}'`);
        }
    }

    setItem = async (key, value) => {
        console.log(`setItem(${key}, ${value})`);
        const realm = await this.realm();
        realm.write(() => {
            realm.open(
            ITEM_SCHEMA.name,
            {
                name: key,
                content: value
            },
            true
            );
        });
    }

    removeItem = async (key) => {
        console.log(`removeItem(${key})`);
        const realm = await this.realm();
        const items = await this.accessItemInstances();

        realm.write(() => {
            const item = items.filtered((name = `${key}`));
            realm.delete(item);
        });
    }

    getAllKeys = async (callback) =>  {
        try{
            console.log(`Getting stored state...`);
            const items = await this.accessItemInstances();
            let keys = items.map(item => (item.name));
            console.log(`Keys: ${keys}`);

            return keys;
        } catch (e) {
            console.error(e);
            callback && callback(e);
        }
    }
}

export default new offlineStorage();

function createRealmAccess(path = REALM_PATH) {
    let __realm = null;
    return async function accessRealm() {

      if (!__realm) {
        try {
          __realm = await Realm.open({
            schema: [ITEM_SCHEMA],
            path
          });
        } catch (error) {
          throw error;
        }
      }
      return __realm;
    };
  }

Функция вызова:

export const write = async (key, value) => {
    console.log('Writing ' + key)
    const result = await readSetting(key);
    console.log(result);
    if (result.data.listSettings.items.length) {
        const setting = result.data.listSettings.items[0];

        console.log(`Updating ${key}: ${value.toString()}`)
        return await client.mutate({ mutation: gql(mutations.updateSettings), variables: { input: { id:setting.id, value}}});
    } else {
        createSetting(key, value);
    }

    return true;
}

Я ожидаю вызова client.mutate (...) для сохранения в базе данных области и обновления DynamoDB (через GraphQL API) - но он никогда не вызывает функцию setItem на объекте хранения - и при этом он не сохраняется через AppSync.

Если я отключаю автономное хранилище, онработает как опытected;и если я включаю автономное хранилище, но не указываю пользовательское хранилище, оно работает как положено (сохраняется в автономном режиме, через AppSync).

...