CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/npm-aws-amplify--api

A unified API layer for AWS Amplify that combines GraphQL and REST API functionality

Pending

Quality

Pending

Does it follow best practices?

Impact

Pending

No eval scenarios have been run

SecuritybySnyk

Pending

The risk profile of this skill

Overview
Eval results
Files

server-apis.mddocs/

Server-Side APIs

Server-side compatible versions of GraphQL and REST APIs for use in SSR environments like Next.js, providing the same functionality optimized for Node.js server contexts.

Capabilities

Server-Side GraphQL Client

GraphQL client generation specifically designed for server-side rendering environments.

/**
 * Generate GraphQL client for server-side usage
 * @returns Server-compatible GraphQL client
 */
function generateClient(): ServerGraphQLClient;

/**
 * Generate client with specific Amplify instance for advanced server usage
 * @param amplifyInstance - Custom Amplify configuration instance
 * @returns Server GraphQL client with custom configuration
 */
function generateClientWithAmplifyInstance(
  amplifyInstance: AmplifyInstance
): ServerGraphQLClient;

interface ServerGraphQLClient {
  /**
   * Execute GraphQL operations on the server
   */
  graphql<T>(
    options: GraphQLOptionsV6<T>,
    additionalHeaders?: CustomHeaders
  ): Promise<GraphQLResult<T>>;
  
  /**
   * Cancel server-side GraphQL operations
   */
  cancel(promise: Promise<any>, message?: string): boolean;
  
  /**
   * Check if error is from cancellation
   */
  isCancelError(error: any): boolean;
}

Usage Examples:

// Next.js API route example
import { generateClient } from "@aws-amplify/api/server";
import { NextRequest } from "next/server";

export async function GET(request: NextRequest) {
  const client = generateClient();
  
  const { data, errors } = await client.graphql({
    query: `
      query ListTodos {
        listTodos {
          items {
            id
            content
            completed
          }
        }
      }
    `
  });
  
  if (errors) {
    return Response.json({ errors }, { status: 400 });
  }
  
  return Response.json({ data });
}

// With custom Amplify instance
import { Amplify } from "@aws-amplify/core";
import { generateClientWithAmplifyInstance } from "@aws-amplify/api/internals";

const amplify = Amplify.configure({
  API: {
    GraphQL: {
      endpoint: process.env.GRAPHQL_ENDPOINT,
      region: process.env.AWS_REGION,
      defaultAuthMode: "iam"
    }
  }
});

const client = generateClientWithAmplifyInstance(amplify);

Server-Side SSR Client Types

Specialized client types for server-side rendering with different authentication strategies.

/**
 * SSR client that uses cookies for authentication
 */
type V6ClientSSRCookies<T, Options = DefaultCommonClientOptions> = {
  graphql: ServerGraphQLMethod<Options>;
  cancel(promise: Promise<any>, message?: string): boolean;
  isCancelError(error: any): boolean;
  models: T extends Record<any, any> ? ModelOperations<T> : never;
};

/**
 * SSR client that uses request context for authentication
 */
type V6ClientSSRRequest<T, Options = DefaultCommonClientOptions> = {
  graphql: ServerGraphQLMethod<Options>;
  cancel(promise: Promise<any>, message?: string): boolean;
  isCancelError(error: any): boolean;
  models: T extends Record<any, any> ? ModelOperations<T> : never;
};

Server-Side REST API Methods

Complete set of HTTP methods optimized for server-side environments.

/**
 * Server-side HTTP GET request
 * @param contextSpec - Amplify server context specification
 * @param input - Request configuration including API name and path
 * @returns GetOperation promise that resolves to response
 */
function get(contextSpec: AmplifyServer.ContextSpec, input: GetInput): GetOperation;

/**
 * Server-side HTTP POST request
 * @param contextSpec - Amplify server context specification
 * @param input - Request configuration including API name, path, and body
 * @returns PostOperation promise that resolves to response
 */
function post(contextSpec: AmplifyServer.ContextSpec, input: PostInput): PostOperation;

/**
 * Server-side HTTP PUT request
 * @param contextSpec - Amplify server context specification
 * @param input - Request configuration including API name, path, and body
 * @returns PutOperation promise that resolves to response
 */
function put(contextSpec: AmplifyServer.ContextSpec, input: PutInput): PutOperation;

/**
 * Server-side HTTP DELETE request
 * @param contextSpec - Amplify server context specification
 * @param input - Request configuration including API name and path
 * @returns DeleteOperation promise that resolves to response
 */
function del(contextSpec: AmplifyServer.ContextSpec, input: DeleteInput): DeleteOperation;

/**
 * Server-side HTTP PATCH request
 * @param contextSpec - Amplify server context specification
 * @param input - Request configuration including API name, path, and body
 * @returns PatchOperation promise that resolves to response
 */
function patch(contextSpec: AmplifyServer.ContextSpec, input: PatchInput): PatchOperation;

/**
 * Server-side HTTP HEAD request
 * @param contextSpec - Amplify server context specification
 * @param input - Request configuration including API name and path
 * @returns HeadOperation promise that resolves to response with headers only
 */
