@absinthe/socket

中文文档
0.2.1发布于 2019/02/20MITESM + CJS近 30 天下载 17.4万

Absinthe Socket

原始使用文档
文档目录14 节
  1. Features
  2. Installation
  3. Using npm
  4. Using yarn
  5. Types
  6. API
  7. cancel
  8. create
  9. observe
  10. send
  11. toObservable
  12. unobserve
  13. unobserveOrCancel
  14. License

@absinthe/socket

Absinthe Socket

Features

  • Immutable functional API

    All received and returned objects with the exception of AbsintheSocket instances (there are plans to make this immutable too) are treated in an immutable way. Objects have no methods and instead we provide independant stateless functions to interact with them.

  • Lazy connect / join

    If provided phoenix socket instance is not connected, then instead of connecting at creation time, connection will be established on the next invocation of send.

  • Handle pending operations on connection lost

    Pending mutations will be aborted, queries will be resent, and subscriptions reestablished.

  • Cancellable requests

    Calling cancel removes given notifier from absintheSocket instance and sends a Cancel event to all its observers and unsubscribes in case it holds a subscription request.

  • Operations deduplication

    If an already sent request is given to send, then instead of sending it again, the notifier associated with it will be returned.

  • Observer support of recoverable errors

    Since connection lost is handled, then two events needs to exist to represent this fact: Error (recoverable), Abort (unrecoverable).

  • Multiple observers per request

    Calling send returns a notifier which allows attaching any number of observers that will be notified when result arrives.

  • Observer interaction depending on operation type

    For the case of subscriptions, Start event is dispatched when the subscription is established, while for the other types (queries and mutations), when the request is sent.

Installation

Using npm

$ npm install --save phoenix @absinthe/socket

Using yarn

$ yarn add phoenix @absinthe/socket

Types

type RequestStatus = "canceled" | "canceling" | "pending" | "sent" | "sending";

// from @jumpn/utils-graphql
type GqlRequest<Variables: void | Object = void> = {
  operation: string,
  variables?: Variables
};

// from @jumpn/utils-graphql
type GqlResponse<Data> = {
  data?: Data,
  errors?: Array<GqlError>
};

// from @jumpn/utils-graphql
type GqlOperationType = "mutation" | "query" | "subscription";

type Observer<Result, Variables: void | Object = void> = {|
  onAbort?: (error: Error) => any,
  onCancel?: () => any,
  onError?: (error: Error) => any,
  onStart?: (notifier: Notifier<Result, Variables>) => any,
  onResult?: (result: Result) => any
|};

type Notifier<Result, Variables: void | Object = void> = {|
  activeObservers: $ReadOnlyArray<Observer<Result, Variables>>,
  canceledObservers: $ReadOnlyArray<Observer<Result, Variables>>,
  isActive: boolean,
  operationType: GqlOperationType,
  request: GqlRequest<Variables>,
  requestStatus: RequestStatus,
  subscriptionId?: string
|};

type AbsintheSocket = {|
  channel: Channel,
  channelJoinCreated: boolean,
  notifiers: Array<Notifier<any>>,
  phoenixSocket: PhoenixSocket
|};

API

cancel

Cancels a notifier sending a Cancel event to all its observers and unsubscribing in case it holds a subscription request

Parameters

  • absintheSocket AbsintheSocket
  • notifier Notifier<any, any>

Examples

import * as withAbsintheSocket from "@absinthe/socket";

withAbsintheSocket.cancel(absintheSocket, notifier);

Returns AbsintheSocket

create

Creates an Absinthe Socket using the given Phoenix Socket instance

Parameters

  • phoenixSocket PhoenixSocket

Examples

import * as withAbsintheSocket from "@absinthe/socket";
import {Socket as PhoenixSocket} from "phoenix";

const absintheSocket = withAbsintheSocket.create(
  new PhoenixSocket("ws://localhost:4000/socket")
);

Returns AbsintheSocket

observe

Observes given notifier using the provided observer

Parameters

  • absintheSocket AbsintheSocket
  • notifier Notifier<Result, Variables>
  • observer Observer<Result, Variables>

