meteor/agent-skills

meteor-pubsub

Use when authoring or debugging Meteor publications and subscriptions (Meteor.publish, Meteor.subscribe).

Zobacz źródło
Oryginalny dokument Skill

Treść z repozytorium z zachowaniem nagłówków, przykładów, kodu, tabel, linków i obrazów.

Meteor publications and subscriptions

Publications stream a set of documents to subscribed clients and keep them live. The publication is the only place server-side authorization can filter rows before they reach the client.

Decision flow

  1. Does the client need this data reactively? If no, prefer a method (one-shot

read). If yes, use a publication.

  1. Is the data user-specific? Filter by this.userId inside the publish

function. Without that filter, documents leak across users.

  1. Can the publication be expressed as a single cursor? Return it directly.
  2. Does it need one async lookup before choosing a cursor? Use an async

publish handler, await the lookup, then return the cursor.

  1. Does it need per-document async joins, custom aggregation output, or an

external reactive source? Drop to the low-level this.added / this.changed / this.removed API.

Scaffold

javascript
import { Meteor } from "meteor/meteor";
import { Items } from "/imports/api/items";

Meteor.publish("items.mine", function () {
  if (!this.userId) {
    return this.ready();
  }
  return Items.find(
    { ownerId: this.userId },
    { fields: { title: 1, qty: 1, updatedAt: 1 }, sort: { updatedAt: -1 } },
  );
});

Project fields whenever the collection contains columns the subscriber must not receive.

Async publish handlers may also return a cursor:

javascript
Meteor.publish("items.byTeam", async function (teamId) {
  const member = await Memberships.findOneAsync({
    teamId,
    userId: this.userId,
  });
  if (!member) return this.ready();
  return Items.find({ teamId }, { fields: { title: 1, qty: 1 } });
});

Meteor awaits the handler before processing the returned cursor.

Subscribing

javascript
import { Meteor } from "meteor/meteor";

const handle = Meteor.subscribe("items.mine");
// React / Blaze / Svelte hooks observe handle.ready() and the local cursor.
handle.stop();

Publication strategies

Set per-collection with Meteor.server.setPublicationStrategy. Three options:

javascript
import { DDPServer } from "meteor/ddp-server";

Meteor.server.setPublicationStrategy(
  "items",
  DDPServer.publicationStrategies.NO_MERGE,
);
StrategyWhen to use
SERVER_MERGEDefault. Tracks merged document fields across publications and sends deltas.
NO_MERGETracks sent document IDs so unsubscribe can remove them. Use when the collection is owned by one publication.
NO_MERGE_NO_HISTORYRemembers nothing and sends no removals on stop. Reserve for send-and-forget queues where stale client documents are intentional.

See references/publication-strategies.md.

Low-level publish API

For joins or async work:

javascript
Meteor.publish("feed", async function () {
  const cursor = Posts.find({}, { fields: { title: 1, authorId: 1 } });
  const observer = await cursor.observeChangesAsync({
    added: async (id, doc) => {
      const author = await Users.findOneAsync(doc.authorId, {
        fields: { username: 1 },
      });
      this.added("feed", id, { ...doc, authorName: author?.username });
    },
    changed: (id, changes) => this.changed("feed", id, changes),
    removed: (id) => this.removed("feed", id),
  });

  this.ready();
  this.onStop(() => observer.stop());
});

Note: cursor transform functions remain synchronous. Use a separate publication or the low-level API for per-document async joins.

Live observer delivery does not wait for one async callback before later changes arrive. If ordering or backpressure matters, serialize the work with a per-subscription Promise queue. Attach an error policy and stop the observer from this.onStop; see references/low-level-publish-api.md.

Anti-patterns

  • Publish without a this.userId filter when data is user-specific.
  • Publish sensitive or unnecessary columns. Add a fields projection when

the full document is not part of the publication contract.

  • Confuse an async publish handler with an async cursor transform. Meteor

awaits the handler Promise, but each transform callback must return a document synchronously.

  • Use cursor transforms for async joins. Transforms are synchronous; the

low-level API is the right tool.

  • Subscribe to large unbounded collections. Page the data with limit/skip.

See also

  • references/publication-strategies.md
  • references/low-level-publish-api.md
  • references/eval-cases.md
z tego samego repozytorium

Więcej Skills

Wszystkie Skills
meteor
Społeczność

meteor-community-packages

Use when choosing, evaluating, adopting, configuring, or debugging a package from Meteor's documented community catalog, or moving from a community package to a promoted core package such as roles. Triggers on community package recommendations, Atmosphere vs npm selection, Packosphere maintenance checks, jam: helpers, Meteor.publish.once, Meteor.publish.stream, meteor-rpc, Wormhole, cluster, mail-preview, meteor add --search, or adopting a Git-hosted Atmosphere package. Use this skill when the user asks which maintained package fits or how its documented integration works. Route Meteor 2-to-3 package failures to migrate-to-meteor-3 and underlying core API design to its owning skill.

instalacje
1
GitHub Stars
9
Aktualizacja
11 wrz
meteor
Społeczność

meteor-debugging

Use when diagnosing an unexplained failure in a Meteor 3 application before the failing layer or fix is known. Triggers on server crashes, client-only errors, stuck subscriptions, DDP or WebSocket disconnects, Minimongo/server data mismatches, hanging or flaky tests, slow builds, --inspect, console.log, .only, Playwright traces, or requests to debug a Meteor app. Use this skill when evidence must distinguish Meteor tool, server, client, data, test, browser, mobile, or production boundaries. For test setup and authoring use meteor-testing; after confirming a domain cause, hand the repair to the owning skill.

instalacje
1
GitHub Stars
9
Aktualizacja
11 wrz
meteor
Społeczność

meteor-deployment

Use when deploying a Meteor 3 application. Triggers on meteor build, meteor deploy, Galaxy Push to Deploy, Galaxy Mode, Repository Mode, DEPLOYHOSTNAME, Docker, Kubernetes, settings.json, METEORSETTINGS, MONGOURL, MONGOOPLOGURL, ROOTURL, PORT, HTTPFORWARDEDCOUNT, NODEOPTIONS, health checks, pre-deploy commands, hot code push, --architecture os.linux.x8664, --server-only, or a deployed Node.js version mismatch. Use this skill when the user asks about shipping the app, asks about production config, or asks about containerizing. For Cordova Android/iOS artifacts, signing, and native HCP compatibility use meteor-native; this skill owns the backend deployment.

instalacje
1
GitHub Stars
9
Aktualizacja
11 wrz
meteor
Społeczność

meteor-methods

Use when authoring or debugging Meteor methods (Meteor.methods, Meteor.call, Meteor.callAsync). Triggers on argument validation with check(), optimistic UI stubs, latency compensation, Meteor.Error handling, and DDPRateLimiter. Use this skill when the user asks about server-side mutation, asks about rate limiting RPC, or asks about wrapping a method with auth checks.

instalacje
1
GitHub Stars
9
Aktualizacja
11 wrz