@juzi/wechaty-puppet-service 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +166 -0
- package/dist/cjs/examples/ding-dong-bot.d.ts +2 -0
- package/dist/cjs/examples/ding-dong-bot.d.ts.map +1 -0
- package/dist/cjs/examples/ding-dong-bot.js +156 -0
- package/dist/cjs/examples/ding-dong-bot.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/src/auth/auth-impl-token.d.ts +4 -0
- package/dist/cjs/src/auth/auth-impl-token.d.ts.map +1 -0
- package/dist/cjs/src/auth/auth-impl-token.js +81 -0
- package/dist/cjs/src/auth/auth-impl-token.js.map +1 -0
- package/dist/cjs/src/auth/auth-impl-token.spec.d.ts +3 -0
- package/dist/cjs/src/auth/auth-impl-token.spec.d.ts.map +1 -0
- package/dist/cjs/src/auth/auth-impl-token.spec.js +65 -0
- package/dist/cjs/src/auth/auth-impl-token.spec.js.map +1 -0
- package/dist/cjs/src/auth/ca.d.ts +46 -0
- package/dist/cjs/src/auth/ca.d.ts.map +1 -0
- package/dist/cjs/src/auth/ca.js +135 -0
- package/dist/cjs/src/auth/ca.js.map +1 -0
- package/dist/cjs/src/auth/ca.spec.d.ts +3 -0
- package/dist/cjs/src/auth/ca.spec.d.ts.map +1 -0
- package/dist/cjs/src/auth/ca.spec.js +115 -0
- package/dist/cjs/src/auth/ca.spec.js.map +1 -0
- package/dist/cjs/src/auth/call-cred.d.ts +9 -0
- package/dist/cjs/src/auth/call-cred.d.ts.map +1 -0
- package/dist/cjs/src/auth/call-cred.js +17 -0
- package/dist/cjs/src/auth/call-cred.js.map +1 -0
- package/dist/cjs/src/auth/call-cred.spec.d.ts +3 -0
- package/dist/cjs/src/auth/call-cred.spec.d.ts.map +1 -0
- package/dist/cjs/src/auth/call-cred.spec.js +18 -0
- package/dist/cjs/src/auth/call-cred.spec.js.map +1 -0
- package/dist/cjs/src/auth/env-vars.d.ts +13 -0
- package/dist/cjs/src/auth/env-vars.d.ts.map +1 -0
- package/dist/cjs/src/auth/env-vars.js +29 -0
- package/dist/cjs/src/auth/env-vars.js.map +1 -0
- package/dist/cjs/src/auth/grpc-js.d.ts +7 -0
- package/dist/cjs/src/auth/grpc-js.d.ts.map +1 -0
- package/dist/cjs/src/auth/grpc-js.js +10 -0
- package/dist/cjs/src/auth/grpc-js.js.map +1 -0
- package/dist/cjs/src/auth/mod.d.ts +5 -0
- package/dist/cjs/src/auth/mod.d.ts.map +1 -0
- package/dist/cjs/src/auth/mod.js +10 -0
- package/dist/cjs/src/auth/mod.js.map +1 -0
- package/dist/cjs/src/auth/mokey-patch-header-authorization.d.ts +11 -0
- package/dist/cjs/src/auth/mokey-patch-header-authorization.d.ts.map +1 -0
- package/dist/cjs/src/auth/mokey-patch-header-authorization.js +32 -0
- package/dist/cjs/src/auth/mokey-patch-header-authorization.js.map +1 -0
- package/dist/cjs/src/auth/monkey-patch-header-authorization.spec.d.ts +3 -0
- package/dist/cjs/src/auth/monkey-patch-header-authorization.spec.d.ts.map +1 -0
- package/dist/cjs/src/auth/monkey-patch-header-authorization.spec.js +19 -0
- package/dist/cjs/src/auth/monkey-patch-header-authorization.spec.js.map +1 -0
- package/dist/cjs/src/client/duck/actions.d.ts +6 -0
- package/dist/cjs/src/client/duck/actions.d.ts.map +1 -0
- package/dist/cjs/src/client/duck/actions.js +54 -0
- package/dist/cjs/src/client/duck/actions.js.map +1 -0
- package/dist/cjs/src/client/duck/epic-recover.d.ts +36 -0
- package/dist/cjs/src/client/duck/epic-recover.d.ts.map +1 -0
- package/dist/cjs/src/client/duck/epic-recover.js +41 -0
- package/dist/cjs/src/client/duck/epic-recover.js.map +1 -0
- package/dist/cjs/src/client/duck/epic-recover.spec.d.ts +3 -0
- package/dist/cjs/src/client/duck/epic-recover.spec.d.ts.map +1 -0
- package/dist/cjs/src/client/duck/epic-recover.spec.js +131 -0
- package/dist/cjs/src/client/duck/epic-recover.spec.js.map +1 -0
- package/dist/cjs/src/client/duck/epics.d.ts +4 -0
- package/dist/cjs/src/client/duck/epics.d.ts.map +1 -0
- package/dist/cjs/src/client/duck/epics.js +36 -0
- package/dist/cjs/src/client/duck/epics.js.map +1 -0
- package/dist/cjs/src/client/duck/mod.d.ts +29 -0
- package/dist/cjs/src/client/duck/mod.d.ts.map +1 -0
- package/dist/cjs/src/client/duck/mod.js +63 -0
- package/dist/cjs/src/client/duck/mod.js.map +1 -0
- package/dist/cjs/src/client/duck/operations.d.ts +23 -0
- package/dist/cjs/src/client/duck/operations.d.ts.map +1 -0
- package/dist/cjs/src/client/duck/operations.js +30 -0
- package/dist/cjs/src/client/duck/operations.js.map +1 -0
- package/dist/cjs/src/client/duck/reducers.d.ts +59 -0
- package/dist/cjs/src/client/duck/reducers.d.ts.map +1 -0
- package/dist/cjs/src/client/duck/reducers.js +51 -0
- package/dist/cjs/src/client/duck/reducers.js.map +1 -0
- package/dist/cjs/src/client/duck/selectors.d.ts +21 -0
- package/dist/cjs/src/client/duck/selectors.d.ts.map +1 -0
- package/dist/cjs/src/client/duck/selectors.js +23 -0
- package/dist/cjs/src/client/duck/selectors.js.map +1 -0
- package/dist/cjs/src/client/duck/tests.spec.d.ts +3 -0
- package/dist/cjs/src/client/duck/tests.spec.d.ts.map +1 -0
- package/dist/cjs/src/client/duck/tests.spec.js +49 -0
- package/dist/cjs/src/client/duck/tests.spec.js.map +1 -0
- package/dist/cjs/src/client/duck/types.d.ts +21 -0
- package/dist/cjs/src/client/duck/types.d.ts.map +1 -0
- package/dist/cjs/src/client/duck/types.js +24 -0
- package/dist/cjs/src/client/duck/types.js.map +1 -0
- package/dist/cjs/src/client/duck/utils.d.ts +21 -0
- package/dist/cjs/src/client/duck/utils.d.ts.map +1 -0
- package/dist/cjs/src/client/duck/utils.js +3 -0
- package/dist/cjs/src/client/duck/utils.js.map +1 -0
- package/dist/cjs/src/client/grpc-manager.d.ts +29 -0
- package/dist/cjs/src/client/grpc-manager.d.ts.map +1 -0
- package/dist/cjs/src/client/grpc-manager.js +359 -0
- package/dist/cjs/src/client/grpc-manager.js.map +1 -0
- package/dist/cjs/src/client/grpc-manager.spec.d.ts +3 -0
- package/dist/cjs/src/client/grpc-manager.spec.d.ts.map +1 -0
- package/dist/cjs/src/client/grpc-manager.spec.js +19 -0
- package/dist/cjs/src/client/grpc-manager.spec.js.map +1 -0
- package/dist/cjs/src/client/payload-store.d.ts +26 -0
- package/dist/cjs/src/client/payload-store.d.ts.map +1 -0
- package/dist/cjs/src/client/payload-store.js +118 -0
- package/dist/cjs/src/client/payload-store.js.map +1 -0
- package/dist/cjs/src/client/payload-store.spec.d.ts +3 -0
- package/dist/cjs/src/client/payload-store.spec.d.ts.map +1 -0
- package/dist/cjs/src/client/payload-store.spec.js +17 -0
- package/dist/cjs/src/client/payload-store.spec.js.map +1 -0
- package/dist/cjs/src/client/puppet-service.d.ts +161 -0
- package/dist/cjs/src/client/puppet-service.d.ts.map +1 -0
- package/dist/cjs/src/client/puppet-service.js +1384 -0
- package/dist/cjs/src/client/puppet-service.js.map +1 -0
- package/dist/cjs/src/client/puppet-service.spec.d.ts +3 -0
- package/dist/cjs/src/client/puppet-service.spec.d.ts.map +1 -0
- package/dist/cjs/src/client/puppet-service.spec.js +55 -0
- package/dist/cjs/src/client/puppet-service.spec.js.map +1 -0
- package/dist/cjs/src/config.d.ts +20 -0
- package/dist/cjs/src/config.d.ts.map +1 -0
- package/dist/cjs/src/config.js +49 -0
- package/dist/cjs/src/config.js.map +1 -0
- package/dist/cjs/src/deprecated/chunk-pb.d.ts +15 -0
- package/dist/cjs/src/deprecated/chunk-pb.d.ts.map +1 -0
- package/dist/cjs/src/deprecated/chunk-pb.js +60 -0
- package/dist/cjs/src/deprecated/chunk-pb.js.map +1 -0
- package/dist/cjs/src/deprecated/chunk-pb.spec.d.ts +3 -0
- package/dist/cjs/src/deprecated/chunk-pb.spec.d.ts.map +1 -0
- package/dist/cjs/src/deprecated/chunk-pb.spec.js +144 -0
- package/dist/cjs/src/deprecated/chunk-pb.spec.js.map +1 -0
- package/dist/cjs/src/deprecated/conversation-id-file-box.d.ts +21 -0
- package/dist/cjs/src/deprecated/conversation-id-file-box.d.ts.map +1 -0
- package/dist/cjs/src/deprecated/conversation-id-file-box.js +43 -0
- package/dist/cjs/src/deprecated/conversation-id-file-box.js.map +1 -0
- package/dist/cjs/src/deprecated/conversation-id-file-box.spec.d.ts +3 -0
- package/dist/cjs/src/deprecated/conversation-id-file-box.spec.d.ts.map +1 -0
- package/dist/cjs/src/deprecated/conversation-id-file-box.spec.js +94 -0
- package/dist/cjs/src/deprecated/conversation-id-file-box.spec.js.map +1 -0
- package/dist/cjs/src/deprecated/file-box-chunk.d.ts +14 -0
- package/dist/cjs/src/deprecated/file-box-chunk.d.ts.map +1 -0
- package/dist/cjs/src/deprecated/file-box-chunk.js +67 -0
- package/dist/cjs/src/deprecated/file-box-chunk.js.map +1 -0
- package/dist/cjs/src/deprecated/file-box-chunk.spec.d.ts +3 -0
- package/dist/cjs/src/deprecated/file-box-chunk.spec.d.ts.map +1 -0
- package/dist/cjs/src/deprecated/file-box-chunk.spec.js +134 -0
- package/dist/cjs/src/deprecated/file-box-chunk.spec.js.map +1 -0
- package/dist/cjs/src/deprecated/file-box-pb.d.ts +15 -0
- package/dist/cjs/src/deprecated/file-box-pb.d.ts.map +1 -0
- package/dist/cjs/src/deprecated/file-box-pb.js +26 -0
- package/dist/cjs/src/deprecated/file-box-pb.js.map +1 -0
- package/dist/cjs/src/deprecated/file-box-pb.spec.d.ts +3 -0
- package/dist/cjs/src/deprecated/file-box-pb.spec.d.ts.map +1 -0
- package/dist/cjs/src/deprecated/file-box-pb.spec.js +18 -0
- package/dist/cjs/src/deprecated/file-box-pb.spec.js.map +1 -0
- package/dist/cjs/src/deprecated/file-box-pb.type.d.ts +15 -0
- package/dist/cjs/src/deprecated/file-box-pb.type.d.ts.map +1 -0
- package/dist/cjs/src/deprecated/file-box-pb.type.js +3 -0
- package/dist/cjs/src/deprecated/file-box-pb.type.js.map +1 -0
- package/dist/cjs/src/deprecated/mod.d.ts +3 -0
- package/dist/cjs/src/deprecated/mod.d.ts.map +1 -0
- package/dist/cjs/src/deprecated/mod.js +10 -0
- package/dist/cjs/src/deprecated/mod.js.map +1 -0
- package/dist/cjs/src/deprecated/next-data.d.ts +7 -0
- package/dist/cjs/src/deprecated/next-data.d.ts.map +1 -0
- package/dist/cjs/src/deprecated/next-data.js +26 -0
- package/dist/cjs/src/deprecated/next-data.js.map +1 -0
- package/dist/cjs/src/deprecated/serialize-file-box.d.ts +6 -0
- package/dist/cjs/src/deprecated/serialize-file-box.d.ts.map +1 -0
- package/dist/cjs/src/deprecated/serialize-file-box.js +22 -0
- package/dist/cjs/src/deprecated/serialize-file-box.js.map +1 -0
- package/dist/cjs/src/env-vars.d.ts +5 -0
- package/dist/cjs/src/env-vars.d.ts.map +1 -0
- package/dist/cjs/src/env-vars.js +88 -0
- package/dist/cjs/src/env-vars.js.map +1 -0
- package/dist/cjs/src/env-vars.spec.d.ts +3 -0
- package/dist/cjs/src/env-vars.spec.d.ts.map +1 -0
- package/dist/cjs/src/env-vars.spec.js +21 -0
- package/dist/cjs/src/env-vars.spec.js.map +1 -0
- package/dist/cjs/src/event-type-rev.d.ts +11 -0
- package/dist/cjs/src/event-type-rev.d.ts.map +1 -0
- package/dist/cjs/src/event-type-rev.js +17 -0
- package/dist/cjs/src/event-type-rev.js.map +1 -0
- package/dist/cjs/src/file-box-helper/mod.d.ts +4 -0
- package/dist/cjs/src/file-box-helper/mod.d.ts.map +1 -0
- package/dist/cjs/src/file-box-helper/mod.js +8 -0
- package/dist/cjs/src/file-box-helper/mod.js.map +1 -0
- package/dist/cjs/src/file-box-helper/normalize-filebox.d.ts +6 -0
- package/dist/cjs/src/file-box-helper/normalize-filebox.d.ts.map +1 -0
- package/dist/cjs/src/file-box-helper/normalize-filebox.js +76 -0
- package/dist/cjs/src/file-box-helper/normalize-filebox.js.map +1 -0
- package/dist/cjs/src/file-box-helper/normalize-filebox.spec.d.ts +3 -0
- package/dist/cjs/src/file-box-helper/normalize-filebox.spec.d.ts.map +1 -0
- package/dist/cjs/src/file-box-helper/normalize-filebox.spec.js +35 -0
- package/dist/cjs/src/file-box-helper/normalize-filebox.spec.js.map +1 -0
- package/dist/cjs/src/file-box-helper/uuidify-file-box-grpc.d.ts +6 -0
- package/dist/cjs/src/file-box-helper/uuidify-file-box-grpc.d.ts.map +1 -0
- package/dist/cjs/src/file-box-helper/uuidify-file-box-grpc.js +45 -0
- package/dist/cjs/src/file-box-helper/uuidify-file-box-grpc.js.map +1 -0
- package/dist/cjs/src/file-box-helper/uuidify-file-box-local.d.ts +5 -0
- package/dist/cjs/src/file-box-helper/uuidify-file-box-local.d.ts.map +1 -0
- package/dist/cjs/src/file-box-helper/uuidify-file-box-local.js +19 -0
- package/dist/cjs/src/file-box-helper/uuidify-file-box-local.js.map +1 -0
- package/dist/cjs/src/mod.d.ts +8 -0
- package/dist/cjs/src/mod.d.ts.map +1 -0
- package/dist/cjs/src/mod.js +13 -0
- package/dist/cjs/src/mod.js.map +1 -0
- package/dist/cjs/src/mod.spec.d.ts +3 -0
- package/dist/cjs/src/mod.spec.d.ts.map +1 -0
- package/dist/cjs/src/mod.spec.js +32 -0
- package/dist/cjs/src/mod.spec.js.map +1 -0
- package/dist/cjs/src/package-json.d.ts +6 -0
- package/dist/cjs/src/package-json.d.ts.map +1 -0
- package/dist/cjs/src/package-json.js +101 -0
- package/dist/cjs/src/package-json.js.map +1 -0
- package/dist/cjs/src/package-json.spec.d.ts +3 -0
- package/dist/cjs/src/package-json.spec.d.ts.map +1 -0
- package/dist/cjs/src/package-json.spec.js +10 -0
- package/dist/cjs/src/package-json.spec.js.map +1 -0
- package/dist/cjs/src/pure-functions/timestamp.d.ts +8 -0
- package/dist/cjs/src/pure-functions/timestamp.d.ts.map +1 -0
- package/dist/cjs/src/pure-functions/timestamp.js +23 -0
- package/dist/cjs/src/pure-functions/timestamp.js.map +1 -0
- package/dist/cjs/src/server/event-stream-manager.d.ts +40 -0
- package/dist/cjs/src/server/event-stream-manager.d.ts.map +1 -0
- package/dist/cjs/src/server/event-stream-manager.js +344 -0
- package/dist/cjs/src/server/event-stream-manager.js.map +1 -0
- package/dist/cjs/src/server/grpc-error.d.ts +5 -0
- package/dist/cjs/src/server/grpc-error.d.ts.map +1 -0
- package/dist/cjs/src/server/grpc-error.js +12 -0
- package/dist/cjs/src/server/grpc-error.js.map +1 -0
- package/dist/cjs/src/server/health-implementation.d.ts +5 -0
- package/dist/cjs/src/server/health-implementation.d.ts.map +1 -0
- package/dist/cjs/src/server/health-implementation.js +55 -0
- package/dist/cjs/src/server/health-implementation.js.map +1 -0
- package/dist/cjs/src/server/puppet-implementation.d.ts +6 -0
- package/dist/cjs/src/server/puppet-implementation.d.ts.map +1 -0
- package/dist/cjs/src/server/puppet-implementation.js +1226 -0
- package/dist/cjs/src/server/puppet-implementation.js.map +1 -0
- package/dist/cjs/src/server/puppet-server.d.ts +23 -0
- package/dist/cjs/src/server/puppet-server.d.ts.map +1 -0
- package/dist/cjs/src/server/puppet-server.js +159 -0
- package/dist/cjs/src/server/puppet-server.js.map +1 -0
- package/dist/cjs/src/server/puppet-server.spec.d.ts +3 -0
- package/dist/cjs/src/server/puppet-server.spec.d.ts.map +1 -0
- package/dist/cjs/src/server/puppet-server.spec.js +15 -0
- package/dist/cjs/src/server/puppet-server.spec.js.map +1 -0
- package/dist/cjs/tests/grpc-client.spec.d.ts +3 -0
- package/dist/cjs/tests/grpc-client.spec.d.ts.map +1 -0
- package/dist/cjs/tests/grpc-client.spec.js +137 -0
- package/dist/cjs/tests/grpc-client.spec.js.map +1 -0
- package/dist/cjs/tests/grpc-stream.spec.d.ts +15 -0
- package/dist/cjs/tests/grpc-stream.spec.d.ts.map +1 -0
- package/dist/cjs/tests/grpc-stream.spec.js +67 -0
- package/dist/cjs/tests/grpc-stream.spec.js.map +1 -0
- package/dist/cjs/tests/integration.spec.d.ts +3 -0
- package/dist/cjs/tests/integration.spec.d.ts.map +1 -0
- package/dist/cjs/tests/integration.spec.js +70 -0
- package/dist/cjs/tests/integration.spec.js.map +1 -0
- package/dist/cjs/tests/performance.spec.d.ts +14 -0
- package/dist/cjs/tests/performance.spec.d.ts.map +1 -0
- package/dist/cjs/tests/performance.spec.js +129 -0
- package/dist/cjs/tests/performance.spec.js.map +1 -0
- package/dist/cjs/tests/ready-event.spec.d.ts +3 -0
- package/dist/cjs/tests/ready-event.spec.d.ts.map +1 -0
- package/dist/cjs/tests/ready-event.spec.js +80 -0
- package/dist/cjs/tests/ready-event.spec.js.map +1 -0
- package/dist/cjs/tests/uuid-file-box.spec.d.ts +3 -0
- package/dist/cjs/tests/uuid-file-box.spec.d.ts.map +1 -0
- package/dist/cjs/tests/uuid-file-box.spec.js +77 -0
- package/dist/cjs/tests/uuid-file-box.spec.js.map +1 -0
- package/dist/esm/examples/ding-dong-bot.d.ts +2 -0
- package/dist/esm/examples/ding-dong-bot.d.ts.map +1 -0
- package/dist/esm/examples/ding-dong-bot.js +131 -0
- package/dist/esm/examples/ding-dong-bot.js.map +1 -0
- package/dist/esm/src/auth/auth-impl-token.d.ts +4 -0
- package/dist/esm/src/auth/auth-impl-token.d.ts.map +1 -0
- package/dist/esm/src/auth/auth-impl-token.js +78 -0
- package/dist/esm/src/auth/auth-impl-token.js.map +1 -0
- package/dist/esm/src/auth/auth-impl-token.spec.d.ts +3 -0
- package/dist/esm/src/auth/auth-impl-token.spec.d.ts.map +1 -0
- package/dist/esm/src/auth/auth-impl-token.spec.js +63 -0
- package/dist/esm/src/auth/auth-impl-token.spec.js.map +1 -0
- package/dist/esm/src/auth/ca.d.ts +46 -0
- package/dist/esm/src/auth/ca.d.ts.map +1 -0
- package/dist/esm/src/auth/ca.js +129 -0
- package/dist/esm/src/auth/ca.js.map +1 -0
- package/dist/esm/src/auth/ca.spec.d.ts +3 -0
- package/dist/esm/src/auth/ca.spec.d.ts.map +1 -0
- package/dist/esm/src/auth/ca.spec.js +87 -0
- package/dist/esm/src/auth/ca.spec.js.map +1 -0
- package/dist/esm/src/auth/call-cred.d.ts +9 -0
- package/dist/esm/src/auth/call-cred.d.ts.map +1 -0
- package/dist/esm/src/auth/call-cred.js +13 -0
- package/dist/esm/src/auth/call-cred.js.map +1 -0
- package/dist/esm/src/auth/call-cred.spec.d.ts +3 -0
- package/dist/esm/src/auth/call-cred.spec.d.ts.map +1 -0
- package/dist/esm/src/auth/call-cred.spec.js +16 -0
- package/dist/esm/src/auth/call-cred.spec.js.map +1 -0
- package/dist/esm/src/auth/env-vars.d.ts +13 -0
- package/dist/esm/src/auth/env-vars.d.ts.map +1 -0
- package/dist/esm/src/auth/env-vars.js +21 -0
- package/dist/esm/src/auth/env-vars.js.map +1 -0
- package/dist/esm/src/auth/grpc-js.d.ts +7 -0
- package/dist/esm/src/auth/grpc-js.d.ts.map +1 -0
- package/dist/esm/src/auth/grpc-js.js +4 -0
- package/dist/esm/src/auth/grpc-js.js.map +1 -0
- package/dist/esm/src/auth/mod.d.ts +5 -0
- package/dist/esm/src/auth/mod.d.ts.map +1 -0
- package/dist/esm/src/auth/mod.js +5 -0
- package/dist/esm/src/auth/mod.js.map +1 -0
- package/dist/esm/src/auth/mokey-patch-header-authorization.d.ts +11 -0
- package/dist/esm/src/auth/mokey-patch-header-authorization.d.ts.map +1 -0
- package/dist/esm/src/auth/mokey-patch-header-authorization.js +29 -0
- package/dist/esm/src/auth/mokey-patch-header-authorization.js.map +1 -0
- package/dist/esm/src/auth/monkey-patch-header-authorization.spec.d.ts +3 -0
- package/dist/esm/src/auth/monkey-patch-header-authorization.spec.d.ts.map +1 -0
- package/dist/esm/src/auth/monkey-patch-header-authorization.spec.js +17 -0
- package/dist/esm/src/auth/monkey-patch-header-authorization.spec.js.map +1 -0
- package/dist/esm/src/client/duck/actions.d.ts +6 -0
- package/dist/esm/src/client/duck/actions.d.ts.map +1 -0
- package/dist/esm/src/client/duck/actions.js +28 -0
- package/dist/esm/src/client/duck/actions.js.map +1 -0
- package/dist/esm/src/client/duck/epic-recover.d.ts +36 -0
- package/dist/esm/src/client/duck/epic-recover.d.ts.map +1 -0
- package/dist/esm/src/client/duck/epic-recover.js +36 -0
- package/dist/esm/src/client/duck/epic-recover.js.map +1 -0
- package/dist/esm/src/client/duck/epic-recover.spec.d.ts +3 -0
- package/dist/esm/src/client/duck/epic-recover.spec.d.ts.map +1 -0
- package/dist/esm/src/client/duck/epic-recover.spec.js +126 -0
- package/dist/esm/src/client/duck/epic-recover.spec.js.map +1 -0
- package/dist/esm/src/client/duck/epics.d.ts +4 -0
- package/dist/esm/src/client/duck/epics.d.ts.map +1 -0
- package/dist/esm/src/client/duck/epics.js +33 -0
- package/dist/esm/src/client/duck/epics.js.map +1 -0
- package/dist/esm/src/client/duck/mod.d.ts +29 -0
- package/dist/esm/src/client/duck/mod.d.ts.map +1 -0
- package/dist/esm/src/client/duck/mod.js +29 -0
- package/dist/esm/src/client/duck/mod.js.map +1 -0
- package/dist/esm/src/client/duck/operations.d.ts +23 -0
- package/dist/esm/src/client/duck/operations.d.ts.map +1 -0
- package/dist/esm/src/client/duck/operations.js +4 -0
- package/dist/esm/src/client/duck/operations.js.map +1 -0
- package/dist/esm/src/client/duck/reducers.d.ts +59 -0
- package/dist/esm/src/client/duck/reducers.d.ts.map +1 -0
- package/dist/esm/src/client/duck/reducers.js +26 -0
- package/dist/esm/src/client/duck/reducers.js.map +1 -0
- package/dist/esm/src/client/duck/selectors.d.ts +21 -0
- package/dist/esm/src/client/duck/selectors.d.ts.map +1 -0
- package/dist/esm/src/client/duck/selectors.js +22 -0
- package/dist/esm/src/client/duck/selectors.js.map +1 -0
- package/dist/esm/src/client/duck/tests.spec.d.ts +3 -0
- package/dist/esm/src/client/duck/tests.spec.d.ts.map +1 -0
- package/dist/esm/src/client/duck/tests.spec.js +24 -0
- package/dist/esm/src/client/duck/tests.spec.js.map +1 -0
- package/dist/esm/src/client/duck/types.d.ts +21 -0
- package/dist/esm/src/client/duck/types.d.ts.map +1 -0
- package/dist/esm/src/client/duck/types.js +21 -0
- package/dist/esm/src/client/duck/types.js.map +1 -0
- package/dist/esm/src/client/duck/utils.d.ts +21 -0
- package/dist/esm/src/client/duck/utils.d.ts.map +1 -0
- package/dist/esm/src/client/duck/utils.js +2 -0
- package/dist/esm/src/client/duck/utils.js.map +1 -0
- package/dist/esm/src/client/grpc-manager.d.ts +29 -0
- package/dist/esm/src/client/grpc-manager.d.ts.map +1 -0
- package/dist/esm/src/client/grpc-manager.js +353 -0
- package/dist/esm/src/client/grpc-manager.js.map +1 -0
- package/dist/esm/src/client/grpc-manager.spec.d.ts +3 -0
- package/dist/esm/src/client/grpc-manager.spec.d.ts.map +1 -0
- package/dist/esm/src/client/grpc-manager.spec.js +17 -0
- package/dist/esm/src/client/grpc-manager.spec.js.map +1 -0
- package/dist/esm/src/client/payload-store.d.ts +26 -0
- package/dist/esm/src/client/payload-store.d.ts.map +1 -0
- package/dist/esm/src/client/payload-store.js +112 -0
- package/dist/esm/src/client/payload-store.js.map +1 -0
- package/dist/esm/src/client/payload-store.spec.d.ts +3 -0
- package/dist/esm/src/client/payload-store.spec.d.ts.map +1 -0
- package/dist/esm/src/client/payload-store.spec.js +15 -0
- package/dist/esm/src/client/payload-store.spec.js.map +1 -0
- package/dist/esm/src/client/puppet-service.d.ts +161 -0
- package/dist/esm/src/client/puppet-service.d.ts.map +1 -0
- package/dist/esm/src/client/puppet-service.js +1357 -0
- package/dist/esm/src/client/puppet-service.js.map +1 -0
- package/dist/esm/src/client/puppet-service.spec.d.ts +3 -0
- package/dist/esm/src/client/puppet-service.spec.d.ts.map +1 -0
- package/dist/esm/src/client/puppet-service.spec.js +50 -0
- package/dist/esm/src/client/puppet-service.spec.js.map +1 -0
- package/dist/esm/src/config.d.ts +20 -0
- package/dist/esm/src/config.d.ts.map +1 -0
- package/dist/esm/src/config.js +20 -0
- package/dist/esm/src/config.js.map +1 -0
- package/dist/esm/src/deprecated/chunk-pb.d.ts +15 -0
- package/dist/esm/src/deprecated/chunk-pb.d.ts.map +1 -0
- package/dist/esm/src/deprecated/chunk-pb.js +56 -0
- package/dist/esm/src/deprecated/chunk-pb.js.map +1 -0
- package/dist/esm/src/deprecated/chunk-pb.spec.d.ts +3 -0
- package/dist/esm/src/deprecated/chunk-pb.spec.d.ts.map +1 -0
- package/dist/esm/src/deprecated/chunk-pb.spec.js +142 -0
- package/dist/esm/src/deprecated/chunk-pb.spec.js.map +1 -0
- package/dist/esm/src/deprecated/conversation-id-file-box.d.ts +21 -0
- package/dist/esm/src/deprecated/conversation-id-file-box.d.ts.map +1 -0
- package/dist/esm/src/deprecated/conversation-id-file-box.js +39 -0
- package/dist/esm/src/deprecated/conversation-id-file-box.js.map +1 -0
- package/dist/esm/src/deprecated/conversation-id-file-box.spec.d.ts +3 -0
- package/dist/esm/src/deprecated/conversation-id-file-box.spec.d.ts.map +1 -0
- package/dist/esm/src/deprecated/conversation-id-file-box.spec.js +92 -0
- package/dist/esm/src/deprecated/conversation-id-file-box.spec.js.map +1 -0
- package/dist/esm/src/deprecated/file-box-chunk.d.ts +14 -0
- package/dist/esm/src/deprecated/file-box-chunk.d.ts.map +1 -0
- package/dist/esm/src/deprecated/file-box-chunk.js +63 -0
- package/dist/esm/src/deprecated/file-box-chunk.js.map +1 -0
- package/dist/esm/src/deprecated/file-box-chunk.spec.d.ts +3 -0
- package/dist/esm/src/deprecated/file-box-chunk.spec.d.ts.map +1 -0
- package/dist/esm/src/deprecated/file-box-chunk.spec.js +132 -0
- package/dist/esm/src/deprecated/file-box-chunk.spec.js.map +1 -0
- package/dist/esm/src/deprecated/file-box-pb.d.ts +15 -0
- package/dist/esm/src/deprecated/file-box-pb.d.ts.map +1 -0
- package/dist/esm/src/deprecated/file-box-pb.js +22 -0
- package/dist/esm/src/deprecated/file-box-pb.js.map +1 -0
- package/dist/esm/src/deprecated/file-box-pb.spec.d.ts +3 -0
- package/dist/esm/src/deprecated/file-box-pb.spec.d.ts.map +1 -0
- package/dist/esm/src/deprecated/file-box-pb.spec.js +16 -0
- package/dist/esm/src/deprecated/file-box-pb.spec.js.map +1 -0
- package/dist/esm/src/deprecated/file-box-pb.type.d.ts +15 -0
- package/dist/esm/src/deprecated/file-box-pb.type.d.ts.map +1 -0
- package/dist/esm/src/deprecated/file-box-pb.type.js +2 -0
- package/dist/esm/src/deprecated/file-box-pb.type.js.map +1 -0
- package/dist/esm/src/deprecated/mod.d.ts +3 -0
- package/dist/esm/src/deprecated/mod.d.ts.map +1 -0
- package/dist/esm/src/deprecated/mod.js +3 -0
- package/dist/esm/src/deprecated/mod.js.map +1 -0
- package/dist/esm/src/deprecated/next-data.d.ts +7 -0
- package/dist/esm/src/deprecated/next-data.d.ts.map +1 -0
- package/dist/esm/src/deprecated/next-data.js +23 -0
- package/dist/esm/src/deprecated/next-data.js.map +1 -0
- package/dist/esm/src/deprecated/serialize-file-box.d.ts +6 -0
- package/dist/esm/src/deprecated/serialize-file-box.d.ts.map +1 -0
- package/dist/esm/src/deprecated/serialize-file-box.js +18 -0
- package/dist/esm/src/deprecated/serialize-file-box.js.map +1 -0
- package/dist/esm/src/env-vars.d.ts +5 -0
- package/dist/esm/src/env-vars.d.ts.map +1 -0
- package/dist/esm/src/env-vars.js +83 -0
- package/dist/esm/src/env-vars.js.map +1 -0
- package/dist/esm/src/env-vars.spec.d.ts +3 -0
- package/dist/esm/src/env-vars.spec.d.ts.map +1 -0
- package/dist/esm/src/env-vars.spec.js +19 -0
- package/dist/esm/src/env-vars.spec.js.map +1 -0
- package/dist/esm/src/event-type-rev.d.ts +11 -0
- package/dist/esm/src/event-type-rev.d.ts.map +1 -0
- package/dist/esm/src/event-type-rev.js +14 -0
- package/dist/esm/src/event-type-rev.js.map +1 -0
- package/dist/esm/src/file-box-helper/mod.d.ts +4 -0
- package/dist/esm/src/file-box-helper/mod.d.ts.map +1 -0
- package/dist/esm/src/file-box-helper/mod.js +4 -0
- package/dist/esm/src/file-box-helper/mod.js.map +1 -0
- package/dist/esm/src/file-box-helper/normalize-filebox.d.ts +6 -0
- package/dist/esm/src/file-box-helper/normalize-filebox.d.ts.map +1 -0
- package/dist/esm/src/file-box-helper/normalize-filebox.js +72 -0
- package/dist/esm/src/file-box-helper/normalize-filebox.js.map +1 -0
- package/dist/esm/src/file-box-helper/normalize-filebox.spec.d.ts +3 -0
- package/dist/esm/src/file-box-helper/normalize-filebox.spec.d.ts.map +1 -0
- package/dist/esm/src/file-box-helper/normalize-filebox.spec.js +33 -0
- package/dist/esm/src/file-box-helper/normalize-filebox.spec.js.map +1 -0
- package/dist/esm/src/file-box-helper/uuidify-file-box-grpc.d.ts +6 -0
- package/dist/esm/src/file-box-helper/uuidify-file-box-grpc.d.ts.map +1 -0
- package/dist/esm/src/file-box-helper/uuidify-file-box-grpc.js +42 -0
- package/dist/esm/src/file-box-helper/uuidify-file-box-grpc.js.map +1 -0
- package/dist/esm/src/file-box-helper/uuidify-file-box-local.d.ts +5 -0
- package/dist/esm/src/file-box-helper/uuidify-file-box-local.d.ts.map +1 -0
- package/dist/esm/src/file-box-helper/uuidify-file-box-local.js +16 -0
- package/dist/esm/src/file-box-helper/uuidify-file-box-local.js.map +1 -0
- package/dist/esm/src/mod.d.ts +8 -0
- package/dist/esm/src/mod.d.ts.map +1 -0
- package/dist/esm/src/mod.js +7 -0
- package/dist/esm/src/mod.js.map +1 -0
- package/dist/esm/src/mod.spec.d.ts +3 -0
- package/dist/esm/src/mod.spec.d.ts.map +1 -0
- package/dist/esm/src/mod.spec.js +7 -0
- package/dist/esm/src/mod.spec.js.map +1 -0
- package/dist/esm/src/package-json.d.ts +6 -0
- package/dist/esm/src/package-json.d.ts.map +1 -0
- package/dist/esm/src/package-json.js +98 -0
- package/dist/esm/src/package-json.js.map +1 -0
- package/dist/esm/src/package-json.spec.d.ts +3 -0
- package/dist/esm/src/package-json.spec.d.ts.map +1 -0
- package/dist/esm/src/package-json.spec.js +8 -0
- package/dist/esm/src/package-json.spec.js.map +1 -0
- package/dist/esm/src/pure-functions/timestamp.d.ts +8 -0
- package/dist/esm/src/pure-functions/timestamp.d.ts.map +1 -0
- package/dist/esm/src/pure-functions/timestamp.js +19 -0
- package/dist/esm/src/pure-functions/timestamp.js.map +1 -0
- package/dist/esm/src/server/event-stream-manager.d.ts +40 -0
- package/dist/esm/src/server/event-stream-manager.d.ts.map +1 -0
- package/dist/esm/src/server/event-stream-manager.js +318 -0
- package/dist/esm/src/server/event-stream-manager.js.map +1 -0
- package/dist/esm/src/server/grpc-error.d.ts +5 -0
- package/dist/esm/src/server/grpc-error.d.ts.map +1 -0
- package/dist/esm/src/server/grpc-error.js +8 -0
- package/dist/esm/src/server/grpc-error.js.map +1 -0
- package/dist/esm/src/server/health-implementation.d.ts +5 -0
- package/dist/esm/src/server/health-implementation.d.ts.map +1 -0
- package/dist/esm/src/server/health-implementation.js +52 -0
- package/dist/esm/src/server/health-implementation.js.map +1 -0
- package/dist/esm/src/server/puppet-implementation.d.ts +6 -0
- package/dist/esm/src/server/puppet-implementation.d.ts.map +1 -0
- package/dist/esm/src/server/puppet-implementation.js +1200 -0
- package/dist/esm/src/server/puppet-implementation.js.map +1 -0
- package/dist/esm/src/server/puppet-server.d.ts +23 -0
- package/dist/esm/src/server/puppet-server.d.ts.map +1 -0
- package/dist/esm/src/server/puppet-server.js +152 -0
- package/dist/esm/src/server/puppet-server.js.map +1 -0
- package/dist/esm/src/server/puppet-server.spec.d.ts +3 -0
- package/dist/esm/src/server/puppet-server.spec.d.ts.map +1 -0
- package/dist/esm/src/server/puppet-server.spec.js +13 -0
- package/dist/esm/src/server/puppet-server.spec.js.map +1 -0
- package/dist/esm/tests/grpc-client.spec.d.ts +3 -0
- package/dist/esm/tests/grpc-client.spec.d.ts.map +1 -0
- package/dist/esm/tests/grpc-client.spec.js +132 -0
- package/dist/esm/tests/grpc-client.spec.js.map +1 -0
- package/dist/esm/tests/grpc-stream.spec.d.ts +15 -0
- package/dist/esm/tests/grpc-stream.spec.d.ts.map +1 -0
- package/dist/esm/tests/grpc-stream.spec.js +62 -0
- package/dist/esm/tests/grpc-stream.spec.js.map +1 -0
- package/dist/esm/tests/integration.spec.d.ts +3 -0
- package/dist/esm/tests/integration.spec.d.ts.map +1 -0
- package/dist/esm/tests/integration.spec.js +65 -0
- package/dist/esm/tests/integration.spec.js.map +1 -0
- package/dist/esm/tests/performance.spec.d.ts +14 -0
- package/dist/esm/tests/performance.spec.d.ts.map +1 -0
- package/dist/esm/tests/performance.spec.js +104 -0
- package/dist/esm/tests/performance.spec.js.map +1 -0
- package/dist/esm/tests/ready-event.spec.d.ts +3 -0
- package/dist/esm/tests/ready-event.spec.d.ts.map +1 -0
- package/dist/esm/tests/ready-event.spec.js +52 -0
- package/dist/esm/tests/ready-event.spec.js.map +1 -0
- package/dist/esm/tests/uuid-file-box.spec.d.ts +3 -0
- package/dist/esm/tests/uuid-file-box.spec.d.ts.map +1 -0
- package/dist/esm/tests/uuid-file-box.spec.js +49 -0
- package/dist/esm/tests/uuid-file-box.spec.js.map +1 -0
- package/package.json +97 -0
- package/src/auth/README.md +10 -0
- package/src/auth/auth-impl-token.spec.ts +81 -0
- package/src/auth/auth-impl-token.ts +108 -0
- package/src/auth/ca.spec.ts +116 -0
- package/src/auth/ca.ts +137 -0
- package/src/auth/call-cred.spec.ts +25 -0
- package/src/auth/call-cred.ts +22 -0
- package/src/auth/env-vars.ts +32 -0
- package/src/auth/grpc-js.ts +29 -0
- package/src/auth/mod.ts +9 -0
- package/src/auth/mokey-patch-header-authorization.ts +45 -0
- package/src/auth/monkey-patch-header-authorization.spec.ts +26 -0
- package/src/client/duck/actions.ts +31 -0
- package/src/client/duck/epic-recover.spec.ts +180 -0
- package/src/client/duck/epic-recover.ts +109 -0
- package/src/client/duck/epics.ts +53 -0
- package/src/client/duck/mod.ts +38 -0
- package/src/client/duck/operations.ts +28 -0
- package/src/client/duck/reducers.ts +36 -0
- package/src/client/duck/selectors.ts +27 -0
- package/src/client/duck/tests.spec.ts +25 -0
- package/src/client/duck/types.ts +20 -0
- package/src/client/duck/utils.ts +20 -0
- package/src/client/grpc-manager.spec.ts +20 -0
- package/src/client/grpc-manager.ts +440 -0
- package/src/client/payload-store.spec.ts +19 -0
- package/src/client/payload-store.ts +153 -0
- package/src/client/puppet-service.spec.ts +59 -0
- package/src/client/puppet-service.ts +1938 -0
- package/src/config.ts +31 -0
- package/src/deprecated/chunk-pb.spec.ts +210 -0
- package/src/deprecated/chunk-pb.ts +75 -0
- package/src/deprecated/conversation-id-file-box.spec.ts +131 -0
- package/src/deprecated/conversation-id-file-box.ts +72 -0
- package/src/deprecated/file-box-chunk.spec.ts +184 -0
- package/src/deprecated/file-box-chunk.ts +87 -0
- package/src/deprecated/file-box-pb.spec.ts +31 -0
- package/src/deprecated/file-box-pb.ts +41 -0
- package/src/deprecated/file-box-pb.type.ts +16 -0
- package/src/deprecated/mod.ts +8 -0
- package/src/deprecated/next-data.ts +35 -0
- package/src/deprecated/serialize-file-box.ts +24 -0
- package/src/env-vars.spec.ts +23 -0
- package/src/env-vars.ts +100 -0
- package/src/event-type-rev.ts +19 -0
- package/src/file-box-helper/mod.ts +11 -0
- package/src/file-box-helper/normalize-filebox.spec.ts +47 -0
- package/src/file-box-helper/normalize-filebox.ts +90 -0
- package/src/file-box-helper/uuidify-file-box-grpc.ts +83 -0
- package/src/file-box-helper/uuidify-file-box-local.ts +31 -0
- package/src/mod.spec.ts +9 -0
- package/src/mod.ts +25 -0
- package/src/package-json.spec.ts +10 -0
- package/src/package-json.ts +101 -0
- package/src/pure-functions/timestamp.ts +28 -0
- package/src/server/event-stream-manager.ts +383 -0
- package/src/server/grpc-error.ts +23 -0
- package/src/server/health-implementation.ts +78 -0
- package/src/server/puppet-implementation.ts +1539 -0
- package/src/server/puppet-server.spec.ts +21 -0
- package/src/server/puppet-server.ts +239 -0
- package/src/typings.d.ts +68 -0
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wechaty Open Source Software - https://github.com/wechaty
|
|
3
|
+
*
|
|
4
|
+
* @copyright 2016 Huan LI (李卓桓) <https://github.com/huan>, and
|
|
5
|
+
* Wechaty Contributors <https://github.com/wechaty>.
|
|
6
|
+
*
|
|
7
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
* you may not use this file except in compliance with the License.
|
|
9
|
+
* You may obtain a copy of the License at
|
|
10
|
+
*
|
|
11
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
*
|
|
13
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
* See the License for the specific language governing permissions and
|
|
17
|
+
* limitations under the License.
|
|
18
|
+
*
|
|
19
|
+
*/
|
|
20
|
+
import util from 'util'
|
|
21
|
+
import EventEmitter from 'events'
|
|
22
|
+
import crypto from 'crypto'
|
|
23
|
+
|
|
24
|
+
import { log } from '@juzi/wechaty-puppet'
|
|
25
|
+
import {
|
|
26
|
+
grpc,
|
|
27
|
+
puppet,
|
|
28
|
+
} from '@juzi/wechaty-grpc'
|
|
29
|
+
import {
|
|
30
|
+
timeoutPromise,
|
|
31
|
+
} from 'gerror'
|
|
32
|
+
import {
|
|
33
|
+
WechatyToken,
|
|
34
|
+
WechatyResolver,
|
|
35
|
+
} from 'wechaty-token'
|
|
36
|
+
|
|
37
|
+
import {
|
|
38
|
+
GRPC_OPTIONS,
|
|
39
|
+
envVars,
|
|
40
|
+
} from '../config.js'
|
|
41
|
+
|
|
42
|
+
import { callCredToken } from '../auth/mod.js'
|
|
43
|
+
import { GrpcStatus } from '../auth/grpc-js.js'
|
|
44
|
+
import {
|
|
45
|
+
TLS_CA_CERT,
|
|
46
|
+
TLS_INSECURE_SERVER_CERT_COMMON_NAME,
|
|
47
|
+
} from '../auth/ca.js'
|
|
48
|
+
|
|
49
|
+
import type { PuppetServiceOptions } from './puppet-service.js'
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Huan(202108): register `wechaty` schema for gRPC service discovery
|
|
53
|
+
* so that we can use `wechaty:///SNI_UUIDv4` for gRPC address
|
|
54
|
+
*
|
|
55
|
+
* See: https://github.com/wechaty/wechaty-puppet-service/issues/155
|
|
56
|
+
*/
|
|
57
|
+
WechatyResolver.setup()
|
|
58
|
+
|
|
59
|
+
class GrpcManager extends EventEmitter {
|
|
60
|
+
|
|
61
|
+
protected _client? : puppet.PuppetClient
|
|
62
|
+
get client () : puppet.PuppetClient {
|
|
63
|
+
if (!this._client) {
|
|
64
|
+
throw new Error('NO CLIENT')
|
|
65
|
+
}
|
|
66
|
+
return this._client
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
eventStream? : grpc.ClientReadableStream<puppet.EventResponse>
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* gRPC settings
|
|
73
|
+
*/
|
|
74
|
+
caCert : Buffer
|
|
75
|
+
disableTls : boolean
|
|
76
|
+
endpoint : string
|
|
77
|
+
serverName : string
|
|
78
|
+
token : WechatyToken
|
|
79
|
+
|
|
80
|
+
constructor (private options: PuppetServiceOptions) {
|
|
81
|
+
super()
|
|
82
|
+
log.verbose('GrpcManager', 'constructor(%s)', JSON.stringify(options))
|
|
83
|
+
|
|
84
|
+
this.caCert = Buffer.from(
|
|
85
|
+
envVars.WECHATY_PUPPET_SERVICE_TLS_CA_CERT(this.options.tls?.caCert) || TLS_CA_CERT,
|
|
86
|
+
)
|
|
87
|
+
log.verbose('GrpcManager', 'constructor() tlsRootCert(hash): "%s"',
|
|
88
|
+
crypto.createHash('sha256')
|
|
89
|
+
.update(this.caCert)
|
|
90
|
+
.digest('hex'),
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Token will be used in the gRPC resolver (in endpoint)
|
|
95
|
+
*/
|
|
96
|
+
this.token = new WechatyToken(
|
|
97
|
+
envVars.WECHATY_PUPPET_SERVICE_TOKEN(this.options.token),
|
|
98
|
+
)
|
|
99
|
+
log.verbose('GrpcManager', 'constructor() token: "%s"', this.token)
|
|
100
|
+
|
|
101
|
+
this.endpoint = envVars.WECHATY_PUPPET_SERVICE_ENDPOINT(this.options.endpoint)
|
|
102
|
+
/**
|
|
103
|
+
* Wechaty Token Discovery-able URL
|
|
104
|
+
* See: wechaty-token / https://github.com/wechaty/wechaty-puppet-service/issues/155
|
|
105
|
+
*/
|
|
106
|
+
|| [
|
|
107
|
+
'wechaty://',
|
|
108
|
+
envVars.WECHATY_PUPPET_SERVICE_AUTHORITY(this.options.authority),
|
|
109
|
+
'/',
|
|
110
|
+
this.token,
|
|
111
|
+
].join('')
|
|
112
|
+
log.verbose('GrpcManager', 'constructor() endpoint: "%s"', this.endpoint)
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Disable TLS
|
|
116
|
+
*/
|
|
117
|
+
this.disableTls = envVars.WECHATY_PUPPET_SERVICE_NO_TLS_INSECURE_CLIENT(this.options.tls?.disable)
|
|
118
|
+
log.verbose('GrpcManager', 'constructor() disableTls: "%s"', this.disableTls)
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* for Node.js TLS SNI
|
|
122
|
+
* https://en.wikipedia.org/wiki/Server_Name_Indication
|
|
123
|
+
*/
|
|
124
|
+
const serverNameIndication = envVars.WECHATY_PUPPET_SERVICE_TLS_SERVER_NAME(this.options.tls?.serverName)
|
|
125
|
+
/**
|
|
126
|
+
* Huan(202108): we use SNI from token
|
|
127
|
+
* if there is
|
|
128
|
+
* neither override from environment variable: `WECHATY_PUPPET_SERVICE_TLS_SERVER_NAME`
|
|
129
|
+
* nor set from: `options.tls.serverName`
|
|
130
|
+
*/
|
|
131
|
+
|| this.token.sni
|
|
132
|
+
|
|
133
|
+
if (!serverNameIndication) {
|
|
134
|
+
throw new Error([
|
|
135
|
+
'Wechaty Puppet Service requires a SNI as prefix of the token from version 0.30 and later.',
|
|
136
|
+
`You can add the "${TLS_INSECURE_SERVER_CERT_COMMON_NAME}_" prefix to your token`,
|
|
137
|
+
`like: "${TLS_INSECURE_SERVER_CERT_COMMON_NAME}_${this.token}"`,
|
|
138
|
+
'and try again.',
|
|
139
|
+
].join('\n'))
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
this.serverName = serverNameIndication
|
|
143
|
+
log.verbose('GrpcManager', 'constructor() serverName(SNI): "%s"', this.serverName)
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
async start (): Promise<void> {
|
|
147
|
+
log.verbose('GrpcManager', 'start()')
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* 1. Init grpc client
|
|
151
|
+
*/
|
|
152
|
+
log.verbose('GrpcManager', 'start() initializing client ...')
|
|
153
|
+
await this.initClient()
|
|
154
|
+
log.verbose('GrpcManager', 'start() initializing client ... done')
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* 2. Connect to stream
|
|
158
|
+
*/
|
|
159
|
+
log.verbose('GrpcManager', 'start() starting stream ...')
|
|
160
|
+
await this.startStream()
|
|
161
|
+
log.verbose('GrpcManager', 'start() starting stream ... done')
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* 3. Start the puppet
|
|
165
|
+
*/
|
|
166
|
+
log.verbose('GrpcManager', 'start() calling grpc server: start() ...')
|
|
167
|
+
await util.promisify(
|
|
168
|
+
this.client.start
|
|
169
|
+
.bind(this.client),
|
|
170
|
+
)(new puppet.StartRequest())
|
|
171
|
+
log.verbose('GrpcManager', 'start() calling grpc server: start() ... done')
|
|
172
|
+
|
|
173
|
+
log.verbose('GrpcManager', 'start() ... done')
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
async stop (): Promise<void> {
|
|
177
|
+
log.verbose('GrpcManager', 'stop()')
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* 1. Disconnect from stream
|
|
181
|
+
*/
|
|
182
|
+
log.verbose('GrpcManager', 'stop() stop stream ...')
|
|
183
|
+
this.stopStream()
|
|
184
|
+
log.verbose('GrpcManager', 'stop() stop stream ... done')
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* 2. Stop the puppet
|
|
188
|
+
*/
|
|
189
|
+
try {
|
|
190
|
+
log.verbose('GrpcManager', 'stop() stop client ...')
|
|
191
|
+
await util.promisify(
|
|
192
|
+
this.client.stop
|
|
193
|
+
.bind(this.client),
|
|
194
|
+
)(new puppet.StopRequest())
|
|
195
|
+
log.verbose('GrpcManager', 'stop() stop client ... done')
|
|
196
|
+
} catch (e) {
|
|
197
|
+
this.emit('error', e)
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* 3. Destroy grpc client
|
|
202
|
+
*/
|
|
203
|
+
try {
|
|
204
|
+
log.verbose('GrpcManager', 'stop() destroy client ...')
|
|
205
|
+
this.destroyClient()
|
|
206
|
+
log.verbose('GrpcManager', 'stop() destroy client ... done')
|
|
207
|
+
} catch (e) {
|
|
208
|
+
this.emit('error', e)
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
log.verbose('GrpcManager', 'stop() ... done')
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
protected async initClient (): Promise<void> {
|
|
215
|
+
log.verbose('GrpcManager', 'initClient()')
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Huan(202108): for maximum compatible with the non-tls community servers/clients,
|
|
219
|
+
* we introduced the WECHATY_PUPPET_SERVICE_NO_TLS_INSECURE_{SERVER,CLIENT} environment variables.
|
|
220
|
+
* if it has been set, then we will run under HTTP instead of HTTPS
|
|
221
|
+
*/
|
|
222
|
+
let credential
|
|
223
|
+
if (this.disableTls) {
|
|
224
|
+
log.warn('GrpcManager', 'initClient() TLS: disabled (INSECURE)')
|
|
225
|
+
credential = grpc.credentials.createInsecure()
|
|
226
|
+
} else {
|
|
227
|
+
log.verbose('GrpcManager', 'initClient() TLS: enabled')
|
|
228
|
+
const callCred = callCredToken(this.token.token)
|
|
229
|
+
const channelCred = grpc.credentials.createSsl(this.caCert)
|
|
230
|
+
const combCreds = grpc.credentials.combineChannelCredentials(channelCred, callCred)
|
|
231
|
+
|
|
232
|
+
credential = combCreds
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
const clientOptions: grpc.ChannelOptions = {
|
|
236
|
+
...GRPC_OPTIONS,
|
|
237
|
+
'grpc.ssl_target_name_override': this.serverName,
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
{
|
|
241
|
+
// Deprecated: this block will be removed after Dec 21, 2022.
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Huan(202108): `grpc.default_authority` is a workaround
|
|
245
|
+
* for compatiblity with the non-tls community servers/clients.
|
|
246
|
+
*
|
|
247
|
+
* See: https://github.com/wechaty/wechaty-puppet-service/pull/78
|
|
248
|
+
*/
|
|
249
|
+
const grpcDefaultAuthority = this.token.token
|
|
250
|
+
clientOptions['grpc.default_authority'] = grpcDefaultAuthority
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
if (this._client) {
|
|
254
|
+
log.warn('GrpcManager', 'initClient() this.#client exists? Old client has been dropped.')
|
|
255
|
+
this._client = undefined
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
this._client = new puppet.PuppetClient(
|
|
259
|
+
this.endpoint,
|
|
260
|
+
credential,
|
|
261
|
+
clientOptions,
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
log.verbose('GrpcManager', 'initClient() ... done')
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
protected destroyClient (): void {
|
|
268
|
+
log.verbose('GrpcManager', 'destroyClient()')
|
|
269
|
+
|
|
270
|
+
if (!this._client) {
|
|
271
|
+
log.warn('GrpcManager', 'destroyClient() this.#client not exist')
|
|
272
|
+
return
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
const client = this._client
|
|
276
|
+
/**
|
|
277
|
+
* Huan(202108): we should set `this.client` to `undefined` at the current event loop
|
|
278
|
+
* to prevent the future usage of the old client.
|
|
279
|
+
*/
|
|
280
|
+
this._client = undefined
|
|
281
|
+
|
|
282
|
+
try {
|
|
283
|
+
client.close()
|
|
284
|
+
} catch (e) {
|
|
285
|
+
log.error('GrpcManager', 'destroyClient() client.close() rejection: %s\n%s', e && (e as Error).message, (e as Error).stack)
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
protected async startStream (): Promise<void> {
|
|
290
|
+
log.verbose('GrpcManager', 'startStream()')
|
|
291
|
+
|
|
292
|
+
if (this.eventStream) {
|
|
293
|
+
log.verbose('GrpcManager', 'startStream() this.eventStream exists, dropped.')
|
|
294
|
+
this.eventStream = undefined
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
log.verbose('GrpcManager', 'startStream() grpc -> event() ...')
|
|
298
|
+
const eventStream = this.client.event(new puppet.EventRequest())
|
|
299
|
+
log.verbose('GrpcManager', 'startStream() grpc -> event() ... done')
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* Store the event data from the stream when we test connection,
|
|
303
|
+
* and re-emit the event data when we have finished testing the connection
|
|
304
|
+
*/
|
|
305
|
+
let peekedData: undefined | puppet.EventResponse
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Huan(202108): future must be placed before other listenser registration
|
|
309
|
+
* because the on('data') will start drain the stream
|
|
310
|
+
*/
|
|
311
|
+
const future = new Promise<void>((resolve, reject) => eventStream
|
|
312
|
+
/**
|
|
313
|
+
* Huan(202108): we need a `heartbeat` event to confirm the connection is alive
|
|
314
|
+
* for our wechaty-puppet-service server code, when the gRPC event stream is opened,
|
|
315
|
+
* it will emit a `heartbeat` event as early as possible.
|
|
316
|
+
*
|
|
317
|
+
* However, the `heartbeat` event is not guaranteed to be emitted,
|
|
318
|
+
* if the puppet service provider is coming from the community, like:
|
|
319
|
+
* - paimon
|
|
320
|
+
*
|
|
321
|
+
* So we also need a timeout for compatible with those providers
|
|
322
|
+
* in case of they are not following this special protocol.
|
|
323
|
+
*/
|
|
324
|
+
.once('data', (resp: puppet.EventResponse) => {
|
|
325
|
+
peekedData = resp
|
|
326
|
+
resolve()
|
|
327
|
+
})
|
|
328
|
+
/**
|
|
329
|
+
* Any of the following events will be emitted means that there's a problem.
|
|
330
|
+
*/
|
|
331
|
+
.once('cancel', reject)
|
|
332
|
+
.once('end', reject)
|
|
333
|
+
.once('error', reject)
|
|
334
|
+
/**
|
|
335
|
+
* The `status` event is import when we connect a gRPC stream.
|
|
336
|
+
*
|
|
337
|
+
* Huan(202108): according to the unit tests (tests/grpc-client.spec.ts)
|
|
338
|
+
* 1. If client TLS is not ok (client no-tls but server TLS is required)
|
|
339
|
+
* then status will be:
|
|
340
|
+
* { code: 14, details: 'Connection dropped' }
|
|
341
|
+
* 2. If client TLS is ok but the client token is invalid,
|
|
342
|
+
* then status will be:
|
|
343
|
+
* { code: 16, details: 'Invalid Wechaty TOKEN "0.XXX"' }
|
|
344
|
+
*/
|
|
345
|
+
.once('status', status => {
|
|
346
|
+
// console.info('once(status)', status)
|
|
347
|
+
status.code === GrpcStatus.OK
|
|
348
|
+
? resolve()
|
|
349
|
+
: reject(new Error('once(status)'))
|
|
350
|
+
}),
|
|
351
|
+
/**
|
|
352
|
+
* Huan(202108): `metadata` event will be fired
|
|
353
|
+
* when the TLS connection is OK
|
|
354
|
+
* even if the token is invalid
|
|
355
|
+
*
|
|
356
|
+
* Conclusion: we MUST NOT listen on `metadata` for `resolve`.
|
|
357
|
+
*/
|
|
358
|
+
// .once('metadata', (...args) => console.info('once(metadata)', ...args))
|
|
359
|
+
)
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* Huan(202108): the `heartbeat` event is not guaranteed to be emitted
|
|
363
|
+
* if a puppet service provider is coming from the community, it might not follow the protocol specification.
|
|
364
|
+
* So we need a timeout for compatible with those providers
|
|
365
|
+
*/
|
|
366
|
+
log.verbose('GrpcManager', 'startStream() grpc -> event peeking data or timeout ...')
|
|
367
|
+
try {
|
|
368
|
+
await timeoutPromise(future, 5 * 1000) // 5 seconds
|
|
369
|
+
} catch (_) {
|
|
370
|
+
log.verbose('GrpcManager', 'startStream() grpc -> event peeking data or timeout ... timeout')
|
|
371
|
+
}
|
|
372
|
+
log.verbose('GrpcManager', 'startStream() grpc -> event peeking data or timeout ... data peeked')
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* Bridge the events
|
|
376
|
+
* Huan(202108): adding the below event listeners
|
|
377
|
+
* must be after the `await future` above,
|
|
378
|
+
* so that if there's any `error` event,
|
|
379
|
+
* it will be triggered already.
|
|
380
|
+
*/
|
|
381
|
+
log.verbose('GrpcManager', 'startStream() initializing event stream ...')
|
|
382
|
+
eventStream
|
|
383
|
+
.on('cancel', (...args) => this.emit('cancel', ...args))
|
|
384
|
+
.on('data', (...args) => this.emit('data', ...args))
|
|
385
|
+
.on('end', (...args) => this.emit('end', ...args))
|
|
386
|
+
.on('error', (...args) => this.emit('error', ...args))
|
|
387
|
+
.on('metadata', (...args) => this.emit('metadata', ...args))
|
|
388
|
+
.on('status', (...args) => this.emit('status', ...args))
|
|
389
|
+
|
|
390
|
+
this.eventStream = eventStream
|
|
391
|
+
log.verbose('GrpcManager', 'startStream() initializing event stream ... done')
|
|
392
|
+
|
|
393
|
+
/**
|
|
394
|
+
* Re-emit the peeked data if there's any
|
|
395
|
+
*/
|
|
396
|
+
if (peekedData) {
|
|
397
|
+
log.verbose('GrpcManager', 'startStream() sending back the peeked data ...')
|
|
398
|
+
this.emit('data', peekedData)
|
|
399
|
+
peekedData = undefined
|
|
400
|
+
log.verbose('GrpcManager', 'startStream() sending back the peeked data ... done')
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
log.verbose('GrpcManager', 'startStream() ... done')
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
protected stopStream (): void {
|
|
407
|
+
log.verbose('GrpcManager', 'stopStream()')
|
|
408
|
+
|
|
409
|
+
if (!this.eventStream) {
|
|
410
|
+
log.verbose('GrpcManager', 'stopStream() no eventStream when stop, skip destroy.')
|
|
411
|
+
return
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Huan(202108): we should set `this.eventStream` to `undefined` at the current event loop
|
|
415
|
+
* to prevent the future usage of the old eventStream.
|
|
416
|
+
*/
|
|
417
|
+
const eventStream = this.eventStream
|
|
418
|
+
this.eventStream = undefined
|
|
419
|
+
|
|
420
|
+
/**
|
|
421
|
+
* Huan(202003):
|
|
422
|
+
* destroy() will be enough to terminate a stream call.
|
|
423
|
+
* cancel() is not needed.
|
|
424
|
+
*/
|
|
425
|
+
// this.eventStream.cancel()
|
|
426
|
+
|
|
427
|
+
try {
|
|
428
|
+
log.verbose('GrpcManager', 'stopStream() destroying event stream ...')
|
|
429
|
+
eventStream.destroy()
|
|
430
|
+
log.verbose('GrpcManager', 'stopStream() destroying event stream ... done')
|
|
431
|
+
} catch (e) {
|
|
432
|
+
this.emit('error', e)
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
export {
|
|
439
|
+
GrpcManager,
|
|
440
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env -S node --no-warnings --loader ts-node/esm
|
|
2
|
+
|
|
3
|
+
import { test } from 'tstest'
|
|
4
|
+
|
|
5
|
+
import { PayloadStore } from './payload-store.js'
|
|
6
|
+
|
|
7
|
+
test('PayloadStore perfect restart', async t => {
|
|
8
|
+
const token = Math.random().toString(36)
|
|
9
|
+
const store = new PayloadStore({ token })
|
|
10
|
+
|
|
11
|
+
for (let i = 0; i < 3; i++) {
|
|
12
|
+
const accountId = Math.random().toString(36)
|
|
13
|
+
await store.start(accountId)
|
|
14
|
+
await store.stop()
|
|
15
|
+
t.pass('start/stop-ed at #' + i)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
await store.destroy()
|
|
19
|
+
})
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wechaty Open Source Software - https://github.com/wechaty
|
|
3
|
+
*
|
|
4
|
+
* @copyright 2016 Huan LI (李卓桓) <https://github.com/huan>, and
|
|
5
|
+
* Wechaty Contributors <https://github.com/wechaty>.
|
|
6
|
+
*
|
|
7
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
* you may not use this file except in compliance with the License.
|
|
9
|
+
* You may obtain a copy of the License at
|
|
10
|
+
*
|
|
11
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
*
|
|
13
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
* See the License for the specific language governing permissions and
|
|
17
|
+
* limitations under the License.
|
|
18
|
+
*
|
|
19
|
+
*/
|
|
20
|
+
import path from 'path'
|
|
21
|
+
import os from 'os'
|
|
22
|
+
import fs from 'fs'
|
|
23
|
+
|
|
24
|
+
import semverPkg from 'semver'
|
|
25
|
+
|
|
26
|
+
import type * as PUPPET from '@juzi/wechaty-puppet'
|
|
27
|
+
|
|
28
|
+
import { FlashStore } from 'flash-store'
|
|
29
|
+
|
|
30
|
+
import {
|
|
31
|
+
VERSION,
|
|
32
|
+
log,
|
|
33
|
+
} from '../config.js'
|
|
34
|
+
|
|
35
|
+
const { major, minor } = semverPkg
|
|
36
|
+
|
|
37
|
+
interface PayloadStoreOptions {
|
|
38
|
+
token: string
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
interface StoreRoomMemberPayload {
|
|
42
|
+
[roomMemberContactId: string]: PUPPET.payloads.RoomMember
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
class PayloadStore {
|
|
46
|
+
|
|
47
|
+
// public message? : LRU<string, MessagePayload>
|
|
48
|
+
|
|
49
|
+
public contact? : FlashStore<string, PUPPET.payloads.Contact>
|
|
50
|
+
public roomMember? : FlashStore<string, StoreRoomMemberPayload>
|
|
51
|
+
public room? : FlashStore<string, PUPPET.payloads.Room>
|
|
52
|
+
|
|
53
|
+
protected storeDir: string
|
|
54
|
+
protected accountId?: string
|
|
55
|
+
|
|
56
|
+
constructor (private options: PayloadStoreOptions) {
|
|
57
|
+
log.verbose('PayloadStore', 'constructor(%s)', JSON.stringify(options))
|
|
58
|
+
|
|
59
|
+
this.storeDir = path.join(
|
|
60
|
+
os.homedir(),
|
|
61
|
+
'.wechaty',
|
|
62
|
+
'wechaty-puppet-service',
|
|
63
|
+
this.options.token,
|
|
64
|
+
`v${major(VERSION)}.${minor(VERSION)}`,
|
|
65
|
+
)
|
|
66
|
+
log.silly('PayloadStore', 'constructor() storeDir: "%s"', this.storeDir)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* When starting the store, we need to know the accountId
|
|
71
|
+
* so that we can save the payloads under a specific account folder.
|
|
72
|
+
*/
|
|
73
|
+
async start (accountId: string): Promise<void> {
|
|
74
|
+
log.verbose('PayloadStore', 'start(%s)', accountId)
|
|
75
|
+
|
|
76
|
+
if (this.accountId) {
|
|
77
|
+
throw new Error('PayloadStore should be stop() before start() again.')
|
|
78
|
+
}
|
|
79
|
+
this.accountId = accountId
|
|
80
|
+
|
|
81
|
+
const accountDir = path.join(this.storeDir, accountId)
|
|
82
|
+
|
|
83
|
+
if (!fs.existsSync(accountDir)) {
|
|
84
|
+
fs.mkdirSync(accountDir, { recursive: true })
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
this.contact = new FlashStore(path.join(accountDir, 'contact-payload'))
|
|
88
|
+
this.roomMember = new FlashStore(path.join(accountDir, 'room-member-payload'))
|
|
89
|
+
this.room = new FlashStore(path.join(accountDir, 'room-payload'))
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* LRU
|
|
93
|
+
*
|
|
94
|
+
* Huan(202108): the Wechaty Puppet has LRU cache already,
|
|
95
|
+
* there's no need to do it again.
|
|
96
|
+
*
|
|
97
|
+
* We can focus on providing a persistent store for the performance.
|
|
98
|
+
*/
|
|
99
|
+
// const lruOptions: LRU.Options<string, MessagePayload> = {
|
|
100
|
+
// dispose (key, val) {
|
|
101
|
+
// log.silly('PayloadStore', `constructor() lruOptions.dispose(${key}, ${JSON.stringify(val)})`)
|
|
102
|
+
// },
|
|
103
|
+
// max : 1000, // 1000 messages
|
|
104
|
+
// maxAge : 60 * 60 * 1000, // 1 hour
|
|
105
|
+
// }
|
|
106
|
+
// this.message = new LRU(lruOptions)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
async stop (): Promise<void> {
|
|
110
|
+
log.verbose('PayloadStore', 'stop()')
|
|
111
|
+
|
|
112
|
+
const contactStore = this.contact
|
|
113
|
+
const roomMemberStore = this.roomMember
|
|
114
|
+
const roomStore = this.room
|
|
115
|
+
/**
|
|
116
|
+
* Huan(202108): we must set all the instances of the store to underfined
|
|
117
|
+
* in the current event loop as soon as possible
|
|
118
|
+
* to prevent the future store calls.
|
|
119
|
+
*/
|
|
120
|
+
this.contact = undefined
|
|
121
|
+
this.roomMember = undefined
|
|
122
|
+
this.room = undefined
|
|
123
|
+
|
|
124
|
+
// LRU
|
|
125
|
+
// this.message = undefined
|
|
126
|
+
|
|
127
|
+
// clear accountId
|
|
128
|
+
this.accountId = undefined
|
|
129
|
+
|
|
130
|
+
await contactStore?.close()
|
|
131
|
+
await roomMemberStore?.close()
|
|
132
|
+
await roomStore?.close()
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
async destroy (): Promise<void> {
|
|
136
|
+
log.verbose('PayloadStore', 'destroy()')
|
|
137
|
+
if (this.accountId) {
|
|
138
|
+
throw new Error('Can not destroy() a start()-ed store. Call stop() to stop it first')
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Huan(202108): `fs.rm` was introduced from Node.js v14.14
|
|
143
|
+
* https://nodejs.org/api/fs.html#fs_fspromises_rm_path_options
|
|
144
|
+
*/
|
|
145
|
+
await fs.promises.rmdir(this.storeDir, {
|
|
146
|
+
// force: true,
|
|
147
|
+
recursive: true,
|
|
148
|
+
})
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export { PayloadStore }
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
#!/usr/bin/env -S node --no-warnings --loader ts-node/esm
|
|
2
|
+
|
|
3
|
+
import { test } from 'tstest'
|
|
4
|
+
import getPort from 'get-port'
|
|
5
|
+
|
|
6
|
+
import { PuppetMock } from 'wechaty-puppet-mock'
|
|
7
|
+
|
|
8
|
+
import { PuppetService } from './puppet-service.js'
|
|
9
|
+
import { PuppetServer } from '../mod.js'
|
|
10
|
+
|
|
11
|
+
test('version()', async t => {
|
|
12
|
+
const puppet = new PuppetService({
|
|
13
|
+
token: 'test',
|
|
14
|
+
})
|
|
15
|
+
t.ok(puppet.version())
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Huan(202003):
|
|
20
|
+
* need to setup a test server to provide test token for Puppet Service
|
|
21
|
+
*/
|
|
22
|
+
test('PuppetService restart without problem', async t => {
|
|
23
|
+
const TOKEN = 'insecure_token'
|
|
24
|
+
const PORT = await getPort()
|
|
25
|
+
const ENDPOINT = '0.0.0.0:' + PORT
|
|
26
|
+
|
|
27
|
+
const puppet = new PuppetMock() as any
|
|
28
|
+
const serverOptions = {
|
|
29
|
+
endpoint: ENDPOINT,
|
|
30
|
+
puppet: puppet,
|
|
31
|
+
token: TOKEN,
|
|
32
|
+
} as const
|
|
33
|
+
|
|
34
|
+
const puppetServer = new PuppetServer(serverOptions)
|
|
35
|
+
await puppetServer.start()
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Puppet Service Client
|
|
39
|
+
*/
|
|
40
|
+
const puppetOptions = {
|
|
41
|
+
endpoint: ENDPOINT,
|
|
42
|
+
token: TOKEN,
|
|
43
|
+
} as const
|
|
44
|
+
|
|
45
|
+
const puppetService = new PuppetService(puppetOptions)
|
|
46
|
+
|
|
47
|
+
try {
|
|
48
|
+
for (let i = 0; i < 3; i++) {
|
|
49
|
+
await puppetService.start()
|
|
50
|
+
await puppetService.stop()
|
|
51
|
+
t.pass('start/stop-ed at #' + i)
|
|
52
|
+
}
|
|
53
|
+
t.pass('PuppetService() start/restart successed.')
|
|
54
|
+
} catch (e) {
|
|
55
|
+
t.fail(e as any)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
await puppetServer.stop()
|
|
59
|
+
})
|