Skip to content

Support middleware for hooking into get- and onSnapshot requests #10

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

Open
wants to merge 9 commits into
base: main
Choose a base branch
from

Conversation

IjzerenHein
Copy link
Collaborator

@IjzerenHein IjzerenHein commented May 27, 2025

Adds a middleware for intercepting, logging and providing custom connection logic for get,onSnapshot, updateDoc and deleteDoc requests. The following methods have been added for registering middleware:

experimental_registerOnDocSnapshotMiddleware
experimental_registerOnDocsSnapshotMiddleware
experimental_registerGetDocMiddleware (handles getDoc, getDocFromCache & getDocFromServer)
experimental_registerGetDocsMiddleware (handles getDocs, getDocsFromCache & getDocsFromServer)
experimental_registerDeleteDocMiddleware
experimental_registerUpdateDocMiddleware

Conceptually I decided to use separater middleware handlers to support code isolation and tree shaking; and to be consistent with the paradigm of exporting separate functions in firestore.

Example snapshot middleware:

// 1) Install log handler (will be executed first)
experimental_registerOnDocSnapshotMiddleware((context, next) => {
  console.log('onDocSnapshot', context.reference.path)
  const unsubscribe = next(context)
  return () => {
    console.log('onDocSnapshot unsubscribed', context.reference.path)
    unsubscribe()
  }
})

// 2) Install a custom snapshot listener
experimental_registerOnDocSnapshotMiddleware((context, next) => {
  // forbid any request to __internal
  if (context.reference.path.startsWith('__internal')) {
    context.onError(new Error('Not allowed'))
    return () => {}
  }
  return next(context)
})

Example getDoc middleware:

// 1) Install log handler (will be executed first)
experimental_registerGetDocsMiddleware((context, next) => {
  console.log('getDocs...')
  const result = await next(context)
  console.log('getDocs DONE')
  return result
})

experimental_registerGetDocsMiddleware(async (context, next) => {
  // for the sake of demonstration, delay the request
  await new Promise(resolve => setTimeout(resolve, 5000))
  return next(context)
})

@IjzerenHein IjzerenHein requested a review from 0x80 as a code owner May 27, 2025 13:27
@IjzerenHein
Copy link
Collaborator Author

@0x80 ik heb de middleware PR ge-update en experimental_ aan de functies toegevoegd. Ik heb besloten de middleware te laten zoals ik hem oorspronkelijk gebouwd heb. Dit maakt het namelijk het eenvoudigst om de logica die ik voor ogen heb te schrijven in de app. Zou je dit kunnen reviewen?

@0x80
Copy link
Owner

0x80 commented Jun 4, 2025

@IjzerenHein Looks good, but since we have no way to test this I will first do a pre-release from this branch, so we can start verifying it

@IjzerenHein
Copy link
Collaborator Author

@IjzerenHein Looks good, but since we have no way to test this I will first do a pre-release from this branch, so we can start verifying it

sounds good 👍

@IjzerenHein
Copy link
Collaborator Author

@0x80 ik heb twee fixes doorgevoerd, zou jij nog eens een nieuwe next versie kunnen publishen op npm?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants