Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add s3 ACL in parameter to allow different file permissions #393

Open
wants to merge 15 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ node_modules
lib
*.tgz
lerna-debug.log
.npmrc
16 changes: 16 additions & 0 deletions packages/aws-appsync-react/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.

<a name="1.2.7"></a>
## [1.2.7](https://github.com/awslabs/aws-mobile-appsync-sdk-js/compare/[email protected]@1.2.7) (2019-03-12)




**Note:** Version bump only for package aws-appsync-react

<a name="1.2.6"></a>
## [1.2.6](https://github.com/awslabs/aws-mobile-appsync-sdk-js/compare/[email protected]@1.2.6) (2019-01-11)




**Note:** Version bump only for package aws-appsync-react

<a name="1.2.5"></a>
## [1.2.5](https://github.com/awslabs/aws-mobile-appsync-sdk-js/compare/[email protected]@1.2.5) (2018-12-12)

Expand Down
4 changes: 2 additions & 2 deletions packages/aws-appsync-react/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "aws-appsync-react",
"version": "1.2.5",
"version": "1.2.7",
"main": "lib/index.js",
"license": "SEE LICENSE IN LICENSE",
"description": "AWS Mobile AppSync SDK for JavaScript - React and React Native components",
Expand All @@ -27,7 +27,7 @@
"devDependencies": {
"@types/graphql": "0.12.4",
"@types/react": "^16.0.25",
"aws-appsync": "^1.7.0",
"aws-appsync": "^1.7.2",
"react": "^16.1.1",
"react-apollo": "^2.1.9",
"react-native": "^0.50.3",
Expand Down
27 changes: 27 additions & 0 deletions packages/aws-appsync/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,33 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.

<a name="1.7.2"></a>
## [1.7.2](https://github.com/awslabs/aws-mobile-appsync-sdk-js/compare/[email protected]@1.7.2) (2019-03-12)


### Bug Fixes

* **auth:** Remove temporary variables (starting with '@@') before signing ([#347](https://github.com/awslabs/aws-mobile-appsync-sdk-js/issues/347)) ([920b47d](https://github.com/awslabs/aws-mobile-appsync-sdk-js/commit/920b47d)), closes [#354](https://github.com/awslabs/aws-mobile-appsync-sdk-js/issues/354)
* **deltaSync:** Make sure query manager is initialized ([13a2dec](https://github.com/awslabs/aws-mobile-appsync-sdk-js/commit/13a2dec)), closes [#893237](https://github.com/awslabs/aws-mobile-appsync-sdk-js/issues/893237)




<a name="1.7.1"></a>
## [1.7.1](https://github.com/awslabs/aws-mobile-appsync-sdk-js/compare/[email protected]@1.7.1) (2019-01-11)


### Bug Fixes

* **deltasync:** Fix error when baseQuery is not specified ([#320](https://github.com/awslabs/aws-mobile-appsync-sdk-js/issues/320)) ([8dbe01d](https://github.com/awslabs/aws-mobile-appsync-sdk-js/commit/8dbe01d))
* **offline-helpers:** Offline helpers types and fix issue with different options ([#329](https://github.com/awslabs/aws-mobile-appsync-sdk-js/issues/329)) ([42ac50a](https://github.com/awslabs/aws-mobile-appsync-sdk-js/commit/42ac50a))
* **offline-helpers:** Preserve order of elements in update cache operation type ([#325](https://github.com/awslabs/aws-mobile-appsync-sdk-js/issues/325)) ([5b49946](https://github.com/awslabs/aws-mobile-appsync-sdk-js/commit/5b49946))
* **subscriptions:** Do not retry mqtt disconnections ([#319](https://github.com/awslabs/aws-mobile-appsync-sdk-js/issues/319)) ([b933379](https://github.com/awslabs/aws-mobile-appsync-sdk-js/commit/b933379))
* **subscriptions:** Guard against errors: null response in subscription handshake ([#337](https://github.com/awslabs/aws-mobile-appsync-sdk-js/issues/337)) ([a2035d0](https://github.com/awslabs/aws-mobile-appsync-sdk-js/commit/a2035d0))




<a name="1.7.0"></a>
# [1.7.0](https://github.com/awslabs/aws-mobile-appsync-sdk-js/compare/[email protected]@1.7.0) (2018-12-12)

Expand Down
4 changes: 2 additions & 2 deletions packages/aws-appsync/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "aws-appsync",
"version": "1.7.0",
"version": "1.7.2",
"main": "lib/index.js",
"license": "SEE LICENSE IN LICENSE",
"description": "AWS Mobile AppSync SDK for JavaScript",
Expand Down Expand Up @@ -28,7 +28,7 @@
"apollo-link-retry": "2.2.5",
"aws-sdk": "2.329.0",
"debug": "2.6.9",
"graphql": "^0.11.7",
"graphql": "0.13.0",
"redux": "^3.7.2",
"redux-thunk": "^2.2.0",
"setimmediate": "^1.0.5",
Expand Down
2 changes: 1 addition & 1 deletion packages/aws-appsync/src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ const createLinkWithStore = (createLinkFunc = (store: Store<OfflineCacheType>) =
});
}

type CredentialsGetter = () => (Credentials | CredentialsOptions | null) | Credentials | CredentialsOptions | null;
type CredentialsGetter = () => (Credentials | CredentialsOptions | Promise<Credentials> | Promise<CredentialsOptions> | null) | Credentials | CredentialsOptions | Promise<Credentials> | Promise<CredentialsOptions> | null;

export interface AWSAppSyncClientOptions {
url: string,
Expand Down
5 changes: 3 additions & 2 deletions packages/aws-appsync/src/deltaSync.ts
Original file line number Diff line number Diff line change
Expand Up @@ -318,7 +318,7 @@ const effect = async <TCache extends NormalizedCacheObject>(
}
//#endregion

const { baseRefreshIntervalInSeconds } = baseQuery;
const { baseRefreshIntervalInSeconds } = baseQuery || { baseRefreshIntervalInSeconds: undefined };
upperBoundTimeMS = baseRefreshIntervalInSeconds ? baseRefreshIntervalInSeconds * 1000 : DEFAULT_UPPER_BOUND_TIME_MS;

const skipBaseQuery = !(baseQuery && baseQuery.query) || (baseLastSyncTimestamp
Expand All @@ -336,7 +336,7 @@ const effect = async <TCache extends NormalizedCacheObject>(
query,
variables,
});
cacheProxy.writeQuery({ query, data: result.data });
cacheProxy.writeQuery({ query, variables, data: result.data });

if (typeof update === 'function') {
tryFunctionOrLogError(() => {
Expand Down Expand Up @@ -417,6 +417,7 @@ const effect = async <TCache extends NormalizedCacheObject>(

boundSaveSnapshot(store, client.cache);

client.initQueryManager();
const dataStore = client.queryManager.dataStore;
const enqueuedActionsFilter = [mutationsConfig.enqueueAction];
enquededMutations
Expand Down
15 changes: 10 additions & 5 deletions packages/aws-appsync/src/helpers/offline.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,9 +87,9 @@ export type CacheUpdateQuery = QueryWithVariables | DocumentNode;

export type CacheUpdatesDefinitions = {
[key in CacheOperationTypes]?: CacheUpdateQuery | CacheUpdateQuery[]
};
} | CacheUpdateQuery | CacheUpdateQuery[];

export type CacheUpdatesOptions = (variables?: object) => CacheUpdatesDefinitions | CacheUpdatesDefinitions;
export type CacheUpdatesOptions = ((variables?: object) => CacheUpdatesDefinitions) | CacheUpdatesDefinitions;

/**
* Builds a SubscribeToMoreOptions object ready to be used by Apollo's subscribeToMore() to automatically update the query result in the
Expand Down Expand Up @@ -171,9 +171,14 @@ const getOpTypeQueriesMap = (cacheUpdateQuery: CacheUpdatesOptions, variables):
const cacheUpdateQueryVal = typeof cacheUpdateQuery === 'function' ?
cacheUpdateQuery(variables) :
cacheUpdateQuery || {};
const opTypeQueriesMap = isDocument(cacheUpdateQueryVal) ?
{ [CacheOperationTypes.AUTO]: [].concat(cacheUpdateQueryVal) } as CacheUpdatesDefinitions :
cacheUpdateQueryVal;

let opTypeQueriesMap = cacheUpdateQueryVal;

if (isDocument(cacheUpdateQueryVal) ||
isDocument((cacheUpdateQueryVal as QueryWithVariables).query) ||
Array.isArray(cacheUpdateQuery)) {
opTypeQueriesMap = { [CacheOperationTypes.AUTO]: [].concat(cacheUpdateQueryVal) } as CacheUpdatesDefinitions;
}

return opTypeQueriesMap;
};
Expand Down
16 changes: 14 additions & 2 deletions packages/aws-appsync/src/link/auth-link.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ export class AuthLink extends ApolloLink {
private link: ApolloLink;

/**
*
*
* @param {*} options
*/
constructor(options) {
Expand Down Expand Up @@ -167,7 +167,7 @@ export const authLink = ({ url, region, auth: { type = AUTH_TYPE.NONE, credentia
const formatAsRequest = ({ operationName, variables, query }, options) => {
const body = {
operationName,
variables,
variables: removeTemporaryVariables(variables),
query: print(query)
};

Expand All @@ -182,3 +182,15 @@ const formatAsRequest = ({ operationName, variables, query }, options) => {
},
};
}

/**
* Removes all temporary variables (starting with '@@') so that the signature matches the final request.
*/
const removeTemporaryVariables = (variables: any) =>
Object.keys(variables)
.filter(key => !key.startsWith("@@"))
.reduce((acc, key) => {
acc[key] = variables[key];
return acc;
}, {});

Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ export default (fileField, { credentials }) => {
region,
mimeType: ContentType,
localUri: Body,
acl: ACL,
} = fileField;

const s3 = new S3({
Expand All @@ -27,5 +28,6 @@ export default (fileField, { credentials }) => {
Key,
Body,
ContentType,
ACL,
}).promise();
};
2 changes: 2 additions & 0 deletions packages/aws-appsync/src/link/complex-object-link.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ const complexObjectFields = [
{ name: 'key', type: 'string' },
{ name: 'region', type: 'string' },
{ name: 'mimeType', type: 'string' },
{ name: 'acl', type: 'string' },
{ name: 'localUri', type: ['object', 'string'] },
];
const findInObject = obj => {
Expand All @@ -109,6 +110,7 @@ const findInObject = obj => {
if (testFn(obj)) {
acc[path] = { ...obj };
delete obj.mimeType;
delete obj.acl;
delete obj.localUri;
}

Expand Down
6 changes: 6 additions & 0 deletions packages/aws-appsync/src/link/retry-link.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ const MAX_DELAY_MS = 5 * 60 * 1000;
const getDelay = count => ((2 ** count) * BASE_TIME_MS) + (JITTER_FACTOR * Math.random());

export const SKIP_RETRY_KEY = '@@skipRetry';
export const PERMANENT_ERROR_KEY = typeof Symbol !== 'undefined' ? Symbol('permanentError') : '@@permanentError';

export const getEffectDelay = (_action: OfflineAction, retries: number) => {
const delay = getDelay(retries);
Expand All @@ -30,8 +31,13 @@ export const createRetryLink = (origLink: ApolloLink) => {

const retryLink = new RetryLink({
attempts: (count, operation, error) => {
const { [PERMANENT_ERROR_KEY]: permanent = false } = error;
const { [SKIP_RETRY_KEY]: skipRetry = false } = operation.variables;

if (permanent) {
return false;
}

if (error.statusCode >= 400 && error.statusCode < 500) {
return false;
}
Expand Down
15 changes: 8 additions & 7 deletions packages/aws-appsync/src/link/subscription-handshake-link.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import * as Paho from '../vendor/paho-mqtt';
import { ApolloError } from "apollo-client";
import { FieldNode } from "graphql";
import { getMainDefinition } from "apollo-utilities";
import { PERMANENT_ERROR_KEY } from "./retry-link";

const logger = rootLogger.extend('subscriptions');
const mqttLogger = logger.extend('mqtt');
Expand Down Expand Up @@ -66,13 +67,13 @@ export class SubscriptionHandshakeLink extends ApolloLink {
} = { subscription: { newSubscriptions: {}, mqttConnections: [] } },
errors = [],
}: {
extensions?: {
subscription: SubscriptionExtension
},
errors: any[]
} = subsInfo;
extensions?: {
subscription: SubscriptionExtension
},
errors: any[]
} = subsInfo;

if (errors.length) {
if (errors && errors.length) {
return new Observable(observer => {
observer.error(new ApolloError({
errorMessage: 'Error during subscription handshake',
Expand Down Expand Up @@ -170,7 +171,7 @@ export class SubscriptionHandshakeLink extends ApolloLink {
if (errorCode !== 0) {
topics.forEach(t => {
if (this.topicObservers.has(t)) {
this.topicObservers.get(t).forEach(observer => observer.error(args));
this.topicObservers.get(t).forEach(observer => observer.error({ ...args, [PERMANENT_ERROR_KEY]: true }));
}
});
}
Expand Down
24 changes: 12 additions & 12 deletions tutorials/react-offline-realtime-todos/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

This is an example tutorial of building an offline and realtime enabled React application with the AWS AppSync SDK cache abstractions for the Apollo client. The tutorial takes you through a sample GraphQL schema for a "Todo" application in steps:
- Persisting queries offline for reads
- Mutations offline, with automatic optimistic UI and syncronization
- Mutations offline, with automatic optimistic UI and synchronization
- Subscribing to data and automatically updating UI
- Mutations with version checks and conflict resolution
- Mutations to update multiple UIs (e.g. queries) simultaneously
Expand Down Expand Up @@ -52,7 +52,7 @@ input UpdateTodoInput {
}
```

**Save** the schema again. On the navigation bar in the left of the console, click on `<your api name>`, scroll down and select the **Web** section then click **Download** and save the `AppSync.js` file somewhere for later.
**Save** the schema again. On the navigation bar in the left of the console, click on `<your api name>`, scroll down and select the **Web** section then click **Download Config** and save the `aws-exports.js` file somewhere for later.

## Imports and configuration

Expand All @@ -65,25 +65,25 @@ create-react-app todos && cd ./todos
yarn add aws-appsync aws-appsync-react graphql-tag react-apollo
```

Copy the `AppSync.js` file that you downloaded from the console into the `./todos/src` directory. Next add the following imports towards the top of the `App.js` file:
Copy the `aws-exports.js` file that you downloaded from the console into the `./todos/src` directory. Next add the following imports towards the top of the `App.js` file:


```javascript
import AWSAppSyncClient, { buildSubscription } from 'aws-appsync';
import { Rehydrated, graphqlMutation } from 'aws-appsync-react';
import AppSyncConfig from './AppSync';
import awsmobile from './aws-exports';
import { ApolloProvider } from 'react-apollo';
```

Replace everything __after__ the definition of the `<App />` component with the following configuration:

```jsx
const client = new AWSAppSyncClient({
url: AppSyncConfig.graphqlEndpoint,
region: AppSyncConfig.region,
url: awsmobile.graphqlEndpoint,
region: awsmobile.region,
auth: {
type: AppSyncConfig.authenticationType,
apiKey: AppSyncConfig.apiKey
type: awsmobile.authenticationType,
apiKey: awsmobile.apiKey
}
})

Expand Down Expand Up @@ -181,7 +181,7 @@ mutation addTodo {
}
```

Press the arrow at the top to run your query and then from the running client application press the **Refresh** button. Alter the mutation text for `name` and `description` a couple of times in the console and add more items then refresh the client again. If you keep the app running, or build as a PWA, but disable the network connection (which can be similated in browsers such as Google Chrome) the items will be persisted in the cache and visible on the screen.
Press the arrow at the top to run your query and then from the running client application press the **Refresh** button. Alter the mutation text for `name` and `description` a couple of times in the console and add more items then refresh the client again. If you keep the app running, or build as a PWA, but disable the network connection (which can be simulated in browsers such as Google Chrome) the items will be persisted in the cache and visible on the screen.

## Add offline writes

Expand Down Expand Up @@ -299,7 +299,7 @@ Import this into your `App.js` file:
import SubscribeTodos from './GraphQLSubscribeTodos';
```

It is recommended to initiate the subscription inside of the `componentDidMount()` lifecyle method of the `<Todos />` component like so:
It is recommended to initiate the subscription inside of the `componentDidMount()` lifecycle method of the `<Todos />` component like so:

```javascript
class Todos extends Component {
Expand Down Expand Up @@ -339,7 +339,7 @@ You should see the change automatically show up in your client application. Note

If you wanted to add capabilities to perform updates to your Todos you could use the generated `updateTodo` mutation and just create a new component. However if performing offline functions or shared data it is valuable to perform version checks against each individual object.

The SDK will automatically account for this, however you will need to modify the schema as well as your resolvers in order to do server validaton on the versions. Edit your schema as following:
The SDK will automatically account for this, however you will need to modify the schema as well as your resolvers in order to do server validation on the versions. Edit your schema as following:

- Add a `version` field in the `Todo` type
- Add a required field of `expectedVersion` to `UpdateTodoInput`
Expand Down Expand Up @@ -385,7 +385,7 @@ Also, replace the resolver Request Mapping Template for `createTodo` mutation (O

If you are unfamiliar with editing resolvers in AWS AppSync please [reference this section of the documentation](https://docs.aws.amazon.com/appsync/latest/devguide/configuring-resolvers.html).

Now modify the resolver Request Mapping template attached to the `updateTodo` field and overwite it with the contents below:
Now modify the resolver Request Mapping template attached to the `updateTodo` field and overwrite it with the contents below:

```
{
Expand Down