Examples

import * as withAbsintheSocket from "@absinthe/socket"

const logEvent = eventName => (...args) => console.log(eventName, ...args);

const updatedNotifier = withAbsintheSocket.observe(absintheSocket, notifier, {
  onAbort: logEvent("abort"),
  onError: logEvent("error"),
  onStart: logEvent("open"),
  onResult: logEvent("result")
});

send

Sends given request and returns an object (notifier) to track its progress (see observe function)

Parameters

  • absintheSocket AbsintheSocket
  • request GqlRequest<Variables>

Examples

import * as withAbsintheSocket from "@absinthe/socket";

const operation = `
  subscription userSubscription($userId: ID!) {
    user(userId: $userId) {
      id
      name
    }
  }
`;

// This example uses a subscription, but the functionallity is the same for
// all operation types (queries, mutations and subscriptions)

const notifier = withAbsintheSocket.send(absintheSocket, {
  operation,
  variables: {userId: 10}
});

Returns Notifier<Result, Variables>

toObservable

Creates an Observable that will follow the given notifier

Parameters

  • absintheSocket AbsintheSocket
  • notifier Notifier<Result, Variables>
  • options Object? (optional, default {})
    • options.unsubscribe function (): undefined?
    • options.onError function (error: Error): undefined?
    • options.onStart function (notifier: Notifier<Result, Variables>): undefined?
    • options.handlers ...any

Examples

import * as withAbsintheSocket from "@absinthe/socket";

const unobserveOrCancelIfNeeded = (absintheSocket, notifier, observer) => {
  if (notifier && observer) {
    withAbsintheSocket.unobserveOrCancel(absintheSocket, notifier, observer);
  }
};

const logEvent = eventName => (...args) => console.log(eventName, ...args);

const observable = withAbsintheSocket.toObservable(absintheSocket, notifier, {
  onError: logEvent("error"),
  onStart: logEvent("open"),
  unsubscribe: unobserveOrCancelIfNeeded
});

Returns Observable

unobserve

Detaches observer from notifier

Parameters

  • absintheSocket AbsintheSocket
  • notifier Notifier<any, any>
  • observer Observer<any, any>

Examples

import * as withAbsintheSocket from "@absinthe/socket";

withAbsintheSocket.unobserve(absintheSocket, notifier, observer);

Returns AbsintheSocket

unobserveOrCancel

Cancels notifier if there are no more observers apart from the one given, or detaches given observer from notifier otherwise

Parameters

  • absintheSocket AbsintheSocket
  • notifier Notifier<Result, Variables>
  • observer Observer<Result, Variables>

Examples

import * as withAbsintheSocket from "@absinthe/socket";

withAbsintheSocket.unobserve(absintheSocket, notifier, observer);

License

MIT :copyright: Jumpn Limited.

版本与发布记录

@absinthe/socket 共发布 13 个版本,首次发布于 2017/11/08;过去 12 个月发布了 0 个版本。

版本发布日期距今
0.2.1latest2019/02/207 年前
0.2.02018/12/147 年前
0.1.102018/01/038 年前
0.1.92017/11/288 年前
0.1.82017/11/108 年前
0.1.72017/11/108 年前

关于 @absinthe/socket 的常见问题

@absinthe/socket 是什么?

Absinthe Socket

如何安装 @absinthe/socket?

在项目目录运行 npm install @absinthe/socket,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:phoenix(^1.4.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@absinthe/socket 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/absinthe__socket 是否存在。

@absinthe/socket 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@absinthe/socket 可以商用吗?

@absinthe/socket 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@absinthe/socket 的下载量有多少?

根据 npm 官方下载统计,@absinthe/socket 在 2026/10/05 – 2026/11/03 这 30 天内被下载 174,492 次,日均约 5,816 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@absinthe/socket 还在维护吗?

最新版本 0.2.1 发布于 2019/02/20(7 年前);至今共发布 13 个版本,其中过去 12 个月发布了 0 个;首次发布于 2017/11/08。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。