function head(contextSpec: AmplifyServer.ContextSpec, input: HeadInput): HeadOperation;

/**
 * Check if error is from request cancellation
 */
function isCancelError(error: unknown): boolean;

Usage Examples:

// Next.js server action example
import { post } from "@aws-amplify/api/server";
import { createServerRunner } from "@aws-amplify/adapter-nextjs";

const { runWithAmplifyServerContext } = createServerRunner({
  config: amplifyServerConfig
});

export async function createUser(formData: FormData) {
  "use server";
  
  const userData = {
    name: formData.get("name"),
    email: formData.get("email")
  };
  
  return await runWithAmplifyServerContext({
    nextServerContext: { cookies },
    operation: (contextSpec) => {
      try {
        const response = await post(contextSpec, {
          apiName: "userApi",
          path: "/users",
          options: {
            body: userData,
            headers: {
              "Content-Type": "application/json"
            }
          }
        });
        
        return { success: true, data: response.body };
      } catch (error) {
        return { success: false, error: error.message };
      }
    }
  });
}

Server Context Specification

The AmplifyServer.ContextSpec type required for all server-side operations.

/**
 * Server context specification for Amplify operations
 */
namespace AmplifyServer {
  interface ContextSpec {
    token: {
      value: ContextToken;
    };
  }
  
  interface ContextToken {
    libraryOptions: LibraryOptions;
    userAgentSuffix?: string;
  }
}

Server Configuration

Configuration options specific to server-side usage.

interface ServerApiConfig {
  /**
   * Server-side authentication configuration
   */
  auth?: {
    /**
     * AWS credentials for server-side requests
     */
    credentials?: AWSCredentials;
    
    /**
     * IAM role for server-side authentication
     */
    region?: string;
    
    /**
     * Custom authentication headers
     */
    customHeaders?: Record<string, string>;
  };
  
  /**
   * Request timeout for server operations
   */
  timeout?: number;
  
  /**
   * Custom user agent for server requests
   */
  userAgent?: string;
  
  /**
   * Server-side retry configuration
   */
  retryConfig?: ServerRetryConfig;
}

interface ServerRetryConfig {
  maxRetries?: number;
  baseDelay?: number;
  maxDelay?: number;
  jitter?: boolean;
}

interface AWSCredentials {
  accessKeyId: string;
  secretAccessKey: string;
  sessionToken?: string;
}

Server Context Integration

Integration with server frameworks and request contexts.

/**
 * Server context for passing request information
 */
interface ServerContext {
  /**
   * HTTP request object
   */
  request?: {
    headers: Record<string, string>;
    url: string;
    method: string;
  };
  
  /**
   * User authentication context
   */
  user?: {
    id: string;
    email?: string;
    groups?: string[];
  };
  
  /**
   * Request tracing information
   */
  tracing?: {
    traceId: string;
    spanId: string;
  };
}

/**
 * Context-aware server operations
 */
interface ContextualServerAPI {
  /**
   * Execute operation with server context
   */
  withContext<T>(
    context: ServerContext,
    operation: () => Promise<T>
  ): Promise<T>;
  
  /**
   * Get current server context
   */
  getContext(): ServerContext | null;
}

Usage Examples:

// Express.js middleware example
import { generateClient } from "@aws-amplify/api/server";

app.use(async (req, res, next) => {
  const client = generateClient();
  
  // Add client to request context
  req.amplifyClient = client;
  
  // Execute with server context
  const result = await client.withContext({
    request: {
      headers: req.headers,
      url: req.url,
      method: req.method
    },
    user: req.user
  }, async () => {
    // Operations here have access to server context
    return client.graphql({
      query: "query GetUserData { getCurrentUser { id name } }"
    });
  });
  
  next();
});

Server-Side Error Handling

Error handling patterns specific to server environments.

/**
 * Server-specific error types
 */
interface ServerApiError extends Error {
  /**
   * HTTP status code for the error
   */
  statusCode?: number;
  
  /**
   * Error code for categorization
   */
  code?: string;
  
  /**
   * Request ID for tracking
   */
  requestId?: string;
  
  /**
   * Whether error should be retried
   */
  retryable?: boolean;
  
  /**
   * Additional error context
   */
  context?: Record<string, any>;
}

/**
 * Server authentication errors
 */
interface ServerAuthError extends ServerApiError {
  /**
   * Authentication failure reason
   */
  authFailure: "credentials" | "permissions" | "expired" | "invalid";
  
  /**
   * Required permissions for the operation
   */
  requiredPermissions?: string[];
}

Environment Detection

Utilities for detecting and adapting to server environments.

/**
 * Server environment detection utilities
 */
interface ServerEnvironment {
  /**
   * Check if running in server environment
   */
  isServer(): boolean;
  
  /**
   * Check if running in specific frameworks
   */
  isNextJS(): boolean;
  isExpress(): boolean;
  isLambda(): boolean;
  
  /**
   * Get current runtime information
   */
  getRuntime(): {
    platform: string;
    version: string;
    framework?: string;
  };
}

docs

graphql-client.md

index.md

realtime-events.md

rest-api.md

server-apis.md

tile.json