miaw-core 1.1.0 → 1.2.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/.claude/settings.local.json +42 -0
- package/CHANGELOG.md +52 -0
- package/README.md +31 -1
- package/bin/miaw-cli.ts +181 -0
- package/dist/cli/commands/catalog.d.ts +68 -0
- package/dist/cli/commands/catalog.d.ts.map +1 -0
- package/dist/cli/commands/catalog.js +241 -0
- package/dist/cli/commands/catalog.js.map +1 -0
- package/dist/cli/commands/commands-index.d.ts +16 -0
- package/dist/cli/commands/commands-index.d.ts.map +1 -0
- package/dist/cli/commands/commands-index.js +16 -0
- package/dist/cli/commands/commands-index.js.map +1 -0
- package/dist/cli/commands/contact.d.ts +48 -0
- package/dist/cli/commands/contact.d.ts.map +1 -0
- package/dist/cli/commands/contact.js +180 -0
- package/dist/cli/commands/contact.js.map +1 -0
- package/dist/cli/commands/get.d.ts +59 -0
- package/dist/cli/commands/get.d.ts.map +1 -0
- package/dist/cli/commands/get.js +351 -0
- package/dist/cli/commands/get.js.map +1 -0
- package/dist/cli/commands/group.d.ts +114 -0
- package/dist/cli/commands/group.d.ts.map +1 -0
- package/dist/cli/commands/group.js +432 -0
- package/dist/cli/commands/group.js.map +1 -0
- package/dist/cli/commands/index.d.ts +24 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +671 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/instance.d.ts +52 -0
- package/dist/cli/commands/instance.d.ts.map +1 -0
- package/dist/cli/commands/instance.js +247 -0
- package/dist/cli/commands/instance.js.map +1 -0
- package/dist/cli/commands/label.d.ts +43 -0
- package/dist/cli/commands/label.d.ts.map +1 -0
- package/dist/cli/commands/label.js +209 -0
- package/dist/cli/commands/label.js.map +1 -0
- package/dist/cli/commands/media.d.ts +15 -0
- package/dist/cli/commands/media.d.ts.map +1 -0
- package/dist/cli/commands/media.js +69 -0
- package/dist/cli/commands/media.js.map +1 -0
- package/dist/cli/commands/misc.d.ts +13 -0
- package/dist/cli/commands/misc.d.ts.map +1 -0
- package/dist/cli/commands/misc.js +37 -0
- package/dist/cli/commands/misc.js.map +1 -0
- package/dist/cli/commands/profile.d.ts +29 -0
- package/dist/cli/commands/profile.d.ts.map +1 -0
- package/dist/cli/commands/profile.js +100 -0
- package/dist/cli/commands/profile.js.map +1 -0
- package/dist/cli/commands/send.d.ts +48 -0
- package/dist/cli/commands/send.d.ts.map +1 -0
- package/dist/cli/commands/send.js +137 -0
- package/dist/cli/commands/send.js.map +1 -0
- package/dist/cli/context.d.ts +23 -0
- package/dist/cli/context.d.ts.map +1 -0
- package/dist/cli/context.js +21 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli/index.d.ts +11 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +11 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/repl.d.ts +15 -0
- package/dist/cli/repl.d.ts.map +1 -0
- package/dist/cli/repl.js +899 -0
- package/dist/cli/repl.js.map +1 -0
- package/dist/cli/utils/cleanup.d.ts +32 -0
- package/dist/cli/utils/cleanup.d.ts.map +1 -0
- package/dist/cli/utils/cleanup.js +61 -0
- package/dist/cli/utils/cleanup.js.map +1 -0
- package/dist/cli/utils/client-cache.d.ts +41 -0
- package/dist/cli/utils/client-cache.d.ts.map +1 -0
- package/dist/cli/utils/client-cache.js +132 -0
- package/dist/cli/utils/client-cache.js.map +1 -0
- package/dist/cli/utils/formatter.d.ts +32 -0
- package/dist/cli/utils/formatter.d.ts.map +1 -0
- package/dist/cli/utils/formatter.js +111 -0
- package/dist/cli/utils/formatter.js.map +1 -0
- package/dist/cli/utils/instance-registry.d.ts +78 -0
- package/dist/cli/utils/instance-registry.d.ts.map +1 -0
- package/dist/cli/utils/instance-registry.js +158 -0
- package/dist/cli/utils/instance-registry.js.map +1 -0
- package/dist/cli/utils/prompt.d.ts +70 -0
- package/dist/cli/utils/prompt.d.ts.map +1 -0
- package/dist/cli/utils/prompt.js +120 -0
- package/dist/cli/utils/prompt.js.map +1 -0
- package/dist/cli/utils/session.d.ts +53 -0
- package/dist/cli/utils/session.d.ts.map +1 -0
- package/dist/cli/utils/session.js +294 -0
- package/dist/cli/utils/session.js.map +1 -0
- package/dist/client/MiawClient.d.ts +218 -19
- package/dist/client/MiawClient.d.ts.map +1 -1
- package/dist/client/MiawClient.js +1270 -143
- package/dist/client/MiawClient.js.map +1 -1
- package/dist/constants/cache.d.ts +8 -0
- package/dist/constants/cache.d.ts.map +1 -0
- package/dist/constants/cache.js +8 -0
- package/dist/constants/cache.js.map +1 -0
- package/dist/constants/colors.d.ts +19 -0
- package/dist/constants/colors.d.ts.map +1 -0
- package/dist/constants/colors.js +42 -0
- package/dist/constants/colors.js.map +1 -0
- package/dist/constants/timeouts.d.ts +38 -0
- package/dist/constants/timeouts.d.ts.map +1 -0
- package/dist/constants/timeouts.js +38 -0
- package/dist/constants/timeouts.js.map +1 -0
- package/dist/handlers/MessageHandler.d.ts +18 -1
- package/dist/handlers/MessageHandler.d.ts.map +1 -1
- package/dist/handlers/MessageHandler.js +44 -15
- package/dist/handlers/MessageHandler.js.map +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/types/baileys.d.ts +130 -0
- package/dist/types/baileys.d.ts.map +1 -0
- package/dist/types/baileys.js +16 -0
- package/dist/types/baileys.js.map +1 -0
- package/dist/types/index.d.ts +20 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/logger.d.ts +23 -0
- package/dist/types/logger.d.ts.map +1 -0
- package/dist/types/logger.js +2 -0
- package/dist/types/logger.js.map +1 -0
- package/dist/utils/console-filter.d.ts +62 -0
- package/dist/utils/console-filter.d.ts.map +1 -0
- package/dist/utils/console-filter.js +139 -0
- package/dist/utils/console-filter.js.map +1 -0
- package/dist/utils/filtered-logger.d.ts +23 -0
- package/dist/utils/filtered-logger.d.ts.map +1 -0
- package/dist/utils/filtered-logger.js +87 -0
- package/dist/utils/filtered-logger.js.map +1 -0
- package/dist/utils/type-guards.d.ts +39 -0
- package/dist/utils/type-guards.d.ts.map +1 -0
- package/dist/utils/type-guards.js +59 -0
- package/dist/utils/type-guards.js.map +1 -0
- package/dist/utils/validation.d.ts +90 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +177 -0
- package/dist/utils/validation.js.map +1 -0
- package/docs/BAILEYS_MIGRATION_v7.md +131 -23
- package/docs/CLI-ANALYSIS.md +428 -0
- package/docs/CLI.md +1189 -0
- package/docs/CODE_REVIEW_REPORT.md +581 -0
- package/docs/LID_RESOLUTION.md +226 -0
- package/docs/MIGRATION.md +172 -0
- package/docs/PROXY_SUPPORT_PLAN.md +1442 -0
- package/docs/USAGE.md +623 -651
- package/eslint.config.js +1 -1
- package/package.json +10 -5
- package/sessions-cli/.cli_history +200 -0
- package/sessions-cli/default/app-state-sync-key-AAAAAFwv.json +1 -0
- package/sessions-cli/default/app-state-sync-key-AAAAAFww.json +1 -0
- package/sessions-cli/default/app-state-sync-version-critical_block.json +1 -0
- package/sessions-cli/default/app-state-sync-version-critical_unblock_low.json +1 -0
- package/sessions-cli/default/app-state-sync-version-regular.json +1 -0
- package/sessions-cli/default/app-state-sync-version-regular_high.json +1 -0
- package/sessions-cli/default/app-state-sync-version-regular_low.json +1 -0
- package/sessions-cli/default/chats.json +244 -0
- package/sessions-cli/default/contacts.json +3880 -0
- package/sessions-cli/default/creds.json +1 -0
- package/sessions-cli/default/device-list-6285604722341.json +1 -0
- package/sessions-cli/default/labels.json +82 -0
- package/sessions-cli/default/lid-mapping-42877077966917_reverse.json +1 -0
- package/sessions-cli/default/lid-mapping-6285604722341.json +1 -0
- package/sessions-cli/default/lid-mappings.json +750 -0
- package/sessions-cli/default/messages.json +17287 -0
- package/sessions-cli/default/pre-key-1.json +1 -0
- package/sessions-cli/default/pre-key-10.json +1 -0
- package/sessions-cli/default/pre-key-100.json +1 -0
- package/sessions-cli/default/pre-key-101.json +1 -0
- package/sessions-cli/default/pre-key-102.json +1 -0
- package/sessions-cli/default/pre-key-103.json +1 -0
- package/sessions-cli/default/pre-key-104.json +1 -0
- package/sessions-cli/default/pre-key-105.json +1 -0
- package/sessions-cli/default/pre-key-106.json +1 -0
- package/sessions-cli/default/pre-key-107.json +1 -0
- package/sessions-cli/default/pre-key-108.json +1 -0
- package/sessions-cli/default/pre-key-109.json +1 -0
- package/sessions-cli/default/pre-key-11.json +1 -0
- package/sessions-cli/default/pre-key-110.json +1 -0
- package/sessions-cli/default/pre-key-111.json +1 -0
- package/sessions-cli/default/pre-key-112.json +1 -0
- package/sessions-cli/default/pre-key-113.json +1 -0
- package/sessions-cli/default/pre-key-114.json +1 -0
- package/sessions-cli/default/pre-key-115.json +1 -0
- package/sessions-cli/default/pre-key-116.json +1 -0
- package/sessions-cli/default/pre-key-117.json +1 -0
- package/sessions-cli/default/pre-key-118.json +1 -0
- package/sessions-cli/default/pre-key-119.json +1 -0
- package/sessions-cli/default/pre-key-12.json +1 -0
- package/sessions-cli/default/pre-key-120.json +1 -0
- package/sessions-cli/default/pre-key-121.json +1 -0
- package/sessions-cli/default/pre-key-122.json +1 -0
- package/sessions-cli/default/pre-key-123.json +1 -0
- package/sessions-cli/default/pre-key-124.json +1 -0
- package/sessions-cli/default/pre-key-125.json +1 -0
- package/sessions-cli/default/pre-key-126.json +1 -0
- package/sessions-cli/default/pre-key-127.json +1 -0
- package/sessions-cli/default/pre-key-128.json +1 -0
- package/sessions-cli/default/pre-key-129.json +1 -0
- package/sessions-cli/default/pre-key-13.json +1 -0
- package/sessions-cli/default/pre-key-130.json +1 -0
- package/sessions-cli/default/pre-key-131.json +1 -0
- package/sessions-cli/default/pre-key-132.json +1 -0
- package/sessions-cli/default/pre-key-133.json +1 -0
- package/sessions-cli/default/pre-key-134.json +1 -0
- package/sessions-cli/default/pre-key-135.json +1 -0
- package/sessions-cli/default/pre-key-136.json +1 -0
- package/sessions-cli/default/pre-key-137.json +1 -0
- package/sessions-cli/default/pre-key-138.json +1 -0
- package/sessions-cli/default/pre-key-139.json +1 -0
- package/sessions-cli/default/pre-key-14.json +1 -0
- package/sessions-cli/default/pre-key-140.json +1 -0
- package/sessions-cli/default/pre-key-141.json +1 -0
- package/sessions-cli/default/pre-key-142.json +1 -0
- package/sessions-cli/default/pre-key-143.json +1 -0
- package/sessions-cli/default/pre-key-144.json +1 -0
- package/sessions-cli/default/pre-key-145.json +1 -0
- package/sessions-cli/default/pre-key-146.json +1 -0
- package/sessions-cli/default/pre-key-147.json +1 -0
- package/sessions-cli/default/pre-key-148.json +1 -0
- package/sessions-cli/default/pre-key-149.json +1 -0
- package/sessions-cli/default/pre-key-15.json +1 -0
- package/sessions-cli/default/pre-key-150.json +1 -0
- package/sessions-cli/default/pre-key-151.json +1 -0
- package/sessions-cli/default/pre-key-152.json +1 -0
- package/sessions-cli/default/pre-key-153.json +1 -0
- package/sessions-cli/default/pre-key-154.json +1 -0
- package/sessions-cli/default/pre-key-155.json +1 -0
- package/sessions-cli/default/pre-key-156.json +1 -0
- package/sessions-cli/default/pre-key-157.json +1 -0
- package/sessions-cli/default/pre-key-158.json +1 -0
- package/sessions-cli/default/pre-key-159.json +1 -0
- package/sessions-cli/default/pre-key-16.json +1 -0
- package/sessions-cli/default/pre-key-160.json +1 -0
- package/sessions-cli/default/pre-key-161.json +1 -0
- package/sessions-cli/default/pre-key-162.json +1 -0
- package/sessions-cli/default/pre-key-163.json +1 -0
- package/sessions-cli/default/pre-key-164.json +1 -0
- package/sessions-cli/default/pre-key-165.json +1 -0
- package/sessions-cli/default/pre-key-166.json +1 -0
- package/sessions-cli/default/pre-key-167.json +1 -0
- package/sessions-cli/default/pre-key-168.json +1 -0
- package/sessions-cli/default/pre-key-169.json +1 -0
- package/sessions-cli/default/pre-key-17.json +1 -0
- package/sessions-cli/default/pre-key-170.json +1 -0
- package/sessions-cli/default/pre-key-171.json +1 -0
- package/sessions-cli/default/pre-key-172.json +1 -0
- package/sessions-cli/default/pre-key-173.json +1 -0
- package/sessions-cli/default/pre-key-174.json +1 -0
- package/sessions-cli/default/pre-key-175.json +1 -0
- package/sessions-cli/default/pre-key-176.json +1 -0
- package/sessions-cli/default/pre-key-177.json +1 -0
- package/sessions-cli/default/pre-key-178.json +1 -0
- package/sessions-cli/default/pre-key-179.json +1 -0
- package/sessions-cli/default/pre-key-18.json +1 -0
- package/sessions-cli/default/pre-key-180.json +1 -0
- package/sessions-cli/default/pre-key-181.json +1 -0
- package/sessions-cli/default/pre-key-182.json +1 -0
- package/sessions-cli/default/pre-key-183.json +1 -0
- package/sessions-cli/default/pre-key-184.json +1 -0
- package/sessions-cli/default/pre-key-185.json +1 -0
- package/sessions-cli/default/pre-key-186.json +1 -0
- package/sessions-cli/default/pre-key-187.json +1 -0
- package/sessions-cli/default/pre-key-188.json +1 -0
- package/sessions-cli/default/pre-key-189.json +1 -0
- package/sessions-cli/default/pre-key-19.json +1 -0
- package/sessions-cli/default/pre-key-190.json +1 -0
- package/sessions-cli/default/pre-key-191.json +1 -0
- package/sessions-cli/default/pre-key-192.json +1 -0
- package/sessions-cli/default/pre-key-193.json +1 -0
- package/sessions-cli/default/pre-key-194.json +1 -0
- package/sessions-cli/default/pre-key-195.json +1 -0
- package/sessions-cli/default/pre-key-196.json +1 -0
- package/sessions-cli/default/pre-key-197.json +1 -0
- package/sessions-cli/default/pre-key-198.json +1 -0
- package/sessions-cli/default/pre-key-199.json +1 -0
- package/sessions-cli/default/pre-key-2.json +1 -0
- package/sessions-cli/default/pre-key-20.json +1 -0
- package/sessions-cli/default/pre-key-200.json +1 -0
- package/sessions-cli/default/pre-key-201.json +1 -0
- package/sessions-cli/default/pre-key-202.json +1 -0
- package/sessions-cli/default/pre-key-203.json +1 -0
- package/sessions-cli/default/pre-key-204.json +1 -0
- package/sessions-cli/default/pre-key-205.json +1 -0
- package/sessions-cli/default/pre-key-206.json +1 -0
- package/sessions-cli/default/pre-key-207.json +1 -0
- package/sessions-cli/default/pre-key-208.json +1 -0
- package/sessions-cli/default/pre-key-209.json +1 -0
- package/sessions-cli/default/pre-key-21.json +1 -0
- package/sessions-cli/default/pre-key-210.json +1 -0
- package/sessions-cli/default/pre-key-211.json +1 -0
- package/sessions-cli/default/pre-key-212.json +1 -0
- package/sessions-cli/default/pre-key-213.json +1 -0
- package/sessions-cli/default/pre-key-214.json +1 -0
- package/sessions-cli/default/pre-key-215.json +1 -0
- package/sessions-cli/default/pre-key-216.json +1 -0
- package/sessions-cli/default/pre-key-217.json +1 -0
- package/sessions-cli/default/pre-key-218.json +1 -0
- package/sessions-cli/default/pre-key-219.json +1 -0
- package/sessions-cli/default/pre-key-22.json +1 -0
- package/sessions-cli/default/pre-key-220.json +1 -0
- package/sessions-cli/default/pre-key-221.json +1 -0
- package/sessions-cli/default/pre-key-222.json +1 -0
- package/sessions-cli/default/pre-key-223.json +1 -0
- package/sessions-cli/default/pre-key-224.json +1 -0
- package/sessions-cli/default/pre-key-225.json +1 -0
- package/sessions-cli/default/pre-key-226.json +1 -0
- package/sessions-cli/default/pre-key-227.json +1 -0
- package/sessions-cli/default/pre-key-228.json +1 -0
- package/sessions-cli/default/pre-key-229.json +1 -0
- package/sessions-cli/default/pre-key-23.json +1 -0
- package/sessions-cli/default/pre-key-230.json +1 -0
- package/sessions-cli/default/pre-key-231.json +1 -0
- package/sessions-cli/default/pre-key-232.json +1 -0
- package/sessions-cli/default/pre-key-233.json +1 -0
- package/sessions-cli/default/pre-key-234.json +1 -0
- package/sessions-cli/default/pre-key-235.json +1 -0
- package/sessions-cli/default/pre-key-236.json +1 -0
- package/sessions-cli/default/pre-key-237.json +1 -0
- package/sessions-cli/default/pre-key-238.json +1 -0
- package/sessions-cli/default/pre-key-239.json +1 -0
- package/sessions-cli/default/pre-key-24.json +1 -0
- package/sessions-cli/default/pre-key-240.json +1 -0
- package/sessions-cli/default/pre-key-241.json +1 -0
- package/sessions-cli/default/pre-key-242.json +1 -0
- package/sessions-cli/default/pre-key-243.json +1 -0
- package/sessions-cli/default/pre-key-244.json +1 -0
- package/sessions-cli/default/pre-key-245.json +1 -0
- package/sessions-cli/default/pre-key-246.json +1 -0
- package/sessions-cli/default/pre-key-247.json +1 -0
- package/sessions-cli/default/pre-key-248.json +1 -0
- package/sessions-cli/default/pre-key-249.json +1 -0
- package/sessions-cli/default/pre-key-25.json +1 -0
- package/sessions-cli/default/pre-key-250.json +1 -0
- package/sessions-cli/default/pre-key-251.json +1 -0
- package/sessions-cli/default/pre-key-252.json +1 -0
- package/sessions-cli/default/pre-key-253.json +1 -0
- package/sessions-cli/default/pre-key-254.json +1 -0
- package/sessions-cli/default/pre-key-255.json +1 -0
- package/sessions-cli/default/pre-key-256.json +1 -0
- package/sessions-cli/default/pre-key-257.json +1 -0
- package/sessions-cli/default/pre-key-258.json +1 -0
- package/sessions-cli/default/pre-key-259.json +1 -0
- package/sessions-cli/default/pre-key-26.json +1 -0
- package/sessions-cli/default/pre-key-260.json +1 -0
- package/sessions-cli/default/pre-key-261.json +1 -0
- package/sessions-cli/default/pre-key-262.json +1 -0
- package/sessions-cli/default/pre-key-263.json +1 -0
- package/sessions-cli/default/pre-key-264.json +1 -0
- package/sessions-cli/default/pre-key-265.json +1 -0
- package/sessions-cli/default/pre-key-266.json +1 -0
- package/sessions-cli/default/pre-key-267.json +1 -0
- package/sessions-cli/default/pre-key-268.json +1 -0
- package/sessions-cli/default/pre-key-269.json +1 -0
- package/sessions-cli/default/pre-key-27.json +1 -0
- package/sessions-cli/default/pre-key-270.json +1 -0
- package/sessions-cli/default/pre-key-271.json +1 -0
- package/sessions-cli/default/pre-key-272.json +1 -0
- package/sessions-cli/default/pre-key-273.json +1 -0
- package/sessions-cli/default/pre-key-274.json +1 -0
- package/sessions-cli/default/pre-key-275.json +1 -0
- package/sessions-cli/default/pre-key-276.json +1 -0
- package/sessions-cli/default/pre-key-277.json +1 -0
- package/sessions-cli/default/pre-key-278.json +1 -0
- package/sessions-cli/default/pre-key-279.json +1 -0
- package/sessions-cli/default/pre-key-28.json +1 -0
- package/sessions-cli/default/pre-key-280.json +1 -0
- package/sessions-cli/default/pre-key-281.json +1 -0
- package/sessions-cli/default/pre-key-282.json +1 -0
- package/sessions-cli/default/pre-key-283.json +1 -0
- package/sessions-cli/default/pre-key-284.json +1 -0
- package/sessions-cli/default/pre-key-285.json +1 -0
- package/sessions-cli/default/pre-key-286.json +1 -0
- package/sessions-cli/default/pre-key-287.json +1 -0
- package/sessions-cli/default/pre-key-288.json +1 -0
- package/sessions-cli/default/pre-key-289.json +1 -0
- package/sessions-cli/default/pre-key-29.json +1 -0
- package/sessions-cli/default/pre-key-290.json +1 -0
- package/sessions-cli/default/pre-key-291.json +1 -0
- package/sessions-cli/default/pre-key-292.json +1 -0
- package/sessions-cli/default/pre-key-293.json +1 -0
- package/sessions-cli/default/pre-key-294.json +1 -0
- package/sessions-cli/default/pre-key-295.json +1 -0
- package/sessions-cli/default/pre-key-296.json +1 -0
- package/sessions-cli/default/pre-key-297.json +1 -0
- package/sessions-cli/default/pre-key-298.json +1 -0
- package/sessions-cli/default/pre-key-299.json +1 -0
- package/sessions-cli/default/pre-key-3.json +1 -0
- package/sessions-cli/default/pre-key-30.json +1 -0
- package/sessions-cli/default/pre-key-300.json +1 -0
- package/sessions-cli/default/pre-key-301.json +1 -0
- package/sessions-cli/default/pre-key-302.json +1 -0
- package/sessions-cli/default/pre-key-303.json +1 -0
- package/sessions-cli/default/pre-key-304.json +1 -0
- package/sessions-cli/default/pre-key-305.json +1 -0
- package/sessions-cli/default/pre-key-306.json +1 -0
- package/sessions-cli/default/pre-key-307.json +1 -0
- package/sessions-cli/default/pre-key-308.json +1 -0
- package/sessions-cli/default/pre-key-309.json +1 -0
- package/sessions-cli/default/pre-key-31.json +1 -0
- package/sessions-cli/default/pre-key-310.json +1 -0
- package/sessions-cli/default/pre-key-311.json +1 -0
- package/sessions-cli/default/pre-key-312.json +1 -0
- package/sessions-cli/default/pre-key-313.json +1 -0
- package/sessions-cli/default/pre-key-314.json +1 -0
- package/sessions-cli/default/pre-key-315.json +1 -0
- package/sessions-cli/default/pre-key-316.json +1 -0
- package/sessions-cli/default/pre-key-317.json +1 -0
- package/sessions-cli/default/pre-key-318.json +1 -0
- package/sessions-cli/default/pre-key-319.json +1 -0
- package/sessions-cli/default/pre-key-32.json +1 -0
- package/sessions-cli/default/pre-key-320.json +1 -0
- package/sessions-cli/default/pre-key-321.json +1 -0
- package/sessions-cli/default/pre-key-322.json +1 -0
- package/sessions-cli/default/pre-key-323.json +1 -0
- package/sessions-cli/default/pre-key-324.json +1 -0
- package/sessions-cli/default/pre-key-325.json +1 -0
- package/sessions-cli/default/pre-key-326.json +1 -0
- package/sessions-cli/default/pre-key-327.json +1 -0
- package/sessions-cli/default/pre-key-328.json +1 -0
- package/sessions-cli/default/pre-key-329.json +1 -0
- package/sessions-cli/default/pre-key-33.json +1 -0
- package/sessions-cli/default/pre-key-330.json +1 -0
- package/sessions-cli/default/pre-key-331.json +1 -0
- package/sessions-cli/default/pre-key-332.json +1 -0
- package/sessions-cli/default/pre-key-333.json +1 -0
- package/sessions-cli/default/pre-key-334.json +1 -0
- package/sessions-cli/default/pre-key-335.json +1 -0
- package/sessions-cli/default/pre-key-336.json +1 -0
- package/sessions-cli/default/pre-key-337.json +1 -0
- package/sessions-cli/default/pre-key-338.json +1 -0
- package/sessions-cli/default/pre-key-339.json +1 -0
- package/sessions-cli/default/pre-key-34.json +1 -0
- package/sessions-cli/default/pre-key-340.json +1 -0
- package/sessions-cli/default/pre-key-341.json +1 -0
- package/sessions-cli/default/pre-key-342.json +1 -0
- package/sessions-cli/default/pre-key-343.json +1 -0
- package/sessions-cli/default/pre-key-344.json +1 -0
- package/sessions-cli/default/pre-key-345.json +1 -0
- package/sessions-cli/default/pre-key-346.json +1 -0
- package/sessions-cli/default/pre-key-347.json +1 -0
- package/sessions-cli/default/pre-key-348.json +1 -0
- package/sessions-cli/default/pre-key-349.json +1 -0
- package/sessions-cli/default/pre-key-35.json +1 -0
- package/sessions-cli/default/pre-key-350.json +1 -0
- package/sessions-cli/default/pre-key-351.json +1 -0
- package/sessions-cli/default/pre-key-352.json +1 -0
- package/sessions-cli/default/pre-key-353.json +1 -0
- package/sessions-cli/default/pre-key-354.json +1 -0
- package/sessions-cli/default/pre-key-355.json +1 -0
- package/sessions-cli/default/pre-key-356.json +1 -0
- package/sessions-cli/default/pre-key-357.json +1 -0
- package/sessions-cli/default/pre-key-358.json +1 -0
- package/sessions-cli/default/pre-key-359.json +1 -0
- package/sessions-cli/default/pre-key-36.json +1 -0
- package/sessions-cli/default/pre-key-360.json +1 -0
- package/sessions-cli/default/pre-key-361.json +1 -0
- package/sessions-cli/default/pre-key-362.json +1 -0
- package/sessions-cli/default/pre-key-363.json +1 -0
- package/sessions-cli/default/pre-key-364.json +1 -0
- package/sessions-cli/default/pre-key-365.json +1 -0
- package/sessions-cli/default/pre-key-366.json +1 -0
- package/sessions-cli/default/pre-key-367.json +1 -0
- package/sessions-cli/default/pre-key-368.json +1 -0
- package/sessions-cli/default/pre-key-369.json +1 -0
- package/sessions-cli/default/pre-key-37.json +1 -0
- package/sessions-cli/default/pre-key-370.json +1 -0
- package/sessions-cli/default/pre-key-371.json +1 -0
- package/sessions-cli/default/pre-key-372.json +1 -0
- package/sessions-cli/default/pre-key-373.json +1 -0
- package/sessions-cli/default/pre-key-374.json +1 -0
- package/sessions-cli/default/pre-key-375.json +1 -0
- package/sessions-cli/default/pre-key-376.json +1 -0
- package/sessions-cli/default/pre-key-377.json +1 -0
- package/sessions-cli/default/pre-key-378.json +1 -0
- package/sessions-cli/default/pre-key-379.json +1 -0
- package/sessions-cli/default/pre-key-38.json +1 -0
- package/sessions-cli/default/pre-key-380.json +1 -0
- package/sessions-cli/default/pre-key-381.json +1 -0
- package/sessions-cli/default/pre-key-382.json +1 -0
- package/sessions-cli/default/pre-key-383.json +1 -0
- package/sessions-cli/default/pre-key-384.json +1 -0
- package/sessions-cli/default/pre-key-385.json +1 -0
- package/sessions-cli/default/pre-key-386.json +1 -0
- package/sessions-cli/default/pre-key-387.json +1 -0
- package/sessions-cli/default/pre-key-388.json +1 -0
- package/sessions-cli/default/pre-key-389.json +1 -0
- package/sessions-cli/default/pre-key-39.json +1 -0
- package/sessions-cli/default/pre-key-390.json +1 -0
- package/sessions-cli/default/pre-key-391.json +1 -0
- package/sessions-cli/default/pre-key-392.json +1 -0
- package/sessions-cli/default/pre-key-393.json +1 -0
- package/sessions-cli/default/pre-key-394.json +1 -0
- package/sessions-cli/default/pre-key-395.json +1 -0
- package/sessions-cli/default/pre-key-396.json +1 -0
- package/sessions-cli/default/pre-key-397.json +1 -0
- package/sessions-cli/default/pre-key-398.json +1 -0
- package/sessions-cli/default/pre-key-399.json +1 -0
- package/sessions-cli/default/pre-key-4.json +1 -0
- package/sessions-cli/default/pre-key-40.json +1 -0
- package/sessions-cli/default/pre-key-400.json +1 -0
- package/sessions-cli/default/pre-key-401.json +1 -0
- package/sessions-cli/default/pre-key-402.json +1 -0
- package/sessions-cli/default/pre-key-403.json +1 -0
- package/sessions-cli/default/pre-key-404.json +1 -0
- package/sessions-cli/default/pre-key-405.json +1 -0
- package/sessions-cli/default/pre-key-406.json +1 -0
- package/sessions-cli/default/pre-key-407.json +1 -0
- package/sessions-cli/default/pre-key-408.json +1 -0
- package/sessions-cli/default/pre-key-409.json +1 -0
- package/sessions-cli/default/pre-key-41.json +1 -0
- package/sessions-cli/default/pre-key-410.json +1 -0
- package/sessions-cli/default/pre-key-411.json +1 -0
- package/sessions-cli/default/pre-key-412.json +1 -0
- package/sessions-cli/default/pre-key-413.json +1 -0
- package/sessions-cli/default/pre-key-414.json +1 -0
- package/sessions-cli/default/pre-key-415.json +1 -0
- package/sessions-cli/default/pre-key-416.json +1 -0
- package/sessions-cli/default/pre-key-417.json +1 -0
- package/sessions-cli/default/pre-key-418.json +1 -0
- package/sessions-cli/default/pre-key-419.json +1 -0
- package/sessions-cli/default/pre-key-42.json +1 -0
- package/sessions-cli/default/pre-key-420.json +1 -0
- package/sessions-cli/default/pre-key-421.json +1 -0
- package/sessions-cli/default/pre-key-422.json +1 -0
- package/sessions-cli/default/pre-key-423.json +1 -0
- package/sessions-cli/default/pre-key-424.json +1 -0
- package/sessions-cli/default/pre-key-425.json +1 -0
- package/sessions-cli/default/pre-key-426.json +1 -0
- package/sessions-cli/default/pre-key-427.json +1 -0
- package/sessions-cli/default/pre-key-428.json +1 -0
- package/sessions-cli/default/pre-key-429.json +1 -0
- package/sessions-cli/default/pre-key-43.json +1 -0
- package/sessions-cli/default/pre-key-430.json +1 -0
- package/sessions-cli/default/pre-key-431.json +1 -0
- package/sessions-cli/default/pre-key-432.json +1 -0
- package/sessions-cli/default/pre-key-433.json +1 -0
- package/sessions-cli/default/pre-key-434.json +1 -0
- package/sessions-cli/default/pre-key-435.json +1 -0
- package/sessions-cli/default/pre-key-436.json +1 -0
- package/sessions-cli/default/pre-key-437.json +1 -0
- package/sessions-cli/default/pre-key-438.json +1 -0
- package/sessions-cli/default/pre-key-439.json +1 -0
- package/sessions-cli/default/pre-key-44.json +1 -0
- package/sessions-cli/default/pre-key-440.json +1 -0
- package/sessions-cli/default/pre-key-441.json +1 -0
- package/sessions-cli/default/pre-key-442.json +1 -0
- package/sessions-cli/default/pre-key-443.json +1 -0
- package/sessions-cli/default/pre-key-444.json +1 -0
- package/sessions-cli/default/pre-key-445.json +1 -0
- package/sessions-cli/default/pre-key-446.json +1 -0
- package/sessions-cli/default/pre-key-447.json +1 -0
- package/sessions-cli/default/pre-key-448.json +1 -0
- package/sessions-cli/default/pre-key-449.json +1 -0
- package/sessions-cli/default/pre-key-45.json +1 -0
- package/sessions-cli/default/pre-key-450.json +1 -0
- package/sessions-cli/default/pre-key-451.json +1 -0
- package/sessions-cli/default/pre-key-452.json +1 -0
- package/sessions-cli/default/pre-key-453.json +1 -0
- package/sessions-cli/default/pre-key-454.json +1 -0
- package/sessions-cli/default/pre-key-455.json +1 -0
- package/sessions-cli/default/pre-key-456.json +1 -0
- package/sessions-cli/default/pre-key-457.json +1 -0
- package/sessions-cli/default/pre-key-458.json +1 -0
- package/sessions-cli/default/pre-key-459.json +1 -0
- package/sessions-cli/default/pre-key-46.json +1 -0
- package/sessions-cli/default/pre-key-460.json +1 -0
- package/sessions-cli/default/pre-key-461.json +1 -0
- package/sessions-cli/default/pre-key-462.json +1 -0
- package/sessions-cli/default/pre-key-463.json +1 -0
- package/sessions-cli/default/pre-key-464.json +1 -0
- package/sessions-cli/default/pre-key-465.json +1 -0
- package/sessions-cli/default/pre-key-466.json +1 -0
- package/sessions-cli/default/pre-key-467.json +1 -0
- package/sessions-cli/default/pre-key-468.json +1 -0
- package/sessions-cli/default/pre-key-469.json +1 -0
- package/sessions-cli/default/pre-key-47.json +1 -0
- package/sessions-cli/default/pre-key-470.json +1 -0
- package/sessions-cli/default/pre-key-471.json +1 -0
- package/sessions-cli/default/pre-key-472.json +1 -0
- package/sessions-cli/default/pre-key-473.json +1 -0
- package/sessions-cli/default/pre-key-474.json +1 -0
- package/sessions-cli/default/pre-key-475.json +1 -0
- package/sessions-cli/default/pre-key-476.json +1 -0
- package/sessions-cli/default/pre-key-477.json +1 -0
- package/sessions-cli/default/pre-key-478.json +1 -0
- package/sessions-cli/default/pre-key-479.json +1 -0
- package/sessions-cli/default/pre-key-48.json +1 -0
- package/sessions-cli/default/pre-key-480.json +1 -0
- package/sessions-cli/default/pre-key-481.json +1 -0
- package/sessions-cli/default/pre-key-482.json +1 -0
- package/sessions-cli/default/pre-key-483.json +1 -0
- package/sessions-cli/default/pre-key-484.json +1 -0
- package/sessions-cli/default/pre-key-485.json +1 -0
- package/sessions-cli/default/pre-key-486.json +1 -0
- package/sessions-cli/default/pre-key-487.json +1 -0
- package/sessions-cli/default/pre-key-488.json +1 -0
- package/sessions-cli/default/pre-key-489.json +1 -0
- package/sessions-cli/default/pre-key-49.json +1 -0
- package/sessions-cli/default/pre-key-490.json +1 -0
- package/sessions-cli/default/pre-key-491.json +1 -0
- package/sessions-cli/default/pre-key-492.json +1 -0
- package/sessions-cli/default/pre-key-493.json +1 -0
- package/sessions-cli/default/pre-key-494.json +1 -0
- package/sessions-cli/default/pre-key-495.json +1 -0
- package/sessions-cli/default/pre-key-496.json +1 -0
- package/sessions-cli/default/pre-key-497.json +1 -0
- package/sessions-cli/default/pre-key-498.json +1 -0
- package/sessions-cli/default/pre-key-499.json +1 -0
- package/sessions-cli/default/pre-key-5.json +1 -0
- package/sessions-cli/default/pre-key-50.json +1 -0
- package/sessions-cli/default/pre-key-500.json +1 -0
- package/sessions-cli/default/pre-key-501.json +1 -0
- package/sessions-cli/default/pre-key-502.json +1 -0
- package/sessions-cli/default/pre-key-503.json +1 -0
- package/sessions-cli/default/pre-key-504.json +1 -0
- package/sessions-cli/default/pre-key-505.json +1 -0
- package/sessions-cli/default/pre-key-506.json +1 -0
- package/sessions-cli/default/pre-key-507.json +1 -0
- package/sessions-cli/default/pre-key-508.json +1 -0
- package/sessions-cli/default/pre-key-509.json +1 -0
- package/sessions-cli/default/pre-key-51.json +1 -0
- package/sessions-cli/default/pre-key-510.json +1 -0
- package/sessions-cli/default/pre-key-511.json +1 -0
- package/sessions-cli/default/pre-key-512.json +1 -0
- package/sessions-cli/default/pre-key-513.json +1 -0
- package/sessions-cli/default/pre-key-514.json +1 -0
- package/sessions-cli/default/pre-key-515.json +1 -0
- package/sessions-cli/default/pre-key-516.json +1 -0
- package/sessions-cli/default/pre-key-517.json +1 -0
- package/sessions-cli/default/pre-key-518.json +1 -0
- package/sessions-cli/default/pre-key-519.json +1 -0
- package/sessions-cli/default/pre-key-52.json +1 -0
- package/sessions-cli/default/pre-key-520.json +1 -0
- package/sessions-cli/default/pre-key-521.json +1 -0
- package/sessions-cli/default/pre-key-522.json +1 -0
- package/sessions-cli/default/pre-key-523.json +1 -0
- package/sessions-cli/default/pre-key-524.json +1 -0
- package/sessions-cli/default/pre-key-525.json +1 -0
- package/sessions-cli/default/pre-key-526.json +1 -0
- package/sessions-cli/default/pre-key-527.json +1 -0
- package/sessions-cli/default/pre-key-528.json +1 -0
- package/sessions-cli/default/pre-key-529.json +1 -0
- package/sessions-cli/default/pre-key-53.json +1 -0
- package/sessions-cli/default/pre-key-530.json +1 -0
- package/sessions-cli/default/pre-key-531.json +1 -0
- package/sessions-cli/default/pre-key-532.json +1 -0
- package/sessions-cli/default/pre-key-533.json +1 -0
- package/sessions-cli/default/pre-key-534.json +1 -0
- package/sessions-cli/default/pre-key-535.json +1 -0
- package/sessions-cli/default/pre-key-536.json +1 -0
- package/sessions-cli/default/pre-key-537.json +1 -0
- package/sessions-cli/default/pre-key-538.json +1 -0
- package/sessions-cli/default/pre-key-539.json +1 -0
- package/sessions-cli/default/pre-key-54.json +1 -0
- package/sessions-cli/default/pre-key-540.json +1 -0
- package/sessions-cli/default/pre-key-541.json +1 -0
- package/sessions-cli/default/pre-key-542.json +1 -0
- package/sessions-cli/default/pre-key-543.json +1 -0
- package/sessions-cli/default/pre-key-544.json +1 -0
- package/sessions-cli/default/pre-key-545.json +1 -0
- package/sessions-cli/default/pre-key-546.json +1 -0
- package/sessions-cli/default/pre-key-547.json +1 -0
- package/sessions-cli/default/pre-key-548.json +1 -0
- package/sessions-cli/default/pre-key-549.json +1 -0
- package/sessions-cli/default/pre-key-55.json +1 -0
- package/sessions-cli/default/pre-key-550.json +1 -0
- package/sessions-cli/default/pre-key-551.json +1 -0
- package/sessions-cli/default/pre-key-552.json +1 -0
- package/sessions-cli/default/pre-key-553.json +1 -0
- package/sessions-cli/default/pre-key-554.json +1 -0
- package/sessions-cli/default/pre-key-555.json +1 -0
- package/sessions-cli/default/pre-key-556.json +1 -0
- package/sessions-cli/default/pre-key-557.json +1 -0
- package/sessions-cli/default/pre-key-558.json +1 -0
- package/sessions-cli/default/pre-key-559.json +1 -0
- package/sessions-cli/default/pre-key-56.json +1 -0
- package/sessions-cli/default/pre-key-560.json +1 -0
- package/sessions-cli/default/pre-key-561.json +1 -0
- package/sessions-cli/default/pre-key-562.json +1 -0
- package/sessions-cli/default/pre-key-563.json +1 -0
- package/sessions-cli/default/pre-key-564.json +1 -0
- package/sessions-cli/default/pre-key-565.json +1 -0
- package/sessions-cli/default/pre-key-566.json +1 -0
- package/sessions-cli/default/pre-key-567.json +1 -0
- package/sessions-cli/default/pre-key-568.json +1 -0
- package/sessions-cli/default/pre-key-569.json +1 -0
- package/sessions-cli/default/pre-key-57.json +1 -0
- package/sessions-cli/default/pre-key-570.json +1 -0
- package/sessions-cli/default/pre-key-571.json +1 -0
- package/sessions-cli/default/pre-key-572.json +1 -0
- package/sessions-cli/default/pre-key-573.json +1 -0
- package/sessions-cli/default/pre-key-574.json +1 -0
- package/sessions-cli/default/pre-key-575.json +1 -0
- package/sessions-cli/default/pre-key-576.json +1 -0
- package/sessions-cli/default/pre-key-577.json +1 -0
- package/sessions-cli/default/pre-key-578.json +1 -0
- package/sessions-cli/default/pre-key-579.json +1 -0
- package/sessions-cli/default/pre-key-58.json +1 -0
- package/sessions-cli/default/pre-key-580.json +1 -0
- package/sessions-cli/default/pre-key-581.json +1 -0
- package/sessions-cli/default/pre-key-582.json +1 -0
- package/sessions-cli/default/pre-key-583.json +1 -0
- package/sessions-cli/default/pre-key-584.json +1 -0
- package/sessions-cli/default/pre-key-585.json +1 -0
- package/sessions-cli/default/pre-key-586.json +1 -0
- package/sessions-cli/default/pre-key-587.json +1 -0
- package/sessions-cli/default/pre-key-588.json +1 -0
- package/sessions-cli/default/pre-key-589.json +1 -0
- package/sessions-cli/default/pre-key-59.json +1 -0
- package/sessions-cli/default/pre-key-590.json +1 -0
- package/sessions-cli/default/pre-key-591.json +1 -0
- package/sessions-cli/default/pre-key-592.json +1 -0
- package/sessions-cli/default/pre-key-593.json +1 -0
- package/sessions-cli/default/pre-key-594.json +1 -0
- package/sessions-cli/default/pre-key-595.json +1 -0
- package/sessions-cli/default/pre-key-596.json +1 -0
- package/sessions-cli/default/pre-key-597.json +1 -0
- package/sessions-cli/default/pre-key-598.json +1 -0
- package/sessions-cli/default/pre-key-599.json +1 -0
- package/sessions-cli/default/pre-key-6.json +1 -0
- package/sessions-cli/default/pre-key-60.json +1 -0
- package/sessions-cli/default/pre-key-600.json +1 -0
- package/sessions-cli/default/pre-key-601.json +1 -0
- package/sessions-cli/default/pre-key-602.json +1 -0
- package/sessions-cli/default/pre-key-603.json +1 -0
- package/sessions-cli/default/pre-key-604.json +1 -0
- package/sessions-cli/default/pre-key-605.json +1 -0
- package/sessions-cli/default/pre-key-606.json +1 -0
- package/sessions-cli/default/pre-key-607.json +1 -0
- package/sessions-cli/default/pre-key-608.json +1 -0
- package/sessions-cli/default/pre-key-609.json +1 -0
- package/sessions-cli/default/pre-key-61.json +1 -0
- package/sessions-cli/default/pre-key-610.json +1 -0
- package/sessions-cli/default/pre-key-611.json +1 -0
- package/sessions-cli/default/pre-key-612.json +1 -0
- package/sessions-cli/default/pre-key-613.json +1 -0
- package/sessions-cli/default/pre-key-614.json +1 -0
- package/sessions-cli/default/pre-key-615.json +1 -0
- package/sessions-cli/default/pre-key-616.json +1 -0
- package/sessions-cli/default/pre-key-617.json +1 -0
- package/sessions-cli/default/pre-key-618.json +1 -0
- package/sessions-cli/default/pre-key-619.json +1 -0
- package/sessions-cli/default/pre-key-62.json +1 -0
- package/sessions-cli/default/pre-key-620.json +1 -0
- package/sessions-cli/default/pre-key-621.json +1 -0
- package/sessions-cli/default/pre-key-622.json +1 -0
- package/sessions-cli/default/pre-key-623.json +1 -0
- package/sessions-cli/default/pre-key-624.json +1 -0
- package/sessions-cli/default/pre-key-625.json +1 -0
- package/sessions-cli/default/pre-key-626.json +1 -0
- package/sessions-cli/default/pre-key-627.json +1 -0
- package/sessions-cli/default/pre-key-628.json +1 -0
- package/sessions-cli/default/pre-key-629.json +1 -0
- package/sessions-cli/default/pre-key-63.json +1 -0
- package/sessions-cli/default/pre-key-630.json +1 -0
- package/sessions-cli/default/pre-key-631.json +1 -0
- package/sessions-cli/default/pre-key-632.json +1 -0
- package/sessions-cli/default/pre-key-633.json +1 -0
- package/sessions-cli/default/pre-key-634.json +1 -0
- package/sessions-cli/default/pre-key-635.json +1 -0
- package/sessions-cli/default/pre-key-636.json +1 -0
- package/sessions-cli/default/pre-key-637.json +1 -0
- package/sessions-cli/default/pre-key-638.json +1 -0
- package/sessions-cli/default/pre-key-639.json +1 -0
- package/sessions-cli/default/pre-key-64.json +1 -0
- package/sessions-cli/default/pre-key-640.json +1 -0
- package/sessions-cli/default/pre-key-641.json +1 -0
- package/sessions-cli/default/pre-key-642.json +1 -0
- package/sessions-cli/default/pre-key-643.json +1 -0
- package/sessions-cli/default/pre-key-644.json +1 -0
- package/sessions-cli/default/pre-key-645.json +1 -0
- package/sessions-cli/default/pre-key-646.json +1 -0
- package/sessions-cli/default/pre-key-647.json +1 -0
- package/sessions-cli/default/pre-key-648.json +1 -0
- package/sessions-cli/default/pre-key-649.json +1 -0
- package/sessions-cli/default/pre-key-65.json +1 -0
- package/sessions-cli/default/pre-key-650.json +1 -0
- package/sessions-cli/default/pre-key-651.json +1 -0
- package/sessions-cli/default/pre-key-652.json +1 -0
- package/sessions-cli/default/pre-key-653.json +1 -0
- package/sessions-cli/default/pre-key-654.json +1 -0
- package/sessions-cli/default/pre-key-655.json +1 -0
- package/sessions-cli/default/pre-key-656.json +1 -0
- package/sessions-cli/default/pre-key-657.json +1 -0
- package/sessions-cli/default/pre-key-658.json +1 -0
- package/sessions-cli/default/pre-key-659.json +1 -0
- package/sessions-cli/default/pre-key-66.json +1 -0
- package/sessions-cli/default/pre-key-660.json +1 -0
- package/sessions-cli/default/pre-key-661.json +1 -0
- package/sessions-cli/default/pre-key-662.json +1 -0
- package/sessions-cli/default/pre-key-663.json +1 -0
- package/sessions-cli/default/pre-key-664.json +1 -0
- package/sessions-cli/default/pre-key-665.json +1 -0
- package/sessions-cli/default/pre-key-666.json +1 -0
- package/sessions-cli/default/pre-key-667.json +1 -0
- package/sessions-cli/default/pre-key-668.json +1 -0
- package/sessions-cli/default/pre-key-669.json +1 -0
- package/sessions-cli/default/pre-key-67.json +1 -0
- package/sessions-cli/default/pre-key-670.json +1 -0
- package/sessions-cli/default/pre-key-671.json +1 -0
- package/sessions-cli/default/pre-key-672.json +1 -0
- package/sessions-cli/default/pre-key-673.json +1 -0
- package/sessions-cli/default/pre-key-674.json +1 -0
- package/sessions-cli/default/pre-key-675.json +1 -0
- package/sessions-cli/default/pre-key-676.json +1 -0
- package/sessions-cli/default/pre-key-677.json +1 -0
- package/sessions-cli/default/pre-key-678.json +1 -0
- package/sessions-cli/default/pre-key-679.json +1 -0
- package/sessions-cli/default/pre-key-68.json +1 -0
- package/sessions-cli/default/pre-key-680.json +1 -0
- package/sessions-cli/default/pre-key-681.json +1 -0
- package/sessions-cli/default/pre-key-682.json +1 -0
- package/sessions-cli/default/pre-key-683.json +1 -0
- package/sessions-cli/default/pre-key-684.json +1 -0
- package/sessions-cli/default/pre-key-685.json +1 -0
- package/sessions-cli/default/pre-key-686.json +1 -0
- package/sessions-cli/default/pre-key-687.json +1 -0
- package/sessions-cli/default/pre-key-688.json +1 -0
- package/sessions-cli/default/pre-key-689.json +1 -0
- package/sessions-cli/default/pre-key-69.json +1 -0
- package/sessions-cli/default/pre-key-690.json +1 -0
- package/sessions-cli/default/pre-key-691.json +1 -0
- package/sessions-cli/default/pre-key-692.json +1 -0
- package/sessions-cli/default/pre-key-693.json +1 -0
- package/sessions-cli/default/pre-key-694.json +1 -0
- package/sessions-cli/default/pre-key-695.json +1 -0
- package/sessions-cli/default/pre-key-696.json +1 -0
- package/sessions-cli/default/pre-key-697.json +1 -0
- package/sessions-cli/default/pre-key-698.json +1 -0
- package/sessions-cli/default/pre-key-699.json +1 -0
- package/sessions-cli/default/pre-key-7.json +1 -0
- package/sessions-cli/default/pre-key-70.json +1 -0
- package/sessions-cli/default/pre-key-700.json +1 -0
- package/sessions-cli/default/pre-key-701.json +1 -0
- package/sessions-cli/default/pre-key-702.json +1 -0
- package/sessions-cli/default/pre-key-703.json +1 -0
- package/sessions-cli/default/pre-key-704.json +1 -0
- package/sessions-cli/default/pre-key-705.json +1 -0
- package/sessions-cli/default/pre-key-706.json +1 -0
- package/sessions-cli/default/pre-key-707.json +1 -0
- package/sessions-cli/default/pre-key-708.json +1 -0
- package/sessions-cli/default/pre-key-709.json +1 -0
- package/sessions-cli/default/pre-key-71.json +1 -0
- package/sessions-cli/default/pre-key-710.json +1 -0
- package/sessions-cli/default/pre-key-711.json +1 -0
- package/sessions-cli/default/pre-key-712.json +1 -0
- package/sessions-cli/default/pre-key-713.json +1 -0
- package/sessions-cli/default/pre-key-714.json +1 -0
- package/sessions-cli/default/pre-key-715.json +1 -0
- package/sessions-cli/default/pre-key-716.json +1 -0
- package/sessions-cli/default/pre-key-717.json +1 -0
- package/sessions-cli/default/pre-key-718.json +1 -0
- package/sessions-cli/default/pre-key-719.json +1 -0
- package/sessions-cli/default/pre-key-72.json +1 -0
- package/sessions-cli/default/pre-key-720.json +1 -0
- package/sessions-cli/default/pre-key-721.json +1 -0
- package/sessions-cli/default/pre-key-722.json +1 -0
- package/sessions-cli/default/pre-key-723.json +1 -0
- package/sessions-cli/default/pre-key-724.json +1 -0
- package/sessions-cli/default/pre-key-725.json +1 -0
- package/sessions-cli/default/pre-key-726.json +1 -0
- package/sessions-cli/default/pre-key-727.json +1 -0
- package/sessions-cli/default/pre-key-728.json +1 -0
- package/sessions-cli/default/pre-key-729.json +1 -0
- package/sessions-cli/default/pre-key-73.json +1 -0
- package/sessions-cli/default/pre-key-730.json +1 -0
- package/sessions-cli/default/pre-key-731.json +1 -0
- package/sessions-cli/default/pre-key-732.json +1 -0
- package/sessions-cli/default/pre-key-733.json +1 -0
- package/sessions-cli/default/pre-key-734.json +1 -0
- package/sessions-cli/default/pre-key-735.json +1 -0
- package/sessions-cli/default/pre-key-736.json +1 -0
- package/sessions-cli/default/pre-key-737.json +1 -0
- package/sessions-cli/default/pre-key-738.json +1 -0
- package/sessions-cli/default/pre-key-739.json +1 -0
- package/sessions-cli/default/pre-key-74.json +1 -0
- package/sessions-cli/default/pre-key-740.json +1 -0
- package/sessions-cli/default/pre-key-741.json +1 -0
- package/sessions-cli/default/pre-key-742.json +1 -0
- package/sessions-cli/default/pre-key-743.json +1 -0
- package/sessions-cli/default/pre-key-744.json +1 -0
- package/sessions-cli/default/pre-key-745.json +1 -0
- package/sessions-cli/default/pre-key-746.json +1 -0
- package/sessions-cli/default/pre-key-747.json +1 -0
- package/sessions-cli/default/pre-key-748.json +1 -0
- package/sessions-cli/default/pre-key-749.json +1 -0
- package/sessions-cli/default/pre-key-75.json +1 -0
- package/sessions-cli/default/pre-key-750.json +1 -0
- package/sessions-cli/default/pre-key-751.json +1 -0
- package/sessions-cli/default/pre-key-752.json +1 -0
- package/sessions-cli/default/pre-key-753.json +1 -0
- package/sessions-cli/default/pre-key-754.json +1 -0
- package/sessions-cli/default/pre-key-755.json +1 -0
- package/sessions-cli/default/pre-key-756.json +1 -0
- package/sessions-cli/default/pre-key-757.json +1 -0
- package/sessions-cli/default/pre-key-758.json +1 -0
- package/sessions-cli/default/pre-key-759.json +1 -0
- package/sessions-cli/default/pre-key-76.json +1 -0
- package/sessions-cli/default/pre-key-760.json +1 -0
- package/sessions-cli/default/pre-key-761.json +1 -0
- package/sessions-cli/default/pre-key-762.json +1 -0
- package/sessions-cli/default/pre-key-763.json +1 -0
- package/sessions-cli/default/pre-key-764.json +1 -0
- package/sessions-cli/default/pre-key-765.json +1 -0
- package/sessions-cli/default/pre-key-766.json +1 -0
- package/sessions-cli/default/pre-key-767.json +1 -0
- package/sessions-cli/default/pre-key-768.json +1 -0
- package/sessions-cli/default/pre-key-769.json +1 -0
- package/sessions-cli/default/pre-key-77.json +1 -0
- package/sessions-cli/default/pre-key-770.json +1 -0
- package/sessions-cli/default/pre-key-771.json +1 -0
- package/sessions-cli/default/pre-key-772.json +1 -0
- package/sessions-cli/default/pre-key-773.json +1 -0
- package/sessions-cli/default/pre-key-774.json +1 -0
- package/sessions-cli/default/pre-key-775.json +1 -0
- package/sessions-cli/default/pre-key-776.json +1 -0
- package/sessions-cli/default/pre-key-777.json +1 -0
- package/sessions-cli/default/pre-key-778.json +1 -0
- package/sessions-cli/default/pre-key-779.json +1 -0
- package/sessions-cli/default/pre-key-78.json +1 -0
- package/sessions-cli/default/pre-key-780.json +1 -0
- package/sessions-cli/default/pre-key-781.json +1 -0
- package/sessions-cli/default/pre-key-782.json +1 -0
- package/sessions-cli/default/pre-key-783.json +1 -0
- package/sessions-cli/default/pre-key-784.json +1 -0
- package/sessions-cli/default/pre-key-785.json +1 -0
- package/sessions-cli/default/pre-key-786.json +1 -0
- package/sessions-cli/default/pre-key-787.json +1 -0
- package/sessions-cli/default/pre-key-788.json +1 -0
- package/sessions-cli/default/pre-key-789.json +1 -0
- package/sessions-cli/default/pre-key-79.json +1 -0
- package/sessions-cli/default/pre-key-790.json +1 -0
- package/sessions-cli/default/pre-key-791.json +1 -0
- package/sessions-cli/default/pre-key-792.json +1 -0
- package/sessions-cli/default/pre-key-793.json +1 -0
- package/sessions-cli/default/pre-key-794.json +1 -0
- package/sessions-cli/default/pre-key-795.json +1 -0
- package/sessions-cli/default/pre-key-796.json +1 -0
- package/sessions-cli/default/pre-key-797.json +1 -0
- package/sessions-cli/default/pre-key-798.json +1 -0
- package/sessions-cli/default/pre-key-799.json +1 -0
- package/sessions-cli/default/pre-key-8.json +1 -0
- package/sessions-cli/default/pre-key-80.json +1 -0
- package/sessions-cli/default/pre-key-800.json +1 -0
- package/sessions-cli/default/pre-key-801.json +1 -0
- package/sessions-cli/default/pre-key-802.json +1 -0
- package/sessions-cli/default/pre-key-803.json +1 -0
- package/sessions-cli/default/pre-key-804.json +1 -0
- package/sessions-cli/default/pre-key-805.json +1 -0
- package/sessions-cli/default/pre-key-806.json +1 -0
- package/sessions-cli/default/pre-key-807.json +1 -0
- package/sessions-cli/default/pre-key-808.json +1 -0
- package/sessions-cli/default/pre-key-809.json +1 -0
- package/sessions-cli/default/pre-key-81.json +1 -0
- package/sessions-cli/default/pre-key-810.json +1 -0
- package/sessions-cli/default/pre-key-811.json +1 -0
- package/sessions-cli/default/pre-key-812.json +1 -0
- package/sessions-cli/default/pre-key-82.json +1 -0
- package/sessions-cli/default/pre-key-83.json +1 -0
- package/sessions-cli/default/pre-key-84.json +1 -0
- package/sessions-cli/default/pre-key-85.json +1 -0
- package/sessions-cli/default/pre-key-86.json +1 -0
- package/sessions-cli/default/pre-key-87.json +1 -0
- package/sessions-cli/default/pre-key-88.json +1 -0
- package/sessions-cli/default/pre-key-89.json +1 -0
- package/sessions-cli/default/pre-key-9.json +1 -0
- package/sessions-cli/default/pre-key-90.json +1 -0
- package/sessions-cli/default/pre-key-91.json +1 -0
- package/sessions-cli/default/pre-key-92.json +1 -0
- package/sessions-cli/default/pre-key-93.json +1 -0
- package/sessions-cli/default/pre-key-94.json +1 -0
- package/sessions-cli/default/pre-key-95.json +1 -0
- package/sessions-cli/default/pre-key-96.json +1 -0
- package/sessions-cli/default/pre-key-97.json +1 -0
- package/sessions-cli/default/pre-key-98.json +1 -0
- package/sessions-cli/default/pre-key-99.json +1 -0
- package/sessions-cli/default/session-103732167577712_1.0.json +1 -0
- package/sessions-cli/default/session-123235563786303_1.0.json +1 -0
- package/sessions-cli/default/session-181312044433566_1.0.json +1 -0
- package/sessions-cli/default/session-42877077966917_1.0.json +1 -0
- package/sessions-cli/default/session-62324404687100_1.0.json +1 -0
- package/sessions-cli/default/tctoken-6281295802674@s.whatsapp.net.json +1 -0
- package/test-autocomplete.ts +66 -0
- package/test-sessions-manual/manual-test-bot/app-state-sync-key-AAAAABGP.json +1 -0
- package/test-sessions-manual/manual-test-bot/app-state-sync-version-critical_block.json +1 -0
- package/test-sessions-manual/manual-test-bot/app-state-sync-version-critical_unblock_low.json +1 -0
- package/test-sessions-manual/manual-test-bot/app-state-sync-version-regular.json +1 -0
- package/test-sessions-manual/manual-test-bot/app-state-sync-version-regular_high.json +1 -0
- package/test-sessions-manual/manual-test-bot/app-state-sync-version-regular_low.json +1 -0
- package/test-sessions-manual/manual-test-bot/creds.json +1 -0
- package/test-sessions-manual/manual-test-bot/device-list-6285792059652.json +1 -0
- package/test-sessions-manual/manual-test-bot/lid-mapping-177919053803568_reverse.json +1 -0
- package/test-sessions-manual/manual-test-bot/lid-mapping-6285792059652.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-1.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-10.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-100.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-101.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-102.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-103.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-104.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-105.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-106.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-107.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-108.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-109.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-11.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-110.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-111.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-112.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-113.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-114.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-115.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-116.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-117.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-118.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-119.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-12.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-120.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-121.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-122.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-123.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-124.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-125.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-126.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-127.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-128.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-129.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-13.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-130.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-131.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-132.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-133.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-134.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-135.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-136.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-137.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-138.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-139.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-14.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-140.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-141.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-142.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-143.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-144.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-145.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-146.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-147.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-148.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-149.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-15.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-150.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-151.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-152.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-153.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-154.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-155.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-156.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-157.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-158.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-159.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-16.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-160.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-161.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-162.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-163.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-164.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-165.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-166.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-167.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-168.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-169.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-17.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-170.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-171.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-172.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-173.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-174.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-175.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-176.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-177.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-178.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-179.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-18.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-180.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-181.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-182.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-183.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-184.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-185.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-186.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-187.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-188.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-189.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-19.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-190.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-191.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-192.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-193.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-194.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-195.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-196.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-197.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-198.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-199.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-2.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-20.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-200.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-201.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-202.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-203.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-204.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-205.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-206.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-207.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-208.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-209.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-21.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-210.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-211.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-212.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-213.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-214.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-215.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-216.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-217.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-218.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-219.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-22.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-220.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-221.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-222.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-223.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-224.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-225.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-226.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-227.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-228.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-229.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-23.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-230.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-231.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-232.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-233.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-234.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-235.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-236.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-237.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-238.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-239.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-24.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-240.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-241.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-242.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-243.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-244.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-245.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-246.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-247.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-248.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-249.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-25.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-250.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-251.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-252.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-253.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-254.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-255.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-256.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-257.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-258.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-259.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-26.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-260.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-261.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-262.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-263.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-264.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-265.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-266.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-267.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-268.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-269.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-27.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-270.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-271.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-272.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-273.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-274.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-275.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-276.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-277.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-278.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-279.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-28.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-280.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-281.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-282.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-283.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-284.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-285.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-286.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-287.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-288.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-289.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-29.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-290.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-291.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-292.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-293.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-294.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-295.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-296.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-297.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-298.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-299.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-3.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-30.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-300.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-301.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-302.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-303.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-304.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-305.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-306.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-307.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-308.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-309.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-31.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-310.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-311.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-312.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-313.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-314.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-315.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-316.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-317.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-318.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-319.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-32.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-320.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-321.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-322.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-323.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-324.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-325.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-326.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-327.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-328.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-329.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-33.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-330.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-331.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-332.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-333.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-334.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-335.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-336.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-337.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-338.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-339.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-34.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-340.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-341.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-342.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-343.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-344.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-345.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-346.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-347.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-348.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-349.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-35.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-350.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-351.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-352.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-353.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-354.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-355.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-356.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-357.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-358.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-359.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-36.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-360.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-361.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-362.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-363.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-364.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-365.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-366.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-367.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-368.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-369.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-37.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-370.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-371.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-372.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-373.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-374.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-375.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-376.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-377.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-378.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-379.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-38.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-380.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-381.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-382.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-383.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-384.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-385.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-386.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-387.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-388.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-389.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-39.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-390.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-391.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-392.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-393.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-394.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-395.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-396.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-397.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-398.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-399.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-4.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-40.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-400.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-401.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-402.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-403.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-404.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-405.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-406.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-407.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-408.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-409.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-41.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-410.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-411.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-412.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-413.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-414.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-415.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-416.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-417.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-418.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-419.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-42.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-420.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-421.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-422.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-423.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-424.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-425.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-426.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-427.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-428.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-429.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-43.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-430.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-431.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-432.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-433.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-434.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-435.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-436.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-437.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-438.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-439.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-44.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-440.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-441.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-442.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-443.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-444.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-445.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-446.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-447.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-448.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-449.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-45.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-450.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-451.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-452.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-453.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-454.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-455.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-456.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-457.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-458.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-459.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-46.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-460.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-461.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-462.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-463.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-464.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-465.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-466.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-467.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-468.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-469.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-47.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-470.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-471.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-472.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-473.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-474.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-475.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-476.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-477.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-478.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-479.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-48.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-480.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-481.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-482.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-483.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-484.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-485.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-486.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-487.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-488.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-489.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-49.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-490.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-491.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-492.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-493.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-494.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-495.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-496.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-497.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-498.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-499.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-5.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-50.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-500.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-501.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-502.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-503.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-504.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-505.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-506.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-507.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-508.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-509.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-51.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-510.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-511.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-512.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-513.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-514.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-515.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-516.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-517.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-518.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-519.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-52.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-520.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-521.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-522.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-523.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-524.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-525.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-526.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-527.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-528.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-529.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-53.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-530.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-531.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-532.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-533.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-534.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-535.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-536.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-537.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-538.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-539.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-54.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-540.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-541.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-542.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-543.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-544.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-545.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-546.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-547.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-548.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-549.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-55.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-550.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-551.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-552.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-553.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-554.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-555.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-556.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-557.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-558.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-559.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-56.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-560.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-561.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-562.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-563.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-564.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-565.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-566.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-567.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-568.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-569.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-57.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-570.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-571.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-572.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-573.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-574.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-575.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-576.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-577.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-578.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-579.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-58.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-580.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-581.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-582.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-583.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-584.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-585.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-586.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-587.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-588.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-589.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-59.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-590.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-591.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-592.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-593.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-594.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-595.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-596.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-597.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-598.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-599.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-6.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-60.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-600.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-601.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-602.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-603.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-604.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-605.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-606.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-607.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-608.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-609.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-61.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-610.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-611.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-612.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-613.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-614.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-615.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-616.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-617.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-618.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-619.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-62.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-620.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-621.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-622.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-623.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-624.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-625.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-626.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-627.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-628.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-629.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-63.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-630.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-631.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-632.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-633.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-634.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-635.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-636.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-637.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-638.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-639.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-64.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-640.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-641.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-642.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-643.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-644.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-645.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-646.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-647.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-648.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-649.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-65.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-650.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-651.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-652.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-653.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-654.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-655.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-656.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-657.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-658.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-659.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-66.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-660.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-661.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-662.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-663.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-664.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-665.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-666.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-667.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-668.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-669.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-67.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-670.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-671.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-672.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-673.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-674.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-675.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-676.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-677.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-678.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-679.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-68.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-680.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-681.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-682.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-683.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-684.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-685.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-686.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-687.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-688.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-689.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-69.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-690.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-691.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-692.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-693.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-694.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-695.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-696.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-697.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-698.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-699.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-7.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-70.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-700.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-701.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-702.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-703.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-704.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-705.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-706.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-707.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-708.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-709.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-71.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-710.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-711.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-712.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-713.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-714.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-715.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-716.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-717.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-718.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-719.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-72.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-720.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-721.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-722.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-723.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-724.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-725.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-726.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-727.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-728.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-729.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-73.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-730.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-731.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-732.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-733.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-734.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-735.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-736.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-737.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-738.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-739.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-74.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-740.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-741.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-742.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-743.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-744.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-745.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-746.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-747.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-748.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-749.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-75.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-750.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-751.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-752.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-753.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-754.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-755.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-756.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-757.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-758.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-759.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-76.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-760.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-761.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-762.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-763.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-764.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-765.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-766.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-767.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-768.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-769.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-77.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-770.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-771.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-772.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-773.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-774.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-775.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-776.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-777.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-778.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-779.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-78.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-780.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-781.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-782.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-783.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-784.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-785.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-786.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-787.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-788.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-789.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-79.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-790.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-791.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-792.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-793.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-794.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-795.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-796.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-797.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-798.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-799.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-8.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-80.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-800.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-801.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-802.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-803.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-804.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-805.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-806.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-807.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-808.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-809.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-81.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-810.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-811.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-812.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-82.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-83.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-84.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-85.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-86.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-87.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-88.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-89.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-9.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-90.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-91.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-92.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-93.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-94.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-95.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-96.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-97.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-98.json +1 -0
- package/test-sessions-manual/manual-test-bot/pre-key-99.json +1 -0
- package/test-sessions-manual/manual-test-bot/session-177919053803568_1.0.json +1 -0
|
@@ -1,9 +1,14 @@
|
|
|
1
|
-
import makeWASocket, { DisconnectReason, fetchLatestBaileysVersion, makeCacheableSignalKeyStore, downloadMediaMessage, } from "@whiskeysockets/baileys";
|
|
1
|
+
import makeWASocket, { DisconnectReason, fetchLatestBaileysVersion, makeCacheableSignalKeyStore, Browsers, downloadMediaMessage, } from "@whiskeysockets/baileys";
|
|
2
2
|
import { EventEmitter } from "node:events";
|
|
3
|
-
import
|
|
3
|
+
import { createFilteredLogger } from "../utils/filtered-logger.js";
|
|
4
|
+
import { enableConsoleFilter, disableConsoleFilter, } from "../utils/console-filter.js";
|
|
4
5
|
import * as path from "node:path";
|
|
6
|
+
import * as fs from "node:fs";
|
|
5
7
|
import { AuthHandler } from "../handlers/AuthHandler.js";
|
|
6
8
|
import { MessageHandler } from "../handlers/MessageHandler.js";
|
|
9
|
+
import { TIMEOUTS } from "../constants/timeouts.js";
|
|
10
|
+
import { CACHE_CONFIG } from "../constants/cache.js";
|
|
11
|
+
import { validatePhoneNumber, validateJID, validateMessageText, validateGroupName, validatePhoneNumbers, } from "../utils/validation.js";
|
|
7
12
|
/**
|
|
8
13
|
* LRU Cache for LID to JID mappings
|
|
9
14
|
* Prevents unbounded memory growth while maintaining frequently used mappings
|
|
@@ -11,7 +16,7 @@ import { MessageHandler } from "../handlers/MessageHandler.js";
|
|
|
11
16
|
class LruCache {
|
|
12
17
|
cache;
|
|
13
18
|
maxSize;
|
|
14
|
-
constructor(maxSize =
|
|
19
|
+
constructor(maxSize = CACHE_CONFIG.LID_MAP_MAX_SIZE) {
|
|
15
20
|
this.cache = new Map();
|
|
16
21
|
this.maxSize = maxSize;
|
|
17
22
|
}
|
|
@@ -48,6 +53,34 @@ class LruCache {
|
|
|
48
53
|
get size() {
|
|
49
54
|
return this.cache.size;
|
|
50
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* Get an iterator for all entries in the cache
|
|
58
|
+
* @returns Iterator of [key, value] tuples
|
|
59
|
+
*/
|
|
60
|
+
entries() {
|
|
61
|
+
return this.cache.entries();
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Get an iterator for all keys in the cache
|
|
65
|
+
* @returns Iterator of keys
|
|
66
|
+
*/
|
|
67
|
+
keys() {
|
|
68
|
+
return this.cache.keys();
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get an iterator for all values in the cache
|
|
72
|
+
* @returns Iterator of values
|
|
73
|
+
*/
|
|
74
|
+
values() {
|
|
75
|
+
return this.cache.values();
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Execute a callback for each entry in the cache
|
|
79
|
+
* @param callback - Function to call for each entry
|
|
80
|
+
*/
|
|
81
|
+
forEach(callback) {
|
|
82
|
+
this.cache.forEach(callback);
|
|
83
|
+
}
|
|
51
84
|
}
|
|
52
85
|
/**
|
|
53
86
|
* Main client class for interacting with WhatsApp
|
|
@@ -57,33 +90,54 @@ export class MiawClient extends EventEmitter {
|
|
|
57
90
|
socket = null;
|
|
58
91
|
authHandler;
|
|
59
92
|
connectionState = "disconnected";
|
|
93
|
+
connectionStateTimestamp = 0;
|
|
94
|
+
connectionWatchdogTimer = null;
|
|
60
95
|
reconnectAttempts = 0;
|
|
61
96
|
reconnectTimer = null;
|
|
97
|
+
loggingOut = false;
|
|
62
98
|
logger;
|
|
63
|
-
lidToJidMap = new LruCache(
|
|
64
|
-
//
|
|
99
|
+
lidToJidMap = new LruCache();
|
|
100
|
+
// Custom stores for contacts, chats, messages (Baileys v7 removed makeInMemoryStore)
|
|
65
101
|
contactsStore = new Map();
|
|
102
|
+
chatsStore = new Map();
|
|
103
|
+
messagesStore = new Map();
|
|
66
104
|
labelsStore = new Map();
|
|
67
|
-
|
|
68
|
-
|
|
105
|
+
// Store label-chat associations (labelId -> Set of chatJids)
|
|
106
|
+
labelChatsStore = new Map();
|
|
107
|
+
// Track pending history fetch requests for loadMoreMessages
|
|
108
|
+
pendingHistoryRequests = new Map();
|
|
109
|
+
labelEventCount = 0;
|
|
110
|
+
lastLabelSyncTime;
|
|
111
|
+
// Track initial label sync to ensure fetchAllLabels waits for it
|
|
112
|
+
initialLabelSyncPromise = null;
|
|
113
|
+
initialLabelSyncComplete = false;
|
|
114
|
+
// Store auth state for logout access (needed when disconnected)
|
|
115
|
+
authState = null;
|
|
69
116
|
constructor(options) {
|
|
70
117
|
super();
|
|
118
|
+
// Initialize logger first (needed for options)
|
|
119
|
+
const logger = options.logger || createFilteredLogger(options.debug || false);
|
|
71
120
|
// Set default options
|
|
72
121
|
this.options = {
|
|
73
122
|
instanceId: options.instanceId,
|
|
74
123
|
sessionPath: options.sessionPath || "./sessions",
|
|
75
124
|
debug: options.debug || false,
|
|
76
|
-
logger:
|
|
125
|
+
logger: logger,
|
|
77
126
|
autoReconnect: options.autoReconnect !== false,
|
|
78
127
|
maxReconnectAttempts: options.maxReconnectAttempts || Infinity,
|
|
79
|
-
reconnectDelay: options.reconnectDelay ||
|
|
128
|
+
reconnectDelay: options.reconnectDelay || TIMEOUTS.RECONNECT_DELAY,
|
|
129
|
+
stuckStateTimeout: options.stuckStateTimeout || TIMEOUTS.STUCK_STATE,
|
|
130
|
+
qrGracePeriod: options.qrGracePeriod || TIMEOUTS.QR_GRACE_PERIOD,
|
|
131
|
+
qrScanTimeout: options.qrScanTimeout || TIMEOUTS.QR_SCAN_TIMEOUT,
|
|
132
|
+
connectionTimeout: options.connectionTimeout || TIMEOUTS.CONNECTION_TIMEOUT,
|
|
80
133
|
};
|
|
81
|
-
//
|
|
82
|
-
this.logger =
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
134
|
+
// Use the initialized logger
|
|
135
|
+
this.logger = logger;
|
|
136
|
+
// Enable console filter to suppress libsignal logs when debug is off
|
|
137
|
+
// libsignal logs directly to console.info/warn, bypassing our logger
|
|
138
|
+
if (!this.options.debug) {
|
|
139
|
+
enableConsoleFilter();
|
|
140
|
+
}
|
|
87
141
|
// Initialize handlers
|
|
88
142
|
this.authHandler = new AuthHandler(this.options.sessionPath, this.options.instanceId);
|
|
89
143
|
}
|
|
@@ -91,13 +145,42 @@ export class MiawClient extends EventEmitter {
|
|
|
91
145
|
* Connect to WhatsApp
|
|
92
146
|
*/
|
|
93
147
|
async connect() {
|
|
148
|
+
// Check for stale "connecting" state (stuck for more than configured timeout)
|
|
149
|
+
if (this.connectionState === "connecting") {
|
|
150
|
+
const elapsed = Date.now() - this.connectionStateTimestamp;
|
|
151
|
+
if (elapsed < this.options.stuckStateTimeout) {
|
|
152
|
+
this.logger.info(`Already connecting (${elapsed}ms), skipping connect() call`);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
this.logger.warn(`Stuck in "connecting" state for ${elapsed}ms, forcing reconnect`);
|
|
157
|
+
this.updateConnectionState("disconnected");
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// Don't reconnect if already connected
|
|
161
|
+
if (this.connectionState === "connected") {
|
|
162
|
+
this.logger.info("Already connected, skipping connect() call");
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
94
165
|
try {
|
|
95
166
|
this.updateConnectionState("connecting");
|
|
167
|
+
// Load persisted stores from disk before connecting
|
|
168
|
+
// This ensures data is available even if Baileys history sync doesn't fire
|
|
169
|
+
// (Known Baileys v7 issue: history sync notification may be received but never processed)
|
|
170
|
+
this.loadLabelsFromFile();
|
|
171
|
+
this.loadContactsFromFile();
|
|
172
|
+
this.loadLidMappingsFromFile(); // Load LID mappings BEFORE chats for resolution
|
|
173
|
+
this.loadChatsFromFile();
|
|
174
|
+
this.loadMessagesFromFile();
|
|
96
175
|
// Load auth state
|
|
97
176
|
const { state, saveCreds } = await this.authHandler.initialize();
|
|
177
|
+
// Store auth state for logout access (needed when disconnected)
|
|
178
|
+
this.authState = { creds: state.creds };
|
|
98
179
|
// Get latest Baileys version
|
|
99
180
|
const { version } = await fetchLatestBaileysVersion();
|
|
100
181
|
// Create socket
|
|
182
|
+
const debugMode = this.options.debug;
|
|
183
|
+
const logger = this.logger;
|
|
101
184
|
this.socket = makeWASocket({
|
|
102
185
|
version,
|
|
103
186
|
logger: this.logger,
|
|
@@ -106,11 +189,18 @@ export class MiawClient extends EventEmitter {
|
|
|
106
189
|
creds: state.creds,
|
|
107
190
|
keys: makeCacheableSignalKeyStore(state.keys, this.logger),
|
|
108
191
|
},
|
|
109
|
-
browser:
|
|
192
|
+
browser: Browsers.macOS("Desktop"), // Desktop for more history
|
|
110
193
|
generateHighQualityLinkPreview: true,
|
|
111
|
-
// Enable
|
|
112
|
-
syncFullHistory:
|
|
194
|
+
// Enable full history sync to populate stores
|
|
195
|
+
syncFullHistory: true,
|
|
113
196
|
fireInitQueries: true,
|
|
197
|
+
// Debug callback to see if history sync notifications are received
|
|
198
|
+
shouldSyncHistoryMessage: (msg) => {
|
|
199
|
+
if (debugMode) {
|
|
200
|
+
logger.debug(`[shouldSyncHistoryMessage] syncType: ${msg.syncType}`);
|
|
201
|
+
}
|
|
202
|
+
return true; // Always sync
|
|
203
|
+
},
|
|
114
204
|
});
|
|
115
205
|
// Register event handlers
|
|
116
206
|
this.registerSocketEvents(saveCreds);
|
|
@@ -150,10 +240,25 @@ export class MiawClient extends EventEmitter {
|
|
|
150
240
|
this.updateConnectionState("connected");
|
|
151
241
|
this.emit("ready");
|
|
152
242
|
this.logger.info("Connected to WhatsApp");
|
|
153
|
-
//
|
|
154
|
-
|
|
155
|
-
|
|
243
|
+
// Log store sizes after connection
|
|
244
|
+
if (this.options.debug) {
|
|
245
|
+
this.logger.debug(`[ready] Stores: contacts=${this.contactsStore.size}, chats=${this.chatsStore.size}, messages=${this.messagesStore.size}`);
|
|
246
|
+
// Also log after a delay to catch async updates
|
|
247
|
+
setTimeout(() => {
|
|
248
|
+
this.logger.debug(`[ready+5s] Stores: contacts=${this.contactsStore.size}, chats=${this.chatsStore.size}, messages=${this.messagesStore.size}`);
|
|
249
|
+
}, 5000);
|
|
250
|
+
}
|
|
251
|
+
// Track the initial sync promise so fetchAllLabels can await it
|
|
252
|
+
// This ensures CLI commands that run immediately after connection
|
|
253
|
+
// will wait for the sync to complete before returning empty results
|
|
254
|
+
this.initialLabelSyncPromise = this.syncLabelsFromAppState()
|
|
255
|
+
.then(() => {
|
|
256
|
+
this.initialLabelSyncComplete = true;
|
|
257
|
+
this.logger.debug("Initial label sync completed");
|
|
258
|
+
})
|
|
259
|
+
.catch((error) => {
|
|
156
260
|
this.logger.warn("Failed to sync labels from app state:", error);
|
|
261
|
+
this.initialLabelSyncComplete = true; // Mark complete even on error
|
|
157
262
|
});
|
|
158
263
|
}
|
|
159
264
|
});
|
|
@@ -162,24 +267,88 @@ export class MiawClient extends EventEmitter {
|
|
|
162
267
|
await saveCreds();
|
|
163
268
|
this.emit("session_saved");
|
|
164
269
|
});
|
|
165
|
-
//
|
|
270
|
+
// LID mapping update - captures LID to PN (phone number) mappings
|
|
271
|
+
// This event is part of Baileys v7 LID privacy feature
|
|
272
|
+
// Note: This event is WIP and may not always fire
|
|
273
|
+
this.socket.ev.on("lid-mapping.update", (mapping) => {
|
|
274
|
+
this.addLidMapping(mapping.lid, mapping.pn, "BaileysEvent");
|
|
275
|
+
});
|
|
276
|
+
// Contact updates - build LID to JID mapping and update store
|
|
166
277
|
this.socket.ev.on("contacts.upsert", (contacts) => {
|
|
278
|
+
if (this.options.debug) {
|
|
279
|
+
this.logger.debug(`[contacts.upsert] Received ${contacts.length} contacts`);
|
|
280
|
+
if (contacts.length > 0) {
|
|
281
|
+
this.logger.debug(`[contacts.upsert] Sample: ${JSON.stringify(contacts[0])}`);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
167
284
|
this.updateLidToJidMapping(contacts);
|
|
168
285
|
this.updateContactsStore(contacts);
|
|
169
286
|
});
|
|
170
287
|
this.socket.ev.on("contacts.update", (contacts) => {
|
|
288
|
+
if (this.options.debug) {
|
|
289
|
+
this.logger.debug(`[contacts.update] Received ${contacts.length} contact updates`);
|
|
290
|
+
if (contacts.length > 0) {
|
|
291
|
+
this.logger.debug(`[contacts.update] Sample: ${JSON.stringify(contacts[0])}`);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
171
294
|
this.updateLidToJidMapping(contacts);
|
|
172
295
|
this.updateContactsStore(contacts);
|
|
173
296
|
});
|
|
174
|
-
// Chat updates - extract LID mappings
|
|
297
|
+
// Chat updates - extract LID mappings and update store
|
|
175
298
|
this.socket.ev.on("chats.upsert", (chats) => {
|
|
299
|
+
if (this.options.debug) {
|
|
300
|
+
this.logger.debug(`[chats.upsert] Received ${chats.length} chats`);
|
|
301
|
+
if (chats.length > 0) {
|
|
302
|
+
this.logger.debug(`[chats.upsert] Sample: ${JSON.stringify(chats[0])}`);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
176
305
|
this.updateLidFromChats(chats);
|
|
177
306
|
this.updateChatsStore(chats);
|
|
178
307
|
});
|
|
179
308
|
this.socket.ev.on("chats.update", (chats) => {
|
|
309
|
+
if (this.options.debug) {
|
|
310
|
+
this.logger.debug(`[chats.update] Received ${chats.length} chat updates`);
|
|
311
|
+
}
|
|
180
312
|
this.updateLidFromChats(chats);
|
|
181
313
|
this.updateChatsStore(chats);
|
|
182
314
|
});
|
|
315
|
+
// History sync - populates contacts, chats, and messages from history
|
|
316
|
+
this.socket.ev.on("messaging-history.set", ({ chats, contacts, messages, isLatest, peerDataRequestSessionId }) => {
|
|
317
|
+
if (this.options.debug) {
|
|
318
|
+
this.logger.debug("\n========== MESSAGING HISTORY SYNC ==========");
|
|
319
|
+
this.logger.debug(`Contacts: ${contacts.length}, Chats: ${chats.length}, Messages: ${messages.length}`);
|
|
320
|
+
this.logger.debug(`Is Latest: ${isLatest}, SessionId: ${peerDataRequestSessionId || 'none'}`);
|
|
321
|
+
this.logger.debug("============================================\n");
|
|
322
|
+
}
|
|
323
|
+
// Build LID mappings FIRST (before store population)
|
|
324
|
+
this.updateLidToJidMapping(contacts);
|
|
325
|
+
this.updateLidFromChats(chats);
|
|
326
|
+
// Update contacts from history
|
|
327
|
+
this.updateContactsStore(contacts);
|
|
328
|
+
// Update chats from history
|
|
329
|
+
this.updateChatsStore(chats);
|
|
330
|
+
// Update messages from history
|
|
331
|
+
// Baileys v7: messages is a flat WAMessage[] array (not nested)
|
|
332
|
+
for (const msg of messages) {
|
|
333
|
+
this.addMessageToStore(msg);
|
|
334
|
+
}
|
|
335
|
+
// Check for pending loadMoreMessages requests
|
|
336
|
+
if (peerDataRequestSessionId && this.pendingHistoryRequests.has(peerDataRequestSessionId)) {
|
|
337
|
+
const request = this.pendingHistoryRequests.get(peerDataRequestSessionId);
|
|
338
|
+
const newCount = (this.messagesStore.get(request.jid) || []).length;
|
|
339
|
+
const messagesLoaded = newCount - request.initialCount;
|
|
340
|
+
this.pendingHistoryRequests.delete(peerDataRequestSessionId);
|
|
341
|
+
request.resolve({
|
|
342
|
+
success: true,
|
|
343
|
+
messagesLoaded,
|
|
344
|
+
hasMore: !isLatest,
|
|
345
|
+
});
|
|
346
|
+
this.logger.debug(`History request ${peerDataRequestSessionId} completed: ${messagesLoaded} messages loaded`);
|
|
347
|
+
}
|
|
348
|
+
if (this.options.debug && isLatest) {
|
|
349
|
+
this.logger.debug(`✅ History sync complete. Stores: ${this.contactsStore.size} contacts, ${this.chatsStore.size} chats`);
|
|
350
|
+
}
|
|
351
|
+
});
|
|
183
352
|
// Messages
|
|
184
353
|
this.socket.ev.on("messages.upsert", async (m) => {
|
|
185
354
|
if (m.type !== "notify")
|
|
@@ -187,9 +356,9 @@ export class MiawClient extends EventEmitter {
|
|
|
187
356
|
for (const msg of m.messages) {
|
|
188
357
|
// Debug: Log raw Baileys message structure
|
|
189
358
|
if (this.options.debug) {
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
359
|
+
this.logger.debug("\n========== RAW BAILEYS MESSAGE ==========");
|
|
360
|
+
this.logger.debug(JSON.stringify(msg, null, 2));
|
|
361
|
+
this.logger.debug("=========================================\n");
|
|
193
362
|
}
|
|
194
363
|
// Check for protocol messages (edits and deletes)
|
|
195
364
|
const protocolMessage = msg.message?.protocolMessage;
|
|
@@ -202,22 +371,17 @@ export class MiawClient extends EventEmitter {
|
|
|
202
371
|
// Note: senderLid may exist at runtime but isn't in Baileys v7 types
|
|
203
372
|
const msgKey = msg.key;
|
|
204
373
|
if (!msgKey.fromMe && msgKey.senderLid && msgKey.remoteJid) {
|
|
205
|
-
|
|
206
|
-
? msgKey.senderLid
|
|
207
|
-
: `${msgKey.senderLid}@lid`;
|
|
208
|
-
this.lidToJidMap.set(lid, msgKey.remoteJid);
|
|
209
|
-
if (this.options.debug) {
|
|
210
|
-
console.log(`[LID Mapping] ${lid} -> ${msg.key.remoteJid}`);
|
|
211
|
-
}
|
|
374
|
+
this.addLidMapping(msgKey.senderLid, msgKey.remoteJid, "Message");
|
|
212
375
|
}
|
|
213
|
-
const normalized = MessageHandler.normalize({ messages: [msg] });
|
|
376
|
+
const normalized = MessageHandler.normalize({ messages: [msg], type: "notify" }, this.logger);
|
|
214
377
|
if (normalized) {
|
|
215
|
-
// Store message in messagesStore
|
|
378
|
+
// Store message in messagesStore
|
|
216
379
|
const chatJid = normalized.from;
|
|
217
380
|
if (!this.messagesStore.has(chatJid)) {
|
|
218
381
|
this.messagesStore.set(chatJid, []);
|
|
219
382
|
}
|
|
220
383
|
this.messagesStore.get(chatJid).push(normalized);
|
|
384
|
+
this.saveMessagesToFile();
|
|
221
385
|
this.emit("message", normalized);
|
|
222
386
|
}
|
|
223
387
|
}
|
|
@@ -234,9 +398,9 @@ export class MiawClient extends EventEmitter {
|
|
|
234
398
|
raw: { key, reaction },
|
|
235
399
|
};
|
|
236
400
|
if (this.options.debug) {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
401
|
+
this.logger.debug("\n========== REACTION ==========");
|
|
402
|
+
this.logger.debug(JSON.stringify(reactionData, null, 2));
|
|
403
|
+
this.logger.debug("==============================\n");
|
|
240
404
|
}
|
|
241
405
|
this.emit("message_reaction", reactionData);
|
|
242
406
|
}
|
|
@@ -252,19 +416,20 @@ export class MiawClient extends EventEmitter {
|
|
|
252
416
|
lastSeen: presenceData.lastSeen,
|
|
253
417
|
};
|
|
254
418
|
if (this.options.debug) {
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
419
|
+
this.logger.debug("\n========== PRESENCE UPDATE ==========");
|
|
420
|
+
this.logger.debug(JSON.stringify(update, null, 2));
|
|
421
|
+
this.logger.debug("=====================================\n");
|
|
258
422
|
}
|
|
259
423
|
this.emit("presence", update);
|
|
260
424
|
}
|
|
261
425
|
});
|
|
262
426
|
// Label updates (WhatsApp Business)
|
|
263
427
|
this.socket.ev.on("labels.edit", (label) => {
|
|
428
|
+
this.labelEventCount++;
|
|
264
429
|
if (this.options.debug) {
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
430
|
+
this.logger.debug("\n========== LABEL UPDATE ==========");
|
|
431
|
+
this.logger.debug(JSON.stringify(label, null, 2));
|
|
432
|
+
this.logger.debug("==================================\n");
|
|
268
433
|
}
|
|
269
434
|
// Update label in store
|
|
270
435
|
if (label.id) {
|
|
@@ -281,9 +446,54 @@ export class MiawClient extends EventEmitter {
|
|
|
281
446
|
};
|
|
282
447
|
this.labelsStore.set(label.id, labelData);
|
|
283
448
|
}
|
|
449
|
+
// Persist labels to disk after every update
|
|
450
|
+
// This ensures labels survive reconnections where resyncAppState returns only patches
|
|
451
|
+
this.saveLabelsToFile();
|
|
452
|
+
}
|
|
453
|
+
});
|
|
454
|
+
// Handle label-chat associations
|
|
455
|
+
this.socket.ev.on("labels.association", ({ association, type }) => {
|
|
456
|
+
// Only handle chat-level associations (not message-level)
|
|
457
|
+
if (association.type === "label_jid") {
|
|
458
|
+
const { labelId, chatId } = association;
|
|
459
|
+
if (type === "add") {
|
|
460
|
+
if (!this.labelChatsStore.has(labelId)) {
|
|
461
|
+
this.labelChatsStore.set(labelId, new Set());
|
|
462
|
+
}
|
|
463
|
+
this.labelChatsStore.get(labelId).add(chatId);
|
|
464
|
+
}
|
|
465
|
+
else if (type === "remove") {
|
|
466
|
+
this.labelChatsStore.get(labelId)?.delete(chatId);
|
|
467
|
+
}
|
|
468
|
+
if (this.options.debug) {
|
|
469
|
+
this.logger.debug(`Label association: ${type} chat ${chatId} ${type === "add" ? "to" : "from"} label ${labelId}`);
|
|
470
|
+
}
|
|
284
471
|
}
|
|
285
472
|
});
|
|
286
473
|
}
|
|
474
|
+
/**
|
|
475
|
+
* Remove all socket event listeners
|
|
476
|
+
* Call this before closing socket to prevent stale event handlers
|
|
477
|
+
*/
|
|
478
|
+
removeSocketEvents() {
|
|
479
|
+
if (!this.socket)
|
|
480
|
+
return;
|
|
481
|
+
this.logger.debug("Removing socket event listeners");
|
|
482
|
+
// Remove all event listeners
|
|
483
|
+
this.socket.ev.removeAllListeners("connection.update");
|
|
484
|
+
this.socket.ev.removeAllListeners("creds.update");
|
|
485
|
+
this.socket.ev.removeAllListeners("lid-mapping.update");
|
|
486
|
+
this.socket.ev.removeAllListeners("contacts.upsert");
|
|
487
|
+
this.socket.ev.removeAllListeners("contacts.update");
|
|
488
|
+
this.socket.ev.removeAllListeners("chats.upsert");
|
|
489
|
+
this.socket.ev.removeAllListeners("chats.update");
|
|
490
|
+
this.socket.ev.removeAllListeners("messaging-history.set");
|
|
491
|
+
this.socket.ev.removeAllListeners("messages.upsert");
|
|
492
|
+
this.socket.ev.removeAllListeners("messages.reaction");
|
|
493
|
+
this.socket.ev.removeAllListeners("presence.update");
|
|
494
|
+
this.socket.ev.removeAllListeners("labels.edit");
|
|
495
|
+
this.socket.ev.removeAllListeners("labels.association");
|
|
496
|
+
}
|
|
287
497
|
/**
|
|
288
498
|
* Handle protocol messages (edits, deletes)
|
|
289
499
|
*/
|
|
@@ -300,9 +510,9 @@ export class MiawClient extends EventEmitter {
|
|
|
300
510
|
raw: msg,
|
|
301
511
|
};
|
|
302
512
|
if (this.options.debug) {
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
513
|
+
this.logger.debug("\n========== MESSAGE DELETED ==========");
|
|
514
|
+
this.logger.debug(JSON.stringify(deletion, null, 2));
|
|
515
|
+
this.logger.debug("=====================================\n");
|
|
306
516
|
}
|
|
307
517
|
this.emit("message_delete", deletion);
|
|
308
518
|
}
|
|
@@ -323,13 +533,40 @@ export class MiawClient extends EventEmitter {
|
|
|
323
533
|
raw: msg,
|
|
324
534
|
};
|
|
325
535
|
if (this.options.debug) {
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
536
|
+
this.logger.debug("\n========== MESSAGE EDITED ==========");
|
|
537
|
+
this.logger.debug(JSON.stringify(edit, null, 2));
|
|
538
|
+
this.logger.debug("====================================\n");
|
|
329
539
|
}
|
|
330
540
|
this.emit("message_edit", edit);
|
|
331
541
|
}
|
|
332
542
|
}
|
|
543
|
+
/**
|
|
544
|
+
* Add LID to JID mapping with normalized format and debug logging
|
|
545
|
+
* Centralized helper for all LID mapping operations
|
|
546
|
+
* @param lid - The LID (with or without @lid suffix)
|
|
547
|
+
* @param jid - The JID to map to (phone number)
|
|
548
|
+
* @param source - Source of the mapping for debug logs
|
|
549
|
+
*/
|
|
550
|
+
addLidMapping(lid, jid, source) {
|
|
551
|
+
if (!lid || !jid) {
|
|
552
|
+
return;
|
|
553
|
+
}
|
|
554
|
+
// Normalize LID format (ensure it ends with @lid)
|
|
555
|
+
const normalizedLid = lid.endsWith("@lid") ? lid : `${lid}@lid`;
|
|
556
|
+
// Check if this is a new mapping
|
|
557
|
+
const existingJid = this.lidToJidMap.get(normalizedLid);
|
|
558
|
+
const isNew = existingJid !== jid;
|
|
559
|
+
// Store in our LRU cache
|
|
560
|
+
this.lidToJidMap.set(normalizedLid, jid);
|
|
561
|
+
if (this.options.debug) {
|
|
562
|
+
this.logger.debug(`[LID Mapping: ${source}] ${normalizedLid} -> ${jid}`);
|
|
563
|
+
this.logger.debug(`Total LID mappings: ${this.lidToJidMap.size}`);
|
|
564
|
+
}
|
|
565
|
+
// Persist to disk if this is a new mapping
|
|
566
|
+
if (isNew) {
|
|
567
|
+
this.saveLidMappingsToFile();
|
|
568
|
+
}
|
|
569
|
+
}
|
|
333
570
|
/**
|
|
334
571
|
* Update LID to JID mapping from contacts
|
|
335
572
|
*/
|
|
@@ -337,74 +574,14 @@ export class MiawClient extends EventEmitter {
|
|
|
337
574
|
for (const contact of contacts) {
|
|
338
575
|
// Contact has both lid and jid - create mapping
|
|
339
576
|
if (contact.lid && contact.id && !contact.id.endsWith("@lid")) {
|
|
340
|
-
this.
|
|
341
|
-
if (this.options.debug) {
|
|
342
|
-
console.log(`[Contact LID Mapping] ${contact.lid} -> ${contact.id}`);
|
|
343
|
-
}
|
|
577
|
+
this.addLidMapping(contact.lid, contact.id, "Contact");
|
|
344
578
|
}
|
|
345
579
|
// Also check if id is the LID and jid field exists
|
|
346
580
|
if (contact.id?.endsWith("@lid") && contact.jid) {
|
|
347
|
-
this.
|
|
348
|
-
if (this.options.debug) {
|
|
349
|
-
console.log(`[Contact LID Mapping] ${contact.id} -> ${contact.jid}`);
|
|
350
|
-
}
|
|
581
|
+
this.addLidMapping(contact.id, contact.jid, "Contact");
|
|
351
582
|
}
|
|
352
583
|
}
|
|
353
584
|
}
|
|
354
|
-
/**
|
|
355
|
-
* Update in-memory contacts store (v0.9.0)
|
|
356
|
-
* @param contacts - Array of contact objects from Baileys
|
|
357
|
-
*/
|
|
358
|
-
updateContactsStore(contacts) {
|
|
359
|
-
for (const contact of contacts) {
|
|
360
|
-
// Extract the JID (prefer non-lid IDs)
|
|
361
|
-
const jid = contact.id?.endsWith("@lid")
|
|
362
|
-
? contact.jid || contact.id
|
|
363
|
-
: contact.id;
|
|
364
|
-
if (!jid)
|
|
365
|
-
continue;
|
|
366
|
-
// Extract phone number from JID
|
|
367
|
-
const phone = jid.endsWith("@s.whatsapp.net")
|
|
368
|
-
? jid.replace("@s.whatsapp.net", "")
|
|
369
|
-
: undefined;
|
|
370
|
-
// Build contact info
|
|
371
|
-
const contactInfo = {
|
|
372
|
-
jid,
|
|
373
|
-
phone,
|
|
374
|
-
name: contact.name || contact.notify || undefined,
|
|
375
|
-
};
|
|
376
|
-
// Update store
|
|
377
|
-
this.contactsStore.set(jid, contactInfo);
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
/**
|
|
381
|
-
* Update in-memory chats store (v0.9.0)
|
|
382
|
-
* @param chats - Array of chat objects from Baileys
|
|
383
|
-
*/
|
|
384
|
-
updateChatsStore(chats) {
|
|
385
|
-
for (const chat of chats) {
|
|
386
|
-
const jid = chat.id;
|
|
387
|
-
if (!jid)
|
|
388
|
-
continue;
|
|
389
|
-
// Extract phone number from JID
|
|
390
|
-
const phone = jid.endsWith("@s.whatsapp.net")
|
|
391
|
-
? jid.replace("@s.whatsapp.net", "")
|
|
392
|
-
: undefined;
|
|
393
|
-
// Build chat info
|
|
394
|
-
const chatInfo = {
|
|
395
|
-
jid,
|
|
396
|
-
phone,
|
|
397
|
-
name: chat.name || undefined,
|
|
398
|
-
isGroup: jid.endsWith("@g.us"),
|
|
399
|
-
lastMessageTimestamp: chat.timestamp || undefined,
|
|
400
|
-
unreadCount: chat.unreadCount || undefined,
|
|
401
|
-
isArchived: chat.archived || false,
|
|
402
|
-
isPinned: chat.pinned || false,
|
|
403
|
-
};
|
|
404
|
-
// Update store
|
|
405
|
-
this.chatsStore.set(jid, chatInfo);
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
585
|
/**
|
|
409
586
|
* Update LID to JID mapping from chat data
|
|
410
587
|
*/
|
|
@@ -412,20 +589,11 @@ export class MiawClient extends EventEmitter {
|
|
|
412
589
|
for (const chat of chats) {
|
|
413
590
|
// Chat may have both id (could be phone or LID) and lidJid
|
|
414
591
|
if (chat.lidJid && chat.id && !chat.id.endsWith("@lid")) {
|
|
415
|
-
|
|
416
|
-
? chat.lidJid
|
|
417
|
-
: `${chat.lidJid}@lid`;
|
|
418
|
-
this.lidToJidMap.set(lid, chat.id);
|
|
419
|
-
if (this.options.debug) {
|
|
420
|
-
console.log(`[Chat LID Mapping] ${lid} -> ${chat.id}`);
|
|
421
|
-
}
|
|
592
|
+
this.addLidMapping(chat.lidJid, chat.id, "Chat");
|
|
422
593
|
}
|
|
423
594
|
// Reverse: if id is LID and we have a phone JID
|
|
424
595
|
if (chat.id?.endsWith("@lid") && chat.jid) {
|
|
425
|
-
this.
|
|
426
|
-
if (this.options.debug) {
|
|
427
|
-
console.log(`[Chat LID Mapping] ${chat.id} -> ${chat.jid}`);
|
|
428
|
-
}
|
|
596
|
+
this.addLidMapping(chat.id, chat.jid, "Chat");
|
|
429
597
|
}
|
|
430
598
|
}
|
|
431
599
|
}
|
|
@@ -469,12 +637,16 @@ export class MiawClient extends EventEmitter {
|
|
|
469
637
|
* Get all registered LID mappings
|
|
470
638
|
* Useful for persisting mappings to storage
|
|
471
639
|
*/
|
|
640
|
+
/**
|
|
641
|
+
* Get all LID to JID mappings (for debugging/monitoring)
|
|
642
|
+
* @returns Record of LID to JID mappings
|
|
643
|
+
*/
|
|
472
644
|
getLidMappings() {
|
|
473
645
|
const result = {};
|
|
474
|
-
//
|
|
475
|
-
|
|
646
|
+
// Use proper encapsulated iteration method
|
|
647
|
+
this.lidToJidMap.forEach((value, key) => {
|
|
476
648
|
result[key] = value;
|
|
477
|
-
}
|
|
649
|
+
});
|
|
478
650
|
return result;
|
|
479
651
|
}
|
|
480
652
|
/**
|
|
@@ -489,6 +661,124 @@ export class MiawClient extends EventEmitter {
|
|
|
489
661
|
clearLidCache() {
|
|
490
662
|
this.lidToJidMap.clear();
|
|
491
663
|
}
|
|
664
|
+
/**
|
|
665
|
+
* Update in-memory contacts store
|
|
666
|
+
* @param contacts - Array of contact objects from Baileys
|
|
667
|
+
*
|
|
668
|
+
* Baileys v7 Contact structure:
|
|
669
|
+
* - id: primary identifier (could be @lid or @s.whatsapp.net)
|
|
670
|
+
* - phoneNumber: phone JID (@s.whatsapp.net) when available
|
|
671
|
+
* - lid: LID JID (@lid) when available
|
|
672
|
+
* - name: contact name saved by user
|
|
673
|
+
* - notify: contact's own display name (push name)
|
|
674
|
+
* - verifiedName: verified business name
|
|
675
|
+
*/
|
|
676
|
+
updateContactsStore(contacts) {
|
|
677
|
+
for (const contact of contacts) {
|
|
678
|
+
let jid = contact.id;
|
|
679
|
+
// Baileys v7: Use phoneNumber when id is LID
|
|
680
|
+
if (jid?.endsWith("@lid") && contact.phoneNumber) {
|
|
681
|
+
// Register LID mapping for future resolution
|
|
682
|
+
this.addLidMapping(contact.id, contact.phoneNumber, "Contact");
|
|
683
|
+
jid = contact.phoneNumber;
|
|
684
|
+
}
|
|
685
|
+
if (!jid)
|
|
686
|
+
continue;
|
|
687
|
+
// Extract phone number from JID
|
|
688
|
+
const phone = jid.endsWith("@s.whatsapp.net")
|
|
689
|
+
? jid.replace("@s.whatsapp.net", "")
|
|
690
|
+
: undefined;
|
|
691
|
+
// Build contact info
|
|
692
|
+
const contactInfo = {
|
|
693
|
+
jid,
|
|
694
|
+
phone,
|
|
695
|
+
name: contact.name || contact.notify || contact.verifiedName || undefined,
|
|
696
|
+
};
|
|
697
|
+
// Update store with phone JID as primary key
|
|
698
|
+
this.contactsStore.set(jid, contactInfo);
|
|
699
|
+
// Also store by LID for lookup if available
|
|
700
|
+
if (contact.lid && contact.lid !== jid) {
|
|
701
|
+
this.contactsStore.set(contact.lid, contactInfo);
|
|
702
|
+
}
|
|
703
|
+
// Also store by original id if different (for LID contacts)
|
|
704
|
+
if (contact.id && contact.id !== jid) {
|
|
705
|
+
this.contactsStore.set(contact.id, contactInfo);
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
// Persist contacts to disk after every update
|
|
709
|
+
// This ensures contacts survive reconnections where history sync may not fire
|
|
710
|
+
if (contacts.length > 0) {
|
|
711
|
+
this.saveContactsToFile();
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
/**
|
|
715
|
+
* Update in-memory chats store
|
|
716
|
+
* @param chats - Array of chat objects from Baileys
|
|
717
|
+
*
|
|
718
|
+
* Baileys v7 Chat structure (proto.IConversation):
|
|
719
|
+
* - id: chat JID (can be @lid or @s.whatsapp.net or @g.us)
|
|
720
|
+
* - pnJid: phone number JID when id is LID
|
|
721
|
+
* - lidJid: LID JID when id is phone
|
|
722
|
+
* - name/displayName: chat display name
|
|
723
|
+
* - conversationTimestamp: last message timestamp
|
|
724
|
+
* - unreadCount, archived, pinned: chat state
|
|
725
|
+
*/
|
|
726
|
+
updateChatsStore(chats) {
|
|
727
|
+
for (const chat of chats) {
|
|
728
|
+
let jid = chat.id;
|
|
729
|
+
if (!jid)
|
|
730
|
+
continue;
|
|
731
|
+
const originalId = jid;
|
|
732
|
+
// Handle LID chats - use pnJid (phone JID) when available
|
|
733
|
+
if (jid.endsWith("@lid") && chat.pnJid) {
|
|
734
|
+
this.addLidMapping(jid, chat.pnJid, "Chat");
|
|
735
|
+
jid = chat.pnJid;
|
|
736
|
+
}
|
|
737
|
+
// Extract phone number from JID
|
|
738
|
+
const phone = jid.endsWith("@s.whatsapp.net")
|
|
739
|
+
? jid.replace("@s.whatsapp.net", "")
|
|
740
|
+
: undefined;
|
|
741
|
+
// Build chat info with proper field mapping for proto.IConversation
|
|
742
|
+
const chatInfo = {
|
|
743
|
+
jid,
|
|
744
|
+
phone,
|
|
745
|
+
name: chat.name || chat.displayName || undefined,
|
|
746
|
+
isGroup: jid.endsWith("@g.us"),
|
|
747
|
+
lastMessageTimestamp: chat.conversationTimestamp
|
|
748
|
+
? Number(chat.conversationTimestamp)
|
|
749
|
+
: (chat.timestamp ? Number(chat.timestamp) : undefined),
|
|
750
|
+
unreadCount: chat.unreadCount || undefined,
|
|
751
|
+
isArchived: chat.archived || false,
|
|
752
|
+
isPinned: !!chat.pinned,
|
|
753
|
+
};
|
|
754
|
+
// Update store with resolved JID as primary key
|
|
755
|
+
this.chatsStore.set(jid, chatInfo);
|
|
756
|
+
// Also store by original LID if different (for lookup)
|
|
757
|
+
if (originalId !== jid) {
|
|
758
|
+
this.chatsStore.set(originalId, chatInfo);
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
// Persist chats to disk after every update
|
|
762
|
+
// This ensures chats survive reconnections where history sync may not fire
|
|
763
|
+
if (chats.length > 0) {
|
|
764
|
+
this.saveChatsToFile();
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
/**
|
|
768
|
+
* Add a message to the store
|
|
769
|
+
* @param msg - Baileys message object
|
|
770
|
+
*/
|
|
771
|
+
addMessageToStore(msg) {
|
|
772
|
+
const normalized = MessageHandler.normalize({ messages: [msg], type: "notify" }, this.logger);
|
|
773
|
+
if (!normalized)
|
|
774
|
+
return;
|
|
775
|
+
const chatJid = normalized.from;
|
|
776
|
+
if (!this.messagesStore.has(chatJid)) {
|
|
777
|
+
this.messagesStore.set(chatJid, []);
|
|
778
|
+
}
|
|
779
|
+
this.messagesStore.get(chatJid).push(normalized);
|
|
780
|
+
this.saveMessagesToFile();
|
|
781
|
+
}
|
|
492
782
|
/**
|
|
493
783
|
* Clear session data for this instance.
|
|
494
784
|
* This will delete all stored authentication credentials.
|
|
@@ -507,12 +797,15 @@ export class MiawClient extends EventEmitter {
|
|
|
507
797
|
clearTimeout(this.reconnectTimer);
|
|
508
798
|
this.reconnectTimer = null;
|
|
509
799
|
}
|
|
800
|
+
// Reset logout flag
|
|
801
|
+
this.loggingOut = false;
|
|
510
802
|
// Clear LID cache
|
|
511
803
|
this.lidToJidMap.clear();
|
|
512
804
|
// Remove all event listeners
|
|
513
805
|
this.removeAllListeners();
|
|
514
806
|
// Close socket if connected
|
|
515
807
|
if (this.socket) {
|
|
808
|
+
this.removeSocketEvents();
|
|
516
809
|
this.socket.end(undefined);
|
|
517
810
|
this.socket = null;
|
|
518
811
|
}
|
|
@@ -528,6 +821,15 @@ export class MiawClient extends EventEmitter {
|
|
|
528
821
|
this.logger.info("Disconnected:", reason, "Code:", statusCode);
|
|
529
822
|
this.updateConnectionState("disconnected");
|
|
530
823
|
this.emit("disconnected", reason);
|
|
824
|
+
// Reset label sync state so next connection will trigger fresh sync
|
|
825
|
+
this.initialLabelSyncPromise = null;
|
|
826
|
+
this.initialLabelSyncComplete = false;
|
|
827
|
+
// Don't reconnect if logging out
|
|
828
|
+
if (this.loggingOut) {
|
|
829
|
+
this.logger.info("Logout in progress, skipping auto-reconnect");
|
|
830
|
+
this.loggingOut = false; // Reset flag
|
|
831
|
+
return false;
|
|
832
|
+
}
|
|
531
833
|
// Don't reconnect if logged out - clear session for fresh QR code on next connect
|
|
532
834
|
if (statusCode === DisconnectReason.loggedOut) {
|
|
533
835
|
this.logger.info("Logged out, clearing session for fresh authentication");
|
|
@@ -549,11 +851,11 @@ export class MiawClient extends EventEmitter {
|
|
|
549
851
|
clearTimeout(this.reconnectTimer);
|
|
550
852
|
}
|
|
551
853
|
this.reconnectAttempts++;
|
|
552
|
-
|
|
854
|
+
// Emit event but don't set state - let connect() handle the state transition
|
|
553
855
|
this.emit("reconnecting", this.reconnectAttempts);
|
|
554
856
|
this.reconnectTimer = setTimeout(() => {
|
|
555
857
|
this.logger.info(`Reconnecting... Attempt ${this.reconnectAttempts}`);
|
|
556
|
-
this.connect();
|
|
858
|
+
this.connect(); // This will set state to "connecting"
|
|
557
859
|
}, this.options.reconnectDelay);
|
|
558
860
|
}
|
|
559
861
|
/**
|
|
@@ -561,7 +863,38 @@ export class MiawClient extends EventEmitter {
|
|
|
561
863
|
*/
|
|
562
864
|
updateConnectionState(state) {
|
|
563
865
|
this.connectionState = state;
|
|
866
|
+
this.connectionStateTimestamp = Date.now();
|
|
564
867
|
this.emit("connection", state);
|
|
868
|
+
// Start watchdog for potentially stuck states
|
|
869
|
+
if (state === "connecting" || state === "reconnecting") {
|
|
870
|
+
this.startConnectionWatchdog();
|
|
871
|
+
}
|
|
872
|
+
else {
|
|
873
|
+
// Clear watchdog if we're no longer in a potentially stuck state
|
|
874
|
+
if (this.connectionWatchdogTimer) {
|
|
875
|
+
clearTimeout(this.connectionWatchdogTimer);
|
|
876
|
+
this.connectionWatchdogTimer = null;
|
|
877
|
+
}
|
|
878
|
+
}
|
|
879
|
+
}
|
|
880
|
+
/**
|
|
881
|
+
* Start watchdog timer to detect stuck connection states
|
|
882
|
+
*/
|
|
883
|
+
startConnectionWatchdog() {
|
|
884
|
+
// Clear any existing watchdog
|
|
885
|
+
if (this.connectionWatchdogTimer) {
|
|
886
|
+
clearTimeout(this.connectionWatchdogTimer);
|
|
887
|
+
}
|
|
888
|
+
this.connectionWatchdogTimer = setTimeout(() => {
|
|
889
|
+
const currentState = this.connectionState;
|
|
890
|
+
const elapsed = Date.now() - this.connectionStateTimestamp;
|
|
891
|
+
// If stuck in connecting/reconnecting for too long, reset to disconnected
|
|
892
|
+
if ((currentState === "connecting" || currentState === "reconnecting") &&
|
|
893
|
+
elapsed >= this.options.stuckStateTimeout) {
|
|
894
|
+
this.logger.warn(`Connection stuck in "${currentState}" state for ${elapsed}ms, resetting`);
|
|
895
|
+
this.updateConnectionState("disconnected");
|
|
896
|
+
}
|
|
897
|
+
}, this.options.stuckStateTimeout);
|
|
565
898
|
}
|
|
566
899
|
/**
|
|
567
900
|
* Send a text message
|
|
@@ -577,6 +910,25 @@ export class MiawClient extends EventEmitter {
|
|
|
577
910
|
if (this.connectionState !== "connected") {
|
|
578
911
|
throw new Error(`Cannot send message. Connection state: ${this.connectionState}`);
|
|
579
912
|
}
|
|
913
|
+
// Validate recipient (phone or JID)
|
|
914
|
+
const isJID = to.includes("@");
|
|
915
|
+
if (isJID) {
|
|
916
|
+
const jidValidation = validateJID(to);
|
|
917
|
+
if (!jidValidation.valid) {
|
|
918
|
+
return { success: false, error: jidValidation.error };
|
|
919
|
+
}
|
|
920
|
+
}
|
|
921
|
+
else {
|
|
922
|
+
const phoneValidation = validatePhoneNumber(to);
|
|
923
|
+
if (!phoneValidation.valid) {
|
|
924
|
+
return { success: false, error: phoneValidation.error };
|
|
925
|
+
}
|
|
926
|
+
}
|
|
927
|
+
// Validate message text
|
|
928
|
+
const textValidation = validateMessageText(text);
|
|
929
|
+
if (!textValidation.valid) {
|
|
930
|
+
return { success: false, error: textValidation.error };
|
|
931
|
+
}
|
|
580
932
|
const jid = MessageHandler.formatPhoneToJid(to);
|
|
581
933
|
// Build send options (for quoting/replying)
|
|
582
934
|
const sendOptions = options?.quoted?.raw
|
|
@@ -914,6 +1266,86 @@ export class MiawClient extends EventEmitter {
|
|
|
914
1266
|
return null;
|
|
915
1267
|
}
|
|
916
1268
|
}
|
|
1269
|
+
/**
|
|
1270
|
+
* Get full contact profile including name, status, picture, and business info
|
|
1271
|
+
* @param jidOrPhone - Contact's JID or phone number
|
|
1272
|
+
* @returns ContactProfile or null if not found
|
|
1273
|
+
*/
|
|
1274
|
+
async getContactProfile(jidOrPhone) {
|
|
1275
|
+
try {
|
|
1276
|
+
if (!this.socket) {
|
|
1277
|
+
throw new Error("Not connected. Call connect() first.");
|
|
1278
|
+
}
|
|
1279
|
+
if (this.connectionState !== "connected") {
|
|
1280
|
+
throw new Error(`Cannot get contact profile. Connection state: ${this.connectionState}`);
|
|
1281
|
+
}
|
|
1282
|
+
const jid = MessageHandler.formatPhoneToJid(jidOrPhone);
|
|
1283
|
+
// Try to resolve LID JID to phone JID
|
|
1284
|
+
const resolvedJid = this.resolveLidToJid(jid);
|
|
1285
|
+
// Extract phone from resolved JID (or use getPhoneFromJid which handles LID resolution)
|
|
1286
|
+
const phone = this.getPhoneFromJid(jid);
|
|
1287
|
+
// Get name from contactsStore - try both original and resolved JID
|
|
1288
|
+
let name;
|
|
1289
|
+
const storedContact = this.contactsStore.get(jid) || this.contactsStore.get(resolvedJid);
|
|
1290
|
+
if (storedContact?.name) {
|
|
1291
|
+
name = storedContact.name;
|
|
1292
|
+
}
|
|
1293
|
+
// Fetch status
|
|
1294
|
+
let status;
|
|
1295
|
+
try {
|
|
1296
|
+
const statusResult = await this.socket.fetchStatus(jid);
|
|
1297
|
+
const firstResult = Array.isArray(statusResult)
|
|
1298
|
+
? statusResult[0]
|
|
1299
|
+
: statusResult;
|
|
1300
|
+
status = firstResult?.status?.status || undefined;
|
|
1301
|
+
}
|
|
1302
|
+
catch {
|
|
1303
|
+
// Status might not be available
|
|
1304
|
+
}
|
|
1305
|
+
// Fetch profile picture URL
|
|
1306
|
+
let pictureUrl;
|
|
1307
|
+
try {
|
|
1308
|
+
pictureUrl = (await this.socket.profilePictureUrl(jid)) || undefined;
|
|
1309
|
+
}
|
|
1310
|
+
catch {
|
|
1311
|
+
// Profile picture might not be available (privacy settings)
|
|
1312
|
+
}
|
|
1313
|
+
// Check if business account and get business profile
|
|
1314
|
+
let isBusiness = false;
|
|
1315
|
+
let business;
|
|
1316
|
+
try {
|
|
1317
|
+
const businessProfile = await this.socket.getBusinessProfile(jid);
|
|
1318
|
+
if (businessProfile) {
|
|
1319
|
+
isBusiness = true;
|
|
1320
|
+
business = {
|
|
1321
|
+
description: businessProfile.description || undefined,
|
|
1322
|
+
category: businessProfile.category || undefined,
|
|
1323
|
+
website: Array.isArray(businessProfile.website)
|
|
1324
|
+
? businessProfile.website[0]
|
|
1325
|
+
: businessProfile.website,
|
|
1326
|
+
email: businessProfile.email || undefined,
|
|
1327
|
+
address: businessProfile.address || undefined,
|
|
1328
|
+
};
|
|
1329
|
+
}
|
|
1330
|
+
}
|
|
1331
|
+
catch {
|
|
1332
|
+
// Not a business account or not available
|
|
1333
|
+
}
|
|
1334
|
+
return {
|
|
1335
|
+
jid,
|
|
1336
|
+
phone,
|
|
1337
|
+
name,
|
|
1338
|
+
status,
|
|
1339
|
+
pictureUrl,
|
|
1340
|
+
isBusiness,
|
|
1341
|
+
business,
|
|
1342
|
+
};
|
|
1343
|
+
}
|
|
1344
|
+
catch (error) {
|
|
1345
|
+
this.logger.error("Failed to get contact profile:", error);
|
|
1346
|
+
return null;
|
|
1347
|
+
}
|
|
1348
|
+
}
|
|
917
1349
|
/**
|
|
918
1350
|
* Get business profile information
|
|
919
1351
|
* @param jidOrPhone - Contact's JID or phone number
|
|
@@ -976,12 +1408,26 @@ export class MiawClient extends EventEmitter {
|
|
|
976
1408
|
// ============================================
|
|
977
1409
|
/**
|
|
978
1410
|
* Fetch all contacts from the in-memory store
|
|
979
|
-
* Note: Contacts are populated via history sync
|
|
1411
|
+
* Note: Contacts are populated via Baileys store history sync
|
|
980
1412
|
* @returns FetchAllContactsResult with list of contacts
|
|
981
1413
|
*/
|
|
982
1414
|
async fetchAllContacts() {
|
|
983
1415
|
try {
|
|
984
|
-
|
|
1416
|
+
// Map contacts and resolve any @lid JIDs that weren't resolved earlier
|
|
1417
|
+
const contacts = Array.from(this.contactsStore.values()).map(contact => {
|
|
1418
|
+
// If jid is @lid and phone is missing, try to resolve using LID cache
|
|
1419
|
+
if (contact.jid.endsWith("@lid") && !contact.phone) {
|
|
1420
|
+
const resolved = this.resolveLidToJid(contact.jid);
|
|
1421
|
+
if (resolved !== contact.jid && resolved.endsWith("@s.whatsapp.net")) {
|
|
1422
|
+
return {
|
|
1423
|
+
...contact,
|
|
1424
|
+
jid: resolved,
|
|
1425
|
+
phone: resolved.replace("@s.whatsapp.net", ""),
|
|
1426
|
+
};
|
|
1427
|
+
}
|
|
1428
|
+
}
|
|
1429
|
+
return contact;
|
|
1430
|
+
});
|
|
985
1431
|
return {
|
|
986
1432
|
success: true,
|
|
987
1433
|
contacts,
|
|
@@ -1059,6 +1505,8 @@ export class MiawClient extends EventEmitter {
|
|
|
1059
1505
|
const phone = jid.endsWith("@s.whatsapp.net")
|
|
1060
1506
|
? jid.replace("@s.whatsapp.net", "")
|
|
1061
1507
|
: undefined;
|
|
1508
|
+
// Get display name from socket user
|
|
1509
|
+
const name = this.socket.user?.name;
|
|
1062
1510
|
// Fetch status
|
|
1063
1511
|
let status;
|
|
1064
1512
|
try {
|
|
@@ -1091,6 +1539,7 @@ export class MiawClient extends EventEmitter {
|
|
|
1091
1539
|
return {
|
|
1092
1540
|
jid,
|
|
1093
1541
|
phone,
|
|
1542
|
+
name,
|
|
1094
1543
|
status,
|
|
1095
1544
|
pictureUrl,
|
|
1096
1545
|
isBusiness,
|
|
@@ -1103,7 +1552,7 @@ export class MiawClient extends EventEmitter {
|
|
|
1103
1552
|
}
|
|
1104
1553
|
/**
|
|
1105
1554
|
* Sync labels from WhatsApp app state
|
|
1106
|
-
* This triggers a resync of
|
|
1555
|
+
* This triggers a resync of ALL app state collections to ensure labels are synced
|
|
1107
1556
|
* Labels will be emitted via labels.edit events and stored in labelsStore
|
|
1108
1557
|
*/
|
|
1109
1558
|
async syncLabelsFromAppState() {
|
|
@@ -1112,9 +1561,11 @@ export class MiawClient extends EventEmitter {
|
|
|
1112
1561
|
}
|
|
1113
1562
|
try {
|
|
1114
1563
|
// resyncAppState is provided by Baileys to sync app state collections
|
|
1115
|
-
//
|
|
1564
|
+
// Sync ALL collections like Baileys does during initial sync
|
|
1565
|
+
// Labels could be in any of: critical_block, critical_unblock_low, regular_high, regular_low, regular
|
|
1116
1566
|
// The second parameter (false) means this is not an initial sync
|
|
1117
|
-
await this.socket.resyncAppState(["regular"], false);
|
|
1567
|
+
await this.socket.resyncAppState(["critical_block", "critical_unblock_low", "regular_high", "regular_low", "regular"], false);
|
|
1568
|
+
this.lastLabelSyncTime = new Date();
|
|
1118
1569
|
this.logger.info("App state sync completed, labels should be populated via labels.edit events");
|
|
1119
1570
|
}
|
|
1120
1571
|
catch (error) {
|
|
@@ -1128,13 +1579,36 @@ export class MiawClient extends EventEmitter {
|
|
|
1128
1579
|
* @param forceSync - If true, force a resync from WhatsApp before returning labels
|
|
1129
1580
|
* @returns FetchAllLabelsResult with list of labels
|
|
1130
1581
|
*/
|
|
1131
|
-
async fetchAllLabels(forceSync = false) {
|
|
1582
|
+
async fetchAllLabels(forceSync = false, syncTimeout = 2000) {
|
|
1132
1583
|
try {
|
|
1133
|
-
//
|
|
1584
|
+
// If initial sync is still in progress, wait for it first
|
|
1585
|
+
// This handles the case where fetchAllLabels is called immediately after connection
|
|
1586
|
+
// (e.g., CLI "get labels" right after connect)
|
|
1587
|
+
if (this.initialLabelSyncPromise && !this.initialLabelSyncComplete) {
|
|
1588
|
+
this.logger.debug("Waiting for initial label sync to complete...");
|
|
1589
|
+
try {
|
|
1590
|
+
await Promise.race([
|
|
1591
|
+
this.initialLabelSyncPromise,
|
|
1592
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error("Initial sync timeout")), 10000)),
|
|
1593
|
+
]);
|
|
1594
|
+
}
|
|
1595
|
+
catch (error) {
|
|
1596
|
+
this.logger.debug("Initial sync wait timed out or failed:", error);
|
|
1597
|
+
}
|
|
1598
|
+
}
|
|
1599
|
+
// Force resync if explicitly requested OR if store is empty (first call)
|
|
1600
|
+
// This ensures labels are always available even if automatic sync hasn't completed
|
|
1134
1601
|
if (forceSync || this.labelsStore.size === 0) {
|
|
1135
1602
|
await this.syncLabelsFromAppState();
|
|
1136
|
-
//
|
|
1137
|
-
|
|
1603
|
+
// Wait for buffered events to process
|
|
1604
|
+
// Baileys uses ev.createBufferedFunction which processes events async
|
|
1605
|
+
await new Promise((resolve) => setTimeout(resolve, syncTimeout));
|
|
1606
|
+
}
|
|
1607
|
+
// If store is still empty after sync, try loading from disk as fallback
|
|
1608
|
+
// This handles reconnection scenarios where resyncAppState returns only patches
|
|
1609
|
+
if (this.labelsStore.size === 0) {
|
|
1610
|
+
this.logger.debug("Labels store still empty after sync, attempting to load from disk");
|
|
1611
|
+
this.loadLabelsFromFile();
|
|
1138
1612
|
}
|
|
1139
1613
|
const labels = Array.from(this.labelsStore.values());
|
|
1140
1614
|
return {
|
|
@@ -1150,9 +1624,366 @@ export class MiawClient extends EventEmitter {
|
|
|
1150
1624
|
};
|
|
1151
1625
|
}
|
|
1152
1626
|
}
|
|
1627
|
+
/**
|
|
1628
|
+
* Get chats that have a specific label
|
|
1629
|
+
* @param labelId - Label ID to query
|
|
1630
|
+
* @returns Array of ChatInfo for chats with this label
|
|
1631
|
+
*/
|
|
1632
|
+
getChatsByLabel(labelId) {
|
|
1633
|
+
const chatJids = this.labelChatsStore.get(labelId);
|
|
1634
|
+
if (!chatJids || chatJids.size === 0) {
|
|
1635
|
+
return [];
|
|
1636
|
+
}
|
|
1637
|
+
const chats = [];
|
|
1638
|
+
for (const jid of chatJids) {
|
|
1639
|
+
const chat = this.chatsStore.get(jid);
|
|
1640
|
+
if (chat) {
|
|
1641
|
+
chats.push(chat);
|
|
1642
|
+
}
|
|
1643
|
+
else {
|
|
1644
|
+
// Chat not in store, create minimal info
|
|
1645
|
+
chats.push({
|
|
1646
|
+
jid,
|
|
1647
|
+
phone: jid.replace(/@s\.whatsapp\.net$/, ""),
|
|
1648
|
+
isGroup: jid.endsWith("@g.us"),
|
|
1649
|
+
});
|
|
1650
|
+
}
|
|
1651
|
+
}
|
|
1652
|
+
return chats;
|
|
1653
|
+
}
|
|
1654
|
+
/**
|
|
1655
|
+
* Get the count of label events received
|
|
1656
|
+
* Useful for debugging label sync issues
|
|
1657
|
+
* @returns Number of labels.edit events received since connection
|
|
1658
|
+
*/
|
|
1659
|
+
getLabelEventCount() {
|
|
1660
|
+
return this.labelEventCount;
|
|
1661
|
+
}
|
|
1662
|
+
/**
|
|
1663
|
+
* Get detailed information about the labels store
|
|
1664
|
+
* Useful for debugging label sync issues
|
|
1665
|
+
* @returns Object with store size, event count, and last sync time
|
|
1666
|
+
*/
|
|
1667
|
+
getLabelsStoreInfo() {
|
|
1668
|
+
return {
|
|
1669
|
+
size: this.labelsStore.size,
|
|
1670
|
+
eventCount: this.labelEventCount,
|
|
1671
|
+
lastSyncTime: this.lastLabelSyncTime,
|
|
1672
|
+
};
|
|
1673
|
+
}
|
|
1674
|
+
// =============================================================================
|
|
1675
|
+
// Persistent Label Storage
|
|
1676
|
+
// =============================================================================
|
|
1677
|
+
/**
|
|
1678
|
+
* Get the path to the labels storage file
|
|
1679
|
+
*/
|
|
1680
|
+
getLabelsFilePath() {
|
|
1681
|
+
return path.join(this.options.sessionPath, this.options.instanceId, "labels.json");
|
|
1682
|
+
}
|
|
1683
|
+
/**
|
|
1684
|
+
* Save labels to disk for persistence across reconnections
|
|
1685
|
+
* WhatsApp's resyncAppState only returns patches (not full snapshot) when version > 0,
|
|
1686
|
+
* so we need to persist labels locally to survive reconnections
|
|
1687
|
+
*/
|
|
1688
|
+
saveLabelsToFile() {
|
|
1689
|
+
try {
|
|
1690
|
+
const labelsPath = this.getLabelsFilePath();
|
|
1691
|
+
const labelsDir = path.dirname(labelsPath);
|
|
1692
|
+
// Ensure directory exists
|
|
1693
|
+
if (!fs.existsSync(labelsDir)) {
|
|
1694
|
+
fs.mkdirSync(labelsDir, { recursive: true });
|
|
1695
|
+
}
|
|
1696
|
+
// Convert Map to array for JSON serialization
|
|
1697
|
+
const labelsData = Array.from(this.labelsStore.values());
|
|
1698
|
+
fs.writeFileSync(labelsPath, JSON.stringify(labelsData, null, 2), "utf8");
|
|
1699
|
+
this.logger.debug(`Saved ${labelsData.length} labels to ${labelsPath}`);
|
|
1700
|
+
}
|
|
1701
|
+
catch (error) {
|
|
1702
|
+
this.logger.warn("Failed to save labels to file:", error);
|
|
1703
|
+
}
|
|
1704
|
+
}
|
|
1705
|
+
/**
|
|
1706
|
+
* Load labels from disk
|
|
1707
|
+
* Called on connection to restore labels from previous session
|
|
1708
|
+
*/
|
|
1709
|
+
loadLabelsFromFile() {
|
|
1710
|
+
try {
|
|
1711
|
+
const labelsPath = this.getLabelsFilePath();
|
|
1712
|
+
if (!fs.existsSync(labelsPath)) {
|
|
1713
|
+
this.logger.debug("No labels file found, starting with empty store");
|
|
1714
|
+
return;
|
|
1715
|
+
}
|
|
1716
|
+
const labelsData = JSON.parse(fs.readFileSync(labelsPath, "utf8"));
|
|
1717
|
+
if (Array.isArray(labelsData)) {
|
|
1718
|
+
// Clear existing store and populate from file
|
|
1719
|
+
this.labelsStore.clear();
|
|
1720
|
+
for (const label of labelsData) {
|
|
1721
|
+
if (label.id) {
|
|
1722
|
+
this.labelsStore.set(label.id, label);
|
|
1723
|
+
}
|
|
1724
|
+
}
|
|
1725
|
+
this.logger.info(`Loaded ${this.labelsStore.size} labels from disk`);
|
|
1726
|
+
}
|
|
1727
|
+
}
|
|
1728
|
+
catch (error) {
|
|
1729
|
+
this.logger.warn("Failed to load labels from file:", error);
|
|
1730
|
+
}
|
|
1731
|
+
}
|
|
1732
|
+
// ============================================
|
|
1733
|
+
// CONTACTS PERSISTENCE
|
|
1734
|
+
// ============================================
|
|
1735
|
+
getContactsFilePath() {
|
|
1736
|
+
return path.join(this.options.sessionPath, this.options.instanceId, "contacts.json");
|
|
1737
|
+
}
|
|
1738
|
+
/**
|
|
1739
|
+
* Save contacts to disk for persistence across reconnections
|
|
1740
|
+
* Baileys v7 history sync doesn't always fire, so we persist contacts locally
|
|
1741
|
+
*/
|
|
1742
|
+
saveContactsToFile() {
|
|
1743
|
+
try {
|
|
1744
|
+
const contactsPath = this.getContactsFilePath();
|
|
1745
|
+
const contactsDir = path.dirname(contactsPath);
|
|
1746
|
+
// Ensure directory exists
|
|
1747
|
+
if (!fs.existsSync(contactsDir)) {
|
|
1748
|
+
fs.mkdirSync(contactsDir, { recursive: true });
|
|
1749
|
+
}
|
|
1750
|
+
// Convert Map to array for JSON serialization
|
|
1751
|
+
// Deduplicate by jid (Map may have same contact under multiple keys)
|
|
1752
|
+
const uniqueContacts = new Map();
|
|
1753
|
+
for (const contact of this.contactsStore.values()) {
|
|
1754
|
+
if (contact.jid && !uniqueContacts.has(contact.jid)) {
|
|
1755
|
+
uniqueContacts.set(contact.jid, contact);
|
|
1756
|
+
}
|
|
1757
|
+
}
|
|
1758
|
+
const contactsData = Array.from(uniqueContacts.values());
|
|
1759
|
+
fs.writeFileSync(contactsPath, JSON.stringify(contactsData, null, 2), "utf8");
|
|
1760
|
+
this.logger.debug(`Saved ${contactsData.length} contacts to ${contactsPath}`);
|
|
1761
|
+
}
|
|
1762
|
+
catch (error) {
|
|
1763
|
+
this.logger.warn("Failed to save contacts to file:", error);
|
|
1764
|
+
}
|
|
1765
|
+
}
|
|
1766
|
+
/**
|
|
1767
|
+
* Load contacts from disk
|
|
1768
|
+
* Called on connection to restore contacts from previous session
|
|
1769
|
+
*/
|
|
1770
|
+
loadContactsFromFile() {
|
|
1771
|
+
try {
|
|
1772
|
+
const contactsPath = this.getContactsFilePath();
|
|
1773
|
+
if (!fs.existsSync(contactsPath)) {
|
|
1774
|
+
this.logger.debug("No contacts file found, starting with empty store");
|
|
1775
|
+
return;
|
|
1776
|
+
}
|
|
1777
|
+
const contactsData = JSON.parse(fs.readFileSync(contactsPath, "utf8"));
|
|
1778
|
+
if (Array.isArray(contactsData)) {
|
|
1779
|
+
// Clear existing store and populate from file
|
|
1780
|
+
this.contactsStore.clear();
|
|
1781
|
+
for (const contact of contactsData) {
|
|
1782
|
+
if (contact.jid) {
|
|
1783
|
+
this.contactsStore.set(contact.jid, contact);
|
|
1784
|
+
}
|
|
1785
|
+
}
|
|
1786
|
+
this.logger.info(`Loaded ${this.contactsStore.size} contacts from disk`);
|
|
1787
|
+
}
|
|
1788
|
+
}
|
|
1789
|
+
catch (error) {
|
|
1790
|
+
this.logger.warn("Failed to load contacts from file:", error);
|
|
1791
|
+
}
|
|
1792
|
+
}
|
|
1793
|
+
// ============================================
|
|
1794
|
+
// LID MAPPINGS PERSISTENCE
|
|
1795
|
+
// ============================================
|
|
1796
|
+
getLidMappingsFilePath() {
|
|
1797
|
+
return path.join(this.options.sessionPath, this.options.instanceId, "lid-mappings.json");
|
|
1798
|
+
}
|
|
1799
|
+
/**
|
|
1800
|
+
* Save LID-to-JID mappings to disk for persistence across reconnections
|
|
1801
|
+
* This ensures @lid JIDs can be resolved to phone numbers even after restart
|
|
1802
|
+
*/
|
|
1803
|
+
saveLidMappingsToFile() {
|
|
1804
|
+
try {
|
|
1805
|
+
const mappingsPath = this.getLidMappingsFilePath();
|
|
1806
|
+
const mappingsDir = path.dirname(mappingsPath);
|
|
1807
|
+
// Ensure directory exists
|
|
1808
|
+
if (!fs.existsSync(mappingsDir)) {
|
|
1809
|
+
fs.mkdirSync(mappingsDir, { recursive: true });
|
|
1810
|
+
}
|
|
1811
|
+
// Get all mappings from the LRU cache
|
|
1812
|
+
const mappings = this.getLidMappings();
|
|
1813
|
+
const count = Object.keys(mappings).length;
|
|
1814
|
+
if (count > 0) {
|
|
1815
|
+
fs.writeFileSync(mappingsPath, JSON.stringify(mappings, null, 2), "utf8");
|
|
1816
|
+
this.logger.debug(`Saved ${count} LID mappings to ${mappingsPath}`);
|
|
1817
|
+
}
|
|
1818
|
+
}
|
|
1819
|
+
catch (error) {
|
|
1820
|
+
this.logger.warn("Failed to save LID mappings to file:", error);
|
|
1821
|
+
}
|
|
1822
|
+
}
|
|
1823
|
+
/**
|
|
1824
|
+
* Load LID-to-JID mappings from disk
|
|
1825
|
+
* Called on connection BEFORE loading chats to ensure resolution works
|
|
1826
|
+
*/
|
|
1827
|
+
loadLidMappingsFromFile() {
|
|
1828
|
+
try {
|
|
1829
|
+
const mappingsPath = this.getLidMappingsFilePath();
|
|
1830
|
+
if (!fs.existsSync(mappingsPath)) {
|
|
1831
|
+
this.logger.debug("No LID mappings file found, starting with empty cache");
|
|
1832
|
+
return;
|
|
1833
|
+
}
|
|
1834
|
+
const mappingsData = JSON.parse(fs.readFileSync(mappingsPath, "utf8"));
|
|
1835
|
+
if (typeof mappingsData === "object" && mappingsData !== null) {
|
|
1836
|
+
let count = 0;
|
|
1837
|
+
for (const [lid, jid] of Object.entries(mappingsData)) {
|
|
1838
|
+
if (typeof lid === "string" && typeof jid === "string") {
|
|
1839
|
+
this.lidToJidMap.set(lid, jid);
|
|
1840
|
+
count++;
|
|
1841
|
+
}
|
|
1842
|
+
}
|
|
1843
|
+
this.logger.info(`Loaded ${count} LID mappings from disk`);
|
|
1844
|
+
}
|
|
1845
|
+
}
|
|
1846
|
+
catch (error) {
|
|
1847
|
+
this.logger.warn("Failed to load LID mappings from file:", error);
|
|
1848
|
+
}
|
|
1849
|
+
}
|
|
1850
|
+
// ============================================
|
|
1851
|
+
// CHATS PERSISTENCE
|
|
1852
|
+
// ============================================
|
|
1853
|
+
getChatsFilePath() {
|
|
1854
|
+
return path.join(this.options.sessionPath, this.options.instanceId, "chats.json");
|
|
1855
|
+
}
|
|
1856
|
+
/**
|
|
1857
|
+
* Save chats to disk for persistence across reconnections
|
|
1858
|
+
* Baileys v7 history sync doesn't always fire, so we persist chats locally
|
|
1859
|
+
*/
|
|
1860
|
+
saveChatsToFile() {
|
|
1861
|
+
try {
|
|
1862
|
+
const chatsPath = this.getChatsFilePath();
|
|
1863
|
+
const chatsDir = path.dirname(chatsPath);
|
|
1864
|
+
// Ensure directory exists
|
|
1865
|
+
if (!fs.existsSync(chatsDir)) {
|
|
1866
|
+
fs.mkdirSync(chatsDir, { recursive: true });
|
|
1867
|
+
}
|
|
1868
|
+
// Convert Map to array for JSON serialization
|
|
1869
|
+
// Deduplicate by jid (Map may have same chat under multiple keys)
|
|
1870
|
+
const uniqueChats = new Map();
|
|
1871
|
+
for (const chat of this.chatsStore.values()) {
|
|
1872
|
+
if (chat.jid && !uniqueChats.has(chat.jid)) {
|
|
1873
|
+
uniqueChats.set(chat.jid, chat);
|
|
1874
|
+
}
|
|
1875
|
+
}
|
|
1876
|
+
const chatsData = Array.from(uniqueChats.values());
|
|
1877
|
+
fs.writeFileSync(chatsPath, JSON.stringify(chatsData, null, 2), "utf8");
|
|
1878
|
+
this.logger.debug(`Saved ${chatsData.length} chats to ${chatsPath}`);
|
|
1879
|
+
}
|
|
1880
|
+
catch (error) {
|
|
1881
|
+
this.logger.warn("Failed to save chats to file:", error);
|
|
1882
|
+
}
|
|
1883
|
+
}
|
|
1884
|
+
/**
|
|
1885
|
+
* Load chats from disk
|
|
1886
|
+
* Called on connection to restore chats from previous session
|
|
1887
|
+
*/
|
|
1888
|
+
loadChatsFromFile() {
|
|
1889
|
+
try {
|
|
1890
|
+
const chatsPath = this.getChatsFilePath();
|
|
1891
|
+
if (!fs.existsSync(chatsPath)) {
|
|
1892
|
+
this.logger.debug("No chats file found, starting with empty store");
|
|
1893
|
+
return;
|
|
1894
|
+
}
|
|
1895
|
+
const chatsData = JSON.parse(fs.readFileSync(chatsPath, "utf8"));
|
|
1896
|
+
if (Array.isArray(chatsData)) {
|
|
1897
|
+
// Clear existing store and populate from file
|
|
1898
|
+
this.chatsStore.clear();
|
|
1899
|
+
for (const chat of chatsData) {
|
|
1900
|
+
if (chat.jid) {
|
|
1901
|
+
this.chatsStore.set(chat.jid, chat);
|
|
1902
|
+
}
|
|
1903
|
+
}
|
|
1904
|
+
this.logger.info(`Loaded ${this.chatsStore.size} chats from disk`);
|
|
1905
|
+
}
|
|
1906
|
+
}
|
|
1907
|
+
catch (error) {
|
|
1908
|
+
this.logger.warn("Failed to load chats from file:", error);
|
|
1909
|
+
}
|
|
1910
|
+
}
|
|
1911
|
+
// ============================================
|
|
1912
|
+
// MESSAGES PERSISTENCE
|
|
1913
|
+
// ============================================
|
|
1914
|
+
getMessagesFilePath() {
|
|
1915
|
+
return path.join(this.options.sessionPath, this.options.instanceId, "messages.json");
|
|
1916
|
+
}
|
|
1917
|
+
/**
|
|
1918
|
+
* Save messages to disk for persistence across reconnections
|
|
1919
|
+
* Baileys v7 history sync doesn't always fire, so we persist messages locally
|
|
1920
|
+
*/
|
|
1921
|
+
saveMessagesToFile() {
|
|
1922
|
+
try {
|
|
1923
|
+
const messagesPath = this.getMessagesFilePath();
|
|
1924
|
+
const messagesDir = path.dirname(messagesPath);
|
|
1925
|
+
// Ensure directory exists
|
|
1926
|
+
if (!fs.existsSync(messagesDir)) {
|
|
1927
|
+
fs.mkdirSync(messagesDir, { recursive: true });
|
|
1928
|
+
}
|
|
1929
|
+
// Convert Map to object for JSON serialization
|
|
1930
|
+
// Structure: { "jid1": [msg1, msg2], "jid2": [msg3] }
|
|
1931
|
+
const messagesData = {};
|
|
1932
|
+
for (const [jid, messages] of this.messagesStore.entries()) {
|
|
1933
|
+
messagesData[jid] = messages;
|
|
1934
|
+
}
|
|
1935
|
+
// Count total messages
|
|
1936
|
+
const totalMessages = Array.from(this.messagesStore.values()).reduce((sum, msgs) => sum + msgs.length, 0);
|
|
1937
|
+
fs.writeFileSync(messagesPath, JSON.stringify(messagesData, null, 2), "utf8");
|
|
1938
|
+
this.logger.debug(`Saved ${totalMessages} messages across ${this.messagesStore.size} chats to ${messagesPath}`);
|
|
1939
|
+
}
|
|
1940
|
+
catch (error) {
|
|
1941
|
+
this.logger.warn("Failed to save messages to file:", error);
|
|
1942
|
+
}
|
|
1943
|
+
}
|
|
1944
|
+
/**
|
|
1945
|
+
* Load messages from disk
|
|
1946
|
+
* Called on connection to restore messages from previous session
|
|
1947
|
+
*/
|
|
1948
|
+
loadMessagesFromFile() {
|
|
1949
|
+
try {
|
|
1950
|
+
const messagesPath = this.getMessagesFilePath();
|
|
1951
|
+
if (!fs.existsSync(messagesPath)) {
|
|
1952
|
+
this.logger.debug("No messages file found, starting with empty store");
|
|
1953
|
+
return;
|
|
1954
|
+
}
|
|
1955
|
+
const messagesData = JSON.parse(fs.readFileSync(messagesPath, "utf8"));
|
|
1956
|
+
if (messagesData && typeof messagesData === "object") {
|
|
1957
|
+
// Clear existing store and populate from file
|
|
1958
|
+
this.messagesStore.clear();
|
|
1959
|
+
let totalMessages = 0;
|
|
1960
|
+
for (const [jid, messages] of Object.entries(messagesData)) {
|
|
1961
|
+
if (Array.isArray(messages)) {
|
|
1962
|
+
this.messagesStore.set(jid, messages);
|
|
1963
|
+
totalMessages += messages.length;
|
|
1964
|
+
}
|
|
1965
|
+
}
|
|
1966
|
+
this.logger.info(`Loaded ${totalMessages} messages across ${this.messagesStore.size} chats from disk`);
|
|
1967
|
+
}
|
|
1968
|
+
}
|
|
1969
|
+
catch (error) {
|
|
1970
|
+
this.logger.warn("Failed to load messages from file:", error);
|
|
1971
|
+
}
|
|
1972
|
+
}
|
|
1973
|
+
/**
|
|
1974
|
+
* Get message counts for all chats
|
|
1975
|
+
* @returns Map of JID to message count
|
|
1976
|
+
*/
|
|
1977
|
+
getMessageCounts() {
|
|
1978
|
+
const counts = new Map();
|
|
1979
|
+
for (const [jid, messages] of this.messagesStore.entries()) {
|
|
1980
|
+
counts.set(jid, messages.length);
|
|
1981
|
+
}
|
|
1982
|
+
return counts;
|
|
1983
|
+
}
|
|
1153
1984
|
/**
|
|
1154
1985
|
* Get chat messages from the in-memory store
|
|
1155
|
-
* Note: Messages are populated via
|
|
1986
|
+
* Note: Messages are populated via Baileys store history sync
|
|
1156
1987
|
* @param jidOrPhone - Chat JID or phone number
|
|
1157
1988
|
* @returns FetchChatMessagesResult with list of messages
|
|
1158
1989
|
*/
|
|
@@ -1173,14 +2004,104 @@ export class MiawClient extends EventEmitter {
|
|
|
1173
2004
|
};
|
|
1174
2005
|
}
|
|
1175
2006
|
}
|
|
2007
|
+
/**
|
|
2008
|
+
* Load more (older) messages for a specific chat
|
|
2009
|
+
* Uses Baileys fetchMessageHistory to fetch earlier messages
|
|
2010
|
+
* @param jidOrPhone - Chat JID or phone number
|
|
2011
|
+
* @param count - Number of messages to fetch (max 50)
|
|
2012
|
+
* @param timeoutMs - Timeout in milliseconds (default 30000)
|
|
2013
|
+
* @returns Result with number of messages loaded and whether more are available
|
|
2014
|
+
*/
|
|
2015
|
+
async loadMoreMessages(jidOrPhone, count = 50, timeoutMs = 30000) {
|
|
2016
|
+
try {
|
|
2017
|
+
if (!this.socket) {
|
|
2018
|
+
return { success: false, error: "Not connected. Call connect() first." };
|
|
2019
|
+
}
|
|
2020
|
+
if (this.connectionState !== "connected") {
|
|
2021
|
+
return { success: false, error: `Cannot load messages. Connection state: ${this.connectionState}` };
|
|
2022
|
+
}
|
|
2023
|
+
const jid = MessageHandler.formatPhoneToJid(jidOrPhone);
|
|
2024
|
+
const messages = this.messagesStore.get(jid) || [];
|
|
2025
|
+
if (messages.length === 0) {
|
|
2026
|
+
return { success: false, error: "No messages in store to paginate from. Send or receive a message first." };
|
|
2027
|
+
}
|
|
2028
|
+
// Find the oldest message (messages are stored newest first after history sync)
|
|
2029
|
+
// We need the raw Baileys message for the key and timestamp
|
|
2030
|
+
let oldestMessage = null;
|
|
2031
|
+
let oldestTimestamp = Infinity;
|
|
2032
|
+
for (const msg of messages) {
|
|
2033
|
+
if (msg.timestamp < oldestTimestamp) {
|
|
2034
|
+
oldestTimestamp = msg.timestamp;
|
|
2035
|
+
oldestMessage = msg;
|
|
2036
|
+
}
|
|
2037
|
+
}
|
|
2038
|
+
if (!oldestMessage || !oldestMessage.raw) {
|
|
2039
|
+
return { success: false, error: "Cannot find message with raw data for pagination cursor." };
|
|
2040
|
+
}
|
|
2041
|
+
const rawMsg = oldestMessage.raw;
|
|
2042
|
+
const msgKey = rawMsg.key;
|
|
2043
|
+
const msgTimestamp = rawMsg.messageTimestamp;
|
|
2044
|
+
if (!msgKey || !msgTimestamp) {
|
|
2045
|
+
return { success: false, error: "Message missing key or timestamp for pagination." };
|
|
2046
|
+
}
|
|
2047
|
+
// Clamp count to max 50
|
|
2048
|
+
const fetchCount = Math.min(count, 50);
|
|
2049
|
+
const initialCount = messages.length;
|
|
2050
|
+
this.logger.debug(`Fetching ${fetchCount} older messages for ${jid} (current: ${initialCount})`);
|
|
2051
|
+
// Call Baileys fetchMessageHistory
|
|
2052
|
+
const sessionId = await this.socket.fetchMessageHistory(fetchCount, msgKey, typeof msgTimestamp === 'number' ? msgTimestamp * 1000 : Number(msgTimestamp) * 1000);
|
|
2053
|
+
this.logger.debug(`History fetch initiated with sessionId: ${sessionId}`);
|
|
2054
|
+
// Create a Promise that will be resolved when the history arrives
|
|
2055
|
+
return new Promise((resolve) => {
|
|
2056
|
+
// Set up timeout
|
|
2057
|
+
const timeout = setTimeout(() => {
|
|
2058
|
+
this.pendingHistoryRequests.delete(sessionId);
|
|
2059
|
+
resolve({
|
|
2060
|
+
success: false,
|
|
2061
|
+
error: `Timeout waiting for history (${timeoutMs}ms)`,
|
|
2062
|
+
});
|
|
2063
|
+
}, timeoutMs);
|
|
2064
|
+
// Store the pending request
|
|
2065
|
+
this.pendingHistoryRequests.set(sessionId, {
|
|
2066
|
+
jid,
|
|
2067
|
+
initialCount,
|
|
2068
|
+
resolve: (result) => {
|
|
2069
|
+
clearTimeout(timeout);
|
|
2070
|
+
resolve(result);
|
|
2071
|
+
},
|
|
2072
|
+
});
|
|
2073
|
+
});
|
|
2074
|
+
}
|
|
2075
|
+
catch (error) {
|
|
2076
|
+
this.logger.error("Failed to load more messages:", error);
|
|
2077
|
+
return {
|
|
2078
|
+
success: false,
|
|
2079
|
+
error: error.message,
|
|
2080
|
+
};
|
|
2081
|
+
}
|
|
2082
|
+
}
|
|
1176
2083
|
/**
|
|
1177
2084
|
* Fetch all chats from the in-memory store
|
|
1178
|
-
* Note: Chats are populated via history sync
|
|
2085
|
+
* Note: Chats are populated via Baileys store history sync
|
|
1179
2086
|
* @returns FetchAllChatsResult with list of chats
|
|
1180
2087
|
*/
|
|
1181
2088
|
async fetchAllChats() {
|
|
1182
2089
|
try {
|
|
1183
|
-
|
|
2090
|
+
// Map chats and resolve any @lid JIDs that weren't resolved earlier
|
|
2091
|
+
const chats = Array.from(this.chatsStore.values()).map(chat => {
|
|
2092
|
+
// If jid is @lid and phone is missing, try to resolve using LID cache
|
|
2093
|
+
if (chat.jid.endsWith("@lid") && !chat.phone) {
|
|
2094
|
+
const resolved = this.resolveLidToJid(chat.jid);
|
|
2095
|
+
if (resolved !== chat.jid && resolved.endsWith("@s.whatsapp.net")) {
|
|
2096
|
+
return {
|
|
2097
|
+
...chat,
|
|
2098
|
+
jid: resolved,
|
|
2099
|
+
phone: resolved.replace("@s.whatsapp.net", ""),
|
|
2100
|
+
};
|
|
2101
|
+
}
|
|
2102
|
+
}
|
|
2103
|
+
return chat;
|
|
2104
|
+
});
|
|
1184
2105
|
return {
|
|
1185
2106
|
success: true,
|
|
1186
2107
|
chats,
|
|
@@ -1607,6 +2528,16 @@ export class MiawClient extends EventEmitter {
|
|
|
1607
2528
|
if (this.connectionState !== "connected") {
|
|
1608
2529
|
throw new Error(`Cannot create group. Connection state: ${this.connectionState}`);
|
|
1609
2530
|
}
|
|
2531
|
+
// Validate group name
|
|
2532
|
+
const nameValidation = validateGroupName(name);
|
|
2533
|
+
if (!nameValidation.valid) {
|
|
2534
|
+
return { success: false, error: nameValidation.error };
|
|
2535
|
+
}
|
|
2536
|
+
// Validate participant phone numbers
|
|
2537
|
+
const phonesValidation = validatePhoneNumbers(participants);
|
|
2538
|
+
if (!phonesValidation.valid) {
|
|
2539
|
+
return { success: false, error: phonesValidation.error };
|
|
2540
|
+
}
|
|
1610
2541
|
// Format participant JIDs
|
|
1611
2542
|
const formattedParticipants = participants.map((p) => MessageHandler.formatPhoneToJid(p));
|
|
1612
2543
|
const metadata = await this.socket.groupCreate(name, formattedParticipants);
|
|
@@ -3184,7 +4115,9 @@ export class MiawClient extends EventEmitter {
|
|
|
3184
4115
|
return mimeTypes[ext] || "application/octet-stream";
|
|
3185
4116
|
}
|
|
3186
4117
|
/**
|
|
3187
|
-
* Disconnect from WhatsApp
|
|
4118
|
+
* Disconnect from WhatsApp without logging out.
|
|
4119
|
+
* The session is preserved and can be used to reconnect later without scanning QR again.
|
|
4120
|
+
* Use logout() if you want to fully log out and require a new QR code.
|
|
3188
4121
|
*/
|
|
3189
4122
|
async disconnect() {
|
|
3190
4123
|
if (this.reconnectTimer) {
|
|
@@ -3192,11 +4125,127 @@ export class MiawClient extends EventEmitter {
|
|
|
3192
4125
|
this.reconnectTimer = null;
|
|
3193
4126
|
}
|
|
3194
4127
|
if (this.socket) {
|
|
3195
|
-
|
|
4128
|
+
// Use end() instead of logout() to preserve session
|
|
4129
|
+
// logout() would clear credentials and require new QR scan
|
|
4130
|
+
this.socket.end(undefined);
|
|
3196
4131
|
this.socket = null;
|
|
3197
4132
|
}
|
|
4133
|
+
// Cleanup console filter if it was enabled (reference counted)
|
|
4134
|
+
if (!this.options.debug) {
|
|
4135
|
+
disableConsoleFilter();
|
|
4136
|
+
}
|
|
3198
4137
|
this.updateConnectionState("disconnected");
|
|
3199
|
-
this.logger.info("Disconnected");
|
|
4138
|
+
this.logger.info("Disconnected (session preserved)");
|
|
4139
|
+
}
|
|
4140
|
+
/**
|
|
4141
|
+
* Logout from WhatsApp and clear session.
|
|
4142
|
+
* After calling this, the next connect() will require scanning a new QR code.
|
|
4143
|
+
*
|
|
4144
|
+
* This method:
|
|
4145
|
+
* 1. Attempts to reconnect if disconnected (max 10 seconds)
|
|
4146
|
+
* 2. Sends a logout request to WhatsApp servers using socket.query() to wait for acknowledgment
|
|
4147
|
+
* 3. Clears local session files
|
|
4148
|
+
* 4. Closes the connection
|
|
4149
|
+
*
|
|
4150
|
+
* Note: The socket.query() method waits for WhatsApp's acknowledgment before proceeding.
|
|
4151
|
+
* This is more reliable than Baileys' native socket.logout() which uses sendNode() (fire-and-forget).
|
|
4152
|
+
*/
|
|
4153
|
+
async logout() {
|
|
4154
|
+
// Set flag to prevent auto-reconnect during logout
|
|
4155
|
+
this.loggingOut = true;
|
|
4156
|
+
// Clear any pending reconnection
|
|
4157
|
+
if (this.reconnectTimer) {
|
|
4158
|
+
clearTimeout(this.reconnectTimer);
|
|
4159
|
+
this.reconnectTimer = null;
|
|
4160
|
+
}
|
|
4161
|
+
// Get JID from auth state (if connected) or load from session file
|
|
4162
|
+
let jid = this.authState?.creds?.me?.id;
|
|
4163
|
+
// If not in memory, try loading from session file
|
|
4164
|
+
if (!jid && this.authState) {
|
|
4165
|
+
jid = this.authState.creds.me?.id;
|
|
4166
|
+
this.logger.info(`Retrieved JID from auth state: ${jid ? 'JID found' : 'no JID'}`);
|
|
4167
|
+
}
|
|
4168
|
+
// If still not found, try initializing auth handler
|
|
4169
|
+
if (!jid) {
|
|
4170
|
+
try {
|
|
4171
|
+
const { state } = await this.authHandler.initialize();
|
|
4172
|
+
jid = state.creds.me?.id;
|
|
4173
|
+
this.logger.info(`Loaded credentials from session file: ${jid ? 'JID found' : 'no JID'}`);
|
|
4174
|
+
}
|
|
4175
|
+
catch (error) {
|
|
4176
|
+
this.logger.warn(`Failed to load credentials from session file: ${error}`);
|
|
4177
|
+
}
|
|
4178
|
+
}
|
|
4179
|
+
if (!jid) {
|
|
4180
|
+
this.logger.warn("No credentials found - cannot send logout request to server");
|
|
4181
|
+
this.updateConnectionState("disconnected");
|
|
4182
|
+
return;
|
|
4183
|
+
}
|
|
4184
|
+
// If disconnected, try to reconnect temporarily (only if we have credentials)
|
|
4185
|
+
if ((!this.socket || this.connectionState !== "connected") && jid) {
|
|
4186
|
+
this.logger.info("Not connected - attempting quick reconnect for logout");
|
|
4187
|
+
try {
|
|
4188
|
+
// Race between connect+wait and timeout to prevent hanging
|
|
4189
|
+
await Promise.race([
|
|
4190
|
+
(async () => {
|
|
4191
|
+
await this.connect();
|
|
4192
|
+
await this.waitForState("connected", 5000);
|
|
4193
|
+
})(),
|
|
4194
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error("Reconnect timeout")), 5000))
|
|
4195
|
+
]);
|
|
4196
|
+
this.logger.info("Reconnected successfully for logout");
|
|
4197
|
+
}
|
|
4198
|
+
catch (error) {
|
|
4199
|
+
this.logger.warn(`Quick reconnect failed: ${error instanceof Error ? error.message : error}`);
|
|
4200
|
+
// Continue with local cleanup even if reconnect fails
|
|
4201
|
+
}
|
|
4202
|
+
}
|
|
4203
|
+
// Send logout request using query() to wait for response
|
|
4204
|
+
if (this.socket && this.connectionState === "connected") {
|
|
4205
|
+
try {
|
|
4206
|
+
this.logger.info("Sending logout request to WhatsApp server...");
|
|
4207
|
+
// Use query() instead of sendNode() to wait for response
|
|
4208
|
+
// This works around Baileys' socket.logout() using sendNode() which
|
|
4209
|
+
// closes the connection before WhatsApp can process the request
|
|
4210
|
+
// Note: socket.query() auto-generates the 'id' attribute if not provided
|
|
4211
|
+
await this.socket.query({
|
|
4212
|
+
tag: 'iq',
|
|
4213
|
+
attrs: {
|
|
4214
|
+
to: "s.whatsapp.net",
|
|
4215
|
+
type: 'set',
|
|
4216
|
+
xmlns: 'md'
|
|
4217
|
+
},
|
|
4218
|
+
content: [{
|
|
4219
|
+
tag: 'remove-companion-device',
|
|
4220
|
+
attrs: {
|
|
4221
|
+
jid,
|
|
4222
|
+
reason: 'user_initiated'
|
|
4223
|
+
}
|
|
4224
|
+
}]
|
|
4225
|
+
});
|
|
4226
|
+
this.logger.info("Logout request acknowledged by WhatsApp server");
|
|
4227
|
+
}
|
|
4228
|
+
catch (error) {
|
|
4229
|
+
this.logger.warn(`Logout request failed: ${error}`);
|
|
4230
|
+
// Continue with cleanup even if logout request fails
|
|
4231
|
+
}
|
|
4232
|
+
}
|
|
4233
|
+
// Clean up socket
|
|
4234
|
+
if (this.socket) {
|
|
4235
|
+
this.removeSocketEvents();
|
|
4236
|
+
this.socket.end(undefined);
|
|
4237
|
+
this.socket = null;
|
|
4238
|
+
}
|
|
4239
|
+
// Clear session files
|
|
4240
|
+
this.authHandler.clearSession();
|
|
4241
|
+
// Reset logout flag
|
|
4242
|
+
this.loggingOut = false;
|
|
4243
|
+
// Cleanup console filter if it was enabled (reference counted)
|
|
4244
|
+
if (!this.options.debug) {
|
|
4245
|
+
disableConsoleFilter();
|
|
4246
|
+
}
|
|
4247
|
+
this.updateConnectionState("disconnected");
|
|
4248
|
+
this.logger.info("Logged out (session cleared)");
|
|
3200
4249
|
}
|
|
3201
4250
|
/**
|
|
3202
4251
|
* Get current connection state
|
|
@@ -3204,6 +4253,32 @@ export class MiawClient extends EventEmitter {
|
|
|
3204
4253
|
getConnectionState() {
|
|
3205
4254
|
return this.connectionState;
|
|
3206
4255
|
}
|
|
4256
|
+
/**
|
|
4257
|
+
* Wait for connection state to change to desired state
|
|
4258
|
+
* @param desiredState - The state to wait for
|
|
4259
|
+
* @param timeoutMs - Maximum time to wait in milliseconds
|
|
4260
|
+
*/
|
|
4261
|
+
async waitForState(desiredState, timeoutMs = 10000) {
|
|
4262
|
+
return new Promise((resolve, reject) => {
|
|
4263
|
+
// Check if already in desired state
|
|
4264
|
+
if (this.connectionState === desiredState) {
|
|
4265
|
+
resolve();
|
|
4266
|
+
return;
|
|
4267
|
+
}
|
|
4268
|
+
const timer = setTimeout(() => {
|
|
4269
|
+
this.off("connection", handler);
|
|
4270
|
+
reject(new Error(`Timeout waiting for connection state: ${desiredState}`));
|
|
4271
|
+
}, timeoutMs);
|
|
4272
|
+
const handler = (state) => {
|
|
4273
|
+
if (state === desiredState) {
|
|
4274
|
+
clearTimeout(timer);
|
|
4275
|
+
this.off("connection", handler);
|
|
4276
|
+
resolve();
|
|
4277
|
+
}
|
|
4278
|
+
};
|
|
4279
|
+
this.on("connection", handler);
|
|
4280
|
+
});
|
|
4281
|
+
}
|
|
3207
4282
|
/**
|
|
3208
4283
|
* Get instance ID
|
|
3209
4284
|
*/
|
|
@@ -3216,6 +4291,58 @@ export class MiawClient extends EventEmitter {
|
|
|
3216
4291
|
isConnected() {
|
|
3217
4292
|
return this.connectionState === "connected";
|
|
3218
4293
|
}
|
|
4294
|
+
/**
|
|
4295
|
+
* Enable debug mode at runtime
|
|
4296
|
+
* Enables verbose logging for debugging (includes libsignal session logs)
|
|
4297
|
+
*/
|
|
4298
|
+
enableDebug() {
|
|
4299
|
+
this.options.debug = true;
|
|
4300
|
+
// Recreate logger with debug enabled
|
|
4301
|
+
this.logger = createFilteredLogger(true);
|
|
4302
|
+
this.options.logger = this.logger;
|
|
4303
|
+
// Update socket logger if connected
|
|
4304
|
+
if (this.socket) {
|
|
4305
|
+
this.socket.logger = this.logger;
|
|
4306
|
+
}
|
|
4307
|
+
// Disable console filter to show libsignal logs in debug mode
|
|
4308
|
+
disableConsoleFilter();
|
|
4309
|
+
this.logger.info("Debug mode enabled");
|
|
4310
|
+
}
|
|
4311
|
+
/**
|
|
4312
|
+
* Disable debug mode at runtime
|
|
4313
|
+
* Disables verbose logging and suppresses libsignal session logs
|
|
4314
|
+
*/
|
|
4315
|
+
disableDebug() {
|
|
4316
|
+
this.logger.info("Debug mode disabled");
|
|
4317
|
+
this.options.debug = false;
|
|
4318
|
+
// Recreate logger with debug disabled
|
|
4319
|
+
this.logger = createFilteredLogger(false);
|
|
4320
|
+
this.options.logger = this.logger;
|
|
4321
|
+
// Update socket logger if connected
|
|
4322
|
+
if (this.socket) {
|
|
4323
|
+
this.socket.logger = this.logger;
|
|
4324
|
+
}
|
|
4325
|
+
// Enable console filter to suppress libsignal session logs
|
|
4326
|
+
enableConsoleFilter();
|
|
4327
|
+
}
|
|
4328
|
+
/**
|
|
4329
|
+
* Check if debug mode is enabled
|
|
4330
|
+
*/
|
|
4331
|
+
isDebugEnabled() {
|
|
4332
|
+
return this.options.debug;
|
|
4333
|
+
}
|
|
4334
|
+
/**
|
|
4335
|
+
* Set debug mode
|
|
4336
|
+
* @param enabled - Whether to enable debug mode
|
|
4337
|
+
*/
|
|
4338
|
+
setDebug(enabled) {
|
|
4339
|
+
if (enabled) {
|
|
4340
|
+
this.enableDebug();
|
|
4341
|
+
}
|
|
4342
|
+
else {
|
|
4343
|
+
this.disableDebug();
|
|
4344
|
+
}
|
|
4345
|
+
}
|
|
3219
4346
|
// TypeScript event emitter type safety
|
|
3220
4347
|
on(event, listener) {
|
|
3221
4348
|
return super.on(event, listener);
|