Я работаю над приложением, в котором нам нужно зашифровать автономный кэш 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).